Add the Shadow Warrior source to our tree after astyling, uncrustifying, and renaming one file.

git-svn-id: https://svn.eduke32.com/eduke32@5196 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2015-05-19 21:54:34 +00:00
parent 086a9da9ee
commit 7493c36a94
157 changed files with 139815 additions and 0 deletions

View file

@ -0,0 +1,90 @@
build_h=$(ENGINE_INC)/build.h $(ENGINE_INC)/compat.h
panel_h=$(SW_INC)/panel.h $(SW_INC)/mytypes.h $(SW_INC)/game.h $(SW_INC)/conpic.h
names2_h=$(SW_INC)/names2.h $(SW_INC)/names.h
game_h=$(SW_INC)/game.h $(SW_INC)/mytypes.h $(MACT_ROOT)/keyboard.h $(SW_INC)/sounds.h $(SW_INC)/settings.h $(SW_INC)/digi.h $(SW_INC)/damage.h $(SW_INC)/inv.h $(SW_INC)/stag.h
tags_h=$(SW_INC)/tags.h $(SW_INC)/jtags.h
$(SW_OBJ)/actor.$o: $(SW_SRC)/actor.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/weapon.h $(SW_INC)/sprite.h $(SW_INC)/actor.h $(SW_INC)/saveable.h
$(SW_OBJ)/ai.$o: $(SW_SRC)/ai.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(tags_h) $(SW_INC)/ninja.h $(SW_INC)/ai.h $(SW_INC)/sector.h $(SW_INC)/sprite.h $(SW_INC)/net.h $(SW_INC)/saveable.h
$(SW_OBJ)/anim.$o: $(SW_SRC)/anim.c $(build_h) $(SW_INC)/keys.h $(SW_INC)/mytypes.h $(MACT_ROOT)/develop.h $(AUDIOLIB_INC)/fx_man.h $(AUDIOLIB_INC)/music.h $(MACT_ROOT)/scriplib.h $(MACT_ROOT)/file_lib.h $(SW_INC)/gamedefs.h $(MACT_ROOT)/keyboard.h $(MACT_ROOT)/util_lib.h $(MACT_ROOT)/control.h $(SW_INC)/config.h $(SW_INC)/sounds.h $(SW_INC)/function.h $(MACT_ROOT)/animlib.h $(SW_INC)/anim.h $(game_h) $(SW_INC)/colormap.h $(SW_INC)/net.h
$(SW_OBJ)/border.$o: $(SW_SRC)/border.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(SW_INC)/lists.h $(game_h) $(SW_INC)/net.h $(SW_INC)/text.h
$(SW_OBJ)/break.$o: $(SW_SRC)/break.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/break.h $(SW_INC)/sprite.h $(SW_INC)/sector.h $(SW_INC)/light.h $(SW_INC)/weapon.h
$(SW_OBJ)/bunny.$o: $(SW_SRC)/bunny.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/pal.h $(SW_INC)/sprite.h $(SW_INC)/actor.h $(SW_INC)/weapon.h $(SW_INC)/track.h $(SW_INC)/saveable.h
$(SW_OBJ)/cache.$o: $(SW_SRC)/cache.c $(build_h) $(names2_h) $(game_h) $(tags_h) $(SW_INC)/break.h $(SW_INC)/quake.h $(SW_INC)/pal.h $(SW_INC)/cache.h $(SW_INC)/sounds.h $(SW_INC)/net.h
$(SW_OBJ)/cd.$o: $(SW_SRC)/cd.c $(SW_INC)/mytypes.h $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/player.h $(SW_INC)/lists.h $(SW_INC)/warp.h $(SW_INC)/quake.h $(SW_INC)/function.h $(MACT_ROOT)/control.h $(SW_INC)/trigger.h $(SW_INC)/savedef.h $(SW_INC)/menus.h $(SW_INC)/net.h $(SW_INC)/pal.h
$(SW_OBJ)/cheats.$o: $(SW_SRC)/cheats.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(SW_INC)/mytypes.h $(MACT_ROOT)/control.h $(SW_INC)/function.h $(SW_INC)/text.h
$(SW_OBJ)/colormap.$o: $(SW_SRC)/colormap.c $(build_h) $(SW_INC)/keys.h $(SW_INC)/pal.h $(game_h)
$(SW_OBJ)/config.$o: $(SW_SRC)/config.c $(build_h) $(SW_INC)/settings.h $(SW_INC)/mytypes.h $(MACT_ROOT)/develop.h $(MACT_ROOT)/scriplib.h $(MACT_ROOT)/file_lib.h $(SW_INC)/gamedefs.h $(MACT_ROOT)/keyboard.h $(MACT_ROOT)/util_lib.h $(SW_INC)/function.h $(MACT_ROOT)/control.h $(AUDIOLIB_INC)/fx_man.h $(SW_INC)/sounds.h $(SW_INC)/config.h $(SW_INC)/common_game.h $(SW_INC)/_functio.h $(SW_INC)/_config.h
$(SW_OBJ)/console.$o: $(SW_SRC)/console.c $(build_h) $(SW_INC)/mytypes.h $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/player.h $(SW_INC)/lists.h $(SW_INC)/warp.h $(SW_INC)/quake.h $(SW_INC)/function.h $(MACT_ROOT)/control.h $(SW_INC)/trigger.h $(SW_INC)/savedef.h $(SW_INC)/menus.h $(SW_INC)/net.h $(SW_INC)/pal.h $(SW_INC)/weapon.h $(SW_INC)/text.h $(SW_INC)/jsector.h
$(SW_OBJ)/coolg.$o: $(SW_SRC)/coolg.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/sprite.h $(SW_INC)/actor.h $(SW_INC)/weapon.h $(SW_INC)/track.h $(SW_INC)/saveable.h
$(SW_OBJ)/coolie.$o: $(SW_SRC)/coolie.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/sprite.h $(SW_INC)/actor.h $(SW_INC)/track.h $(SW_INC)/weapon.h $(SW_INC)/saveable.h
$(SW_OBJ)/copysect.$o: $(SW_SRC)/copysect.c $(build_h) $(names2_h) $(game_h) $(tags_h) $(SW_INC)/weapon.h $(SW_INC)/sprite.h $(SW_INC)/track.h
$(SW_OBJ)/demo.$o: $(SW_SRC)/demo.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(SW_INC)/net.h $(SW_INC)/mytypes.h $(MACT_ROOT)/control.h $(SW_INC)/function.h $(SW_INC)/demo.h $(SW_INC)/player.h $(SW_INC)/menus.h
$(SW_OBJ)/draw.$o: $(SW_SRC)/draw.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(SW_INC)/quake.h $(SW_INC)/vis.h $(SW_INC)/jsector.h $(SW_INC)/reserve.h $(SW_INC)/mytypes.h $(MACT_ROOT)/control.h $(SW_INC)/function.h $(SW_INC)/net.h $(SW_INC)/pal.h $(SW_INC)/player.h $(SW_INC)/jtags.h $(SW_INC)/parent.h $(SW_INC)/cache.h $(SW_INC)/text.h $(SW_INC)/menus.h $(SW_INC)/interp.h $(SW_INC)/sector.h
$(SW_OBJ)/eel.$o: $(SW_SRC)/eel.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/actor.h $(SW_INC)/weapon.h $(SW_INC)/track.h $(SW_INC)/saveable.h
$(SW_OBJ)/game.$o: $(SW_SRC)/game.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/sector.h $(SW_INC)/sprite.h $(SW_INC)/weapon.h $(SW_INC)/player.h $(SW_INC)/lists.h $(SW_INC)/net.h $(SW_INC)/pal.h $(AUDIOLIB_INC)/fx_man.h $(SW_INC)/mytypes.h $(SW_INC)/menus.h $(MACT_ROOT)/control.h $(SW_INC)/function.h $(SW_INC)/demo.h $(SW_INC)/cache.h $(SW_INC)/anim.h $(SW_INC)/colormap.h $(SW_INC)/break.h $(SW_INC)/ninja.h $(SW_INC)/light.h $(SW_INC)/track.h $(SW_INC)/jsector.h $(MACT_ROOT)/keyboard.h $(SW_INC)/text.h $(AUDIOLIB_INC)/music.h $(SW_INC)/saveable.h
$(SW_OBJ)/girlninj.$o: $(SW_SRC)/girlninj.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/pal.h $(SW_INC)/player.h $(SW_INC)/net.h $(SW_INC)/actor.h $(SW_INC)/track.h $(SW_INC)/sprite.h $(SW_INC)/saveable.h
$(SW_OBJ)/goro.$o: $(SW_SRC)/goro.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/actor.h $(SW_INC)/track.h $(SW_INC)/saveable.h
$(SW_OBJ)/hornet.$o: $(SW_SRC)/hornet.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/actor.h $(SW_INC)/weapon.h $(SW_INC)/track.h $(SW_INC)/sprite.h $(SW_INC)/saveable.h
$(SW_OBJ)/interp.$o: $(SW_SRC)/interp.c $(SW_INC)/interp.h
$(SW_OBJ)/interpsh.$o: $(SW_SRC)/interpsh.c $(SW_INC)/interp.h
$(SW_OBJ)/inv.$o: $(SW_SRC)/inv.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(SW_INC)/pal.h $(SW_INC)/text.h $(SW_INC)/colormap.h $(SW_INC)/player.h
$(SW_OBJ)/jplayer.$o: $(SW_SRC)/jplayer.c $(build_h) $(SW_INC)/mytypes.h $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/player.h $(SW_INC)/lists.h $(SW_INC)/warp.h $(SW_INC)/quake.h $(SW_INC)/function.h $(MACT_ROOT)/control.h $(SW_INC)/trigger.h $(SW_INC)/savedef.h $(SW_INC)/menus.h $(SW_INC)/net.h $(SW_INC)/pal.h $(SW_INC)/bots.h
$(SW_OBJ)/jsector.$o: $(SW_SRC)/jsector.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(SW_INC)/jnames.h $(panel_h) $(game_h) $(tags_h) $(SW_INC)/sector.h $(SW_INC)/player.h $(SW_INC)/sprite.h $(SW_INC)/reserve.h $(SW_INC)/jsector.h $(SW_INC)/jtags.h $(SW_INC)/lists.h $(SW_INC)/pal.h $(SW_INC)/parent.h
$(SW_OBJ)/jweapon.$o: $(SW_SRC)/jweapon.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/break.h $(SW_INC)/quake.h $(SW_INC)/net.h $(SW_INC)/pal.h $(SW_INC)/ai.h $(SW_INC)/weapon.h $(SW_INC)/sprite.h $(SW_INC)/sector.h $(SW_INC)/actor.h $(SW_INC)/saveable.h
$(SW_OBJ)/lava.$o: $(SW_SRC)/lava.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/actor.h $(SW_INC)/track.h
$(SW_OBJ)/light.$o: $(SW_SRC)/light.c $(build_h) $(names2_h) $(game_h) $(SW_INC)/light.h
$(SW_OBJ)/mclip.$o: $(SW_SRC)/mclip.c $(build_h) $(SW_INC)/mytypes.h $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/player.h $(SW_INC)/mclip.h
$(SW_OBJ)/mdastr.$o: $(SW_SRC)/mdastr.c $(build_h) $(SW_INC)/mytypes.h $(SW_INC)/keys.h $(names2_h) $(game_h)
$(SW_OBJ)/menus.$o: $(SW_SRC)/menus.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/sector.h $(SW_INC)/sprite.h $(SW_INC)/weapon.h $(SW_INC)/player.h $(SW_INC)/jsector.h $(SW_INC)/reserve.h $(MACT_ROOT)/control.h $(SW_INC)/menus.h $(SW_INC)/sw_strs.h $(SW_INC)/pal.h $(SW_INC)/function.h $(SW_INC)/net.h $(AUDIOLIB_INC)/fx_man.h $(AUDIOLIB_INC)/music.h $(SW_INC)/text.h $(SW_INC)/colormap.h
$(SW_OBJ)/miscactr.$o: $(SW_SRC)/miscactr.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/quake.h $(AUDIOLIB_INC)/fx_man.h $(SW_INC)/actor.h $(SW_INC)/sector.h $(SW_INC)/sprite.h $(SW_INC)/saveable.h
$(SW_OBJ)/morph.$o: $(SW_SRC)/morph.c $(build_h) $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/sector.h $(SW_INC)/ai.h $(SW_INC)/player.h $(SW_INC)/saveable.h
$(SW_OBJ)/net.$o: $(SW_SRC)/net.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(tags_h) $(game_h) $(SW_INC)/net.h $(SW_INC)/pal.h $(SW_INC)/weapon.h $(SW_INC)/text.h $(SW_INC)/menus.h
$(SW_OBJ)/ninja.$o: $(SW_SRC)/ninja.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/pal.h $(SW_INC)/player.h $(SW_INC)/net.h $(SW_INC)/weapon.h $(SW_INC)/track.h $(SW_INC)/actor.h $(SW_INC)/ninja.h $(SW_INC)/sprite.h $(SW_INC)/saveable.h
$(SW_OBJ)/panel.$o: $(SW_SRC)/panel.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(SW_INC)/lists.h $(game_h) $(SW_INC)/net.h $(SW_INC)/pal.h $(SW_INC)/vis.h $(SW_INC)/weapon.h $(AUDIOLIB_INC)/fx_man.h $(SW_INC)/text.h $(SW_INC)/player.h $(SW_INC)/saveable.h
$(SW_OBJ)/player.$o: $(SW_SRC)/player.c $(build_h) $(SW_INC)/mytypes.h $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/player.h $(SW_INC)/lists.h $(SW_INC)/warp.h $(SW_INC)/quake.h $(SW_INC)/text.h $(SW_INC)/function.h $(MACT_ROOT)/control.h $(SW_INC)/trigger.h $(SW_INC)/savedef.h $(SW_INC)/menus.h $(SW_INC)/net.h $(SW_INC)/pal.h $(SW_INC)/demo.h $(SW_INC)/mclip.h $(AUDIOLIB_INC)/fx_man.h $(SW_INC)/sprite.h $(SW_INC)/weapon.h $(SW_INC)/ninja.h $(SW_INC)/break.h $(SW_INC)/jsector.h $(SW_INC)/sector.h $(SW_INC)/actor.h $(SW_INC)/colormap.h $(AUDIOLIB_INC)/music.h $(SW_INC)/vis.h $(SW_INC)/track.h $(SW_INC)/interp.h $(SW_INC)/saveable.h
$(SW_OBJ)/predict.$o: $(SW_SRC)/predict.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(SW_INC)/net.h
$(SW_OBJ)/quake.$o: $(SW_SRC)/quake.c $(build_h) $(names2_h) $(game_h) $(tags_h) $(SW_INC)/break.h $(SW_INC)/quake.h $(SW_INC)/sprite.h $(SW_INC)/saveable.h
$(SW_OBJ)/ripper.$o: $(SW_SRC)/ripper.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/pal.h $(SW_INC)/actor.h $(SW_INC)/sprite.h $(SW_INC)/track.h $(SW_INC)/saveable.h
$(SW_OBJ)/ripper2.$o: $(SW_SRC)/ripper2.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/pal.h $(SW_INC)/actor.h $(SW_INC)/sprite.h $(SW_INC)/track.h $(AUDIOLIB_INC)/fx_man.h $(SW_INC)/saveable.h
$(SW_OBJ)/rooms.$o: $(SW_SRC)/rooms.c $(build_h) $(names2_h) $(panel_h) $(game_h) $(SW_INC)/warp.h
$(SW_OBJ)/rotator.$o: $(SW_SRC)/rotator.c $(build_h) $(names2_h) $(panel_h) $(game_h) $(SW_INC)/net.h $(tags_h) $(SW_INC)/sector.h $(SW_INC)/text.h $(SW_INC)/interp.h $(SW_INC)/sprite.h $(SW_INC)/saveable.h
$(SW_OBJ)/rts.$o: $(SW_SRC)/rts.c $(SW_INC)/mytypes.h $(MACT_ROOT)/develop.h $(MACT_ROOT)/util_lib.h $(MACT_ROOT)/file_lib.h $(SW_INC)/_rts.h $(SW_INC)/rts.h $(SW_INC)/cache.h
$(SW_OBJ)/save.$o: $(SW_SRC)/save.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/lists.h $(SW_INC)/interp.h $(SW_INC)/net.h $(SW_INC)/savedef.h $(SW_INC)/jsector.h $(SW_INC)/parent.h $(SW_INC)/reserve.h $(SW_INC)/mfile.h $(SW_INC)/weapon.h $(SW_INC)/cache.h $(SW_INC)/colormap.h $(SW_INC)/player.h $(AUDIOLIB_INC)/fx_man.h $(AUDIOLIB_INC)/music.h $(SW_INC)/saveable.h
$(SW_OBJ)/scrip2.$o: $(SW_SRC)/scrip2.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(SW_INC)/parse.h $(SW_INC)/jsector.h $(SW_INC)/parent.h
$(SW_OBJ)/sector.$o: $(SW_SRC)/sector.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/sector.h $(SW_INC)/player.h $(SW_INC)/quake.h $(SW_INC)/weapon.h $(SW_INC)/jtags.h $(SW_INC)/net.h $(SW_INC)/break.h $(SW_INC)/track.h $(SW_INC)/sprite.h $(SW_INC)/light.h $(SW_INC)/text.h
$(SW_OBJ)/serp.$o: $(SW_SRC)/serp.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/actor.h $(SW_INC)/track.h $(SW_INC)/sector.h
$(SW_OBJ)/setup.$o: $(SW_SRC)/setup.c $(build_h) $(SW_INC)/keys.h $(game_h) $(SW_INC)/mytypes.h $(MACT_ROOT)/develop.h $(AUDIOLIB_INC)/fx_man.h $(AUDIOLIB_INC)/music.h $(MACT_ROOT)/scriplib.h $(MACT_ROOT)/file_lib.h $(SW_INC)/gamedefs.h $(MACT_ROOT)/keyboard.h $(MACT_ROOT)/util_lib.h $(MACT_ROOT)/control.h $(SW_INC)/config.h $(SW_INC)/sounds.h $(SW_INC)/function.h $(SW_INC)/rts.h
$(SW_OBJ)/skel.$o: $(SW_SRC)/skel.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/actor.h $(SW_INC)/track.h
$(SW_OBJ)/skull.$o: $(SW_SRC)/skull.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/weapon.h $(SW_INC)/actor.h
$(SW_OBJ)/slidor.$o: $(SW_SRC)/slidor.c $(build_h) $(names2_h) $(panel_h) $(game_h) $(SW_INC)/net.h $(tags_h) $(SW_INC)/slidor.h $(SW_INC)/slidor.h $(SW_INC)/sector.h $(SW_INC)/interp.h $(SW_INC)/text.h $(SW_INC)/sprite.h $(SW_INC)/saveable.h
$(SW_OBJ)/sounds.$o: $(SW_SRC)/sounds.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(SW_INC)/mytypes.h $(AUDIOLIB_INC)/fx_man.h $(AUDIOLIB_INC)/music.h $(AUDIOLIB_INC)/cd.h $(MACT_ROOT)/util_lib.h $(SW_INC)/gamedefs.h $(SW_INC)/config.h $(panel_h) $(game_h) $(SW_INC)/sounds.h $(SW_INC)/ai.h $(SW_INC)/net.h $(SW_INC)/cache.h $(SW_INC)/text.h $(SW_INC)/rts.h $(SW_INC)/menus.h
$(SW_OBJ)/spike.$o: $(SW_SRC)/spike.c $(build_h) $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/sector.h $(SW_INC)/sprite.h $(SW_INC)/saveable.h
$(SW_OBJ)/sprite.$o: $(SW_SRC)/sprite.c $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/warp.h $(SW_INC)/light.h $(SW_INC)/break.h $(SW_INC)/net.h $(SW_INC)/pal.h $(SW_INC)/sounds.h $(SW_INC)/interp.h $(SW_INC)/sprite.h $(SW_INC)/weapon.h $(SW_INC)/jsector.h $(SW_INC)/text.h $(SW_INC)/slidor.h $(SW_INC)/player.h $(SW_INC)/saveable.h
$(SW_OBJ)/sumo.$o: $(SW_SRC)/sumo.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/quake.h $(SW_INC)/actor.h $(SW_INC)/track.h $(SW_INC)/weapon.h $(SW_INC)/sector.h
$(SW_OBJ)/swconfig.$o: $(SW_SRC)/swconfig.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(SW_INC)/mytypes.h $(MACT_ROOT)/develop.h $(MACT_ROOT)/scriplib.h $(AUDIOLIB_INC)/fx_man.h $(SW_INC)/gamedefs.h $(SW_INC)/common_game.h $(SW_INC)/config.h $(SW_INC)/function.h $(SW_INC)/rts.h
$(SW_OBJ)/sync.$o: $(SW_SRC)/sync.c $(SW_INC)/keys.h $(game_h) $(tags_h) $(names2_h) $(SW_INC)/net.h $(SW_INC)/menus.h
$(SW_OBJ)/text.$o: $(SW_SRC)/text.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(SW_INC)/lists.h $(game_h) $(SW_INC)/pal.h $(SW_INC)/text.h $(SW_INC)/net.h
$(SW_OBJ)/timer.$o: $(SW_SRC)/timer.c $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/sector.h $(SW_INC)/sprite.h $(SW_INC)/weapon.h $(AUDIOLIB_INC)/fx_man.h $(AUDIOLIB_INC)/music.h $(SW_INC)/audiofx.h
$(SW_OBJ)/track.$o: $(SW_SRC)/track.c $(build_h) $(names2_h) $(panel_h) $(tags_h) $(SW_INC)/sector.h $(SW_INC)/ai.h $(SW_INC)/player.h $(game_h) $(SW_INC)/net.h $(SW_INC)/sprite.h $(SW_INC)/track.h $(SW_INC)/weapon.h $(SW_INC)/saveable.h
$(SW_OBJ)/vator.$o: $(SW_SRC)/vator.c $(build_h) $(names2_h) $(panel_h) $(game_h) $(SW_INC)/net.h $(tags_h) $(SW_INC)/sector.h $(SW_INC)/interp.h $(SW_INC)/text.h $(SW_INC)/sprite.h $(SW_INC)/weapon.h $(SW_INC)/saveable.h
$(SW_OBJ)/vis.$o: $(SW_SRC)/vis.c $(build_h) $(names2_h) $(game_h) $(tags_h) $(SW_INC)/break.h $(SW_INC)/quake.h $(SW_INC)/pal.h $(SW_INC)/sprite.h
$(SW_OBJ)/wallmove.$o: $(SW_SRC)/wallmove.c $(build_h) $(names2_h) $(game_h) $(tags_h) $(SW_INC)/weapon.h $(SW_INC)/sprite.h
$(SW_OBJ)/warp.$o: $(SW_SRC)/warp.c $(build_h) $(names2_h) $(panel_h) $(game_h) $(SW_INC)/warp.h
$(SW_OBJ)/weapon.$o: $(SW_SRC)/weapon.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/break.h $(SW_INC)/quake.h $(SW_INC)/net.h $(SW_INC)/pal.h $(SW_INC)/vis.h $(SW_INC)/ai.h $(SW_INC)/weapon.h $(SW_INC)/anim.h $(SW_INC)/damage.h $(SW_INC)/sector.h $(SW_INC)/sprite.h $(SW_INC)/actor.h $(SW_INC)/track.h $(SW_INC)/player.h
$(SW_OBJ)/zilla.$o: $(SW_SRC)/zilla.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/quake.h $(SW_INC)/actor.h $(SW_INC)/track.h $(AUDIOLIB_INC)/fx_man.h
$(SW_OBJ)/zombie.$o: $(SW_SRC)/zombie.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(panel_h) $(game_h) $(tags_h) $(SW_INC)/ai.h $(SW_INC)/pal.h $(SW_INC)/player.h $(SW_INC)/net.h $(SW_INC)/sprite.h $(SW_INC)/weapon.h $(SW_INC)/actor.h $(SW_INC)/track.h
$(SW_OBJ)/saveable.$o: $(SW_SRC)/saveable.c $(ENGINE_INC)/compat.h $(SW_INC)/saveable.h
$(SW_OBJ)/jnstub.$o: $(SW_SRC)/jnstub.c $(build_h) $(SW_INC)/stag.h $(SW_INC)/keys.h $(names2_h) $(game_h) $(tags_h) $(SW_INC)/pal.h $(ENGINE_INC)/pragmas.h $(ENGINE_INC)/editor.h $(ENGINE_INC)/cache1d.h
$(SW_OBJ)/brooms.$o: $(SW_SRC)/brooms.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(ENGINE_INC)/editor.h
$(SW_OBJ)/bldscript.$o: $(SW_SRC)/bldscript.c $(build_h) $(names2_h) $(game_h) $(SW_INC)/parse.h $(ENGINE_INC)/editor.h $(ENGINE_INC)/cache1d.h
$(SW_OBJ)/jbhlp.$o: $(SW_SRC)/jbhlp.c $(build_h) $(SW_INC)/keys.h $(names2_h) $(game_h) $(ENGINE_INC)/editor.h $(ENGINE_INC)/cache1d.h
$(SW_OBJ)/game_icon.$o: $(SW_RSRC)/game_icon.c
$(SW_OBJ)/grpscan.$o: $(SW_SRC)/grpscan.c $(ENGINE_INC)/compat.h $(ENGINE_INC)/baselayer.h $(ENGINE_INC)/scriptfile.h $(ENGINE_INC)/cache1d.h $(ENGINE_INC)/crc32.h $(SW_INC)/grpscan.h
$(SW_OBJ)/gameres.$o: $(SW_RSRC)/gameres.rc $(SW_SRC)/startwin.game.h $(SW_RSRC)/game.bmp $(SW_RSRC)/game_icon.ico
$(SW_OBJ)/buildres.$o: $(SW_RSRC)/buildres.rc $(SW_RSRC)/build.bmp $(SW_RSRC)/game_icon.ico
$(SW_OBJ)/startwin.game.$o: $(SW_SRC)/startwin.game.c $(build_h) $(ENGINE_INC)/winlayer.h $(SW_INC)/grpscan.h
$(SW_OBJ)/startgtk.game.$o: $(SW_SRC)/startgtk.game.c $(build_h) $(ENGINE_INC)/dynamicgtk.h $(ENGINE_INC)/baselayer.h $(SW_INC)/grpscan.h

View file

@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="EDuke32.SW.Editor"
type="win32"
/>
<description>BUILD for Shadow Warrior</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="EDuke32.SW.Game"
type="win32"
/>
<description>Shadow Warrior</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="amd64"
name="EDuke32.SW.Editor"
type="win32"
/>
<description>BUILD for Shadow Warrior</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="amd64"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="amd64"
name="EDuke32.SW.Game"
type="win32"
/>
<description>Shadow Warrior</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="amd64"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View file

@ -0,0 +1,38 @@
#include <windows.h>
#include <commctrl.h>
#include "startwin.editor.h"
RSRC_ICON ICON "game_icon.ico"
RSRC_BMP BITMAP "build.bmp"
WIN_STARTWIN DIALOGEX DISCARDABLE 20, 40, 260, 200
STYLE DS_MODALFRAME | DS_CENTER | DS_SETFONT | DS_FIXEDSYS | WS_OVERLAPPED | WS_CAPTION | WS_VISIBLE | WS_SYSMENU
CAPTION "Startup"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", WIN_STARTWIN_BITMAP, "STATIC", SS_BITMAP | WS_CHILD | WS_VISIBLE, 0, 0, 32, 32
CONTROL "", WIN_STARTWIN_TABCTL, WC_TABCONTROL, WS_CLIPSIBLINGS | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 5, 5, 250, 170
CONTROL "&Start", WIN_STARTWIN_START, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 154, 180, 48, 14
CONTROL "&Cancel", WIN_STARTWIN_CANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 207, 180, 48, 14
CONTROL "", WIN_STARTWIN_MESSAGES, "EDIT", ES_MULTILINE | ES_READONLY | WS_CHILD | WS_VSCROLL, 0, 0, 32, 32
END
WIN_STARTWINPAGE_CONFIG DIALOGEX DISCARDABLE 20, 40, 279, 168
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
CAPTION "Dialog"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "&2D Video mode:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 8, 50, 8
CONTROL "", IDC2DVMODE, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 60, 6, 80, 56
CONTROL "&Fullscreen", IDCFULLSCREEN, "BUTTON", BS_CHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 148, 8, 49, 10
CONTROL "&3D Video mode:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 24, 50, 8
CONTROL "", IDC3DVMODE, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 60, 22, 80, 56
CONTROL "&Always show configuration on start", IDCALWAYSSHOW, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 118, 116, 140, 8
END
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
1 24 "64/manifest.build.xml"
#else
1 24 "32/manifest.build.xml"
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View file

@ -0,0 +1,408 @@
#include "compat.h"
#include "sdlappicon.h"
static uint8_t sdlappicon_pixels[] = {
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0l\342\32"
"\32w\346Zx\251\343\200\275\321\346\253\316\332\346\327\323\334\347\370\346"
"\346\347\377\347\347\347\377\347\347\347\367\350\350\350\344\351\351\351"
"\306\267\333\351\242\235\325\354x\353\353\353'\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0q\354\33\0n\350y\21t\343\267s\246\340\310\342\344\347\365\350\350"
"\350\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\303\336\351\377\331\344\351\377\351\351\351\377\210\314"
"\350\377\350\350\350\377\324\342\347\377\314\337\347\325\346\346\346o\341"
"\341\341\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0l\350!\2n\350\234\1m\347\367G\220\342\310\344\346\350\371\351\351\351"
"\377\352\352\352\377\352\352\352\377\353\353\353\377\353\353\353\377\353"
"\353\353\377\353\353\353\377\353\353\353\377\353\353\353\377\353\353\353"
"\377\267\334\353\377\16\251\352\377\230\322\352\377.\261\351\377\204\314"
"\351\377\350\350\350\377\347\347\347\366\317\340\350\236`\312\3640\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\337\10\0k\345\201\1m\347\366\1m\347\367\212"
"\263\344\315\352\352\352\377\353\353\353\377\353\353\353\377\354\354\354"
"\377\354\354\354\377\355\355\355\377\355\355\355\377\355\355\355\377\355"
"\355\355\377\355\355\355\377\355\355\355\377:\270\355\377\17\253\355\377"
"\1\247\354\377\1\247\354\377\1\246\353\377\7\250\353\377:\266\352\377\215"
"\316\351\377\307\336\350\377\325\342\347\363\345\345\345\201\350\350\350"
"\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0q\350-\1l\347\325\1m\350\377\1n\351\377z\254\344\310\353\353"
"\353\377\354\354\354\377\354\354\354\377\355\355\355\377\356\356\356\377"
"\356\356\356\377\357\357\357\377\357\357\357\377\302\342\357\377\275\340"
"\357\377\346\354\357\377\201\317\357\377\2\251\357\377\1\251\357\377\1\250"
"\356\377\1\250\356\377\1\247\355\377\1\247\354\377\1\247\354\377J\273\353"
"\377\350\351\352\377\351\351\351\377\350\350\350\377\351\351\351\336\352"
"\352\3521\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0n\347_\1m\347\367\1m\350\377\1n\352\377\36|\346\312\354\354\354\377\355"
"\355\355\377\356\356\356\377\356\356\356\377\357\357\357\377\337\353\360"
"\3779\272\360\377g\310\361\377\326\350\361\377\351\357\361\377^\306\361\377"
"\7\254\361\377\1\252\361\377\1\252\361\377\1\252\361\377\1\251\360\377\1"
"\251\360\377\1\251\357\377\1\250\356\377\1\250\356\377\1\247\355\377G\273"
"\354\377\274\335\353\377\352\352\352\377\350\350\350\377\347\347\347\363"
"\346\346\346Z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0o\350z\1m\347"
"\376\1n\351\377\1n\352\377\1o\353\377\272\320\351\337\355\355\355\377\357"
"\357\357\377\357\357\357\377\360\360\360\377\361\361\361\377\362\362\362"
"\377\347\356\362\377\325\352\363\3778\274\363\377`\307\363\377t\316\364\377"
"\1\254\364\377\1\254\363\377\27\262\363\377r\315\363\377\247\334\362\377"
"\206\322\362\377!\264\361\377\1\251\360\377\1\251\357\377;\272\357\377\235"
"\326\355\377\246\330\354\377\223\321\353\377\265\332\352\377\351\351\351"
"\377\347\347\347\376\351\351\351\202\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0m\351"
"u\1m\347\377\1n\351\377\1n\352\377\1o\354\377\21w\351\325\356\356\356\377"
"\357\357\357\377\360\360\360\377\361\361\361\377\362\362\362\377\363\363"
"\363\377\364\364\364\377\364\364\364\377\365\365\365\377\361\364\365\377"
"\276\346\366\377'\270\366\377\1\256\366\377\40\266\366\377\342\357\365\377"
"\365\365\365\377\364\364\364\377\364\364\364\377\345\357\363\3773\272\362"
"\377\1\252\361\377\313\346\360\377\356\357\357\377\326\347\356\377\355\355"
"\355\377\354\354\354\377\352\352\352\377\351\351\351\377\347\347\347\377"
"\352\352\352x\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0m\346[\1m\347\375\1n\351\377\1n\352\377\1o"
"\354\377\1p\355\377P\230\352\303\360\360\360\377\361\361\361\377\362\362"
"\362\377\363\363\363\377\364\364\364\377\365\365\365\377\366\366\366\377"
"\366\366\366\377\367\367\367\377\367\367\367\377\370\370\370\377S\307\370"
"\377\1\257\370\377\227\334\370\377\367\367\367\377\367\367\367\377\366\366"
"\366\377\366\366\366\377\365\365\365\377\315\351\364\377\2\254\363\3774\272"
"\362\377`\306\361\377\307\344\360\377\357\357\357\377\355\355\355\377\354"
"\354\354\377\352\352\352\377\351\351\351\377\347\347\347\375\350\350\350"
"Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0p\3440\1m\347\365\1n\351\377\1n\352\377\1o\354\377\1p\355\377\1p\357\377"
"\201\263\354\307\361\361\361\377\363\363\363\377\364\364\364\377\365\365"
"\365\377\366\366\366\377\367\367\367\377\370\370\370\377\364\367\370\377"
"t\322\371\377\212\330\371\377U\311\372\377\1\260\372\377\1\260\372\377\300"
"\351\372\377\371\371\371\377\371\371\371\377\370\370\370\377\370\370\370"
"\377\367\367\367\377\366\366\366\377\32\265\365\377\13\257\364\377\331\353"
"\363\377\263\337\361\377\360\360\360\377\357\357\357\377\355\355\355\377"
"\354\354\354\377\352\352\352\377\351\351\351\377\347\347\347\367\344\344"
"\3440\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\337\10\1"
"m\350\332\1m\350\377\1n\352\377\1o\354\377\1p\355\377\1p\357\377\1q\360\377"
"\221\275\357\312\363\363\363\377\364\364\364\377\366\366\366\377\367\367"
"\367\377\370\370\370\377\371\371\371\377\372\372\372\377\372\372\372\377"
"\373\373\373\377\373\373\373\377\364\372\374\377\36\273\374\377\1\262\374"
"\377\237\340\374\377\373\373\373\377\373\373\373\377\372\372\372\377\372"
"\372\372\377\371\371\371\377\362\366\370\377\7\260\367\377;\277\366\377\364"
"\364\364\377\363\363\363\377\362\362\362\377\360\360\360\377\357\357\357"
"\377\355\355\355\377\354\354\354\377\352\352\352\377\350\350\350\377\347"
"\347\347\326\377\377\377\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0m\350\203\1m\350\377\1n\351\377\1o\353\377\1p\355\377\1p\357\377\1q\360"
"\377\1r\362\377\202\266\360\316\365\365\365\377\366\366\366\377\367\367\367"
"\377\371\371\371\377\372\372\372\377\373\373\373\377\374\374\374\377\374"
"\374\374\377\375\375\375\377\362\372\375\377\376\376\376\377m\323\376\377"
"\1\263\376\377*\277\376\377\361\371\375\377\375\375\375\377\374\374\374\377"
"\374\374\374\377\373\373\373\377\230\336\372\377\1\260\371\377\202\324\367"
"\377\366\366\366\377\365\365\365\377\363\363\363\377\362\362\362\377\360"
"\360\360\377\357\357\357\377\355\355\355\377\353\353\353\377\351\351\351"
"\377\350\350\350\377\350\350\350\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0p\347\40\1m\347\367\1n\351\377\1o\353\377\1o\354\377\1p\356\377\1q"
"\360\377\1q\361\377\1r\363\377`\245\363\332\366\366\366\377\370\370\370\377"
"\371\371\371\377\372\372\372\377\373\373\373\377\374\374\374\377\375\375"
"\375\377\277\353\376\377\377\377\377\377\346\370\377\377\377\377\377\377"
"\233\342\377\377\1\264\377\377\1\264\377\3778\304\377\377\303\355\377\377"
"\355\371\376\377\336\364\375\377\204\330\374\377\10\263\373\377\1\260\372"
"\3770\275\371\377\370\370\370\377\366\366\366\377\365\365\365\377\363\363"
"\363\377\361\361\361\377\352\356\360\377\275\340\356\377\354\354\354\377"
"\353\353\353\377\351\351\351\377\347\347\347\364\352\352\352\30\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\2m\347\237\1m\350\377\1n\352\377\1o\354\377\1p\355"
"\377\1p\357\377\1q\361\377\1r\363\377\1s\364\377)\210\365\356\370\370\370"
"\377\371\371\371\377\373\373\373\377\374\374\374\377\375\375\375\377\376"
"\376\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\346\370\377\377\21\271\377\377\1\264\377\377\1\264\377"
"\377\1\264\377\377\1\264\377\377\1\264\377\377\1\263\376\377\1\263\375\377"
"\1\262\374\377\2\261\373\377\331\357\371\377\370\370\370\377\366\366\366"
"\377\364\364\364\377\363\363\363\377\361\361\361\377\357\357\357\377\355"
"\355\355\377\354\354\354\377\352\352\352\377\350\350\350\377\347\347\347"
"\224\0\0\0\0\0\0\0\0\0\0\0\0\0j\352\30\1l\350\372\1n\351\377\1o\353\377\1"
"p\355\377\1p\357\377\1q\360\377\1r\362\377\1s\364\377\1t\366\377\2u\367\377"
"\333\351\371\377\373\373\373\377\374\374\374\377\375\375\375\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\276\354\377\377\1\264\377"
"\377\1\264\377\377\1\264\377\377\1\264\377\377\1\264\377\377\1\264\377\377"
"\1\264\377\377\1\263\375\377\1\262\374\377\205\331\373\377\371\371\371\377"
"\367\367\367\377\366\366\366\377\364\364\364\377\362\362\362\377\360\360"
"\360\377\357\357\357\377\355\355\355\377\353\353\353\377\351\351\351\377"
"\347\347\347\367\350\350\350\26\0\0\0\0\0\0\0\0\0n\350y\1m\350\377\1n\352"
"\377\1o\354\377\1p\356\377\1p\357\377\1q\361\377\1r\363\377\1s\365\377\1"
"t\367\377\1u\371\377r\261\372\377\374\374\374\377\375\375\375\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\307\357"
"\377\377~\331\377\377\244\344\377\377\1\264\377\377\1\264\377\377\1\264\377"
"\377\1\264\377\377\1\264\377\377\1\264\377\377\1\263\375\377\27\270\374\377"
"\352\365\372\377\371\371\371\377\367\367\367\377\365\365\365\377\363\363"
"\363\377\361\361\361\377\357\357\357\377\356\356\356\377\354\354\354\377"
"\352\352\352\377\350\350\350\377\350\350\350|\0\0\0\0\0\0\0\0\1m\350\320"
"\1n\351\377\1o\353\377\1o\354\377\1p\356\377\1q\360\377\1r\362\377\1s\364"
"\377\1t\366\377\1u\370\377\1v\372\377\12{\373\377\336\355\375\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377l\323\377\377\353\371\377\377\377\377\377\377<\305\377\377\1\264"
"\377\377\1\264\377\377\1\264\377\377\1\264\377\377\1\264\377\377\25\272\377"
"\377_\316\375\377f\317\373\377\372\372\372\377\370\370\370\377\366\366\366"
"\377\364\364\364\377\362\362\362\377\360\360\360\377\356\356\356\377\354"
"\354\354\377\353\353\353\377\351\351\351\377\350\350\350\322\0\0\0\0\0k\346"
"\37\1m\347\376\1n\351\377\1o\353\377\1p\355\377\1p\357\377\1q\361\377\1r"
"\363\377\1s\365\377\1t\367\377\1u\371\377\1v\373\377\1w\374\377H\235\376"
"\377\375\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377V\315\377\377\373\376\377\377\377\377\377\377\201\332"
"\377\377\1\264\377\377\1\264\377\377\1\264\377\377\1\264\377\377\1\264\377"
"\377\227\340\377\377\372\375\376\377T\313\374\377\372\373\373\377\371\371"
"\371\377\367\367\367\377\365\365\365\377\363\363\363\377\361\361\361\377"
"\357\357\357\377\355\355\355\377\353\353\353\377\351\351\351\377\347\347"
"\347\376\347\347\347\40\0l\347a\1m\350\377\1n\352\377\1o\354\377\1p\356\377"
"\1q\360\377\1r\362\377\1s\364\377\1t\366\377\1u\370\377\1v\372\377\1w\374"
"\377\1w\375\377\1x\377\377\177\273\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\241\343\377\377\1\264\377\377\33\274\377\377\301\355\377"
"\377\3\265\377\377\7\266\377\377\363\373\377\377\377\377\377\377\375\375"
"\375\377\374\374\374\377\372\372\372\377\370\370\370\377\366\366\366\377"
"\364\364\364\377\362\362\362\377\360\360\360\377\356\356\356\377\354\354"
"\354\377\352\352\352\377\350\350\350\377\350\350\350d\2m\350\230\1m\350\377"
"\1n\352\377\1o\354\377\1p\356\377\1q\360\377\1r\362\377\1s\364\377\1t\366"
"\377\1u\370\377\1v\372\377\1w\374\377\1x\376\377\1x\377\377\1x\377\377\222"
"\305\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\255\347\377\377\377\377\377\377\235\342\377\377\1\264\377\377"
"\261\350\377\377\377\377\377\377\40\275\377\377F\310\377\377\377\377\377"
"\377\377\377\377\377\376\376\376\377\374\374\374\377\372\372\372\377\370"
"\370\370\377\366\366\366\377\364\364\364\377\362\362\362\377\360\360\360"
"\377\356\356\356\377\354\354\354\377\352\352\352\377\350\350\350\377\350"
"\350\350\230\1m\347\300\1n\351\377\1o\353\377\1p\355\377\1p\357\377\1q\361"
"\377\1r\363\377\1s\365\377\1t\367\377\1u\371\377\1v\373\377\1w\375\377\1"
"x\377\377\1x\377\377\1x\377\377\2y\377\377\236\314\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\337\366\377\377\377\377\377\377"
"u\326\377\377\32\273\377\377\374\376\377\377\377\377\377\377*\300\377\377"
"\222\337\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\375"
"\375\377\373\373\373\377\371\371\371\377\367\367\367\377\365\365\365\377"
"\363\363\363\377\361\361\361\377\357\357\357\377\355\355\355\377\353\353"
"\353\377\351\351\351\377\350\350\350\300\1l\347\340\1n\351\377\1o\353\377"
"\1p\355\377\1p\357\377\1q\361\377\1r\363\377\1s\365\377\1t\367\377\1u\371"
"\377\1v\373\377\1w\375\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\2"
"y\377\377o\262\377\377\370\373\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377?\306\377\377e\321\377\377\377\377\377\377\377\377\377"
"\377\35\274\377\377\302\355\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\375\375\375\377\373\373\373\377\371\371\371\377\367\367\367\377"
"\365\365\365\377\363\363\363\377\361\361\361\377\357\357\357\377\355\355"
"\355\377\353\353\353\377\351\351\351\377\347\347\347\337\1m\350\366\1n\351"
"\377\1o\353\377\1p\355\377\1p\357\377\1q\361\377\1r\363\377\1s\365\377\1"
"u\370\377\1v\372\377\1w\374\377\1x\376\377\1x\377\377\1x\377\377\1x\377\377"
"\1x\377\377\1x\377\377\1x\377\3772\222\377\377\325\351\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\376\377\377\377\14\267\377\377\207\334\377\377\377\377\377\377"
"\377\377\377\377=\306\377\377\322\362\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\376\376\376\377\374\374\374\377\372\372\372\377\370"
"\370\370\377\365\365\365\377\363\363\363\377\361\361\361\377\357\357\357"
"\377\355\355\355\377\353\353\353\377\351\351\351\377\350\350\350\366\1m\347"
"\377\1n\351\377\1o\353\377\1p\355\377\1p\357\377\1q\361\377\1s\364\377\1"
"t\366\377\1u\370\377\1v\372\377\1w\374\377\1x\376\377\1x\377\377\1x\377\377"
"\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\7{\377\377y\270\377"
"\377\363\371\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\365\374\377\377\1\264\377\377}\330\377\377\377\377\377\377\377"
"\377\377\377l\323\377\377\250\345\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\376\376\376\377\374\374\374\377\372\372\372\377\370\370"
"\370\377\366\366\366\377\364\364\364\377\361\361\361\377\357\357\357\377"
"\355\355\355\377\353\353\353\377\351\351\351\377\350\350\350\377\1m\350\377"
"\1n\351\377\1o\353\377\1p\355\377\1p\357\377\1q\361\377\1s\364\377\1t\366"
"\377\1u\370\377\1v\372\377\1w\374\377\1x\376\377\1x\377\377\1x\377\377\1"
"x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377"
"\24\202\377\377\201\274\377\377\353\364\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\22\271\377\377g\322\377\377\377\377\377\377\377\377"
"\377\377w\327\377\377\250\345\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\376\376\376\377\374\374\374\377\372\372\372\377\370\370\370"
"\377\366\366\366\377\364\364\364\377\361\361\361\377\357\357\357\377\355"
"\355\355\377\353\353\353\377\351\351\351\377\350\350\350\377\1m\350\365\1"
"n\351\377\1o\353\377\1p\355\377\1p\357\377\1q\361\377\1r\363\377\1s\365\377"
"\1u\370\377\1v\372\377\1w\374\377\1x\376\377\1x\377\377\1x\377\377\1x\377"
"\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1"
"x\377\377\1x\377\377\10|\377\377\\\250\377\377\320\346\377\377\377\377\377"
"\377.\301\377\377X\316\377\377\377\377\377\377\377\377\377\377\225\340\377"
"\377d\321\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\376"
"\376\377\374\374\374\377\372\372\372\377\370\370\370\377\365\365\365\377"
"\363\363\363\377\361\361\361\377\357\357\357\377\355\355\355\377\353\353"
"\353\377\351\351\351\377\350\350\350\365\1l\347\341\1n\351\377\1o\353\377"
"\1p\355\377\1p\357\377\1q\361\377\1r\363\377\1s\365\377\1t\367\377\1u\371"
"\377\1v\373\377\1w\375\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1"
"x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377"
"\1x\377\377\1x\377\377\2y\377\377U\244\377\377B\305\377\377Y\316\377\377"
"\377\377\377\377\377\377\377\377\264\351\377\377\203\333\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\375\375\375\377\373\373\373\377"
"\371\371\371\377\367\367\367\377\365\365\365\377\363\363\363\377\361\361"
"\361\377\357\357\357\377\355\355\355\377\353\353\353\377\351\351\351\377"
"\347\347\347\340\1m\347\302\1n\351\377\1o\353\377\1p\355\377\1p\357\377\1"
"q\361\377\1r\363\377\1s\365\377\1t\367\377\1u\371\377\1v\373\377\1w\375\377"
"\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377"
"\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1"
"x\377\377\1x\377\377\5\240\377\377<\271\377\377\373\375\377\377\377\377\377"
"\377\221\337\377\377\277\354\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\375\375\375\377\373\373\373\377\371\371\371\377\367\367\367"
"\377\365\365\365\377\363\363\363\377\361\361\361\377\357\357\357\377\355"
"\355\355\377\353\353\353\377\351\351\351\377\347\347\347\274\2l\346\216\1"
"m\350\377\1n\352\377\1o\354\377\1p\356\377\1q\360\377\1r\362\377\1s\364\377"
"\1t\366\377\1u\370\377\1v\372\377\1w\374\377\1x\376\377\1x\377\377\1x\377"
"\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1"
"x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1\232\377"
"\377\1\222\377\377;\227\377\377\346\362\377\377T\314\377\377\336\365\377"
"\377\377\377\377\377\377\377\377\377\376\376\376\377\374\374\374\377\372"
"\372\372\377\370\370\370\377\366\366\366\377\364\364\364\377\362\362\362"
"\377\360\360\360\377\356\356\356\377\354\354\354\377\352\352\352\377\350"
"\350\350\377\347\347\347\223\0o\346Z\1m\350\377\1n\352\377\1o\354\377\1p"
"\356\377\1q\360\377\1r\362\377\1s\364\377\1t\366\377\1u\370\377\1v\372\377"
"\1w\374\377\1w\375\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377"
"\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1"
"x\377\377\1x\377\377\1x\377\377\1\231\377\377\1\217\377\377\1x\377\377\40"
"\210\377\377\242\333\377\377\374\376\377\377\377\377\377\377\377\377\377"
"\377\375\375\375\377\374\374\374\377\372\372\372\377\370\370\370\377\366"
"\366\366\377\364\364\364\377\362\362\362\377\360\360\360\377\356\356\356"
"\377\354\354\354\377\352\352\352\377\350\350\350\377\352\352\352_\0r\355"
"\35\1m\347\376\1n\351\377\1o\353\377\1p\355\377\1p\357\377\1q\361\377\1r"
"\363\377\1s\365\377\1t\367\377\1u\371\377\1v\373\377\1w\374\377\1x\376\377"
"\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377"
"\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1"
"\230\377\377\1\216\377\377\1x\377\377\1x\377\377\21\200\377\377\317\346\377"
"\377\377\377\377\377\376\376\376\377\374\374\374\377\373\373\373\377\371"
"\371\371\377\367\367\367\377\365\365\365\377\363\363\363\377\361\361\361"
"\377\357\357\357\377\355\355\355\377\353\353\353\377\351\351\351\377\347"
"\347\347\375\350\350\350\26\0\0\0\0\1l\347\306\1n\351\377\1o\353\377\1o\354"
"\377\1p\356\377\1q\360\377\1r\362\377\1s\364\377\1t\366\377\1u\370\377\1"
"v\372\377\1v\373\377\1w\375\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377"
"\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377"
"\377\1x\377\377\1x\377\377\1\232\377\377\1\214\377\377\1x\377\377\1x\377"
"\377\1x\377\377\35\207\377\377\351\363\377\377\375\375\375\377\373\373\373"
"\377\372\372\372\377\370\370\370\377\366\366\366\377\364\364\364\377\362"
"\362\362\377\360\360\360\377\356\356\356\377\354\354\354\377\353\353\353"
"\377\351\351\351\377\351\351\351\317\0\0\0\0\0\0\0\0\0n\347k\1m\350\377\1"
"n\352\377\1o\354\377\1p\356\377\1p\357\377\1q\361\377\1r\363\377\1s\365\377"
"\1t\367\377\1u\370\377\1v\372\377\1w\374\377\1w\375\377\1x\377\377\1x\377"
"\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1"
"x\377\377\1x\377\377\1x\377\377\1x\377\377\1\232\377\377\1\212\377\377\1"
"x\377\377\1x\377\377\1x\377\377\1x\377\377M\240\375\377\374\374\374\377\372"
"\372\372\377\370\370\370\377\367\367\367\377\365\365\365\377\363\363\363"
"\377\361\361\361\377\357\357\357\377\356\356\356\377\354\354\354\377\352"
"\352\352\377\350\350\350\377\351\351\351r\0\0\0\0\0\0\0\0\0k\344\23\1m\347"
"\365\1n\351\377\1o\353\377\1p\355\377\1p\357\377\1q\360\377\1r\362\377\1"
"s\364\377\1t\366\377\1t\367\377\1u\371\377\1v\372\377\1w\374\377\1w\375\377"
"\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377"
"\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1\235\377\377\1\212\377"
"\377\1x\377\377\1x\377\377\1x\377\377\1w\375\377\1w\374\377\257\322\372\377"
"\371\371\371\377\367\367\367\377\366\366\366\377\364\364\364\377\362\362"
"\362\377\360\360\360\377\357\357\357\377\355\355\355\377\353\353\353\377"
"\351\351\351\377\347\347\347\366\350\350\350\26\0\0\0\0\0\0\0\0\0\0\0\0\2"
"l\346\216\1m\350\377\1n\352\377\1o\354\377\1p\355\377\1p\357\377\1q\361\377"
"\1r\363\377\1s\364\377\1t\366\377\1u\370\377\1u\371\377\1v\372\377\1w\374"
"\377\1w\375\377\1x\376\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1"
"x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1\233\377\377\1\215"
"\377\377\1x\377\377\1x\376\377\1w\375\377\1w\374\377\1v\372\3774\221\371"
"\377\370\370\370\377\366\366\366\377\364\364\364\377\363\363\363\377\361"
"\361\361\377\357\357\357\377\355\355\355\377\354\354\354\377\352\352\352"
"\377\350\350\350\377\351\351\351\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0a\333"
"\25\1m\347\361\1n\351\377\1o\353\377\1o\354\377\1p\356\377\1q\360\377\1q"
"\361\377\1r\363\377\1s\365\377\1t\366\377\1u\370\377\1u\371\377\1v\372\377"
"\1v\373\377\4y\374\377N\240\375\377\203\275\376\377l\261\377\377\32\205\377"
"\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1x\377\377\1\225\377\377"
"\1\221\376\377\1w\375\377\1w\374\377\1v\373\377\1v\372\377\1u\371\377\1u"
"\370\377\314\340\366\377\365\365\365\377\363\363\363\377\361\361\361\377"
"\360\360\360\377\356\356\356\377\354\354\354\377\353\353\353\377\351\351"
"\351\377\347\347\347\361\351\351\351\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0n\351\200\1m\350\377\1n\351\377\1o\353\377\1p\355\377\1p\357\377"
"\1q\360\377\1r\362\377\1r\363\377\1s\365\377\1t\366\377\1t\367\377\1u\370"
"\377\15|\372\377\303\335\373\377\374\374\374\377\374\374\374\377\375\375"
"\375\377\360\366\375\377N\240\376\377\1x\376\377\1x\376\377\1x\376\377\1"
"w\375\377\1\211\375\377\1\231\374\377\1w\374\377\1v\373\377\1v\372\377\1"
"u\370\377\1t\367\377\1t\366\377\207\273\365\377\363\363\363\377\362\362\362"
"\377\360\360\360\377\357\357\357\377\355\355\355\377\353\353\353\377\351"
"\351\351\377\350\350\350\377\351\351\351\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0f\314\5\1m\346\312\1m\350\377\1n\352\377\1o\354\377"
"\1p\355\377\1p\357\377\1q\360\377\1r\362\377\1r\363\377\1s\364\377\1t\366"
"\377\1t\367\377\202\272\370\377\371\371\371\377\372\372\372\377\372\372\372"
"\377\373\373\373\377\373\373\373\377\362\367\374\377\31\203\374\377\1w\374"
"\377\1w\374\377\1v\373\377\1w\373\377\1\243\372\377\1v\372\377\1u\371\377"
"\1u\370\377\1t\367\377\1t\366\377\1s\364\377\\\243\363\377\362\362\362\377"
"\360\360\360\377\357\357\357\377\355\355\355\377\354\354\354\377\352\352"
"\352\377\350\350\350\377\347\347\347\314\377\377\377\4\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0q\352$\1m\350\361\1n\351\377\1n\352"
"\377\1o\354\377\1p\355\377\1p\357\377\1q\360\377\1q\361\377\1r\363\377\1"
"s\364\377\1s\365\377\307\335\366\377\367\367\367\377\370\370\370\377\370"
"\370\370\377\371\371\371\377\371\371\371\377\372\372\372\377V\243\372\377"
"\1v\372\377\1v\372\377\1u\371\377\1u\371\377\1\237\370\377\1x\370\377\1t"
"\367\377\1t\366\377\1s\365\377\1s\364\377\1r\363\377N\232\361\377\360\360"
"\360\377\357\357\357\377\355\355\355\377\354\354\354\377\352\352\352\377"
"\351\351\351\377\350\350\350\363\356\356\356,\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0o\347U\1m\347\374\1n\351\377"
"\1n\352\377\1o\354\377\1p\355\377\1p\357\377\1q\360\377\1q\361\377\1r\362"
"\377\1r\363\377\271\324\364\377\365\365\365\377\366\366\366\377\366\366\366"
"\377\367\367\367\377\367\367\367\377\370\370\370\377L\235\370\377\1u\370"
"\377\1u\370\377\1t\367\377\1t\367\377\1\231\366\377\1z\366\377\1s\365\377"
"\1s\364\377\1r\363\377\1r\362\377\1q\361\377W\236\360\377\357\357\357\377"
"\355\355\355\377\354\354\354\377\352\352\352\377\351\351\351\377\347\347"
"\347\376\352\352\352W\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0l\347j\1m\347\376\1n\351\377\1n\352"
"\377\1o\354\377\1p\355\377\1p\356\377\1p\357\377\1q\360\377\1q\361\377Y\240"
"\362\377\363\363\363\377\364\364\364\377\364\364\364\377\365\365\365\377"
"\365\365\365\377\334\350\365\377\15z\366\377\1t\366\377\1s\365\377\1s\365"
"\377\1s\365\377\1\230\364\377\1z\364\377\1r\363\377\1r\362\377\1q\361\377"
"\1q\360\377\1p\357\377|\261\356\377\355\355\355\377\354\354\354\377\352\352"
"\352\377\351\351\351\377\347\347\347\375\346\346\346g\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0o\353s\1m\347\375\1n\351\377\1n\352\377\1o\353\377\1o\354\377"
"\1p\355\377\1p\357\377\1p\357\377\1q\360\377p\254\361\377\356\360\362\377"
"\362\362\362\377\363\363\363\377\326\344\363\3775\216\363\377\1s\364\377"
"\1s\364\377\1r\363\377\1r\363\377\1r\363\377\1\222\362\377\1x\362\377\1q"
"\361\377\1q\360\377\1p\357\377\1p\357\377\1p\355\377\303\327\354\377\353"
"\353\353\377\352\352\352\377\351\351\351\377\350\350\350\375\353\353\353"
"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0m\347T\1m\347\364\1m\350"
"\377\1n\351\377\1o\353\377\1o\354\377\1p\355\377\1p\356\377\1p\356\377\1"
"p\357\377\24{\360\377N\231\360\377B\224\361\377\10u\361\377\1q\361\377\1"
"q\361\377\1q\361\377\1q\361\377\1q\361\377\1q\361\377\1\221\360\377\1x\360"
"\377\1p\357\377\1p\356\377\1p\356\377\1p\355\377D\222\354\377\353\353\353"
"\377\351\351\351\377\350\350\350\377\347\347\347\366\352\352\352W\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0p\3520\1n\350\317"
"\1m\350\377\1n\351\377\1n\352\377\1o\353\377\1o\354\377\1o\354\377\1p\355"
"\377\1p\356\377\1p\356\377\1p\357\377\1p\357\377\1p\357\377\1p\357\377\1"
"p\357\377\1p\357\377\1p\357\377\1p\357\377\1\227\356\377\1y\356\377\1p\355"
"\377\1o\354\377\1o\354\377\21w\353\377\314\332\352\377\351\351\351\377\350"
"\350\350\377\350\350\350\321\356\356\356,\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0U\377\3\0n\351t\1m\347"
"\362\1m\350\377\1n\351\377\1n\352\377\1o\353\377\1o\353\377\1o\354\377\1"
"o\354\377\1p\355\377\1p\355\377\1p\355\377\1p\355\377\1p\355\377\1p\355\377"
"\1p\355\377\1p\355\377\1q\354\377\1o\354\377\1o\353\377\1o\353\377\14t\352"
"\377\260\313\351\377\350\350\350\377\350\350\350\360\354\354\354w\377\377"
"\377\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0o\346\36\2m\350\235\1m\347\367\1"
"m\350\377\1n\351\377\1n\351\377\1n\352\377\1n\352\377\1o\353\377\1o\353\377"
"\1o\353\377\1o\353\377\1o\353\377\1o\353\377\1o\353\377\1o\353\377\1n\352"
"\377\1n\352\377\1n\351\377-\204\351\377\277\322\350\377\347\347\347\365\350"
"\350\350\231\350\350\350\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0h\350\26\0n\351t\1m\347\314\1m\347\374\1m\350\377\1m"
"\350\377\1n\351\377\1n\351\377\1n\351\377\1n\351\377\1n\351\377\1n\351\377"
"\1n\351\377\1n\351\377\1m\350\377'\201\350\377\206\263\347\375\341\344\347"
"\303\347\347\347j\343\343\343\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0f\335\17"
"\0j\345M\2m\345\210\1m\347\276\1m\347\343\12r\350\371\20u\351\376\24x\351"
"\375)\204\351\374D\221\351\365i\245\352\335\235\302\351\242\344\344\347U"
"\351\351\351\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0",
};
struct sdlappicon sdlappicon = {
48,48,
sdlappicon_pixels
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -0,0 +1,53 @@
#include <windows.h>
#include <commctrl.h>
#include "startwin.game.h"
RSRC_ICON ICON "game_icon.ico"
RSRC_BMP BITMAP "game.bmp"
WIN_STARTWIN DIALOGEX DISCARDABLE 20, 40, 260, 200
STYLE DS_MODALFRAME | DS_CENTER | DS_SETFONT | DS_FIXEDSYS | WS_OVERLAPPED | WS_CAPTION | WS_VISIBLE | WS_SYSMENU
CAPTION "Startup"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", WIN_STARTWIN_BITMAP, "STATIC", SS_BITMAP | WS_CHILD | WS_VISIBLE, 0, 0, 32, 32
CONTROL "", WIN_STARTWIN_TABCTL, WC_TABCONTROL, WS_CLIPSIBLINGS | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 5, 5, 250, 170
CONTROL "&Start", WIN_STARTWIN_START, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 154, 180, 48, 14
CONTROL "&Cancel", WIN_STARTWIN_CANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 207, 180, 48, 14
CONTROL "", WIN_STARTWIN_MESSAGES, "EDIT", ES_MULTILINE | ES_READONLY | WS_CHILD | WS_VSCROLL, 0, 0, 32, 32
END
WIN_STARTWINPAGE_CONFIG DIALOGEX DISCARDABLE 20, 40, 279, 168
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
CAPTION "Dialog"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "&Video mode:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 8, 50, 8
CONTROL "", IDCVMODE, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 60, 6, 80, 56
CONTROL "&Fullscreen", IDCFULLSCREEN, "BUTTON", BS_CHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 148, 8, 49, 10
CONTROL "S&ound quality:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 24, 50, 8
CONTROL "", IDCSOUNDQUAL, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 60, 22, 110, 72
CONTROL "Input devices:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 50, 50, 8
CONTROL "Mo&use", IDCINPUTMOUSE, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 60, 50, 49, 8
CONTROL "&Joystick", IDCINPUTJOY, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 110, 50, 49, 8
CONTROL "&Always show configuration on start", IDCALWAYSSHOW, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 118, 116, 140, 8
END
WIN_STARTWINPAGE_GAME DIALOGEX DISCARDABLE 20, 40, 279, 168
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
CAPTION "Dialog"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "&Game or addon:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 5, 100, 8
CONTROL "", IDGDATA, "LISTBOX", LBS_NOINTEGRALHEIGHT | LBS_USETABSTOPS | LBS_SORT | WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP, 10, 15, 226, 50
END
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
1 24 "64/manifest.game.xml"
#else
1 24 "32/manifest.game.xml"
#endif

View file

@ -0,0 +1,37 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 2013 Jonathon Fowler <jf@jonof.id.au>
This file is part of JFShadowWarrior
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
@interface GameListSource : NSObject <NSComboBoxDataSource>
{
NSMutableArray *list;
}
- (id)init;
- (void)dealloc;
- (GrpFile *)grpAtIndex:(int)index;
- (int)findIndexForGrpname:(NSString *)grpname;
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(NSInteger)rowIndex;
- (int)numberOfRowsInTableView:(NSTableView *)aTableView;
@end

View file

@ -0,0 +1,89 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 2013 Jonathon Fowler <jf@jonof.id.au>
This file is part of JFShadowWarrior
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
#import <Cocoa/Cocoa.h>
#import "GrpFile.game.h"
#import "GameListSource.game.h"
@implementation GameListSource
- (id)init
{
self = [super init];
if (self) {
struct grpfile *p;
int i;
list = [[NSMutableArray alloc] init];
for (p = foundgrps; p; p=p->next) {
for (i=0; i<numgrpfiles; i++) if (p->crcval == grpfiles[i].crcval) break;
if (i == numgrpfiles) continue;
[list addObject:[[GrpFile alloc] initWithGrpfile:p andName:[NSString stringWithUTF8String:grpfiles[i].name]]];
}
}
return self;
}
- (void)dealloc
{
[list release];
[super dealloc];
}
- (GrpFile*)grpAtIndex:(int)index
{
return [list objectAtIndex:index];
}
- (int)findIndexForGrpname:(NSString*)grpname
{
unsigned i;
for (i=0; i<[list count]; i++) {
if ([[[list objectAtIndex:i] grpname] isEqual:grpname]) return i;
}
return -1;
}
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(NSInteger)rowIndex
{
NSParameterAssert(rowIndex >= 0 && rowIndex < [list count]);
switch ([[aTableColumn identifier] intValue]) {
case 0: // name column
return [[list objectAtIndex:rowIndex] name];
case 1: // grp column
return [[list objectAtIndex:rowIndex] grpname];
default: return nil;
}
}
- (int)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [list count];
}
@end

View file

@ -0,0 +1,40 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 2013 Jonathon Fowler <jf@jonof.id.au>
This file is part of JFShadowWarrior
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
#import <Cocoa/Cocoa.h>
#include "grpscan.h"
@interface GrpFile : NSObject
{
NSString *name;
struct grpfile *fg;
}
- (id)initWithGrpfile:(struct grpfile *)grpfile andName:(NSString *)aName;
- (void)dealloc;
- (NSString *)name;
- (NSString *)grpname;
- (struct grpfile *)entryptr;
@end

View file

@ -0,0 +1,54 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 2013 Jonathon Fowler <jf@jonof.id.au>
This file is part of JFShadowWarrior
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
#include "GrpFile.game.h"
@implementation GrpFile
- (id)initWithGrpfile:(struct grpfile *)grpfile andName:(NSString*)aName
{
self = [super init];
if (self) {
fg = grpfile;
name = aName;
[aName retain];
}
return self;
}
- (void)dealloc
{
[name release];
[super dealloc];
}
- (NSString *)name
{
return name;
}
- (NSString *)grpname
{
return [NSString stringWithUTF8String:(fg->name)];
}
- (struct grpfile *)entryptr
{
return fg;
}
@end

View file

@ -0,0 +1,463 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 2007 Jonathon Fowler <jf@jonof.id.au>
This file is part of JFShadowWarrior
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
#import <Cocoa/Cocoa.h>
#include "compat.h"
#include "types.h"
#include "build.h"
#include "baselayer.h"
#include "grpscan.h"
#include "gamedefs.h"
#include "config.h"
#import "GrpFile.game.h"
#import "GameListSource.game.h"
static struct {
int fullscreen;
int xdim3d, ydim3d, bpp3d;
int forcesetup;
char selectedgrp[BMAX_PATH+1];
int samplerate, bitspersample, channels;
int usemouse, usejoystick;
} settings;
static struct soundQuality_t {
int frequency;
int samplesize;
int channels;
} * soundQualities = 0;
@interface StartupWinController : NSWindowController
{
NSMutableArray *modeslist3d;
GameListSource *gamelistsrc;
IBOutlet NSButton *alwaysShowButton;
IBOutlet NSButton *fullscreenButton;
IBOutlet NSButton *useMouseButton;
IBOutlet NSButton *useJoystickButton;
IBOutlet NSTextView *messagesView;
IBOutlet NSTabView *tabView;
IBOutlet NSPopUpButton *videoMode3DPUButton;
IBOutlet NSPopUpButton *soundQualityPUButton;
IBOutlet NSScrollView *gameList;
IBOutlet NSButton *cancelButton;
IBOutlet NSButton *startButton;
}
- (void)dealloc;
- (void)populateVideoModes:(BOOL)firstTime;
- (void)populateSoundQuality:(BOOL)firstTime;
- (IBAction)alwaysShowClicked:(id)sender;
- (IBAction)fullscreenClicked:(id)sender;
- (IBAction)cancel:(id)sender;
- (IBAction)start:(id)sender;
- (void)setupRunMode;
- (void)setupMessagesMode;
- (void)putsMessage:(NSString *)str;
- (void)setTitle:(NSString *)str;
@end
@implementation StartupWinController
- (void)dealloc
{
[gamelistsrc release];
[modeslist3d release];
[super dealloc];
}
- (void)populateVideoModes:(BOOL)firstTime
{
int i, mode3d, fullscreen = ([fullscreenButton state] == NSOnState);
int idx3d = -1;
int xdim, ydim, bpp;
if (firstTime) {
xdim = settings.xdim3d;
ydim = settings.ydim3d;
bpp = settings.bpp3d;
} else {
mode3d = [[modeslist3d objectAtIndex:[videoMode3DPUButton indexOfSelectedItem]] intValue];
if (mode3d >= 0) {
xdim = validmode[mode3d].xdim;
ydim = validmode[mode3d].ydim;
bpp = validmode[mode3d].bpp;
}
}
mode3d = checkvideomode(&xdim, &ydim, bpp, fullscreen, 1);
if (mode3d < 0) {
int i, cd[] = { 32, 24, 16, 15, 8, 0 };
for (i=0; cd[i]; ) { if (cd[i] >= bpp) i++; else break; }
for ( ; cd[i]; i++) {
mode3d = checkvideomode(&xdim, &ydim, cd[i], fullscreen, 1);
if (mode3d < 0) continue;
break;
}
}
[modeslist3d release];
[videoMode3DPUButton removeAllItems];
modeslist3d = [[NSMutableArray alloc] init];
for (i = 0; i < validmodecnt; i++) {
if (fullscreen == validmode[i].fs) {
if (i == mode3d) idx3d = [modeslist3d count];
[modeslist3d addObject:[NSNumber numberWithInt:i]];
[videoMode3DPUButton addItemWithTitle:[NSString stringWithFormat:@"%d %C %d %d-bpp",
validmode[i].xdim, 0xd7, validmode[i].ydim, validmode[i].bpp]];
}
}
if (idx3d >= 0) [videoMode3DPUButton selectItemAtIndex:idx3d];
}
- (void)populateSoundQuality:(BOOL)firstTime
{
int i, curidx = -1;
[soundQualityPUButton removeAllItems];
for (i = 0; soundQualities[i].frequency > 0; i++) {
const char *ch;
switch (soundQualities[i].channels) {
case 1: ch = "Mono"; break;
case 2: ch = "Stereo"; break;
default: ch = "?"; break;
}
NSString *s = [NSString stringWithFormat:@"%dkHz, %d-bit, %s",
soundQualities[i].frequency / 1000,
soundQualities[i].samplesize,
ch
];
[soundQualityPUButton addItemWithTitle:s];
if (firstTime &&
soundQualities[i].frequency == settings.samplerate &&
soundQualities[i].samplesize == settings.bitspersample &&
soundQualities[i].channels == settings.channels) {
curidx = i;
}
}
if (firstTime && curidx < 0) {
soundQualities[i].frequency = settings.samplerate;
soundQualities[i].samplesize = settings.bitspersample;
soundQualities[i].channels = settings.channels;
const char *ch;
switch (soundQualities[i].channels) {
case 1: ch = "Mono"; break;
case 2: ch = "Stereo"; break;
default: ch = "?"; break;
}
NSString *s = [NSString stringWithFormat:@"%dkHz, %d-bit, %s",
soundQualities[i].frequency / 1000,
soundQualities[i].samplesize,
ch
];
[soundQualityPUButton addItemWithTitle:s];
curidx = i++;
soundQualities[i].frequency = -1;
}
if (curidx >= 0) {
[soundQualityPUButton selectItemAtIndex:curidx];
}
}
- (IBAction)alwaysShowClicked:(id)sender
{
}
- (IBAction)fullscreenClicked:(id)sender
{
[self populateVideoModes:NO];
}
- (IBAction)cancel:(id)sender
{
[NSApp abortModal];
}
- (IBAction)start:(id)sender
{
int mode = [[modeslist3d objectAtIndex:[videoMode3DPUButton indexOfSelectedItem]] intValue];
if (mode >= 0) {
settings.xdim3d = validmode[mode].xdim;
settings.ydim3d = validmode[mode].ydim;
settings.bpp3d = validmode[mode].bpp;
settings.fullscreen = validmode[mode].fs;
}
int quality = [soundQualityPUButton indexOfSelectedItem];
if (quality >= 0) {
settings.samplerate = soundQualities[quality].frequency;
settings.bitspersample = soundQualities[quality].samplesize;
settings.channels = soundQualities[quality].channels;
}
int row = [[gameList documentView] selectedRow];
if (row >= 0) {
struct grpfile *p = [[gamelistsrc grpAtIndex:row] entryptr];
if (p) {
strcpy(settings.selectedgrp, p->name);
}
}
settings.usemouse = [useMouseButton state] == NSOnState;
settings.usejoystick = [useJoystickButton state] == NSOnState;
settings.forcesetup = [alwaysShowButton state] == NSOnState;
[NSApp stopModal];
}
- (void)setupRunMode
{
getvalidmodes();
[fullscreenButton setState: (settings.fullscreen ? NSOnState : NSOffState)];
[alwaysShowButton setState: (settings.forcesetup ? NSOnState : NSOffState)];
[useMouseButton setState: (settings.usemouse ? NSOnState : NSOffState)];
[useJoystickButton setState: (settings.usejoystick ? NSOnState : NSOffState)];
[self populateVideoModes:YES];
[self populateSoundQuality:YES];
// enable all the controls on the Configuration page
NSEnumerator *enumerator = [[[[tabView tabViewItemAtIndex:0] view] subviews] objectEnumerator];
NSControl *control;
while ((control = [enumerator nextObject])) {
[control setEnabled:true];
}
gamelistsrc = [[GameListSource alloc] init];
[[gameList documentView] setDataSource:gamelistsrc];
[[gameList documentView] deselectAll:nil];
int row = [gamelistsrc findIndexForGrpname:[NSString stringWithUTF8String:settings.selectedgrp]];
if (row >= 0) {
[[gameList documentView] scrollRowToVisible:row];
[[gameList documentView] selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
}
[cancelButton setEnabled:true];
[startButton setEnabled:true];
[tabView selectTabViewItemAtIndex:0];
[NSCursor unhide]; // Why should I need to do this?
}
- (void)setupMessagesMode
{
[tabView selectTabViewItemAtIndex:2];
// disable all the controls on the Configuration page except "always show", so the
// user can enable it if they want to while waiting for something else to happen
NSEnumerator *enumerator = [[[[tabView tabViewItemAtIndex:0] view] subviews] objectEnumerator];
NSControl *control;
while ((control = [enumerator nextObject])) {
if (control == alwaysShowButton) continue;
[control setEnabled:false];
}
[cancelButton setEnabled:false];
[startButton setEnabled:false];
}
- (void)putsMessage:(NSString *)str
{
NSRange end;
NSTextStorage *text = [messagesView textStorage];
BOOL shouldAutoScroll;
shouldAutoScroll = ((int)NSMaxY([messagesView bounds]) == (int)NSMaxY([messagesView visibleRect]));
end.location = [text length];
end.length = 0;
[text beginEditing];
[messagesView replaceCharactersInRange:end withString:str];
[text endEditing];
if (shouldAutoScroll) {
end.location = [text length];
end.length = 0;
[messagesView scrollRangeToVisible:end];
}
}
- (void)setTitle:(NSString *)str
{
[[self window] setTitle:str];
}
@end
static StartupWinController *startwin = nil;
int startwin_open(void)
{
if (startwin != nil) return 1;
startwin = [[StartupWinController alloc] initWithWindowNibName:@"startwin.game"];
if (startwin == nil) return -1;
{
static unsigned soundQualityFrequencies[] = { 44100, 22050, 11025 };
static unsigned soundQualitySampleSizes[] = { 16, 8 };
static unsigned soundQualityChannels[] = { 2, 1 };
unsigned f, b, c, i;
i = sizeof(soundQualityFrequencies) *
sizeof(soundQualitySampleSizes) *
sizeof(soundQualityChannels) /
sizeof(int) + 2; // one for the terminator, one for a custom setting
soundQualities = (struct soundQuality_t *) malloc(i * sizeof(struct soundQuality_t));
i = 0;
for (c = 0; c < sizeof(soundQualityChannels) / sizeof(int); c++) {
for (b = 0; b < sizeof(soundQualitySampleSizes) / sizeof(int); b++) {
for (f = 0; f < sizeof(soundQualityFrequencies) / sizeof(int); f++) {
soundQualities[i].frequency = soundQualityFrequencies[f];
soundQualities[i].samplesize = soundQualitySampleSizes[b];
soundQualities[i].channels = soundQualityChannels[c];
i++;
}
}
}
soundQualities[i].frequency = -1;
}
[startwin setupMessagesMode];
[startwin showWindow:nil];
return 0;
}
int startwin_close(void)
{
if (startwin == nil) return 1;
[startwin close];
[startwin release];
startwin = nil;
return 0;
}
int startwin_puts(const char *s)
{
NSString *ns;
if (!s) return -1;
if (startwin == nil) return 1;
ns = [[NSString alloc] initWithCString:s];
[startwin putsMessage:ns];
[ns release];
return 0;
}
int startwin_settitle(const char *s)
{
NSString *ns;
if (!s) return -1;
if (startwin == nil) return 1;
ns = [[NSString alloc] initWithCString:s];
[startwin setTitle:ns];
[ns release];
return 0;
}
int startwin_idle(void *v)
{
if (startwin) [[startwin window] displayIfNeeded];
return 0;
}
extern char* grpfile;
extern int32 ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, ForceSetup, UseMouse, UseJoystick;
int startwin_run(void)
{
int retval;
if (startwin == nil) return 0;
ScanGroups();
settings.fullscreen = ScreenMode;
settings.xdim3d = ScreenWidth;
settings.ydim3d = ScreenHeight;
settings.bpp3d = ScreenBPP;
settings.samplerate = MixRate;
settings.bitspersample = NumBits;
settings.channels = NumChannels;
settings.usemouse = UseMouse;
settings.usejoystick = UseJoystick;
settings.forcesetup = ForceSetup;
strncpy(settings.selectedgrp, grpfile, BMAX_PATH);
[startwin setupRunMode];
switch ([NSApp runModalForWindow:[startwin window]]) {
case NSRunStoppedResponse: retval = 1; break;
case NSRunAbortedResponse: retval = 0; break;
default: retval = -1;
}
[startwin setupMessagesMode];
if (retval) {
ScreenMode = settings.fullscreen;
ScreenWidth = settings.xdim3d;
ScreenHeight = settings.ydim3d;
ScreenBPP = settings.bpp3d;
MixRate = settings.samplerate;
NumBits = settings.bitspersample;
NumChannels = settings.channels;
UseMouse = settings.usemouse;
UseJoystick = settings.usejoystick;
ForceSetup = settings.forcesetup;
grpfile = settings.selectedgrp;
}
return retval;
}

View file

@ -0,0 +1,34 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef config_private_
#define config_private_
//#define SETUPFILENAME "SW.CFG"
#endif

View file

@ -0,0 +1,382 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
// _functio.h
// file created by makehead.exe
// these headers contain default key assignments, as well as
// default button assignments and game function names
// axis defaults are also included
#ifndef function_private_
#define function_private_
char *gamefunctions[] =
{
"Move_Forward",
"Move_Backward",
"Turn_Left",
"Turn_Right",
"Strafe",
"Fire",
"Open",
"Run",
"AutoRun",
"Jump",
"Crouch",
"Look_Up",
"Look_Down",
"Strafe_Left",
"Strafe_Right",
"Aim_Up",
"Aim_Down",
"Weapon_1",
"Weapon_2",
"Weapon_3",
"Weapon_4",
"Weapon_5",
"Weapon_6",
"Weapon_7",
"Weapon_8",
"Weapon_9",
"Weapon_10",
"Inventory",
"Inventory_Left",
"Inventory_Right",
"Med_Kit",
"Smoke_Bomb",
"Night_Vision",
"Gas_Bomb",
"Flash_Bomb",
"Caltrops",
"TurnAround",
"SendMessage",
"Map",
"Shrink_Screen",
"Enlarge_Screen",
"Center_View",
"Holster_Weapon",
"Map_Follow_Mode",
"See_Co_Op_View",
"Mouse_Aiming",
"Toggle_Crosshair",
"Next_Weapon",
"Previous_Weapon",
"Show_Menu",
"Show_Console",
};
#define NUMKEYENTRIES 50
static char *keydefaults[] =
{
"Move_Forward", "Up", "Kpad8",
"Move_Backward", "Down", "Kpad2",
"Turn_Left", "Left", "Kpad4",
"Turn_Right", "Right", "KPad6",
"Strafe", "LAlt", "RAlt",
"Fire", "LCtrl", "RCtrl",
"Open", "Space", "",
"Run", "LShift", "RShift",
"AutoRun", "CapLck", "",
"Jump", "A", "/",
"Crouch", "Z", "",
"Look_Up", "PgUp", "Kpad9",
"Look_Down", "PgDn", "Kpad3",
"Strafe_Left", ",", "",
"Strafe_Right", ".", "",
"Aim_Up", "Home", "KPad7",
"Aim_Down", "End", "Kpad1",
"Weapon_1", "1", "",
"Weapon_2", "2", "",
"Weapon_3", "3", "",
"Weapon_4", "4", "",
"Weapon_5", "5", "",
"Weapon_6", "6", "",
"Weapon_7", "7", "",
"Weapon_8", "8", "",
"Weapon_9", "9", "",
"Weapon_10", "0", "",
"Inventory", "Enter", "KpdEnt",
"Inventory_Left", "[", "",
"Inventory_Right", "]", "",
"Med_Kit", "M", "",
"Smoke_Bomb", "S", "",
"Night_Vision", "N", "",
"Gas_Bomb", "G", "",
"Flash_Bomb", "F", "",
"Caltrops", "C", "",
"TurnAround", "BakSpc", "",
"SendMessage", "T", "",
"Map", "Tab", "",
"Shrink_Screen", "-", "Kpad-",
"Enlarge_Screen", "=", "Kpad+",
"Center_View", "KPad5", "",
"Holster_Weapon", "ScrLck", "",
"Map_Follow_Mode", "F", "",
"See_Co_Op_View", "K", "",
"Mouse_Aiming", "U", "",
"Toggle_Crosshair", "I", "",
"Next_Weapon", "'", "",
"Previous_Weapon", ";", "",
"Show_Console", "NumLck", "",
};
static char *keydefaults_modern[] =
{
"Move_Forward", "W", "",
"Move_Backward", "S", "",
"Turn_Left", "", "",
"Turn_Right", "", "",
"Strafe", "", "",
"Fire", "", "",
"Open", "E", "",
"Run", "LShift", "",
"AutoRun", "CapLck", "",
"Jump", "Space", "",
"Crouch", "LAlt", "",
"Look_Up", "", "",
"Look_Down", "", "",
"Strafe_Left", "A", "",
"Strafe_Right", "D", "",
"Aim_Up", "", "",
"Aim_Down", "", "",
"Weapon_1", "1", "",
"Weapon_2", "2", "",
"Weapon_3", "3", "",
"Weapon_4", "4", "",
"Weapon_5", "5", "",
"Weapon_6", "6", "",
"Weapon_7", "7", "",
"Weapon_8", "8", "",
"Weapon_9", "9", "",
"Weapon_10", "0", "",
"Inventory", "Enter", "",
"Inventory_Left", "[", "",
"Inventory_Right", "]", "",
"Med_Kit", "M", "",
"Smoke_Bomb", "B", "",
"Night_Vision", "N", "",
"Gas_Bomb", "G", "",
"Flash_Bomb", "F", "",
"Caltrops", "C", "",
"TurnAround", "BakSpc", "",
"SendMessage", "T", "",
"Map", "Tab", "",
"Shrink_Screen", "-", "",
"Enlarge_Screen", "=", "",
"Center_View", "", "",
"Holster_Weapon", "H", "",
"Map_Follow_Mode", "F", "",
"See_Co_Op_View", "K", "",
"Mouse_Aiming", "U", "",
"Toggle_Crosshair", "I", "",
"Next_Weapon", "", "",
"Previous_Weapon", "", "",
"Show_Console", "NumLck", "",
};
static char *mousedefaults[] =
{
"Fire",
"Strafe",
"Move_Forward",
"",
""
};
static char *mousedefaults_modern[] =
{
"Fire",
"Open",
"",
"",
"Next_Weapon",
"Previous_Weapon"
};
static char *mouseclickeddefaults[] =
{
"",
"Open",
"",
"",
""
};
static char *mouseclickeddefaults_modern[] =
{
"",
"",
"",
"",
"",
""
};
static char *joystickdefaults[] =
{
"Fire",
"Strafe",
"Run",
"Open",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"Aim_Down",
"Look_Right",
"Aim_Up",
"Look_Left",
};
static char *joystickclickeddefaults[] =
{
"",
"Inventory",
"Jump",
"Crouch",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
};
static char *mouseanalogdefaults[] =
{
"analog_turning",
"analog_moving",
};
static char *mousedigitaldefaults[] =
{
"",
"",
"",
"",
};
static char *gamepaddigitaldefaults[] =
{
"Turn_Left",
"Turn_Right",
"Move_Forward",
"Move_Backward",
};
static char *joystickanalogdefaults[] =
{
"analog_turning",
"analog_moving",
"analog_strafing",
"",
"",
"",
"",
"",
};
static char *joystickdigitaldefaults[] =
{
"",
"",
"",
"",
"",
"",
"Run",
"",
"",
"",
"",
"",
"",
"",
"",
"",
};
#endif

View file

@ -0,0 +1,79 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2003 - 3D Realms Entertainment
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
Duke Nukem 3D is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1996 - Todd Replogle
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef rts_private__
#define rts_private__
//===============
// TYPES
//===============
typedef struct
{
char name[8];
int32 handle,position,size;
} lumpinfo_t;
typedef struct
{
char identification[4]; // should be IWAD
int32 numlumps;
int32 infotableofs;
} wadinfo_t;
typedef struct
{
int32 filepos;
int32 size;
char name[8];
} filelump_t;
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,8 @@
int DoBeginJump(short SpriteNum);
int DoJump(short SpriteNum);
int DoBeginFall(short SpriteNum);
int DoFall(short SpriteNum);
void KeepActorOnFloor(short SpriteNum);
int DoActorSlide(short SpriteNum);
int DoActorSectorDamage(short SpriteNum);
int DoScaleSprite(short SpriteNum);

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,166 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef AI_H
#define AI_H
// Call functions based on a random range value
typedef struct
{
short range;
ANIMATORp action;
} DECISION, *DECISIONp;
// Personality structure
struct PERSONALITYstruct
{
DECISIONp Battle;
DECISIONp Offense;
DECISIONp Broadcast;
DECISIONp Surprised;
DECISIONp Evasive;
DECISIONp LostTarget;
DECISIONp CloseRange;
DECISIONp TouchTarget;
};
enum ActorStates { SLOW_SPEED, NORM_SPEED, MID_SPEED, FAST_SPEED, MAX_SPEED};
#define MAXATTRIBSNDS 11
typedef enum
{
attr_ambient, attr_alert, attr_attack, attr_pain, attr_die,
attr_extra1, attr_extra2, attr_extra3,attr_extra4,attr_extra5,
attr_extra6
} ATTRIB_SNDS;
struct ATTRIBUTEstruct
{
short Speed[MAX_SPEED];
CHAR TicAdjust[MAX_SPEED];
BYTE MaxWeapons;
/*ATTRIB_SNDS*/ int Sounds[MAXATTRIBSNDS]; // JBF: ATTRIB_SNDS? Somehow I don't think this is what was intended...
};
extern ATTRIBUTE DefaultAttrib;
// AI.C functions
void DebugMoveHit(short SpriteNum);
BOOL ActorMoveHitReact(short SpriteNum);
BOOL ActorFlaming(short SpriteNum);
void DoActorSetSpeed(short SpriteNum,BYTE speed);
short ChooseActionNumber(short decision[]);
int DoActorNoise(ANIMATORp Action,short SpriteNum);
int CanSeePlayer(short SpriteNum);
int CanHitPlayer(short SpriteNum);
int DoActorPickClosePlayer(short SpriteNum);
int CloseRangeDist(SPRITEp sp1,SPRITEp sp2);
int InitActorDecide(short SpriteNum);
int DoActorDecide(short SpriteNum);
int InitActorAlertNoise(short SpriteNum);
int InitActorAmbientNoise(short SpriteNum);
int InitActorAttackNoise(short SpriteNum);
int InitActorPainNoise(short SpriteNum);
int InitActorDieNoise(short SpriteNum);
int InitActorExtra1Noise(short SpriteNum);
int InitActorExtra2Noise(short SpriteNum);
int InitActorExtra3Noise(short SpriteNum);
int InitActorExtra4Noise(short SpriteNum);
int InitActorExtra5Noise(short SpriteNum);
int InitActorExtra6Noise(short SpriteNum);
int InitActorMoveCloser(short SpriteNum);
int DoActorCantMoveCloser(short SpriteNum);
int DoActorMoveCloser(short SpriteNum);
short FindTrackToPlayer(USERp u);
short FindTrackAwayFromPlayer(USERp u);
short FindWanderTrack(USERp u);
int InitActorRunAway(short SpriteNum);
int InitActorRunToward(short SpriteNum);
int InitActorAttack(short SpriteNum);
int DoActorAttack(short SpriteNum);
int InitActorEvade(short SpriteNum);
int InitActorWanderAround(short SpriteNum);
int InitActorFindPlayer(short SpriteNum);
int InitActorDuck(short SpriteNum);
int DoActorDuck(short SpriteNum);
int DoActorMoveJump(short SpriteNum);
int move_scan(short SpriteNum,short ang,int dist,int *stopx,int *stopy,int *stopz,short *stopsect);
int FindNewAngle(short SpriteNum,signed char dir,int DistToMove);
int InitActorReposition(short SpriteNum);
int DoActorReposition(short SpriteNum);
int InitActorPause(short SpriteNum);
int DoActorPause(short SpriteNum);
/*
ANIMATOR
InitActorDecide,
InitActorMoveCloser,
InitActorAttack,
InitActorRunAway,
InitActorEvade,
InitActorWanderAround,
InitActorFindPlayer,
InitActorReposition,
InitActorPause,
InitActorDuck,
InitActorAmbientNoise,
InitActorAlertNoise,
InitActorAttackNoise,
InitActorPainNoise,
InitActorDieNoise,
InitActorExtra1Noise,
InitActorExtra2Noise,
InitActorExtra3Noise,
InitActorExtra4Noise,
InitActorExtra5Noise,
InitActorExtra6Noise;
ANIMATOR
DoActorDecide,
DoActorMoveCloser,
DoActorAttack,
DoActorRunAway,
DoActorWanderAround,
DoActorReposition,
DoActorPause,
DoActorDuck,
DoActorAmbientNoise,
DoActorAlertNoise,
DoActorAttackNoise,
DoActorPainNoise,
DoActorDieNoise,
DoActorExtra1Noise,
DoActorExtra2Noise,
DoActorExtra3Noise,
DoActorExtra4Noise,
DoActorExtra5Noise,
DoActorExtra6Noise;
*/
VOID DoActorSetSpeed(short SpriteNum, BYTE speed);
#endif

View file

@ -0,0 +1,215 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifdef AMBIENT_TABLE
#define AMB_ENTRY(name, diginame, ambient_flags, maxtics) {name, diginame, ambient_flags, maxtics},
#endif
#ifdef AMBIENT_ENUM
#define AMB_ENTRY(name, diginame, ambient_flags, maxtics) name,
#endif
// Ambient Flags, flags can be added whenever needed, up to 16 bits
#define AMB_NONE 0
#define AMB_FOLLOW 1 // 1 = Do coordinate updates on sound
// Use this only if the sprite won't be deleted soon
#define AMB_DOPPLER 4 // 1 = Don't use doppler pitch variance
#define AMB_PAN 8 // 1 = Don't do panning of sound
#define AMB_INTERMIT 32 // 1 = This is a non-looping intermittant sound
// Tic counts used for intermittent sounds
#define AMB_TICRATE 12 // 120/10 since it's only called 10x per second
#define AMB_NOTICS 0
#define AMB_5 5 *AMB_TICRATE
#define AMB_10 10*AMB_TICRATE // AMB_TICRATE is the game's tic rate
#define AMB_15 15*AMB_TICRATE
#define AMB_20 20*AMB_TICRATE
#define AMB_30 30*AMB_TICRATE
#define AMB_45 45*AMB_TICRATE
#define AMB_60 60*AMB_TICRATE
#define AMB_120 120*AMB_TICRATE
// BUBBLES
AMB_ENTRY(0, DIGI_BUBBLES, AMB_PAN, AMB_NOTICS)
// CRICKETS
AMB_ENTRY(1, DIGI_CRICKETS, AMB_PAN, AMB_NOTICS)
// AMBIENT WATER DRIPPING IN CAVE
AMB_ENTRY(2, DIGI_CAVEDRIP1, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(3, DIGI_CAVEDRIP2, AMB_INTERMIT, AMB_10)
AMB_ENTRY(4, DIGI_DRIP, AMB_PAN|AMB_INTERMIT, AMB_20)
// WATER FALL
AMB_ENTRY(5, DIGI_WATERFALL1, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(6, DIGI_WATERFALL2, AMB_NONE, AMB_NOTICS)
// WATER FLOWING
AMB_ENTRY(7, DIGI_WATERFLOW1, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(8, DIGI_WATERFLOW2, AMB_NONE, AMB_NOTICS)
// CRACKLING FIRE FOR CONTINUOUS BURN
AMB_ENTRY(9, DIGI_FIRE1, AMB_NONE, AMB_NOTICS)
// POWERFULL HIGH HEAT CONTINUOUS BURN
AMB_ENTRY(10, DIGI_FIRE2, AMB_NONE, AMB_NOTICS)
// AMBIENT GONG FOR USE IN TEMPLE/PALACE LEVELS
AMB_ENTRY(11, DIGI_GONG, AMB_INTERMIT, AMB_120)
// AMBIENT LAVA FLOW
AMB_ENTRY(12, DIGI_LAVAFLOW1, AMB_NONE, AMB_NOTICS)
// AMBIENT MUD BUBBLES
AMB_ENTRY(13, DIGI_MUBBUBBLES1, AMB_NONE, AMB_NOTICS)
// AMBIENT EARTH QUAKE
AMB_ENTRY(14, DIGI_EARTHQUAKE, AMB_NONE, AMB_NOTICS)
// YUCKY SEWER FLOW
AMB_ENTRY(15, DIGI_SEWERFLOW1, AMB_NONE, AMB_NOTICS)
// STEAM FLOW
AMB_ENTRY(16, DIGI_STEAM1, AMB_NONE, AMB_NOTICS)
// VOLCANIC STEAM VENT
AMB_ENTRY(17, DIGI_VOLCANOSTEAM1, AMB_NONE, AMB_NOTICS)
// SCARY AMBIENT SWAMP SOUNDS
AMB_ENTRY(18, DIGI_SWAMP, AMB_NONE, AMB_NOTICS)
// AMBIENT ROLLING THUNDER
AMB_ENTRY(19, DIGI_THUNDER, AMB_PAN|AMB_INTERMIT, AMB_60)
// UNDERWATER AMBIENCE
AMB_ENTRY(20, DIGI_UNDERWATER, AMB_PAN, AMB_NOTICS)
// SPOOKY ETHERAL VOID AMBIENCE (NETHERWORLDLY SOUNDS)
AMB_ENTRY(21, DIGI_VOID1, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(22, DIGI_VOID2, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(23, DIGI_VOID3, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(24, DIGI_VOID4, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(25, DIGI_VOID5, AMB_NONE, AMB_NOTICS)
// VOLCANIC ERUPTION
AMB_ENTRY(26, DIGI_ERUPTION, AMB_NONE, AMB_NOTICS)
// VOLCANIC SIZZLING PROJECTILES FLYING THROUGH AIR
AMB_ENTRY(27, DIGI_VOLCANOPROJECTILE, AMB_NONE, AMB_NOTICS)
// LIGHT WIND AMBIENCE
AMB_ENTRY(28, DIGI_LIGHTWIND, AMB_NONE, AMB_NOTICS)
// STRONG BLOWING WIND AMBIENCE
AMB_ENTRY(29, DIGI_STRONGWIND, AMB_PAN|AMB_INTERMIT, AMB_20)
// BREAKING WOOD AMBIENCE
AMB_ENTRY(30, DIGI_BREAKINGWOOD, AMB_INTERMIT, AMB_120)
// BREAKING, TUMBLING STONES FALLING AMBIENCE
AMB_ENTRY(31, DIGI_BREAKSTONES, AMB_NONE, AMB_NOTICS)
// MOTOR BOAT
AMB_ENTRY(32, DIGI_NULL, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(33, DIGI_NULL, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(34, DIGI_NULL, AMB_NONE, AMB_NOTICS)
// WWII JAP ARMY TANK
AMB_ENTRY(35, DIGI_NULL, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(36, DIGI_NULL, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(37, DIGI_NULL, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(38, DIGI_NULL, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(39, DIGI_NULL, AMB_NONE, AMB_NOTICS)
// WWII JAP BOMBER PLANE
AMB_ENTRY(40, DIGI_BOMBRFLYING, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(41, DIGI_BOMBRDROPBOMB, AMB_NONE, AMB_NOTICS)
// GIANT DRILL MACHINE
AMB_ENTRY(42, DIGI_DRILL, AMB_NONE, AMB_NOTICS)
// SECTOR GEAR COG TURNING
AMB_ENTRY(43, DIGI_GEAR1, AMB_NONE, AMB_NOTICS)
// GENERIC SECTOR OBJECT MACHINE RUNNING
AMB_ENTRY(44, DIGI_MACHINE1, AMB_NONE, AMB_NOTICS)
// ENGINE ROOM
AMB_ENTRY(45, DIGI_ENGROOM1, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(46, DIGI_ENGROOM2, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(47, DIGI_ENGROOM3, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(48, DIGI_ENGROOM4, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(49, DIGI_ENGROOM5, AMB_NONE, AMB_NOTICS)
// HELICOPTER, SPINNING BLADE SOUND
AMB_ENTRY(50, DIGI_HELI, AMB_NONE, AMB_NOTICS)
// ECHOING HEART
AMB_ENTRY(51, DIGI_BIGHART, AMB_NONE, AMB_NOTICS)
// ETHERAL WIND
AMB_ENTRY(52, DIGI_WIND4, AMB_NONE, AMB_NOTICS)
// SPOOKY SINE WAVE
AMB_ENTRY(53, DIGI_SPOOKY1, AMB_NONE, AMB_NOTICS)
// JET ENGINE
AMB_ENTRY(54, DIGI_JET, AMB_NONE, AMB_NOTICS)
// CEREMONIAL DRUM CHANT
AMB_ENTRY(55, DIGI_DRUMCHANT, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(56, DIGI_ASIREN1, AMB_INTERMIT, AMB_45)
AMB_ENTRY(57, DIGI_FIRETRK1, AMB_INTERMIT, AMB_60)
AMB_ENTRY(58, DIGI_TRAFFIC1, AMB_INTERMIT, AMB_60)
AMB_ENTRY(59, DIGI_TRAFFIC2, AMB_INTERMIT, AMB_60)
AMB_ENTRY(60, DIGI_TRAFFIC3, AMB_INTERMIT, AMB_60)
AMB_ENTRY(61, DIGI_TRAFFIC4, AMB_INTERMIT, AMB_60)
AMB_ENTRY(62, DIGI_TRAFFIC5, AMB_INTERMIT, AMB_30)
AMB_ENTRY(63, DIGI_TRAFFIC6, AMB_INTERMIT, AMB_60)
AMB_ENTRY(64, DIGI_HELI1, AMB_INTERMIT, AMB_120)
AMB_ENTRY(65, DIGI_JET1, AMB_INTERMIT, AMB_120)
AMB_ENTRY(66, DIGI_MOTO1, AMB_INTERMIT, AMB_45)
AMB_ENTRY(67, DIGI_MOTO2, AMB_INTERMIT, AMB_60)
AMB_ENTRY(68, DIGI_NEON1, AMB_INTERMIT, AMB_5)
AMB_ENTRY(69, DIGI_SUBWAY, AMB_INTERMIT, AMB_30)
AMB_ENTRY(70, DIGI_TRAIN1, AMB_INTERMIT, AMB_120)
AMB_ENTRY(71, DIGI_BIRDS1, AMB_INTERMIT, AMB_10)
AMB_ENTRY(72, DIGI_BIRDS2, AMB_INTERMIT, AMB_10)
AMB_ENTRY(73, DIGI_AMOEBA, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(74, DIGI_TRAIN3, AMB_INTERMIT, AMB_120)
AMB_ENTRY(75, DIGI_TRAIN8, AMB_INTERMIT, AMB_120)
AMB_ENTRY(76, DIGI_WHIPME, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(77, DIGI_FLAGWAVE, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(78, DIGI_ANIMECRY, AMB_NONE, AMB_NOTICS)
AMB_ENTRY(79, DIGI_WINDCHIMES, AMB_INTERMIT, AMB_10)
AMB_ENTRY(80, DIGI_BOATCREAK, AMB_INTERMIT, AMB_10)
AMB_ENTRY(81, DIGI_SHIPBELL, AMB_INTERMIT, AMB_30)
AMB_ENTRY(82, DIGI_FOGHORN, AMB_INTERMIT, AMB_120)
#undef AMB_ENTRY

View file

@ -0,0 +1,385 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "cache1d.h"
#include "keys.h"
#include "mytypes.h"
#include "develop.h"
#include "fx_man.h"
#include "music.h"
#include "scriplib.h"
#include "file_lib.h"
#include "gamedefs.h"
#include "keyboard.h"
#include "util_lib.h"
#include "control.h"
#include "config.h"
#include "sounds.h"
#include "function.h"
#include "game.h"
#include "colormap.h"
#include "net.h"
#include "animlib.h"
#include "anim.h"
#define MAX_ANMS 10
anim_t *anm_ptr[MAX_ANMS];
int ANIMnumframes;
unsigned char ANIMpal[3*256];
unsigned char ANIMnum = 0;
short SoundState;
char *ANIMname[] =
{
"sw.anm",
"swend.anm",
"sumocinm.anm",
"zfcin.anm",
};
#define ANIM_TILE(num) (MAXTILES-11 + (num))
VOID AnimShareIntro(int frame, int numframes)
{
int zero=0;
if (frame == numframes-1)
ototalclock += 120;
else if (frame == 1)
{
PlaySound(DIGI_NOMESSWITHWANG,&zero,&zero,&zero,v3df_none);
ototalclock += 120*3;
}
else
ototalclock += 8;
if (frame == 5)
{
PlaySound(DIGI_INTRO_SLASH,&zero,&zero,&zero,v3df_none);
}
else if (frame == 15)
{
PlaySound(DIGI_INTRO_WHIRL,&zero,&zero,&zero,v3df_none);
}
}
VOID AnimSerp(int frame, int numframes)
{
int zero=0;
ototalclock += 16;
if (frame == numframes-1)
ototalclock += 1*120;
if (frame == 1)
{
PlaySound(DIGI_SERPTAUNTWANG,&zero,&zero,&zero,v3df_none);
}
else if (frame == 16)
{
PlaySound(DIGI_SHAREND_TELEPORT,&zero,&zero,&zero,v3df_none);
}
else if (frame == 35)
{
SoundState++;
PlaySound(DIGI_WANGTAUNTSERP1,&zero,&zero,&zero,v3df_none);
}
else if (frame == 51)
{
SoundState++;
PlaySound(DIGI_SHAREND_UGLY1,&zero,&zero,&zero,v3df_none);
}
else if (frame == 64)
{
SoundState++;
PlaySound(DIGI_SHAREND_UGLY2,&zero,&zero,&zero,v3df_none);
}
}
VOID AnimSumo(int frame, int numframes)
{
int zero=0;
ototalclock += 10;
if (frame == numframes-1)
ototalclock += 1*120;
if (frame == 1)
ototalclock += 30;
if (frame == 2)
{
// hungry
PlaySound(DIGI_JG41012,&zero,&zero,&zero,v3df_none);
}
else if (frame == 30)
{
PlaySound(DIGI_HOTHEADSWITCH,&zero,&zero,&zero,v3df_none);
}
else if (frame == 42)
{
PlaySound(DIGI_HOTHEADSWITCH,&zero,&zero,&zero,v3df_none);
}
else if (frame == 59)
{
PlaySound(DIGI_JG41028,&zero,&zero,&zero,v3df_none);
}
}
VOID AnimZilla(int frame, int numframes)
{
int zero=0;
ototalclock += 16;
if (frame == numframes-1)
ototalclock += 1*120;
if (frame == 1)
{
PlaySound(DIGI_ZC1,&zero,&zero,&zero,v3df_none);
}
else if (frame == 5)
{
PlaySound(DIGI_JG94024,&zero,&zero,&zero,v3df_none);
}
else if (frame == 14)
{
PlaySound(DIGI_ZC2,&zero,&zero,&zero,v3df_none);
}
else if (frame == 30)
{
PlaySound(DIGI_ZC3,&zero,&zero,&zero,v3df_none);
}
else if (frame == 32)
{
PlaySound(DIGI_ZC4,&zero,&zero,&zero,v3df_none);
}
else if (frame == 37)
{
PlaySound(DIGI_ZC5,&zero,&zero,&zero,v3df_none);
}
else if (frame == 63)
{
PlaySound(DIGI_Z16043,&zero,&zero,&zero,v3df_none);
PlaySound(DIGI_ZC6,&zero,&zero,&zero,v3df_none);
PlaySound(DIGI_ZC7,&zero,&zero,&zero,v3df_none);
}
else if (frame == 72)
{
PlaySound(DIGI_ZC7,&zero,&zero,&zero,v3df_none);
}
else if (frame == 73)
{
PlaySound(DIGI_ZC4,&zero,&zero,&zero,v3df_none);
}
else if (frame == 77)
{
PlaySound(DIGI_ZC5,&zero,&zero,&zero,v3df_none);
}
else if (frame == 87)
{
PlaySound(DIGI_ZC8,&zero,&zero,&zero,v3df_none);
}
else if (frame == 103)
{
PlaySound(DIGI_ZC7,&zero,&zero,&zero,v3df_none);
}
else if (frame == 108)
{
PlaySound(DIGI_ZC9,&zero,&zero,&zero,v3df_none);
}
else if (frame == 120)
{
PlaySound(DIGI_JG94039,&zero,&zero,&zero,v3df_none);
}
}
unsigned char *LoadAnm(short anim_num)
{
int handle;
int length;
unsigned char *animbuf, *palptr;
int i,j,k;
DSPRINTF(ds,"LoadAnm");
MONO_PRINT(ds);
// this seperate allows the anim to be precached easily
ANIMnum = anim_num;
// lock it
walock[ANIM_TILE(ANIMnum)] = 219;
if (anm_ptr[anim_num] == 0)
{
handle = kopen4load(ANIMname[ANIMnum], 0);
if (handle == -1)
return NULL;
length = kfilelength(handle);
allocache((void **) &anm_ptr[anim_num], length + sizeof(anim_t), &walock[ANIM_TILE(ANIMnum)]);
animbuf = (unsigned char *)((intptr_t)anm_ptr[anim_num] + sizeof(anim_t));
kread(handle, animbuf, length);
kclose(handle);
}
else
{
animbuf = (unsigned char *)((intptr_t)anm_ptr[anim_num] + sizeof(anim_t));
}
return animbuf;
}
void
playanm(short anim_num)
{
unsigned char *animbuf, *palptr;
int i, j, k, length = 0, numframes = 0;
int32 handle = -1;
unsigned char ANIMvesapal[4*256];
unsigned char tempbuf[256];
unsigned char *palook_bak = palookup[0];
UserInput uinfo = { FALSE, FALSE, dir_None };
ANIMnum = anim_num;
KB_FlushKeyboardQueue();
KB_ClearKeysDown();
DSPRINTF(ds,"PlayAnm");
MONO_PRINT(ds);
DSPRINTF(ds,"PlayAnm");
MONO_PRINT(ds);
animbuf = LoadAnm(anim_num);
if (!animbuf)
return;
DSPRINTF(ds,"PlayAnm - Palette Stuff");
MONO_PRINT(ds);
for (i = 0; i < 256; i++)
tempbuf[i] = i;
palookup[0] = tempbuf;
ANIM_LoadAnim(animbuf);
ANIMnumframes = ANIM_NumFrames();
numframes = ANIMnumframes;
palptr = ANIM_GetPalette();
for (i = 0; i < 768; i++)
ANIMvesapal[i] = palptr[i]>>2;
tilesizx[ANIM_TILE(ANIMnum)] = 200;
tilesizy[ANIM_TILE(ANIMnum)] = 320;
clearview(0);
setbrightness(gs.Brightness,ANIMvesapal,2);
if (ANIMnum == 1)
{
// draw the first frame
waloff[ANIM_TILE(ANIMnum)] = (intptr_t)ANIM_DrawFrame(1);
invalidatetile(ANIM_TILE(ANIMnum), 0, 1<<4);
rotatesprite(0 << 16, 0 << 16, 65536L, 512, ANIM_TILE(ANIMnum), 0, 0, 2 + 4 + 8 + 16 + 64, 0, 0, xdim - 1, ydim - 1);
}
SoundState = 0;
//ototalclock = totalclock + 120*2;
ototalclock = totalclock;
for (i = 1; i < numframes; i++)
{
while (totalclock < ototalclock)
{
handleevents();
CONTROL_GetUserInput(&uinfo);
CONTROL_ClearUserInput(&uinfo);
switch (ANIMnum)
{
case ANIM_INTRO:
if (KB_KeyWaiting() || uinfo.button0 || uinfo.button1 || quitevent)
goto ENDOFANIMLOOP;
break;
case ANIM_SERP:
if (KEY_PRESSED(KEYSC_ESC) || uinfo.button1 || quitevent)
goto ENDOFANIMLOOP;
break;
}
getpackets();
}
switch (ANIMnum)
{
case ANIM_INTRO:
AnimShareIntro(i,numframes);
break;
case ANIM_SERP:
AnimSerp(i,numframes);
break;
case ANIM_SUMO:
AnimSumo(i,numframes);
break;
case ANIM_ZILLA:
AnimZilla(i,numframes);
break;
}
waloff[ANIM_TILE(ANIMnum)] = (intptr_t)ANIM_DrawFrame(i);
invalidatetile(ANIM_TILE(ANIMnum), 0, 1<<4);
rotatesprite(0 << 16, 0 << 16, 65536L, 512, ANIM_TILE(ANIMnum), 0, 0, 2 + 4 + 8 + 16 + 64, 0, 0, xdim - 1, ydim - 1);
nextpage();
}
// pause on final frame
while (totalclock < ototalclock)
{
handleevents();
getpackets();
}
ENDOFANIMLOOP:
clearview(0);
nextpage();
palookup[0] = palook_bak;
setbrightness(gs.Brightness, (unsigned char *)palette_data, 2);
KB_FlushKeyboardQueue();
KB_ClearKeysDown();
ANIM_FreeAnim();
walock[ANIM_TILE(ANIMnum)] = 1;
}

View file

@ -0,0 +1,33 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#define ANIM_INTRO 0
#define ANIM_SERP 1
#define ANIM_SUMO 2
#define ANIM_ZILLA 3
unsigned char *LoadAnm(short anim_num);
void playanm(short anim_num);

View file

@ -0,0 +1,643 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2005 - 3D Realms Entertainment
This file is NOT part of Shadow Warrior version 1.2
However, it is either an older version of a file that is, or is
some test code written during the development of Shadow Warrior.
This file is provided purely for educational interest.
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
// scriplib.c
#include "build.h"
#include "editor.h"
#include "cache1d.h"
#include "names2.h"
#include "game.h"
#include "parse.h"
#define PATHSEPERATOR '\\'
//#define COMPUTE_TOTALS 1
/*
=============================================================================
ABNORMAL TERMINATION
=============================================================================
*/
void Error(char *error, ...)
{
va_list argptr;
va_start(argptr,error);
vprintf(error,argptr);
va_end(argptr);
printf("\n");
exit(1);
}
/*
=============================================================================
PARSING STUFF
=============================================================================
*/
char token[MAXTOKEN];
char *scriptbuffer,*script_p,*scriptend_p;
int grabbed;
int scriptline;
BOOL endofscript;
BOOL tokenready; // only TRUE if UnGetToken was just called
/*
==============
=
= LoadScriptFile
=
==============
*/
BOOL LoadScriptFile(char *filename)
{
int size, readsize;
int fp;
if ((fp=kopen4load(filename,0)) == -1)
{
// If there's no script file, forget it.
return FALSE;
}
size = kfilelength(fp);
scriptbuffer = (char *)malloc(size);
ASSERT(scriptbuffer != NULL);
readsize = kread(fp, scriptbuffer, size);
kclose(fp);
ASSERT(readsize == size);
// Convert filebuffer to all upper case
//strupr(scriptbuffer);
script_p = scriptbuffer;
scriptend_p = script_p + size;
scriptline = 1;
endofscript = FALSE;
tokenready = FALSE;
return TRUE;
}
/*
==============
=
= UnGetToken
=
= Signals that the current token was not used, and should be reported
= for the next GetToken. Note that
GetToken (TRUE);
UnGetToken ();
GetToken (FALSE);
= could cross a line boundary.
=
==============
*/
void UnGetToken(void)
{
tokenready = TRUE;
}
/*
==============
=
= GetToken
=
==============
*/
void GetToken(BOOL crossline)
{
char *token_p;
if (tokenready) // is a token already waiting?
{
tokenready = FALSE;
return;
}
if (script_p >= scriptend_p)
{
if (!crossline)
Error("Line %i is incomplete\n",scriptline);
endofscript = TRUE;
return;
}
//
// skip space
//
skipspace:
while (*script_p <= 32)
{
if (script_p >= scriptend_p)
{
if (!crossline)
Error("Line %i is incomplete\n",scriptline);
endofscript = TRUE;
return;
}
if (*script_p++ == '\n')
{
if (!crossline)
Error("Line %i is incomplete\n",scriptline);
scriptline++;
}
}
if (script_p >= scriptend_p)
{
if (!crossline)
Error("Line %i is incomplete\n",scriptline);
endofscript = TRUE;
return;
}
if (*script_p == '#') // # is comment field
{
if (!crossline)
Error("Line %i is incomplete\n",scriptline);
while (*script_p++ != '\n')
if (script_p >= scriptend_p)
{
endofscript = TRUE;
return;
}
goto skipspace;
}
//
// copy token
//
token_p = token;
while (*script_p > 32 && *script_p != '#')
{
*token_p++ = *script_p++;
if (script_p == scriptend_p)
break;
ASSERT(token_p != &token[MAXTOKEN]);
// Error ("Token too large on line %i\n",scriptline);
}
*token_p = 0;
}
/*
==============
=
= TokenAvailable
=
= Returns true if there is another token on the line
=
==============
*/
BOOL TokenAvailable(void)
{
char *search_p;
search_p = script_p;
if (search_p >= scriptend_p)
return FALSE;
while (*search_p <= 32)
{
if (*search_p == '\n')
return FALSE;
search_p++;
if (search_p == scriptend_p)
return FALSE;
}
if (*search_p == '#')
return FALSE;
return TRUE;
}
void DefaultExtension(char *path, char *extension)
{
char *src;
//
// if path doesn't have a .EXT, append extension
// (extension should include the .)
//
src = path + strlen(path) - 1;
while (*src != '\\' && src != path)
{
if (*src == '.')
return; // it has an extension
src--;
}
strcat(path, extension);
}
void DefaultPath(char *path, char *basepath)
{
char temp[128];
if (path[0] == '\\')
return; // absolute path location
strcpy(temp,path);
strcpy(path,basepath);
strcat(path,temp);
}
void StripFilename(char *path)
{
int length;
length = strlen(path)-1;
while (length > 0 && path[length] != PATHSEPERATOR)
length--;
path[length] = 0;
}
void ExtractFileBase(char *path, char *dest)
{
char *src;
int length;
src = path + strlen(path) - 1;
//
// back up until a \ or the start
//
while (src != path && *(src-1) != '\\')
src--;
//
// copy up to eight characters
//
memset(dest,0,8);
length = 0;
while (*src && *src != '.')
{
if (++length == 9)
Error("Filename base of %s >8 chars",path);
*dest++ = toupper(*src++);
}
}
/*
==============
=
= ParseNum / ParseHex
=
==============
*/
int ParseHex(char *hex)
{
char *str;
int num;
num = 0;
str = hex;
while (*str)
{
num <<= 4;
if (*str >= '0' && *str <= '9')
num += *str-'0';
else if (*str >= 'a' && *str <= 'f')
num += 10 + *str-'a';
else if (*str >= 'A' && *str <= 'F')
num += 10 + *str-'A';
else
Error("Bad hex number: %s",hex);
str++;
}
return num;
}
int ParseNum(char *str)
{
if (str[0] == '$')
return ParseHex(str+1);
if (str[0] == '0' && str[1] == 'x')
return ParseHex(str+2);
return atol(str);
}
// voxelarray format is:
// spritenumber, voxelnumber
int aVoxelArray[MAXTILES];
extern int nextvoxid;
// Load all the voxel files using swvoxfil.txt script file
// Script file format:
// # - Comment
// spritenumber (in artfile), voxel number, filename
// Ex. 1803 0 medkit2.kvx
// 1804 1 shotgun.kvx
// etc....
void LoadKVXFromScript(char *filename)
{
int lNumber=0,lTile=0; // lNumber is the voxel no. and lTile is the editart tile being
// replaced.
char *sName; // KVS file being loaded in.
int grabbed=0; // Number of lines parsed
sName = (char *)malloc(256); // Up to 256 bytes for path
ASSERT(sName != NULL);
// zero out the array memory with -1's for pics not being voxelized
memset(aVoxelArray,-1,sizeof(aVoxelArray));
// Load the file
if (!LoadScriptFile(filename)) return;
do
{
GetToken(TRUE); // Crossing a line boundary on the end of line to first token
// of a new line is permitted (and expected)
if (endofscript)
break;
lTile = atol(token);
GetToken(FALSE);
lNumber = atol(token);
GetToken(FALSE);
strcpy(sName,token); // Copy the whole token as a file name and path
// Load the voxel file into memory
if (!qloadkvx(lNumber,sName))
{
// Store the sprite and voxel numbers for later use
aVoxelArray[lTile] = lNumber; // Voxel num
}
if (lNumber >= nextvoxid) // JBF: so voxels in the def file append to the list
nextvoxid = lNumber + 1;
grabbed++;
ASSERT(grabbed < MAXSPRITES);
}
while (script_p < scriptend_p);
free(scriptbuffer);
script_p = NULL;
}
/// MISC ////////////////////////////////////////////////////////////////////
/*
extern int idleclock,slackerclock;
// Watch dog function. Tracks user's work times.
void LogUserTime( BOOL bIsLoggingIn )
{
int size, readsize;
time_t time_of_day;
char serialid[20],filename[100],fbase[20],buf[26],filetemp[100];
FILE *fp;
int tothours, totmins, totsecs, gtotalclock=0,gidleclock=0;
ldiv_t mins_secs;
ldiv_t hrs_mins;
int i;
char path[] = "o:\\user\\jimn\\logs\\";
// char path[] = "c:\\jim\\sw\\";
memset(filename,0,sizeof(filename));
memset(fbase,0,sizeof(fbase));
memset(serialid,0,sizeof(serialid));
memset(buf,0,sizeof(buf));
memset(filetemp,0,sizeof(filetemp));
// Get the time of day user logged in to build
time_of_day = time( NULL );
// Get the serial number from the user's disk drive "it's unique!"
system("dir > serid.bld");
LoadScriptFile("serid.bld");
// Go to the serial number
for (i=0; i<11; i++)
{
GetToken (TRUE);
if (endofscript)
return;
}
// Copy the token to serialid
strcpy(serialid,token);
// Free the script memory when done
free(scriptbuffer);
script_p = NULL;
// Build a file name using serial id.
strcpy(filename,path);
strncpy(fbase,serialid,8);
strcat(fbase,".bld");
strcat(filename,fbase);
// Delete the temp file
system("erase serid.bld");
// Unhide the file so it can be opened
_dos_setfileattr(filename,_A_NORMAL);
// Open the file
fp = fopen( filename, "a+" );
// Opening on the network failed, try putting it on the current disk drive
if(fp == NULL)
{
// Unhide the file so it can be opened/this works if file was created before!
_dos_setfileattr(fbase,_A_NORMAL);
fp = fopen( fbase, "a+" );
strcpy(filetemp,fbase);
} else
strcpy(filetemp,filename);
if( fp == NULL)
return;
else
{
if(bIsLoggingIn)
{
fprintf(fp, "//////////////////////////////\n");
fprintf(fp, "User logged into build at: %s", _ctime( &time_of_day, buf ) );
}else
{
totsecs = totalclock/120; // Convert totalclock to seconds.
mins_secs = ldiv( totsecs, 60L );
totmins = mins_secs.quot;
totsecs = mins_secs.rem;
hrs_mins = ldiv( totmins, 60L);
tothours = hrs_mins.quot;
totmins = hrs_mins.rem;
fprintf(fp, "TotalClock: %ld\n",totalclock);
#ifdef COMPUTE_TOTALS
fprintf(fp, "IdleClock: %ld\n",slackerclock);
#endif
fprintf(fp, "Time this session: %ld Hours %ld Mins %ld Secs\n",tothours,totmins,totsecs);
#ifdef COMPUTE_TOTALS
totsecs = (totalclock-slackerclock)/120; // Convert totalclock to seconds.
if(totsecs<=0) totsecs = 0;
mins_secs = ldiv( totsecs, 60L );
totmins = mins_secs.quot;
totsecs = mins_secs.rem;
hrs_mins = ldiv( totmins, 60L);
tothours = hrs_mins.quot;
totmins = hrs_mins.rem;
fprintf(fp, "Time - idleclock : %ld Hours %ld Mins %ld Secs\n",tothours,totmins,totsecs);
#endif
}
fclose( fp );
}
#if 1
if(!bIsLoggingIn)
{
// Compute total time for file
LoadScriptFile(filetemp);
do {
GetToken (TRUE);
if (endofscript)
break;
if(!strcmpi(token,"totalclock:"))
{
GetToken(TRUE);
gtotalclock += atol(token);
}
#if 0
if(!strcmpi(token,"idleclock:"))
{
GetToken(TRUE);
gidleclock += atol(token);
}
#endif
} while (script_p < scriptend_p);
// Free the script memory when done
free(scriptbuffer);
script_p = NULL;
// Open the file
fp = fopen( filetemp, "a+" );
// Now compute the grand total
if(fp != NULL)
{
totsecs = gtotalclock/120; // Convert totalclock to seconds.
mins_secs = ldiv( totsecs, 60L );
totmins = mins_secs.quot;
totsecs = mins_secs.rem;
hrs_mins = ldiv( totmins, 60L);
tothours = hrs_mins.quot;
totmins = hrs_mins.rem;
fprintf(fp, "\nTotal time so far : %ld Hours %ld Mins %ld Secs\n",tothours,totmins,totsecs);
#if 0
totsecs = (gtotalclock-gidleclock)/120; // Convert totalclock to seconds.
if(totsecs<=0) totsecs = 0;
mins_secs = ldiv( totsecs, 60L );
totmins = mins_secs.quot;
totsecs = mins_secs.rem;
hrs_mins = ldiv( totmins, 60L);
tothours = hrs_mins.quot;
totmins = hrs_mins.rem;
fprintf(fp, "\nTotal actual time : %ld Hours %ld Mins %ld Secs\n",tothours,totmins,totsecs);
#endif
fclose(fp);
}
}
#endif
_dos_setfileattr(filename,_A_HIDDEN);
}
*/

View file

@ -0,0 +1,585 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "panel.h"
#include "lists.h"
#include "game.h"
#include "common_game.h"
#include "net.h"
#include "text.h"
#define BAR_HEIGHT 48
#define XDIM 320
#define YDIM 200
short DebugBorderShade = 0;
short RegBorderTest[] =
{
51, 53, 127, 128, 140, 145, 152, 197, 198, 201, 205, 206, 213, 218, 242, 243,
245, 246, 247, 257, 2560, 2561, 2562, 2570, 2571, 2572, 2573, 2576, 2578,
2579, 2580, 2581, 2582, 2583, 2584, 2585, 2593, 2594
};
short SWBorderTest[] =
{
51, 53, 127, 128, 140, 145, 201, 205, 206, 213, 218,
245, 2560, 2573, 2576, 2580, 2581, 2582, 2583, 2584, 2593
};
#undef BORDER_TILE
#define BORDER_TILE \
(isShareware ? \
SWBorderTest[gs.BorderTile % SIZ(SWBorderTest)] : \
RegBorderTest[gs.BorderTile % SIZ(RegBorderTest)] \
)
#define f_320 FIXED(320,0)
#define f_200 FIXED(200,0)
#define X_TO_FIXED(val) (x_aspect_mul*(val))
#define Y_TO_FIXED(val) (y_aspect_mul*(val))
BOOL RedrawScreen = FALSE;
int f_xdim, f_ydim, x_pix_size, y_pix_size, x_aspect_mul, y_aspect_mul;
int CrosshairX, CrosshairY;
extern BOOL BorderAdjust;
BOOL GlobSpriteBoxUpdateEveryFrame = FALSE;
PANEL_SPRITEp
pSpawnFullScreenSpriteBox(PLAYERp pp, short id, short pic, short pri, int x, int y, short x1, short y1, short x2, short y2)
{
PANEL_SPRITEp psp;
extern BOOL DrawBeforeView;
psp = pSpawnSprite(pp, NULL, pri, x, y);
psp->ID = id;
psp->numpages = numpages;
if (GlobSpriteBoxUpdateEveryFrame)
{
psp->numpages = 1;
}
psp->picndx = -1;
psp->picnum = pic;
psp->x1 = x1;
psp->y1 = y1;
psp->x2 = x2;
psp->y2 = y2;
psp->shade = DebugBorderShade;
//SET(psp->flags, PANF_STATUS_AREA | PANF_KILL_AFTER_SHOW | PANF_IGNORE_START_MOST | PANF_DRAW_BEFORE_VIEW | PANF_NOT_ALL_PAGES);
SET(psp->flags, PANF_STATUS_AREA | PANF_KILL_AFTER_SHOW | PANF_IGNORE_START_MOST | PANF_DRAW_BEFORE_VIEW);
//DrawBeforeView = TRUE;
//SET(psp->flags, PANF_SCREEN_CLIP | PANF_KILL_AFTER_SHOW | PANF_IGNORE_START_MOST);
return psp;
}
VOID SetCrosshair(VOID)
{
int wdx,wdy,x,y;
wdx = ((windowx2-windowx1)/2);
wdy = ((windowy2-windowy1)/2);
x = windowx1 + wdx;
y = windowy1 + wdy;
CrosshairX = x / (xdim/320.0);
CrosshairY = y / (ydim/200.0);
// rotatesprite takes FIXED point number
CrosshairX <<= 16;
CrosshairY <<= 16;
}
VOID
SetupAspectRatio(VOID)
{
f_xdim = FIXED(xdim, 0);
f_ydim = FIXED(ydim, 0);
x_pix_size = (f_320 / xdim);
y_pix_size = (f_200 / ydim);
x_aspect_mul = (f_xdim / 320);
y_aspect_mul = (f_ydim / 200);
}
VOID
SetConsoleDmost(VOID)
{
int ystart;
int xstart;
int i;
int adj=0;
// dont setup the startumost/dmost arrays if border is 0
if (gs.BorderNum == BORDER_NONE || gs.BorderNum == BORDER_MINI_BAR)
return;
//
// Set the whole thing to the size of the bar
//
ystart = f_ydim - Y_TO_FIXED(BAR_HEIGHT);
if (ydim == 480 && gs.BorderNum == 2)
adj = 1;
//for (i = FIXED(0, 0); i < f_320; i += x_pix_size)
for (i = 0; i < xdim; i++)
// define picture
// boundaries
{
startdmost[i] = MSW(ystart) + adj;
}
}
VOID ClearStartMost(VOID)
{
int i;
for (i = 0; i < xdim; i++)
startdmost[i] = ydim;
memset(startumost, 0, sizeof(startumost));
}
VOID
SetFragBar(PLAYERp pp)
{
short i, num_frag_bars;
int y;
extern SHORT OrigCommPlayers;
if (numplayers <= 1)
return;
if (gNet.MultiGameType == MULTI_GAME_COOPERATIVE)
return;
// if player sprite has not been initialized we have no business
// sticking a frag bar up. Prevents processing from MenuLevel etc.
if (!pp->SpriteP)
return;
//num_frag_bars = ((numplayers-1)/4)+1;
num_frag_bars = ((OrigCommPlayers-1)/4)+1;
for (i = windowx1; i <= windowx2; i++)
{
y = (tilesizy[FRAG_BAR] * num_frag_bars) - (2 * (num_frag_bars-1));
y = y * (ydim/200.0);
if (windowy1 < y)
startumost[i] = y;
}
for (i = 0, y = 0; i < num_frag_bars; i++)
{
pSpawnFullScreenSprite(pp, FRAG_BAR, PRI_MID, 0, y);
y += tilesizy[FRAG_BAR] - 2;
}
// write each persons kill info to everybody
// for (i = 0; i < numplayers; i++)
TRAVERSE_CONNECT(i)
{
PlayerUpdateKills(Player + i, 0);
DisplayFragNames(Player + i);
}
}
BOOL RectOverlap(short tx1, short ty1, short bx1, short by1, short tx2, short ty2, short bx2, short by2)
{
if (bx1 >= tx2)
if (tx1 <= bx2)
if (ty1 <= by2)
if (by1 >= ty2)
return TRUE;
return FALSE;
}
VOID DrawBorderShade(PLAYERp pp, short shade_num, short wx1, short wy1, short wx2, short wy2)
{
short i,j,k,l;
PANEL_SPRITEp psp;
int dark_shade = 27 - (shade_num * 6);
int light_shade = 20 - (shade_num * 6);
for (i = 0; i < xdim; i += tilesizx[BORDER_TILE])
{
for (j = 0; j < ydim; j += tilesizy[BORDER_TILE])
{
k = i + tilesizx[BORDER_TILE];
l = j + tilesizy[BORDER_TILE];
if (RectOverlap(i, j, k, l, wx1 - 1, wy1 - 1, wx2 + 1, wy1))
{
// draw top box of the border
psp = pSpawnFullScreenSpriteBox(pp, ID_BORDER_TOP, BORDER_TILE, PRI_BACK + 1, i, j, wx1 - 1, wy1 - 1, wx2 + 1, wy1);
psp->shade = dark_shade;
psp->ID = ID_BORDER_SHADE;
}
if (RectOverlap(i, j, k, l, wx1 - 1, wy2, wx2 + 1, wy2 + 1))
{
// draw bottom box of the border
psp = pSpawnFullScreenSpriteBox(pp, ID_BORDER_BOTTOM, BORDER_TILE, PRI_BACK + 1, i, j, wx1 - 1, wy2, wx2 + 1, wy2 + 1);
psp->shade = light_shade;
psp->ID = ID_BORDER_SHADE;
}
if (RectOverlap(i, j, k, l, wx1 - 1, wy1 - 1, wx1, wy2 + 1))
{
// draw left box of the border
psp = pSpawnFullScreenSpriteBox(pp, ID_BORDER_LEFT, BORDER_TILE, PRI_BACK + 1, i, j, wx1 - 1, wy1 - 1, wx1, wy2 + 1);
psp->shade = dark_shade;
psp->ID = ID_BORDER_SHADE;
}
if (RectOverlap(i, j, k, l, wx2, wy1 - 1, wx2 + 1, wy2 + 1))
{
// draw right box of the border
psp = pSpawnFullScreenSpriteBox(pp, ID_BORDER_RIGHT, BORDER_TILE, PRI_BACK + 1, i, j, wx2, wy1 - 1, wx2 + 1, wy2 + 1);
psp->shade = light_shade;
psp->ID = ID_BORDER_SHADE;
}
}
}
}
VOID
BorderShade(PLAYERp pp, BOOL refresh)
{
int i, j, k, l, wx1, wx2, wy1, wy2;
PANEL_SPRITEp psp;
BYTE lines;
wx1 = windowx1 - 1;
wy1 = windowy1 - 1;
wx2 = windowx2 + 1;
wy2 = windowy2 + 1;
for (lines = 0; lines < 4; lines++)
{
// make sure that these values dont go out of bound - which they do
wx1 = max(wx1, 0);
wx2 = min(wx2, xdim - 1);
wy1 = max(wy1, 0);
if (refresh)
{
// silly thing seems off by 1
wy2 = min(wy2, ydim - (Y_TO_FIXED(BAR_HEIGHT) >> 16) - 2);
}
else
{
if (gs.BorderNum >= BORDER_BAR+1 && gs.BorderNum <= BORDER_BAR+2)
wy2 = min(wy2, ydim - 1);
else
wy2 = min(wy2, ydim - (Y_TO_FIXED(BAR_HEIGHT) >> 16) - 1);
}
DrawBorderShade(pp, lines, wx1, wy1, wx2, wy2);
// increase view size by one - dont do a set view though
wx1--;
wy1--;
wx2++;
wy2++;
}
}
BORDER_INFO BorderInfoValues[] =
{
// x,y,screensize
{0, 0, 0},
{0, 0, 0},
{0, BAR_HEIGHT, 0},
{0, BAR_HEIGHT, (1 * 16)},
{0, BAR_HEIGHT, (2 * 16)},
{0, BAR_HEIGHT, (3 * 16)},
{0, BAR_HEIGHT, (4 * 16)},
{0, BAR_HEIGHT, (5 * 16)},
{0, BAR_HEIGHT, (6 * 16)},
{0, BAR_HEIGHT, (7 * 16)},
{0, BAR_HEIGHT, (8 * 16)},
{0, BAR_HEIGHT, (9 * 16)},
{0, BAR_HEIGHT, (10 * 16)},
{0, BAR_HEIGHT, (11 * 16)},
{0, BAR_HEIGHT, (12 * 16)}
};
VOID DrawBorder(PLAYERp pp, short x, short y, short x2, short y2)
{
short i,j,k,l;
short count = 0;
for (i = 0; i < xdim; i += tilesizx[BORDER_TILE])
{
for (j = 0; j < ydim; j += tilesizy[BORDER_TILE])
{
k = i + tilesizx[BORDER_TILE];
l = j + tilesizy[BORDER_TILE];
if (RectOverlap(i, j, k, l, x, y, windowx1-1, y2))
{
// draw top box of the border
pSpawnFullScreenSpriteBox(pp, ID_BORDER_TOP, BORDER_TILE, PRI_BACK, i, j, x, y, windowx1-1, y2);
count++;
}
if (RectOverlap(i, j, k, l, windowx2+1, y, x2, y2))
{
// draw bottom box of the border
pSpawnFullScreenSpriteBox(pp, ID_BORDER_BOTTOM, BORDER_TILE, PRI_BACK, i, j, windowx2+1, y, x2, y2);
count++;
}
if (RectOverlap(i, j, k, l, windowx1, y, windowx2, windowy1-1))
{
// draw left box of the border
pSpawnFullScreenSpriteBox(pp, ID_BORDER_LEFT, BORDER_TILE, PRI_BACK, i, j, windowx1, y, windowx2, windowy1-1);
count++;
}
if (RectOverlap(i, j, k, l, windowx1, windowy2+1, windowx2, y2))
{
// draw right box of the border
pSpawnFullScreenSpriteBox(pp, ID_BORDER_RIGHT, BORDER_TILE, PRI_BACK, i, j, windowx1, windowy2+1, windowx2, y2);
count++;
}
}
}
}
VOID DrawPanelBorderSides(PLAYERp pp, short x, short y, short x2, short y2, short panl, short panr)
{
short i,j,k,l;
short count = 0;
for (i = 0; i < xdim; i += tilesizx[BORDER_TILE])
{
for (j = 0; j < ydim; j += tilesizy[BORDER_TILE])
{
k = i + tilesizx[BORDER_TILE];
l = j + tilesizy[BORDER_TILE];
if (RectOverlap(i, j, k, l, x, y, panl, y2))
{
pSpawnFullScreenSpriteBox(pp, ID_PANEL_BORDER_LEFT, BORDER_TILE, PRI_BACK, i, j, x, y, panl, y2);
count++;
}
if (RectOverlap(i, j, k, l, panr, y, x2, y2))
{
pSpawnFullScreenSpriteBox(pp, ID_PANEL_BORDER_RIGHT, BORDER_TILE, PRI_BACK, i, j, panr, y, x2, y2);
count++;
}
}
}
}
static
VOID BorderSetView(PLAYERp UNUSED(pp), int *Xdim, int *Ydim, int *ScreenSize)
{
void setview(int scrx1, int scry1, int scrx2, int scry2);
int x, x2, y, y2;
BORDER_INFO *b;
BorderInfo = BorderInfoValues[gs.BorderNum];
b = &BorderInfo;
// figure out the viewing window x and y dimensions
*Xdim = MSW(f_xdim - X_TO_FIXED(b->Xdim));
*Ydim = MSW(f_ydim - Y_TO_FIXED(b->Ydim));
*ScreenSize = MSW(f_xdim - X_TO_FIXED(b->ScreenSize));
// figure out the viewing window x and y coordinates
x = DIV2(*Xdim) - DIV2(*ScreenSize);
x2 = x + *ScreenSize - 1;
y = DIV2(*Ydim) - DIV2((*ScreenSize **Ydim) / *Xdim);
y2 = y + ((*ScreenSize **Ydim) / *Xdim) - 1;
if (ydim == 480 && gs.BorderNum == 2)
{
y2+=2;
}
// global windowx1, windowx2, windowy1, windowy2 coords set here
setview(x, y, x2, y2);
SetCrosshair();
}
//
// Redraw the border without changing the view
//
static VOID
BorderRefresh(PLAYERp pp)
{
int i, j;
int x, x2, y, y2;
BORDER_INFO *b;
if (pp != Player + myconnectindex)
return;
if (!BorderAdjust)
return;
if (gs.BorderNum < BORDER_BAR)
return;
// Redraw the BORDER_TILE only if getting smaller
BorderInfo = BorderInfoValues[gs.BorderNum];
b = &BorderInfo;
// A refresh does not change the view size so we dont need to do a
// setview
// We don't need the calculations for the border drawing boxes - its
// the whole screen
// minus the border if necessary
// fill in the sides of the panel when the screen is wide
if (gs.BorderNum >= BORDER_BAR && widescreen)
{
int sidew = (xdim - scale(320, ydim, mulscale16(200, pixelaspect))) / 2;
x = 0;
x2 = xdim - 1;
y = ydim - (Y_TO_FIXED(b->Ydim) >> 16);
y2 = ydim - 1;
DrawPanelBorderSides(pp, x, y, x2, y2, sidew, xdim-sidew);
}
// only need a border if border is > BORDER_BAR
if (gs.BorderNum > BORDER_BAR)
{
// make sure that these values dont go out of bound - which they do
x = 0;
x2 = xdim - 1;
y = 0;
y2 = ydim - (Y_TO_FIXED(b->Ydim) >> 16) - 1;
DrawBorder(pp, x, y, x2, y2);
// kill ALL outstanding (not yet drawn) border shade sprites before
// doing more shading
pKillScreenSpiteIDs(pp, ID_BORDER_SHADE);
BorderShade(pp, TRUE);
}
}
//
// Redraw the whole screen
//
VOID SetBorder(PLAYERp pp, int value)
{
int diff;
int Xdim, Ydim, ScreenSize;
BOOL set_view = TRUE;
if (pp != Player + myconnectindex)
return;
if (!BorderAdjust)
return;
if (value >= 0) // just refresh
gs.BorderNum = value;
if (gs.BorderNum < BORDER_NONE)
{
gs.BorderNum = BORDER_NONE;
//return;
}
if (gs.BorderNum > (int)SIZ(BorderInfoValues) - 1)
{
gs.BorderNum = SIZ(BorderInfoValues) - 1;
return;
}
BorderSetView(pp, &Xdim, &Ydim, &ScreenSize);
if (gs.BorderNum >= BORDER_BAR)
{
BorderRefresh(pp);
if (gs.BorderNum == BORDER_BAR)
SetConsoleDmost();
pSpawnFullScreenSprite(pp, STATUS_BAR, PRI_FRONT, 0, 200 - tilesizy[STATUS_BAR]);
PlayerUpdatePanelInfo(Player + screenpeek);
}
SetFragBar(pp);
}
VOID
SetRedrawScreen(PLAYERp pp)
{
int i, j;
//int x, x2, y, y2;
BORDER_INFO *b;
if (pp != Player + myconnectindex)
return;
if (!BorderAdjust)
return;
if (gs.BorderNum < BORDER_NONE)
gs.BorderNum = BORDER_NONE;
// Redraw the BORDER_TILE only if getting smaller
BorderInfo = BorderInfoValues[gs.BorderNum];
b = &BorderInfo;
// test at redrawing the whole screen
RedrawScreen = TRUE;
}

View file

@ -0,0 +1,109 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
// BOTS.H
// Contains useful header information for bot creation
#ifndef BOTS_H
#define BOTS_H
// BOT DEFINITIONS AND STRUCTURES
typedef enum
{
BOTstand, BOThide, BOTrun, BOTduck, BOTjump, BOTstrafe, BOTshoot, BOTuseinv,
BOTopen, BOTswimup, BOTswimdown, BOTturn, BOTuserts
} BOT_Actions;
// Linked lists containing node trees that are chosen based on desired actions
struct NODEstruct;
typedef struct NODEstruct NODE, *NODEp;
struct NODEstruct
{
NODEp p, l, r; // Pointers to tree nodes
int goalx, goaly, goalz; // x,y,z point bot wants to get to
BOT_Actions action; // Action to take if this node is reached
int tics; // Optionally stay in this node for x tics.
};
struct NODETREEstruct;
typedef struct NODETREEstruct NODETREE, *NODETREEp;
struct NODETREEstruct
{
short SpriteNum; // Sprite number in sprite array of goal item
NODEp tree; // This is the node tree used to navigate to goal
BOOL Locked; // If list is locked, a bot is using/modifying it and
// other bots cannot modify it while it's locked
};
// Bots main action variables
typedef struct BOT_BRAIN
{
short tgt_inv; // Inventory item it wants to use
short tgt_weapon; // Weapon in wants to activate and use
short tgt_enemy; // Enemy it wants to kill
short tgt_sprite; // Sprite it wants to pickup or operate
short tgt_sector; // Sector it wants to get to
short tgt_wall; // Wall it wants to touch
BOT_Actions action; // Bot's current action
} BotBrain, *BotBrain_p;
// NOTE:
// The following arrays should be saved off with save games!
// 0 = Item not accessible, no item of type was found
// 1 = Shuriken
// 3 = Caltrops
// 4 = Gas Bomb
// 5 = Flash Bomb
// 6 = Uzi Ammo
// 7 = Shotgun Ammo
// 8 = Rocket Ammo
// 9 = 40mm Ammo
// 10 = Sticky Bombs
// 11 = Rail Ammo
// 12 = Head Ammo
// 13 = Heart Ammo
// 14 = Uzi
// 15 = Shotgun
// 16 = Rocket Launcher
// 17 = 40mm Launcher
// 18 = Rail Gun
// 19 = Head
// 20 = Heart
// 21 = MedKit
// 22 = Armor
// 23 = Big Armor
// 24 = Portable MedKit
// 25 = Fortune Cookie
////////////////////////
extern NODETREE BOT_TREELIST[25][50]; // There can be up to 50 of each item
// with a cooresponding search tree for each
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,55 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef BREAK_PUBLIC_
#define BREAK_PUBLIC_
#define BF_TOUGH (BIT(0))
#define BF_KILL (BIT(1))
#define BF_BURN (BIT(2))
#define BF_OVERRIDE_BLOCK (BIT(3))
#define BF_FIRE_FALL (BIT(4))
#define BF_LEAVE_BREAK (BIT(5))
typedef struct
{
short picnum, breaknum, shrap_type;
short flags, shrap_amt;
} BREAK_INFO, *BREAK_INFOp;
BREAK_INFOp FindWallBreakInfo(short picnum);
BREAK_INFOp FindSpriteBreakInfo(short picnum);
void SortBreakInfo(void);
BREAK_INFOp SetupWallForBreak(WALLp wallp);
BREAK_INFOp SetupSpriteForBreak(SPRITEp sp);
short FindBreakSpriteMatch(short match);
BOOL HitBreakWall(WALLp wp, int, int, int, short ang, short type);
int HitBreakSprite(short BreakSprite, short type);
BOOL CheckBreakToughness(BREAK_INFOp break_info, short ID);
int WallBreakPosition(short hitwall, short *sectnum, int *x, int *y, int *z, short *ang);
void SortBreakInfo(void);
#endif

View file

@ -0,0 +1,737 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2005 - 3D Realms Entertainment
This file is NOT part of Shadow Warrior version 1.2
However, it is either an older version of a file that is, or is
some test code written during the development of Shadow Warrior.
This file is provided purely for educational interest.
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "editor.h"
#include "keys.h"
#include "names2.h"
#include "game.h"
extern int posx, posy, posz;
extern short cursectnum;
extern short ang;
extern int horiz;
extern int qsetmode;
BOOL FindCeilingView(short match, LONGp x, LONGp y, LONG z, SHORTp sectnum);
BOOL FindFloorView(short match, LONGp x, LONGp y, LONG z, SHORTp sectnum);
short ViewSectorInScene(short cursectnum, short type, short level);
void Message(char *string, char color);
void
_Assert(char *expr, char *strFile, unsigned uLine)
{
printf(ds, "Assertion failed: %s %s, line %u\n", expr, strFile, uLine);
//DSPRINTF(ds, "Assertion failed: %s %s, line %u", expr, strFile, uLine);
MONO_PRINT(ds);
exit(0);
}
////////////////////////////////////////////////////////////////////
//
// FLOOR ABOVE FLOOR
//
////////////////////////////////////////////////////////////////////
#define ZMAX 400
typedef struct
{
LONG zval[ZMAX];
SHORT sectnum[ZMAX];
SHORT pic[ZMAX];
SHORT slope[ZMAX];
SHORT zcount;
} SAVE, *SAVEp;
SAVE save;
BOOL FAF_DebugView = 0;
BOOL FAFon = 0;
BOOL FAF_DontMoveSectors = FALSE;
short bak_searchsector, bak_searchwall, bak_searchstat;
extern short searchsector, searchwall, searchstat, searchit;
VOID SetupBuildFAF(VOID);
VOID ResetBuildFAF(VOID);
void ToggleFAF(void)
{
if (keystatus[KEYSC_3])
{
keystatus[KEYSC_3] = FALSE;
FLIP(FAFon, 1);
if (FAFon)
{
SetupBuildFAF();
}
else
{
ResetBuildFAF();
}
}
if (FAFon && qsetmode == 200)
{
DrawOverlapRoom(posx, posy, posz, ang, horiz, cursectnum);
// make it so that you can edit both areas in 3D
// back up vars after the first drawrooms
bak_searchsector = searchsector;
bak_searchwall = searchwall;
bak_searchstat = searchstat;
searchit = 2;
}
if (FAFon && qsetmode == 200 && keystatus[KEYSC_4])
{
short match;
int tx,ty,tz;
short tsectnum;
short i;
keystatus[KEYSC_4] = FALSE;
tx = posx;
ty = posy;
tz = posz;
tsectnum = cursectnum;
save.zcount = 0;
if (sector[cursectnum].ceilingpicnum == FAF_MIRROR_PIC)
{
match = ViewSectorInScene(tsectnum, VIEW_THRU_CEILING, VIEW_LEVEL1);
FAF_DontMoveSectors = TRUE;
FindCeilingView(match, &tx, &ty, tz, &tsectnum);
FAF_DontMoveSectors = FALSE;
posx = tx;
posy = ty;
cursectnum = tsectnum;
posz = sector[cursectnum].floorz - Z(20);
}
else if (sector[cursectnum].floorpicnum == FAF_MIRROR_PIC)
{
match = ViewSectorInScene(tsectnum, VIEW_THRU_FLOOR, VIEW_LEVEL2);
FAF_DontMoveSectors = TRUE;
FindFloorView(match, &tx, &ty, tz, &tsectnum);
FAF_DontMoveSectors = FALSE;
posx = tx;
posy = ty;
cursectnum = tsectnum;
posz = sector[cursectnum].ceilingz + Z(20);
}
}
}
void FAF_AfterDrawRooms(void)
{
// make it so that you can edit both areas in 3D
// if your cursor is in the FAF_MIRROR_PIC area use the vars from the first
// drawrooms instead
if ((searchstat == 1 && sector[searchsector].ceilingpicnum == FAF_MIRROR_PIC) ||
(searchstat == 2 && sector[searchsector].floorpicnum == FAF_MIRROR_PIC))
{
searchsector = bak_searchsector;
searchwall = bak_searchwall;
searchstat = bak_searchstat;
}
}
VOID
SetupBuildFAF(VOID)
{
short i, nexti;
SPRITEp sp,vc_sp,vf_sp,vl_sp;
short SpriteNum, NextSprite;
short vc,nextvc,vf,nextvf,l,nextl;
int zdiff;
// move every sprite to the correct list
TRAVERSE_SPRITE_STAT(headspritestat[STAT_DEFAULT], SpriteNum, NextSprite)
{
sp = &sprite[SpriteNum];
if (sp->picnum != ST1)
continue;
switch (sp->hitag)
{
case VIEW_THRU_CEILING:
case VIEW_THRU_FLOOR:
{
int i,nexti;
// make sure there is only one set per level of these
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
if (sprite[i].hitag == sp->hitag && sprite[i].lotag == sp->lotag)
{
sprintf(ds,"Two VIEW_THRU_ tags with same match found on level\n1: x %d, y %d \n2: x %d, y %d", sp->x, sp->y, sprite[i].x, sprite[i].y);
Message(ds,0);
}
}
changespritestat(SpriteNum, STAT_FAF);
break;
}
case VIEW_LEVEL1:
case VIEW_LEVEL2:
case VIEW_LEVEL3:
case VIEW_LEVEL4:
case VIEW_LEVEL5:
case VIEW_LEVEL6:
{
changespritestat(SpriteNum, STAT_FAF);
break;
}
}
}
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
sp = &sprite[i];
if (sector[sp->sectnum].ceilingpicnum == FAF_PLACE_MIRROR_PIC)
{
sector[sp->sectnum].ceilingpicnum = FAF_MIRROR_PIC;
if (sector[sp->sectnum].floorz == sector[sp->sectnum].ceilingz)
{
sprintf(ds, "Mirror used for non-connect area. Use tile 342. Sect %d, x %d, y %d\n", sp->sectnum, wall[sector[sp->sectnum].wallptr].x, wall[sector[sp->sectnum].wallptr].y);
Message(ds,0);
}
}
if (sector[sp->sectnum].floorpicnum == FAF_PLACE_MIRROR_PIC)
{
sector[sp->sectnum].floorpicnum = FAF_MIRROR_PIC;
if (sector[sp->sectnum].floorz == sector[sp->sectnum].ceilingz)
{
sprintf(ds, "Mirror used for non-connect area. Use tile 342. Sect %d, x %d, y %d\n", sp->sectnum, wall[sector[sp->sectnum].wallptr].x, wall[sector[sp->sectnum].wallptr].y);
Message(ds,0);
}
}
if (sector[sp->sectnum].ceilingpicnum == FAF_PLACE_MIRROR_PIC+1)
sector[sp->sectnum].ceilingpicnum = FAF_MIRROR_PIC+1;
if (sector[sp->sectnum].floorpicnum == FAF_PLACE_MIRROR_PIC+1)
sector[sp->sectnum].floorpicnum = FAF_MIRROR_PIC+1;
}
for (i = 0; i < numwalls; i++)
{
if (wall[i].picnum == FAF_PLACE_MIRROR_PIC)
wall[i].picnum = FAF_MIRROR_PIC;
if (wall[i].picnum == FAF_PLACE_MIRROR_PIC+1)
wall[i].picnum = FAF_MIRROR_PIC+1;
}
#if 0
// check ceiling and floor heights
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], vc, nextvc)
{
vc_sp = &sprite[vc];
if (vc_sp->hitag == VIEW_THRU_CEILING)
{
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], vf, nextvf)
{
vf_sp = &sprite[vf];
if (vf_sp->hitag == VIEW_THRU_FLOOR && vf_sp->lotag == vc_sp->lotag)
{
zdiff = labs(sector[vc_sp->sectnum].ceilingz - sector[vf_sp->sectnum].floorz);
//DSPRINTF(ds,"zdiff %d",zdiff);
MONO_PRINT(ds);
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], l, nextl)
{
vl_sp = &sprite[l];
if (vl_sp->hitag == VIEW_LEVEL1)
{
if (sector[vl_sp->sectnum].ceilingz < sector[vc_sp->sectnum].ceilingz + zdiff)
{
sprintf(ds,"Sector %d (x %d, y %d) ceiling z to close to VIEW_THRU_CEILING z",
vl_sp->sectnum, wall[sector[vl_sp->sectnum].wallptr].x, wall[sector[vl_sp->sectnum].wallptr].y);
Message(ds,0);
}
}
else if (vl_sp->hitag == VIEW_LEVEL2)
{
if (sector[vl_sp->sectnum].floorz > sector[vf_sp->sectnum].floorz + zdiff)
{
sprintf(ds,"Sector %d (x %d, y %d)floor z to close to VIEW_THRU_FLOOR z",
vl_sp->sectnum, wall[sector[vl_sp->sectnum].wallptr].x, wall[sector[vl_sp->sectnum].wallptr].y);
Message(ds,0);
}
}
}
}
}
}
}
#endif
}
VOID
ResetBuildFAF(VOID)
{
short i, nexti;
SPRITEp sp;
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
sp = &sprite[i];
if (sector[sp->sectnum].ceilingpicnum == FAF_MIRROR_PIC)
sector[sp->sectnum].ceilingpicnum = FAF_PLACE_MIRROR_PIC;
if (sector[sp->sectnum].floorpicnum == FAF_MIRROR_PIC)
sector[sp->sectnum].floorpicnum = FAF_PLACE_MIRROR_PIC;
if (sector[sp->sectnum].ceilingpicnum == FAF_MIRROR_PIC+1)
sector[sp->sectnum].ceilingpicnum = FAF_PLACE_MIRROR_PIC+1;
if (sector[sp->sectnum].floorpicnum == FAF_MIRROR_PIC+1)
sector[sp->sectnum].floorpicnum = FAF_PLACE_MIRROR_PIC+1;
}
for (i = 0; i < numwalls; i++)
{
if (wall[i].picnum == FAF_MIRROR_PIC)
wall[i].picnum = FAF_PLACE_MIRROR_PIC;
if (wall[i].picnum == FAF_MIRROR_PIC+1)
wall[i].picnum = FAF_PLACE_MIRROR_PIC+1;
}
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
changespritestat(i, STAT_DEFAULT);
}
}
BOOL
PicInView(short tile_num, BOOL reset)
{
if (TEST(gotpic[tile_num >> 3], 1 << (tile_num & 7)))
{
if (reset)
RESET(gotpic[tile_num >> 3], 1 << (tile_num & 7));
return TRUE;
}
return FALSE;
}
void
GetUpperLowerSector(short match, int x, int y, short *upper, short *lower)
{
int i, j;
short sectorlist[16];
short sln = 0;
short SpriteNum, Next;
SPRITEp sp;
// didn't find it yet so test ALL sectors
if (sln < 2)
{
sln = 0;
for (i = numsectors - 1; i >= 0; i--)
{
if (inside(x, y, (short) i) == 1)
{
BOOL found = FALSE;
TRAVERSE_SPRITE_SECT(headspritesect[i], SpriteNum, Next)
{
sp = &sprite[SpriteNum];
if (sp->statnum == STAT_FAF &&
(sp->hitag >= VIEW_LEVEL1 && sp->hitag <= VIEW_LEVEL6)
&& sp->lotag == match)
{
found = TRUE;
}
}
if (!found)
continue;
sectorlist[sln] = i;
sln++;
}
}
}
if (sln == 0)
{
*upper = -1;
*lower = -1;
return;
}
// Map rooms have NOT been dragged on top of each other
if (sln == 1)
{
*lower = sectorlist[0];
*upper = sectorlist[0];
return;
}
else
// Map rooms HAVE been dragged on top of each other
if (sln > 2)
{
// try again moving the x,y pos around until you only get two sectors
GetUpperLowerSector(match, x - 1, y, upper, lower);
}
if (sln == 2)
{
if (sector[sectorlist[0]].floorz < sector[sectorlist[1]].floorz)
{
// swap
// make sectorlist[0] the LOW sector
short hold;
hold = sectorlist[0];
sectorlist[0] = sectorlist[1];
sectorlist[1] = hold;
}
*lower = sectorlist[0];
*upper = sectorlist[1];
}
}
BOOL
FindCeilingView(short match, LONGp x, LONGp y, LONG z, SHORTp sectnum)
{
int xoff = 0;
int yoff = 0;
short i, nexti;
SPRITEp sp = NULL;
short top_sprite = -1;
int pix_diff;
int newz;
save.zcount = 0;
// Search Stat List For closest ceiling view sprite
// Get the match, xoff, yoff from this point
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
sp = &sprite[i];
if (sp->hitag == VIEW_THRU_CEILING && sp->lotag == match)
{
xoff = *x - sp->x;
yoff = *y - sp->y;
break;
}
}
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
sp = &sprite[i];
if (sp->lotag == match)
{
// determine x,y position
if (sp->hitag == VIEW_THRU_FLOOR)
{
short upper, lower;
*x = sp->x + xoff;
*y = sp->y + yoff;
// get new sector
GetUpperLowerSector(match, *x, *y, &upper, &lower);
*sectnum = upper;
break;
}
}
}
if (*sectnum < 0)
return FALSE;
ASSERT(sp);
ASSERT(sp->hitag == VIEW_THRU_FLOOR);
if (FAF_DontMoveSectors)
return TRUE;
pix_diff = labs(z - sector[sp->sectnum].floorz) >> 8;
newz = sector[sp->sectnum].floorz + ((pix_diff / 128) + 1) * Z(128);
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
sp = &sprite[i];
if (sp->lotag == match)
{
// move lower levels ceilings up for the correct view
if (sp->hitag == VIEW_LEVEL2)
{
// save it off
save.sectnum[save.zcount] = sp->sectnum;
save.zval[save.zcount] = sector[sp->sectnum].floorz;
save.pic[save.zcount] = sector[sp->sectnum].floorpicnum;
save.slope[save.zcount] = sector[sp->sectnum].floorheinum;
sector[sp->sectnum].floorz = newz;
sector[sp->sectnum].floorpicnum = FAF_MIRROR_PIC+1;
sector[sp->sectnum].floorheinum = 0;
save.zcount++;
ASSERT(save.zcount < ZMAX);
}
}
}
return TRUE;
}
BOOL
FindFloorView(short match, LONGp x, LONGp y, LONG z, SHORTp sectnum)
{
int xoff = 0;
int yoff = 0;
short i, nexti;
SPRITEp sp = NULL;
int newz;
int pix_diff;
save.zcount = 0;
// Search Stat List For closest ceiling view sprite
// Get the match, xoff, yoff from this point
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
sp = &sprite[i];
if (sp->hitag == VIEW_THRU_FLOOR && sp->lotag == match)
{
xoff = *x - sp->x;
yoff = *y - sp->y;
break;
}
}
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
sp = &sprite[i];
if (sp->lotag == match)
{
// determine x,y position
if (sp->hitag == VIEW_THRU_CEILING)
{
short upper, lower;
*x = sp->x + xoff;
*y = sp->y + yoff;
// get new sector
GetUpperLowerSector(match, *x, *y, &upper, &lower);
*sectnum = lower;
break;
}
}
}
if (*sectnum < 0)
return FALSE;
ASSERT(sp);
ASSERT(sp->hitag == VIEW_THRU_CEILING);
if (FAF_DontMoveSectors)
return TRUE;
// move ceiling multiple of 128 so that the wall tile will line up
pix_diff = labs(z - sector[sp->sectnum].ceilingz) >> 8;
newz = sector[sp->sectnum].ceilingz - ((pix_diff / 128) + 1) * Z(128);
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
sp = &sprite[i];
if (sp->lotag == match)
{
// move upper levels floors down for the correct view
if (sp->hitag == VIEW_LEVEL1)
{
// save it off
save.sectnum[save.zcount] = sp->sectnum;
save.zval[save.zcount] = sector[sp->sectnum].ceilingz;
save.pic[save.zcount] = sector[sp->sectnum].ceilingpicnum;
save.slope[save.zcount] = sector[sp->sectnum].ceilingheinum;
sector[sp->sectnum].ceilingz = newz;
sector[sp->sectnum].ceilingpicnum = FAF_MIRROR_PIC+1;
sector[sp->sectnum].ceilingheinum = 0;
save.zcount++;
ASSERT(save.zcount < ZMAX);
}
}
}
return TRUE;
}
BOOL
SectorInScene(short tile_num)
{
if (TEST(gotsector[tile_num >> 3], 1 << (tile_num & 7)))
{
RESET(gotsector[tile_num >> 3], 1 << (tile_num & 7));
return TRUE;
}
return FALSE;
}
short
ViewSectorInScene(short cursectnum, short type, short level)
{
int i, nexti;
int j, nextj;
SPRITEp sp;
SPRITEp sp2;
int cz, fz;
short match;
TRAVERSE_SPRITE_STAT(headspritestat[STAT_FAF], i, nexti)
{
sp = &sprite[i];
if (sp->hitag == level)
{
if (cursectnum == sp->sectnum)
{
// ignore case if sprite is pointing up
if (sp->ang == 1536)
continue;
// only gets to here is sprite is pointing down
// found a potential match
match = sp->lotag;
return match;
}
}
}
return -1;
}
VOID
DrawOverlapRoom(int tx, int ty, int tz, short tang, int thoriz, short tsectnum)
{
short i;
short match;
save.zcount = 0;
match = ViewSectorInScene(tsectnum, VIEW_THRU_CEILING, VIEW_LEVEL1);
if (match != -1)
{
FindCeilingView(match, &tx, &ty, tz, &tsectnum);
if (tsectnum < 0)
{
sprintf(ds,"COULD NOT FIND TAGGED LEVEL2 SECTOR FROM X %d, Y %d, SECTNUM %d.",posx,posy,cursectnum);
Message(ds, 0);
return;
}
drawrooms(tx, ty, tz, tang, thoriz, tsectnum);
drawmasks();
// reset Z's
for (i = 0; i < save.zcount; i++)
{
sector[save.sectnum[i]].floorz = save.zval[i];
sector[save.sectnum[i]].floorpicnum = save.pic[i];
sector[save.sectnum[i]].floorheinum = save.slope[i];
}
}
else
{
match = ViewSectorInScene(tsectnum, VIEW_THRU_FLOOR, VIEW_LEVEL2);
if (match != -1)
{
FindFloorView(match, &tx, &ty, tz, &tsectnum);
if (tsectnum < 0)
{
sprintf(ds,"COULD NOT FIND TAGGED LEVEL1 SECTOR FROM X %d, Y %d, SECTNUM %d.",posx,posy,cursectnum);
Message(ds, 0);
return;
}
drawrooms(tx, ty, tz, tang, thoriz, tsectnum);
drawmasks();
// reset Z's
for (i = 0; i < save.zcount; i++)
{
sector[save.sectnum[i]].ceilingz = save.zval[i];
sector[save.sectnum[i]].ceilingpicnum = save.pic[i];
sector[save.sectnum[i]].ceilingheinum = save.slope[i];
}
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,728 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
/****************************************
Removed sounds that were causing "Could
not load" error messages.
****************************************/
#include "build.h"
#include "names2.h"
#include "game.h"
#include "tags.h"
#include "common_game.h"
#include "break.h"
#include "quake.h"
#include "pal.h"
#include "cache.h"
#include "sounds.h"
#include "net.h"
// Run the game with the -CACHEPRINT option and redirect to a file.
// It will save out the tile and sound number every time one caches.
//
// sw -map $bullet -cacheprint > foofile
extern BOOL PreCaching;
// player weaponry, item usage, etc. Precache every time.
short Player_SCTable[] =
{
1,2,3,4,5,6,7,8,9,10, // weapons
11,12,14,16,18,20,
22,23,24,25,26,27,28,30,
31,32,33,34,35,40,145,291,445,362,269,
158,476, // underwater
47,359, // cloaking
48,50, // dead head
196,52,53,54,55, // splash & getting items
56,57,58,73,74,410, // bodies hitting ground
484,442, // teleport & respawn
417,418, // healing
238,239,240,241,242,243,244, // bring weapons up
181,182,183,184,187,216, // explosions
272,273,274,275,486, // nuke associated sounds
276,277,278,279,477, // chem bomb
280,281,282,283,284,288,289,290,450, // various player sounds
295, // armor hit
312, // sword clank
324,325,209, // unlocking sound
395,396,411, // gibs
175, // drip
435,436,311,221,220,227, // breakage
246,247,248,249,250,251,252,253,254,255,256, // common player talk
257,258,259,260,261,262,263,264,266,267,438,439,440,441,
326, // ancient chinese secret
330,331,332,333,334,335,336,337,338,339,340, // player kill talk
341,342,343,344,345,346,347,348,
376,377,378,379,380,381,382,383,384,385,386,387, // more asst. talking
370,443 // repair talk
};
// Actor specific sound tables. Cache only if the actor appears on the map.
// Exceptions would include ghosts, which are spawned by coolies, and
// rippers, which are spawned by the serpent boss.
short Coolie_SCTable[] =
{
75,76,77,78,79
};
short Ghost_SCTable[] =
{
80,81,82,83,84,85,86,87,213
};
short Ninja_SCTable[] =
{
88,89,90,91,92,93,94,412,
319, // firing sound
430 // death by sword
};
short Ripper_SCTable[] =
{
95,96,97,98,99,100,431
};
short Ripper2_SCTable[] =
{
313,314,315,316,317,318,431
};
short Head_SCTable[] =
{
115,116,117,118 // accursed heads
};
short Hornet_SCTable[] =
{
119,120,121,122
};
short Guardian_SCTable[] =
{
101,102,103,104,105,106,107
};
short Serpent_SCTable[] =
{
123,124,125,126,127,128,129,130,131 // serpent boss
};
short Sumo_SCTable[] =
{
320,321,322,323 // sumo boss
};
short Bunny_SCTable[] =
{
424,425,426,427,428
};
short Toilet_SCTable[] =
{
388,389,390,391,392,393,488,489,490 // anime girl on toilet
}; // I suspect some of these are no longer in use
short Trash_SCTable[] =
{
416 // I heard the trash can was an actor, so here is is
};
short Pachinko_SCTable[] =
{
419,420,421,422,423
};
void PreCacheSoundList(short table[], int num);
void PreCacheTable(short table[], int num);
VOID PreCacheGhost(VOID);
void
SetupPreCache(void)
{
if (PreCaching)
{
precache();
PreCacheSoundList(Player_SCTable, SIZ(Player_SCTable));
// actors cache ranges are called from SpriteSetup
// only caches the actor if its on the level
// weapons
PreCacheRange(2000, 2227);
PreCacheRange(4090, 4093);
// Explosions
PreCacheRange(3072, 3225);
// ninja player character
PreCacheRange(1024, 1175);
// console
PreCacheRange(2380, 2409);
PreCacheRange(3600, 3645);
PreCacheRange(2434, 2435);
// common
PreCacheRange(204, 208);
// message font
PreCacheRange(4608, 4701);
// gibs
PreCacheRange(1150,1568);
PreCacheRange(1685,1690);
PreCacheRange(900,944);
PreCacheRange(1670,1681);
// blood
PreCacheRange(1710,1715);
PreCacheRange(2410,2425);
PreCacheRange(389,389); // blood puddle by itself in art file
PreCacheRange(2500,2503);
// shrap
PreCacheRange(3840,3911);
PreCacheRange(3924,3947);
PreCacheRange(1397,1398);
// water *** animated tiles, can be deleted now ***
// PreCacheRange(780,794);
// switches
PreCacheRange(561,584);
PreCacheRange(551,552);
PreCacheRange(1846,1847);
PreCacheRange(1850,1859);
// bullet smoke
PreCacheRange(1748,1753);
// small blue font
PreCacheRange(2930,3023);
// gas can
PreCacheRange(3038,3042);
// lava *** animated tiles, can be deleted now ***
// PreCacheRange(175,182);
// gas clouds & teleport effect
PreCacheRange(3240,3277);
// nuke mushroom cloud
PreCacheRange(3280,3300);
// blood drops
PreCacheRange(1718,1721);
// smoke
PreCacheRange(3948,3968);
// footprints
PreCacheRange(2490,2492);
// player fists
PreCacheRange(4070,4077);
PreCacheRange(4050,4051);
PreCacheRange(4090,4093);
// fish actor
PreCacheRange(3760,3771);
PreCacheRange(3780,3795);
// coins
PreCacheRange(2531,2533);
// respawn markers & console keys
PreCacheRange(2440,2467);
// light/torch sprites
PreCacheRange(537,548);
PreCacheRange(521,528);
PreCacheRange(512,515);
PreCacheRange(396,399);
PreCacheRange(443,446);
// bubbles
PreCacheRange(716,720);
// bullet splashes
PreCacheRange(772,776);
}
}
VOID PreCacheRipper(VOID)
{
PreCacheSoundList(Ripper_SCTable, SIZ(Ripper_SCTable));
PreCacheRange(1580, 1644);
}
VOID PreCacheRipper2(VOID)
{
PreCacheSoundList(Ripper2_SCTable, SIZ(Ripper2_SCTable));
PreCacheRange(4320, 4427);
}
VOID PreCacheCoolie(VOID)
{
PreCacheGhost();
PreCacheSoundList(Coolie_SCTable, SIZ(Coolie_SCTable));
PreCacheRange(1400, 1440);
PreCacheRange(4260, 4276); // coolie explode
}
VOID PreCacheGhost(VOID)
{
PreCacheSoundList(Ghost_SCTable, SIZ(Ghost_SCTable));
PreCacheRange(4277, 4312);
}
VOID PreCacheSerpent(VOID)
{
PreCacheSoundList(Serpent_SCTable, SIZ(Serpent_SCTable));
PreCacheRange(960, 1016);
PreCacheRange(1300, 1314);
}
VOID PreCacheGuardian(VOID)
{
PreCacheSoundList(Guardian_SCTable, SIZ(Guardian_SCTable));
PreCacheRange(1469,1497);
}
VOID PreCacheNinja(VOID)
{
PreCacheSoundList(Ninja_SCTable, SIZ(Ninja_SCTable));
PreCacheRange(4096, 4239);
}
VOID PreCacheNinjaGirl(VOID)
{
//PreCacheSoundList(NinjaGirl_SCTable, SIZ(NinjaGirl_SCTable));
PreCacheRange(5162, 5260);
}
VOID PreCacheSumo(VOID)
{
PreCacheSoundList(Sumo_SCTable, SIZ(Sumo_SCTable));
PreCacheRange(4490, 4544);
}
VOID PreCacheZilla(VOID)
{
PreCacheSoundList(Sumo_SCTable, SIZ(Sumo_SCTable));
PreCacheRange(4490, 4544);
}
VOID PreCacheEel(VOID)
{
PreCacheRange(4430, 4479);
}
VOID PreCacheToiletGirl(VOID)
{
PreCacheSoundList(Toilet_SCTable, SIZ(Toilet_SCTable));
PreCacheRange(5023, 5027);
}
VOID PreCacheWashGirl(VOID)
{
PreCacheSoundList(Toilet_SCTable, SIZ(Toilet_SCTable));
PreCacheRange(5032, 5035);
}
VOID PreCacheCarGirl(VOID)
{
PreCacheSoundList(Toilet_SCTable, SIZ(Toilet_SCTable));
PreCacheRange(4594,4597);
}
VOID PreCacheMechanicGirl(VOID)
{
PreCacheSoundList(Toilet_SCTable, SIZ(Toilet_SCTable));
PreCacheRange(4590,4593);
}
VOID PreCacheSailorGirl(VOID)
{
PreCacheSoundList(Toilet_SCTable, SIZ(Toilet_SCTable));
PreCacheRange(4600,4602);
}
VOID PreCachePruneGirl(VOID)
{
PreCacheSoundList(Toilet_SCTable, SIZ(Toilet_SCTable));
PreCacheRange(4604,4604);
}
VOID PreCacheTrash(VOID)
{
PreCacheSoundList(Trash_SCTable, SIZ(Trash_SCTable));
PreCacheRange(2540, 2546);
}
VOID PreCacheBunny(VOID)
{
PreCacheSoundList(Bunny_SCTable, SIZ(Bunny_SCTable));
PreCacheRange(4550, 4584);
}
VOID PreCacheSkel(VOID)
{
PreCacheRange(1320, 1396);
}
VOID PreCacheHornet(VOID)
{
PreCacheSoundList(Hornet_SCTable, SIZ(Hornet_SCTable));
PreCacheRange(800, 811);
}
VOID PreCacheSkull(VOID)
{
PreCacheSoundList(Head_SCTable, SIZ(Head_SCTable));
PreCacheRange(820, 854);
}
VOID PreCacheBetty(VOID)
{
PreCacheRange(817, 819);
}
VOID PreCachePachinko(VOID)
{
PreCacheRange(618,623);
PreCacheRange(618,623);
PreCacheRange(4768,4790);
PreCacheRange(4792,4814);
PreCacheRange(4816,4838);
PreCacheRange(4840,4863);
PreCacheSoundList(Pachinko_SCTable, SIZ(Pachinko_SCTable));
}
void PreCacheSoundList(short table[], int num)
{
short j;
for (j = 0; j < num; j++)
{
CacheSound(table[j], CACHE_SOUND_PRECACHE);
AnimateCacheCursor();
}
}
void
PreCacheTable(short table[], int num)
{
short j;
for (j = 0; j < num; j++)
{
SET(gotpic[table[j]>>3], 1<<(table[j]&7));
}
}
void
PreCacheRange(short start_pic, short end_pic)
{
short j;
for (j = start_pic; j <= end_pic; j++)
{
SET(gotpic[j>>3], 1<<(j&7));
}
}
VOID PreCacheAmbient(VOID)
{
int i,nexti;
int num;
SPRITEp sp;
extern AMB_INFO ambarray[];
TRAVERSE_SPRITE_STAT(headspritestat[STAT_AMBIENT], i, nexti)
{
sp = &sprite[i];
num = sp->lotag;
num = ambarray[num].diginame;
CacheSound(num, CACHE_SOUND_PRECACHE);
}
}
VOID PreCacheOverride(VOID)
{
int i,nexti;
TRAVERSE_SPRITE_STAT(headspritestat[STAT_CEILING_FLOOR_PIC_OVERRIDE], i, nexti)
{
ASSERT(SPRITE_TAG2(i) >= 0 && SPRITE_TAG2(i) <= MAXTILES);
SET_GOTPIC(SPRITE_TAG2(i));
}
}
VOID PreCacheSoundSpot(VOID)
{
int i,nexti;
int num;
SPRITEp sp;
TRAVERSE_SPRITE_STAT(headspritestat[STAT_SOUND_SPOT], i, nexti)
{
sp = &sprite[i];
num = SP_TAG13(sp); // tag4 is copied to tag13
if (num > 0 && num < DIGI_MAX)
CacheSound(num, CACHE_SOUND_PRECACHE);
num = SP_TAG5(sp);
if (num > 0 && num < DIGI_MAX)
CacheSound(num, CACHE_SOUND_PRECACHE);
num = SP_TAG6(sp);
if (num > 0 && num < DIGI_MAX)
CacheSound(num, CACHE_SOUND_PRECACHE);
CacheSound(num, CACHE_SOUND_PRECACHE);
}
}
VOID
PreCacheActor(VOID)
{
int i;
short pic;
for (i=0; i < MAXSPRITES; i++)
{
if (sprite[i].statnum >= MAXSTATUS)
continue;
if (User[i])
pic = User[i]->ID;
else
pic = sprite[i].picnum;
switch (pic)
{
case COOLIE_RUN_R0:
PreCacheCoolie();
break;
case NINJA_RUN_R0:
case NINJA_CRAWL_R0:
PreCacheNinja();
break;
case GORO_RUN_R0:
PreCacheGuardian();
break;
case 1441:
case COOLG_RUN_R0:
PreCacheGhost();
break;
case EEL_RUN_R0:
PreCacheEel();
break;
case SUMO_RUN_R0:
PreCacheZilla();
break;
case ZILLA_RUN_R0:
PreCacheSumo();
break;
case TOILETGIRL_R0:
PreCacheToiletGirl();
break;
case WASHGIRL_R0:
PreCacheWashGirl();
break;
case CARGIRL_R0:
PreCacheCarGirl();
break;
case MECHANICGIRL_R0:
PreCacheMechanicGirl();
break;
case SAILORGIRL_R0:
PreCacheSailorGirl();
break;
case PRUNEGIRL_R0:
PreCachePruneGirl();
break;
case TRASHCAN:
PreCacheTrash();
break;
case BUNNY_RUN_R0:
PreCacheBunny();
break;
case RIPPER_RUN_R0:
PreCacheRipper();
break;
case RIPPER2_RUN_R0:
PreCacheRipper2();
break;
case SERP_RUN_R0:
PreCacheSerpent();
break;
case LAVA_RUN_R0:
break;
case SKEL_RUN_R0:
PreCacheSkel();
break;
case HORNET_RUN_R0:
PreCacheHornet();
break;
case SKULL_R0:
PreCacheSkull();
break;
case BETTY_R0:
PreCacheBetty();
break;
case GIRLNINJA_RUN_R0:
PreCacheNinjaGirl();
break;
case 623: // Pachinko win light
case PACHINKO1:
case PACHINKO2:
case PACHINKO3:
case PACHINKO4:
PreCachePachinko();
break;
}
}
}
void DoTheCache(void)
{
extern char CacheLastLevel[32],LevelName[20];
int i, cnt=0;
PreCacheAmbient();
PreCacheSoundSpot();
PreCacheActor();
PreCacheOverride();
for (i = 0; i < MAXTILES; i++)
{
if ((TEST(gotpic[i>>3], 1<<(i&7))) && (!waloff[i]))
{
loadtile(i);
cnt++;
if (!(cnt&7))
{
AnimateCacheCursor();
handleevents();
getpackets();
}
}
}
memset(gotpic,0,sizeof(gotpic));
strcpy(CacheLastLevel, LevelName);
}
void
precache(void)
{
int i;
short j;
SECTORp sectp;
WALLp wp;
SPRITEp sp;
memset(gotpic,0,sizeof(gotpic));
for (sectp = sector; sectp < &sector[numsectors]; sectp++)
{
j = sectp->ceilingpicnum;
SET(gotpic[j>>3], 1<<(j&7));
if (TEST(picanm[j],TILE_ANIM_TYPE))
{
for (i = 1; i <= TEST(picanm[j],TILE_ANIM_NUM); i++)
{
SET(gotpic[(j+i)>>3], 1<<((j+i)&7));
}
}
j = sectp->floorpicnum;
SET(gotpic[j>>3], 1<<(j&7));
if (TEST(picanm[j],TILE_ANIM_TYPE))
{
for (i = 1; i <= TEST(picanm[j],TILE_ANIM_NUM); i++)
{
SET(gotpic[(j+i)>>3], 1<<((j+i)&7));
}
}
}
for (wp = wall; wp < &wall[numwalls]; wp++)
{
j = wp->picnum;
SET(gotpic[j>>3], 1<<(j&7));
if (TEST(picanm[j],TILE_ANIM_TYPE))
{
for (i = 1; i <= TEST(picanm[j],TILE_ANIM_NUM); i++)
{
SET(gotpic[(j+i)>>3], 1<<((j+i)&7));
}
}
if (wp->overpicnum > 0 && wp->overpicnum < MAXTILES)
{
j = wp->overpicnum;
SET(gotpic[j>>3], 1<<(j&7));
if (TEST(picanm[j],TILE_ANIM_TYPE))
{
for (i = 1; i <= TEST(picanm[j],TILE_ANIM_NUM); i++)
{
SET(gotpic[(j+i)>>3], 1<<((j+i)&7));
}
}
}
}
for (sp = sprite; sp < &sprite[MAXSPRITES]; sp++)
{
if (sp->statnum < MAXSTATUS)
{
j = sp->picnum;
SET(gotpic[j>>3], 1<<(j&7));
}
}
}

View file

@ -0,0 +1,40 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#define CACHE_NONE 0 // don't use this - this is for ken
#define CACHE_LOCK_MAX 255
#define CACHE_LOCK_START 200
#define CACHE_UNLOCK_START 1
#define CACHE_UNLOCK_MAX 199
#define CACHE_SOUND_PRECACHE 0
#define CACHE_SOUND_PLAY 1
void SetupPreCache(void);
void PreCacheRange(short start_pic, short end_pic);
void DoTheCache(void);
void precache(void);

View file

@ -0,0 +1,470 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "mytypes.h"
#include "text.h"
#include "control.h"
#include "function.h"
//#include "inv.h"
BOOL CheatInputMode = FALSE;
char CheatInputString[256];
BOOL EveryCheat = FALSE;
BOOL ResCheat = FALSE;
VOID ResCheatOn(PLAYERp UNUSED(pp), char *UNUSED(cheat_string))
{
ResCheat = TRUE;
}
VOID VoxCheat(PLAYERp UNUSED(pp), char *UNUSED(cheat_string))
{
//gs.Voxel ^= 1;
}
VOID RestartCheat(PLAYERp UNUSED(pp), char *UNUSED(cheat_string))
{
ExitLevel = TRUE;
}
VOID RoomCheat(PLAYERp UNUSED(pp), char *UNUSED(cheat_string))
{
extern BOOL FAF_DebugView;
FAF_DebugView ^= 1;
}
VOID SecretCheat(PLAYERp UNUSED(pp), char *UNUSED(cheat_string))
{
gs.Stats = !gs.Stats;
}
VOID NextCheat(PLAYERp UNUSED(pp), char *UNUSED(cheat_string))
{
Level++;
ExitLevel = TRUE;
}
VOID PrevCheat(PLAYERp UNUSED(pp), char *UNUSED(cheat_string))
{
Level--;
ExitLevel = TRUE;
}
VOID MapCheat(PLAYERp pp, char *UNUSED(cheat_string))
{
automapping ^= 1;
if (automapping)
MapSetAll2D(0);
else
MapSetAll2D(0xFF);
sprintf(ds, "AUTOMAPPING %s", automapping ? "ON" : "OFF");
PutStringInfo(pp, ds);
}
VOID LocCheat(PLAYERp UNUSED(pp), char *UNUSED(cheat_string))
{
extern BOOL LocationInfo;
LocationInfo++;
if (LocationInfo > 2)
LocationInfo = 0;
}
VOID WeaponCheat(PLAYERp UNUSED(pp), char *UNUSED(cheat_string))
{
PLAYERp p;
short pnum;
unsigned int i;
USERp u;
TRAVERSE_CONNECT(pnum)
{
p = &Player[pnum];
u = User[p->PlayerSprite];
// ALL WEAPONS
if (!SW_SHAREWARE)
p->WpnFlags = 0xFFFFFFFF;
else
p->WpnFlags = 0x0000207F; // Disallows high weapon cheat in shareware
for (i = 0; i < SIZ(p->WpnAmmo); i++)
{
p->WpnAmmo[i] = DamageData[i].max_ammo;
}
PlayerUpdateWeapon(p, u->WeaponNum);
}
}
VOID GodCheat(PLAYERp pp, char *UNUSED(cheat_string))
{
//
// GOD mode
//
GodMode ^= 1;
sprintf(ds, "GOD MODE %s", GodMode ? "ON" : "OFF");
PutStringInfo(pp, ds);
}
VOID ClipCheat(PLAYERp pp, char *UNUSED(cheat_string))
{
FLIP(pp->Flags, PF_CLIP_CHEAT);
sprintf(ds, "NO CLIP MODE %s", TEST(pp->Flags, PF_CLIP_CHEAT) ? "ON" : "OFF");
PutStringInfo(pp, ds);
}
VOID WarpCheat(PLAYERp pp, char *cheat_string)
{
char *cp = cheat_string;
int episode_num;
int level_num;
cp += sizeof("swtrek")-1;
level_num = atol(cp);
//DSPRINTF(ds,"ep %d, lev %d",episode_num, level_num);
//MONO_PRINT(ds);
if (!SW_SHAREWARE)
{
if (level_num > 28 || level_num < 1)
return;
}
else
{
if (level_num > 4 || level_num < 1)
return;
}
Level = level_num;
ExitLevel = TRUE;
sprintf(ds, "ENTERING %1d", Level);
PutStringInfo(pp, ds);
}
VOID ItemCheat(PLAYERp pp, char *cheat_string)
{
//
// Get all ITEMS
//
PLAYERp p;
short pnum;
short inv;
int i;
PutStringInfo(pp, "ITEMS");
TRAVERSE_CONNECT(pnum)
{
p = &Player[pnum];
memset(p->HasKey, TRUE, sizeof(p->HasKey));
if (p->Wpn[WPN_UZI] && p->CurWpn == p->Wpn[WPN_UZI])
{
SET(p->Flags, PF_TWO_UZI);
SET(p->Flags, PF_PICKED_UP_AN_UZI);
InitWeaponUzi(p);
}
p->WpnShotgunAuto = 50;
p->WpnRocketHeat = 5;
p->WpnRocketNuke = 1;
p->Armor = 100;
for (inv = 0; inv < MAX_INVENTORY; inv++)
{
p->InventoryPercent[inv] = 100;
//p->InventoryAmount[inv] = 1;
p->InventoryAmount[inv] = InventoryData[inv].MaxInv;
//PlayerUpdateInventory(p, inv);
}
PlayerUpdateInventory(p, p->InventoryNum);
//p->InventoryNum = 0;
}
for (i=0; i<numsectors; i++)
{
if (SectUser[i] && SectUser[i]->stag == SECT_LOCK_DOOR)
SectUser[i]->number = 0; // unlock all doors of this type
}
WeaponCheat(pp, cheat_string);
PlayerUpdateKeys(pp);
}
VOID EveryCheatToggle(PLAYERp pp, char *cheat_string)
{
EveryCheat ^= 1;
WeaponCheat(pp, cheat_string);
GodCheat(pp, cheat_string);
ItemCheat(pp, cheat_string);
sprintf(ds, "EVERY CHEAT %s", EveryCheat ? "ON" : "OFF");
PutStringInfo(pp, ds);
}
VOID SaveCheat(PLAYERp pp, char *UNUSED(cheat_string))
{
saveboard("swsave.map", &pp->posx, &pp->posy, &pp->posz,
&pp->pang, &pp->cursectnum);
}
VOID GeorgeFunc(PLAYERp pp, char *UNUSED(cheat_string))
{
PlayerSound(DIGI_TAUNTAI9,&pp->posx,&pp->posy,&pp->posz,v3df_dontpan|v3df_doppler|v3df_follow,pp);
}
VOID BlackburnFunc(PLAYERp pp, char *UNUSED(cheat_string))
{
PlayerSound(DIGI_TAUNTAI3,&pp->posx,&pp->posy,&pp->posz,v3df_dontpan|v3df_doppler|v3df_follow,pp);
}
int cheatcmp(char *str1, char *str2, int len)
{
char *cp1 = str1;
char *cp2 = str2;
do
{
if (*cp1 != *cp2)
{
if (!((*cp1 == '#' && isdigit(*cp2)) || (*cp2 == '#' && isdigit(*cp1))))
return -1;
}
cp1++;
cp2++;
}
while (--len);
return 0;
}
#define CF_ALL BIT(0)
#define CF_NOTSW BIT(1)
typedef struct
{
char *CheatInputCode;
void (*CheatInputFunc)(PLAYERp, char *);
char flags;
} CHEAT_INFO, *CHEAT_INFOp;
CHEAT_INFO ci[] =
{
{"swchan", GodCheat, 0},
{"swgimme", ItemCheat, 0},
{"swtrek##", WarpCheat, 0},
{"swgreed", EveryCheatToggle, 0},
{"swghost", ClipCheat, 0},
{"swstart", RestartCheat, 0},
{"swres", ResCheatOn, 0},
{"swloc", LocCheat, 0},
{"swmap", MapCheat, 0},
{"swsave", SaveCheat, CF_ALL},
{"swroom", RoomCheat, CF_NOTSW}, // Room above room dbug
#if DEBUG
{"swsecret", SecretCheat, CF_ALL},
#endif
};
// !JIM! My simplified version of CheatInput which simply processes MessageInputString
void CheatInput(void)
{
static BOOL cur_show;
int ret;
BOOL match = FALSE;
unsigned int i;
//if (CommEnabled)
// return;
strcpy(CheatInputString,MessageInputString);
// make sure string is lower cased
Bstrlwr(CheatInputString);
// check for at least one single match
for (i = 0; i < SIZ(ci); i++)
{
// compare without the NULL
if (cheatcmp(CheatInputString, ci[i].CheatInputCode, strlen(CheatInputString)) == 0)
{
// if they are equal in length then its a complet match
if (strlen(CheatInputString) == strlen(ci[i].CheatInputCode))
{
match = TRUE;
CheatInputMode = FALSE;
if (TEST(ci[i].flags, CF_NOTSW) && SW_SHAREWARE)
return;
if (!TEST(ci[i].flags, CF_ALL))
{
if (CommEnabled)
return;
if (Skill >= 3)
{
PutStringInfo(Player, "You're too skillful to cheat\n");
return;
}
}
if (ci[i].CheatInputFunc)
(*ci[i].CheatInputFunc)(Player, CheatInputString);
return;
}
else
{
match = TRUE;
break;
}
}
}
if (!match)
{
////DSPRINTF(ds,"Lost A Match %s", CheatInputString);
//MONO_PRINT(ds);
CheatInputMode = FALSE;
}
}
/* OLD CODE
void CheatInput(void)
{
static BOOL cur_show;
signed char MNU_InputString(char *, short);
int ret;
BOOL match = FALSE;
short i;
// don't use InputMode here - its set for CheatInputMode
if (MessageInputMode || MenuInputMode)
return;
if (!CheatInputMode)
{
if (KEY_PRESSED(KEYSC_S))
{
//KEY_PRESSED(KEYSC_S) = FALSE;
CheatInputMode = TRUE;
strcpy(CheatInputString,"s");
}
}
if (CheatInputMode)
{
// get new chars
ret = MNU_InputString(CheatInputString, 320-20);
// quick check input
switch (ret)
{
case FALSE: // Input finished (RETURN)
case -1: // Cancel Input (pressed ESC) or Err
CheatInputMode = FALSE;
KB_FlushKeyboardQueue();
return;
case TRUE: // Got input
break;
}
// make sure string is lower cased
strlwr(CheatInputString);
// check for at least one single match
for (i = 0; i < SIZ(ci); i++)
{
// compare without the NULL
if (cheatcmp(CheatInputString, ci[i].CheatInputCode, strlen(CheatInputString)) == 0)
{
////DSPRINTF(ds,"%s",CheatInputString);
//MONO_PRINT(ds);
// if they are equal in length then its a complet match
if (strlen(CheatInputString) == strlen(ci[i].CheatInputCode))
{
////DSPRINTF(ds,"Found A Match %s", CheatInputString);
//MONO_PRINT(ds);
match = TRUE;
CheatInputMode = FALSE;
KB_FlushKeyboardQueue();
if (ci[i].CheatInputFunc)
(*ci[i].CheatInputFunc)(Player, CheatInputString);
return;
}
else
{
match = TRUE;
break;
}
}
}
if (!match)
{
////DSPRINTF(ds,"Lost A Match %s", CheatInputString);
//MONO_PRINT(ds);
CheatInputMode = FALSE;
KB_FlushKeyboardQueue();
}
}
}
*/

View file

@ -0,0 +1,466 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "pal.h"
#include "game.h"
short f_c = 3;
static unsigned char tempbuf[256];
unsigned char DefaultPalette[256 * 32];
#if 1
VOID
MapColors(short num, COLOR_MAP cm, short create)
{
int i;
float inc;
if (create)
{
for (i = 0; i < 256; i++)
tempbuf[i] = i;
}
if (cm.FromRange == 0 || num <= 0 || num >= 256)
{
return;
}
inc = cm.ToRange/((float)cm.FromRange);
for (i = 0; i < cm.FromRange; i++)
tempbuf[i + cm.FromColor] = (i*inc) + cm.ToColor;
}
#else
VOID
MapColors(short num, COLOR_MAP cm, short create)
{
int i;
if (create)
{
for (i = 0; i < 256; i++)
tempbuf[i] = i;
}
if (cm.FromRange == 0 || num <= 0 || num >= 256)
{
return;
}
// from 32 to 32 || 16 to 16
if (cm.ToRange == cm.FromRange)
{
for (i = 0; i < cm.FromRange; i++)
tempbuf[i + cm.FromColor] = i + cm.ToColor;
// Quick fix for grey
if (cm.ToColor == LT_GREY)
tempbuf[cm.FromColor+31] = 0; // Set to black
}
else
// from 32 to 16
if (cm.ToRange == DIV2(cm.FromRange))
{
for (i = 0; i < cm.FromRange; i++)
tempbuf[cm.FromColor + i] = cm.ToColor + DIV2(i);
}
else
// from 16 to 32
if (DIV2(cm.ToRange) == cm.FromRange)
{
for (i = 0; i < cm.FromRange; i++)
tempbuf[cm.FromColor + DIV2(i)] = cm.ToColor;
// Quick fix for grey
if (cm.ToColor == LT_GREY)
tempbuf[cm.FromColor+31] = 0; // Set to black
}
}
#endif
#define PLAYER_COLOR_MAPS 15
static COLOR_MAP PlayerColorMap[PLAYER_COLOR_MAPS][1] =
{
{
{32, 32, LT_BLUE, LT_BROWN},
},
{
{32, 31, LT_BLUE, LT_GREY},
},
{
{32, 16, LT_BLUE, PURPLE}
},
{
{32, 16, LT_BLUE, RUST_RED},
},
{
{32, 16, LT_BLUE, YELLOW},
},
{
{32, 16, LT_BLUE, DK_GREEN},
},
{
{32, 16, LT_BLUE, GREEN},
},
{
{32, 32, LT_BLUE, LT_BLUE}, // Redundant, but has to be here for position
},
{
{32, 32, LT_BLUE, LT_TAN},
},
{
{32, 16, LT_BLUE, RED},
},
{
{32, 16, LT_BLUE, DK_GREY},
},
{
{32, 16, LT_BLUE, BRIGHT_GREEN},
},
{
{32, 16, LT_BLUE, DK_BLUE},
},
{
{32, 16, LT_BLUE, FIRE},
},
{
{32, 16, LT_BLUE, FIRE},
}
};
VOID
InitPalette(VOID)
{
static COLOR_MAP AllToRed[] =
{
{31, 16, LT_GREY, RED},
{32, 16, LT_BROWN, RED},
{32, 16, LT_TAN, RED},
{16, 16, RUST_RED, RED},
{16, 16, YELLOW, RED},
{16, 16, BRIGHT_GREEN, RED},
{16, 16, DK_GREEN, RED},
{16, 16, GREEN, RED},
{32, 16, LT_BLUE, RED},
{16, 16, PURPLE, RED},
{16, 16, FIRE, RED}
};
static COLOR_MAP AllToBlue[] =
{
{31, 32, LT_GREY, LT_BLUE},
{32, 32, LT_BROWN, LT_BLUE},
{32, 32, LT_TAN, LT_BLUE},
{16, 32, RUST_RED, LT_BLUE},
{16, 32, YELLOW, LT_BLUE},
{16, 32, BRIGHT_GREEN, LT_BLUE},
{16, 32, DK_GREEN, LT_BLUE},
{16, 32, GREEN, LT_BLUE},
{16, 32, RED, LT_BLUE},
{16, 32, PURPLE, LT_BLUE},
{16, 32, FIRE, LT_BLUE}
};
static COLOR_MAP AllToGreen[] =
{
{31, 16, LT_GREY, GREEN},
{32, 16, LT_BROWN, GREEN},
{32, 16, LT_TAN, GREEN},
{16, 16, RUST_RED, GREEN},
{16, 16, YELLOW, GREEN},
{16, 16, BRIGHT_GREEN, GREEN},
{16, 16, DK_GREEN, GREEN},
{16, 16, GREEN, GREEN},
{32, 16, LT_BLUE, GREEN},
{16, 16, RED, GREEN},
{16, 16, PURPLE, GREEN},
{16, 16, FIRE, GREEN}
};
static COLOR_MAP NinjaBasic[] =
{
{32, 16, LT_TAN, DK_GREY},
{32, 16, LT_BROWN,DK_GREY},
{32, 31, LT_BLUE,LT_GREY},
{16, 16, DK_GREEN,DK_GREY},
{16, 16, GREEN, DK_GREY},
{16, 16, YELLOW, DK_GREY}
};
static COLOR_MAP NinjaRed[] =
{
{16, 16, DK_TAN, DK_GREY},
{16, 16, GREEN, DK_TAN},
{16, 8, DK_BROWN, RED + 8},
{32, 16, LT_BLUE, RED}
};
static COLOR_MAP NinjaGreen[] =
{
{16, 16, DK_TAN, DK_GREY},
{16, 16, GREEN, DK_TAN},
{16, 8, DK_BROWN, GREEN + 6},
{32, 16, LT_BLUE, GREEN}
};
static COLOR_MAP Illuminate[] =
{
{16, 8, LT_GREY, BRIGHT_GREEN},
{16, 8, DK_GREY, BRIGHT_GREEN},
{16, 8, LT_BROWN, BRIGHT_GREEN},
{16, 8, DK_BROWN, BRIGHT_GREEN},
{16, 8, LT_TAN, BRIGHT_GREEN},
{16, 8, DK_TAN, BRIGHT_GREEN},
{16, 8, RUST_RED, BRIGHT_GREEN},
{16, 8, YELLOW, BRIGHT_GREEN},
{16, 8, DK_GREEN, BRIGHT_GREEN},
{16, 8, GREEN, BRIGHT_GREEN},
{32, 8, LT_BLUE, BRIGHT_GREEN},
{16, 8, RED, BRIGHT_GREEN},
{16, 8, PURPLE, BRIGHT_GREEN},
{16, 8, FIRE, BRIGHT_GREEN}
};
static COLOR_MAP BrownRipper = {31, 32, LT_GREY, LT_TAN};
static COLOR_MAP SkelGore = {16, 16, RED, BRIGHT_GREEN};
static COLOR_MAP ElectroGore = {16, 16, RED, DK_BLUE};
static COLOR_MAP MenuHighlight = {16, 16, RED, FIRE};
unsigned int i;
short play;
#if 0
// I need this for doing fog... Not sure why it wasn't already here.
initfastcolorlookup(1,1,1);
#endif
//
// Save default palette
//
memcpy(DefaultPalette, palookup[PALETTE_DEFAULT], 256 * 32);
//
// Dive palettes
//
for (i = 0; i < 256; i++)
tempbuf[i] = i;
// palette for underwater
makepalookup(PALETTE_DIVE, tempbuf, 0, 0, 15, TRUE);
#define FOG_AMT 15
for (i = 0; i < 256; i++)
tempbuf[i] = i;
makepalookup(PALETTE_FOG, tempbuf, FOG_AMT, FOG_AMT, FOG_AMT, TRUE);
for (i = 0; i < 256; i++)
tempbuf[i] = i;
makepalookup(PALETTE_DIVE_LAVA, tempbuf, 11, 0, 0, TRUE);
//
// 1 Range changes
//
MapColors(PALETTE_BROWN_RIPPER, BrownRipper, TRUE);
makepalookup(PALETTE_BROWN_RIPPER, tempbuf, 0, 0, 0, TRUE);
MapColors(PALETTE_SKEL_GORE, SkelGore, TRUE);
makepalookup(PALETTE_SKEL_GORE, tempbuf, 0, 0, 0, TRUE);
MapColors(PALETTE_ELECTRO_GORE, ElectroGore, TRUE);
makepalookup(PALETTE_ELECTRO_GORE, tempbuf, 0, 0, 0, TRUE);
MapColors(PALETTE_MENU_HIGHLIGHT, MenuHighlight, TRUE);
makepalookup(PALETTE_MENU_HIGHLIGHT, tempbuf, 0, 0, 0, TRUE);
//
// Multiple range changes
//
MapColors(PALETTE_BASIC_NINJA, NinjaBasic[0], TRUE);
for (i = 1; i < SIZ(NinjaBasic); i++)
MapColors(PALETTE_BASIC_NINJA, NinjaBasic[i], FALSE);
makepalookup(PALETTE_BASIC_NINJA, tempbuf, 0, 0, 0, TRUE);
MapColors(PALETTE_RED_NINJA, NinjaRed[0], TRUE);
for (i = 1; i < SIZ(NinjaRed); i++)
MapColors(PALETTE_RED_NINJA, NinjaRed[i], FALSE);
makepalookup(PALETTE_RED_NINJA, tempbuf, 0, 0, 0, TRUE);
MapColors(PALETTE_GREEN_NINJA, NinjaGreen[0], TRUE);
for (i = 1; i < SIZ(NinjaGreen); i++)
MapColors(PALETTE_GREEN_NINJA, NinjaGreen[i], FALSE);
makepalookup(PALETTE_GREEN_NINJA, tempbuf, 0, 0, 0, TRUE);
MapColors(PALETTE_GREEN_LIGHTING, AllToGreen[0], TRUE);
for (i = 1; i < SIZ(AllToGreen); i++)
MapColors(PALETTE_GREEN_LIGHTING, AllToGreen[i], FALSE);
makepalookup(PALETTE_GREEN_LIGHTING, tempbuf, 0, 0, 0, TRUE);
MapColors(PALETTE_RED_LIGHTING, AllToRed[0], TRUE);
for (i = 1; i < SIZ(AllToRed); i++)
MapColors(PALETTE_RED_LIGHTING, AllToRed[i], FALSE);
makepalookup(PALETTE_RED_LIGHTING, tempbuf, 0, 0, 0, TRUE);
MapColors(PALETTE_BLUE_LIGHTING, AllToBlue[0], TRUE);
for (i = 1; i < SIZ(AllToBlue); i++)
MapColors(PALETTE_BLUE_LIGHTING, AllToBlue[i], FALSE);
makepalookup(PALETTE_BLUE_LIGHTING, tempbuf, 0, 0, 0, TRUE);
MapColors(PALETTE_ILLUMINATE, Illuminate[0], TRUE);
for (i = 1; i < SIZ(Illuminate); i++)
MapColors(PALETTE_ILLUMINATE, Illuminate[i], FALSE);
makepalookup(PALETTE_ILLUMINATE, tempbuf, 0, 0, 0, TRUE);
// PLAYER COLORS - ALSO USED FOR OTHER THINGS
for (play = 0; play < PLAYER_COLOR_MAPS; play++)
{
MapColors(PALETTE_PLAYER0 + play, PlayerColorMap[play][0], TRUE);
MapColors(PALETTE_PLAYER0 + play, PlayerColorMap[play][0], FALSE);
makepalookup(PALETTE_PLAYER0 + play, tempbuf, 0, 0, 0, TRUE);
}
//
// Special Brown sludge
//
for (i = 0; i < 256; i++)
tempbuf[i] = i;
// invert the brown palette
for (i = 0; i < 32; i++)
tempbuf[LT_BROWN + i] = (LT_BROWN + 32) - i;
makepalookup(PALETTE_SLUDGE, tempbuf, 0, 0, 0, TRUE);
}
/*
2. You must now use my function to set or get any palette
registers.This means that the keywords "3c7", "3c8", and "3c9" should not even exist in your code.I really
didn 't want to force you to use my palette functions, but
since VESA 2.0 supports non VGA compatible cards, you must
do
it this way.If you use setbrightness for all of your
palette setting, then you can ignore this.Note that the
palette format here is VESA 's palette format, which is
different than my other palette control functions.It 's
4 bytes and RGB are backwards.Here are the function
prototypes:
VBE_setPalette(long palstart, long palnum, char *dapal);
VBE_getPalette(long palstart, long palnum, char *dapal);
palstart is the offset of the first palette to set
palnum is the number of the palette entries to set
dapal is a pointer to the palette buffer.The palette
buffer must be in this format:
char Blue, Green, Red, reserved;
I think this format stinks, but since VESA 2.0 uses
it, the code will run fastest if the buffer is not
copied.You can make your own cover up function if
you don 't like this format.
This example sets up a wasteful gray scale palette:
char mypalette[1024];
for (i = 0; i < 256; i++)
{
mypalette[i * 4 + 0] = (i >> 2); // Blue
mypalette[i * 4 + 1] = (i >> 2); // Green
mypalette[i * 4 + 2] = (i >> 2); // Red
mypalette[i * 4 + 3] = 0; // reserved
}
VBE_setPalette(0, 256, mypalette);
*/
#define ORED 0
#define OGREEN 1
#define OBLUE 2
#define NBLUE 0
#define NGREEN 1
#define NRED 2
#define NRESERVED 3
VOID SetPaletteToVESA(unsigned char *pal)
{
/*
char pal_buff[1024];
short i;
for (i = 0; i < 256; i++)
{
pal_buff[i * 4 + NRED] = pal[i * 3 + ORED];
pal_buff[i * 4 + NGREEN] = pal[i * 3 + OGREEN];
pal_buff[i * 4 + NBLUE] = pal[i * 3 + OBLUE];
pal_buff[i * 4 + NRESERVED] = 0;
}
VBE_setPalette(0, 256, pal_buff);
*/
setbrightness(0,pal,4|2);
// fprintf(stderr,"SetPaletteToVESA() called\n");
}
VOID set_pal(unsigned char *pal)
{
SetPaletteToVESA(pal);
}
VOID GetPaletteFromVESA(unsigned char *pal)
{
/*
char pal_buff[1024];
short i;
VBE_getPalette(0, 256, pal_buff);
for (i = 0; i < 256; i++)
{
pal[i * 3 + ORED] = pal_buff[i * 4 + NRED];
pal[i * 3 + OGREEN] = pal_buff[i * 4 + NGREEN];
pal[i * 3 + OBLUE] = pal_buff[i * 4 + NBLUE];
}
*/
int i;
for (i=0; i<256; i++)
{
pal[i*3+0] = curpalette[i].r>>2;
pal[i*3+1] = curpalette[i].g>>2;
pal[i*3+2] = curpalette[i].b>>2;
}
// fprintf(stderr,"GetPaletteFromVESA() called\n");
}

View file

@ -0,0 +1,6 @@
void MapColors(short num,COLOR_MAP cm,short create);
void InitPalette(void);
void SetPaletteToVESA(unsigned char *pal);
void set_pal(unsigned char *pal);
void GetPaletteFromVESA(unsigned char *pal);
void InitPalette(void);

View file

@ -0,0 +1,137 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
//****************************************************************************
//
// common_game.h
//
// common defines for the setup program
//
//****************************************************************************
#ifndef common_public_
#define common_public_
#ifdef __cplusplus
extern "C" {
#endif
//****************************************************************************
//
// DEFINES
//
//****************************************************************************
//
// Color Defines
//
#define MENUBACK_FOREGROUND COLOR_BLACK
#define MENUBACK_BACKGROUND COLOR_DARKGRAY
#define MENUBACKBORDER_FOREGROUND COLOR_BLACK
#define MENUBACKBORDER_BACKGROUND COLOR_GRAY
#define MENU_ACTIVE_FOREGROUND COLOR_WHITE
#define MENU_INACTIVE_FOREGROUND COLOR_GRAY
#define MENU_DISPLAY_FOREGROUND COLOR_LIGHTGREEN
#define MENU_SECTIONHEADER_FOREGROUND COLOR_YELLOW
//
// Setup program defines
//
#define SETUPFILENAME "sw.cfg"
#define SETUPPROGRAMNAME ("Shadow Warrior Setup")
#define SETUPPROGRAMVERSION ("1.2")
#define GAMENAME "Shadow Warrior"
#define GAMELAUNCHER ("SW.EXE")
#define GAMETOTYPE ("SW")
#define MENUFOOTER "Esc Exits  Move ÄÙ Selects\0"
#define COMMITLAUNCHER ("COMMIT.EXE")
#define COMMITFILENAME ("COMMIT.DAT")
#define MAXVOICES 32
#define SONGNAME ("Shadow Warrior Theme Song")
//#define SOUNDSETUPLAUNCHER ("SNDSETUP.EXE")
// Default Socket Number
#define DEFAULTSOCKETNUMBER 0x8849
// Default RTS file
#define DEFAULTRTSFILE "sw.rts"
// Default RTS path
#define DEFAULTRTSPATH ".\\"
// Default UserLevel path
#define DEFAULTLEVELPATH ".\\"
// Default External Control file
#define DEFAULTCONTROLFILE "EXTERNAL.EXE"
// Default Help file
#define DEFAULTHELPFILE "SWHELP.EXE"
// RTS extension
#define RTSEXTENSION "RTS"
// MAP extension
#define MAPEXTENSION "MAP"
// Default Player name
#define DEFAULTPLAYERNAME "KATO"
// Default Macros
#define MACRO1 "Burn baby burn..."
#define MACRO2 "You make another stupid move."
#define MACRO3 "Blocking with your head again?"
#define MACRO4 "You not fight well with hands!"
#define MACRO5 "You so stupid!"
#define MACRO6 "Quit jerking off. Come fight me!"
#define MACRO7 "What the matter you scaredy cat?"
#define MACRO8 "Did I break your concentration?"
#define MACRO9 "Hope you were paying attention."
#define MACRO10 "ITTAIIIUUU!!!"
#ifdef __cplusplus
};
#endif
#endif

View file

@ -0,0 +1,731 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "baselayer.h"
#include "osd.h"
#include "settings.h"
#include "mytypes.h"
#include "develop.h"
#include "scriplib.h"
#include "file_lib.h"
#include "gamedefs.h"
#include "keyboard.h"
#include "util_lib.h"
#include "function.h"
#include "control.h"
#include "fx_man.h"
#include "sounds.h"
#include "config.h"
#include "common_game.h"
// we load this in to get default button and key assignments
// as well as setting up function mappings
#include "_functio.h"
#include "_config.h"
extern void ReadGameSetup(int32 scripthandle);
extern void WriteGameSetup(int32 scripthandle);
//
// Comm variables
//
char CommPlayerName[32];
int32 NumberPlayers,CommPort,PortSpeed,IrqNumber,UartAddress;
//
// Sound variables
//
int32 FXDevice = 0;
int32 MusicDevice = 0;
int32 NumVoices = 32;
int32 NumChannels = 2;
int32 NumBits = 16;
int32 MixRate = 44100;
int32 UseMouse = 1, UseJoystick = 0;
byte KeyboardKeys[NUMGAMEFUNCTIONS][2];
int32 MouseButtons[MAXMOUSEBUTTONS];
int32 MouseButtonsClicked[MAXMOUSEBUTTONS];
int32 MouseDigitalAxes[MAXMOUSEAXES][2];
int32 MouseAnalogAxes[MAXMOUSEAXES];
int32 MouseAnalogScale[MAXMOUSEAXES];
int32 JoystickButtons[MAXJOYBUTTONS];
int32 JoystickButtonsClicked[MAXJOYBUTTONS];
int32 JoystickDigitalAxes[MAXJOYAXES][2];
int32 JoystickAnalogAxes[MAXJOYAXES];
int32 JoystickAnalogScale[MAXJOYAXES];
int32 JoystickAnalogDead[MAXJOYAXES];
int32 JoystickAnalogSaturate[MAXJOYAXES];
//
// Screen variables
//
int32 ScreenMode = 1;
int32 ScreenWidth = 640;
int32 ScreenHeight = 480;
int32 ScreenBPP = 8;
int32 ForceSetup = 1;
extern char WangBangMacro[10][64];
char RTSName[MAXRTSNAMELENGTH];
//static char setupfilename[64]={SETUPFILENAME};
char setupfilename[64]= {SETUPFILENAME};
static int32 scripthandle = -1;
/*
===================
=
= CONFIG_FunctionNameToNum
=
===================
*/
int32 CONFIG_FunctionNameToNum(const char *func)
{
int32 i;
if (!func) return -1;
for (i=0; i<NUMGAMEFUNCTIONS; i++)
{
if (!Bstrcasecmp(func,gamefunctions[i]))
{
return i;
}
}
return -1;
}
/*
===================
=
= CONFIG_FunctionNumToName
=
===================
*/
const char *CONFIG_FunctionNumToName(int32 func)
{
if ((unsigned)func >= (unsigned)NUMGAMEFUNCTIONS)
{
return NULL;
}
else
{
return gamefunctions[func];
}
}
/*
===================
=
= CONFIG_AnalogNameToNum
=
===================
*/
int32 CONFIG_AnalogNameToNum(const char *func)
{
if (!Bstrcasecmp(func,"analog_turning"))
{
return analog_turning;
}
if (!Bstrcasecmp(func,"analog_strafing"))
{
return analog_strafing;
}
if (!Bstrcasecmp(func,"analog_moving"))
{
return analog_moving;
}
if (!Bstrcasecmp(func,"analog_lookingupanddown"))
{
return analog_lookingupanddown;
}
return -1;
}
const char *CONFIG_AnalogNumToName(int32 func)
{
switch (func)
{
case analog_turning:
return "analog_turning";
case analog_strafing:
return "analog_strafing";
case analog_moving:
return "analog_moving";
case analog_lookingupanddown:
return "analog_lookingupanddown";
default: break;
}
return NULL;
}
/*
===================
=
= CONFIG_SetDefaults
=
===================
*/
void CONFIG_SetDefaults(void)
{
// JBF 20031211
int32 i,f;
byte k1,k2;
ScreenMode = 1;
ScreenWidth = 640;
ScreenHeight = 480;
ScreenBPP = 8;
FXDevice = 0;
MusicDevice = 0;
NumVoices = 32;
NumChannels = 2;
NumBits = 16;
MixRate = 44100;
memcpy(&gs, &gs_defaults, sizeof(gs));
Bstrcpy(RTSName, DEFAULTRTSFILE);
Bstrcpy(CommPlayerName, DEFAULTPLAYERNAME);
Bstrcpy(WangBangMacro[0], MACRO1);
Bstrcpy(WangBangMacro[1], MACRO2);
Bstrcpy(WangBangMacro[2], MACRO3);
Bstrcpy(WangBangMacro[3], MACRO4);
Bstrcpy(WangBangMacro[4], MACRO5);
Bstrcpy(WangBangMacro[5], MACRO6);
Bstrcpy(WangBangMacro[6], MACRO7);
Bstrcpy(WangBangMacro[7], MACRO8);
Bstrcpy(WangBangMacro[8], MACRO9);
Bstrcpy(WangBangMacro[9], MACRO10);
SetDefaultKeyDefinitions(0);
SetMouseDefaults(0);
memset(MouseDigitalAxes, -1, sizeof(MouseDigitalAxes));
for (i=0; i<MAXMOUSEAXES; i++)
{
MouseAnalogScale[i] = 65536;
MouseDigitalAxes[i][0] = CONFIG_FunctionNameToNum(mousedigitaldefaults[i*2]);
MouseDigitalAxes[i][1] = CONFIG_FunctionNameToNum(mousedigitaldefaults[i*2+1]);
MouseAnalogAxes[i] = CONFIG_AnalogNameToNum(mouseanalogdefaults[i]);
}
CONTROL_SetMouseSensitivity(gs.MouseSpeed);
memset(JoystickButtons, -1, sizeof(JoystickButtons));
memset(JoystickButtonsClicked, -1, sizeof(JoystickButtonsClicked));
for (i=0; i < (int32)(sizeof(joystickdefaults)/sizeof(char *)); i++)
{
JoystickButtons[i] = CONFIG_FunctionNameToNum(joystickdefaults[i]);
JoystickButtonsClicked[i] = CONFIG_FunctionNameToNum(joystickclickeddefaults[i]);
}
memset(JoystickDigitalAxes, -1, sizeof(JoystickDigitalAxes));
for (i=0; i < (int32)(sizeof(joystickanalogdefaults)/sizeof(char *)); i++)
{
JoystickAnalogScale[i] = 65536;
JoystickAnalogDead[i] = 1024;
JoystickAnalogSaturate[i] = 32767-1024;
JoystickDigitalAxes[i][0] = CONFIG_FunctionNameToNum(joystickdigitaldefaults[i*2]);
JoystickDigitalAxes[i][1] = CONFIG_FunctionNameToNum(joystickdigitaldefaults[i*2+1]);
JoystickAnalogAxes[i] = CONFIG_AnalogNameToNum(joystickanalogdefaults[i]);
}
}
void SetDefaultKeyDefinitions(int style)
{
int numkeydefaults;
char **keydefaultset;
int i, f, k1, k2;
if (style)
{
numkeydefaults = sizeof(keydefaults_modern) / sizeof(char *) / 3;
keydefaultset = keydefaults_modern;
}
else
{
numkeydefaults = sizeof(keydefaults) / sizeof(char *) / 3;
keydefaultset = keydefaults;
}
memset(KeyboardKeys, 0xff, sizeof(KeyboardKeys));
for (i=0; i < numkeydefaults; i++)
{
f = CONFIG_FunctionNameToNum(keydefaultset[3*i+0]);
if (f == -1) continue;
k1 = KB_StringToScanCode(keydefaultset[3*i+1]);
k2 = KB_StringToScanCode(keydefaultset[3*i+2]);
CONTROL_MapKey(i, k1, k2);
KeyboardKeys[f][0] = k1;
KeyboardKeys[f][1] = k2;
}
}
void SetMouseDefaults(int style)
{
int nummousedefaults;
char **mousedefaultset, **mouseclickeddefaultset;
int i;
if (style)
{
nummousedefaults = sizeof(mousedefaults_modern) / sizeof(char *);
mousedefaultset = mousedefaults_modern;
mouseclickeddefaultset = mouseclickeddefaults_modern;
}
else
{
nummousedefaults = sizeof(mousedefaults) / sizeof(char *);
mousedefaultset = mousedefaults;
mouseclickeddefaultset = mouseclickeddefaults;
}
memset(MouseButtons, -1, sizeof(MouseButtons));
memset(MouseButtonsClicked, -1, sizeof(MouseButtonsClicked));
for (i=0; i < nummousedefaults; i++)
{
MouseButtons[i] = CONFIG_FunctionNameToNum(mousedefaultset[i]);
CONTROL_MapButton(MouseButtons[i], i, FALSE, controldevice_mouse);
if (i<4) continue;
MouseButtonsClicked[i] = CONFIG_FunctionNameToNum(mouseclickeddefaultset[i]);
CONTROL_MapButton(MouseButtonsClicked[i], i, TRUE, controldevice_mouse);
}
}
/*
===================
=
= CONFIG_ReadKeys
=
===================
*/
void CONFIG_ReadKeys(int32 scripthandle)
{
int32 i;
int32 numkeyentries;
int32 function;
char keyname1[80];
char keyname2[80];
kb_scancode key1,key2;
if (scripthandle < 0) return;
numkeyentries = SCRIPT_NumberEntries(scripthandle,"KeyDefinitions");
for (i=0; i<numkeyentries; i++)
{
function = CONFIG_FunctionNameToNum(SCRIPT_Entry(scripthandle,"KeyDefinitions", i));
if (function != -1)
{
memset(keyname1,0,sizeof(keyname1));
memset(keyname2,0,sizeof(keyname2));
SCRIPT_GetDoubleString
(
scripthandle,
"KeyDefinitions",
SCRIPT_Entry(scripthandle, "KeyDefinitions", i),
keyname1,
keyname2
);
key1 = 0xff;
key2 = 0xff;
if (keyname1[0])
{
key1 = (byte) KB_StringToScanCode(keyname1);
}
if (keyname2[0])
{
key2 = (byte) KB_StringToScanCode(keyname2);
}
KeyboardKeys[function][0] = key1;
KeyboardKeys[function][1] = key2;
}
}
for (i=0; i<NUMGAMEFUNCTIONS; i++)
{
if (i == gamefunc_Show_Console)
OSD_CaptureKey(KeyboardKeys[i][0]);
else
CONTROL_MapKey(i, KeyboardKeys[i][0], KeyboardKeys[i][1]);
}
}
/*
===================
=
= CONFIG_SetupMouse
=
===================
*/
void CONFIG_SetupMouse(void)
{
int32 i;
char str[80],*p;
char temp[80];
int32 function, scale;
if (scripthandle < 0) return;
for (i=0; i<MAXMOUSEBUTTONS; i++)
{
Bsprintf(str,"MouseButton%d",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle,"Controls", str,temp))
MouseButtons[i] = CONFIG_FunctionNameToNum(temp);
Bsprintf(str,"MouseButtonClicked%d",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle,"Controls", str,temp))
MouseButtonsClicked[i] = CONFIG_FunctionNameToNum(temp);
}
// map over the axes
for (i=0; i<MAXMOUSEAXES; i++)
{
Bsprintf(str,"MouseAnalogAxes%d",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle, "Controls", str,temp))
MouseAnalogAxes[i] = CONFIG_AnalogNameToNum(temp);
Bsprintf(str,"MouseDigitalAxes%d_0",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle, "Controls", str,temp))
MouseDigitalAxes[i][0] = CONFIG_FunctionNameToNum(temp);
Bsprintf(str,"MouseDigitalAxes%d_1",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle, "Controls", str,temp))
MouseDigitalAxes[i][1] = CONFIG_FunctionNameToNum(temp);
Bsprintf(str,"MouseAnalogScale%d",i);
scale = MouseAnalogScale[i];
SCRIPT_GetNumber(scripthandle, "Controls", str,&scale);
MouseAnalogScale[i] = scale;
}
// 0 to 65536
SCRIPT_GetNumber(scripthandle, "Controls","MouseSensitivity",&function);
gs.MouseSpeed = function;
for (i=0; i<MAXMOUSEBUTTONS; i++)
{
CONTROL_MapButton(MouseButtons[i], i, FALSE, controldevice_mouse);
CONTROL_MapButton(MouseButtonsClicked[i], i, TRUE, controldevice_mouse);
}
for (i=0; i<MAXMOUSEAXES; i++)
{
CONTROL_MapAnalogAxis(i, MouseAnalogAxes[i], controldevice_mouse);
CONTROL_MapDigitalAxis(i, MouseDigitalAxes[i][0], 0,controldevice_mouse);
CONTROL_MapDigitalAxis(i, MouseDigitalAxes[i][1], 1,controldevice_mouse);
CONTROL_SetAnalogAxisScale(i, MouseAnalogScale[i], controldevice_mouse);
}
CONTROL_SetMouseSensitivity(gs.MouseSpeed);
}
/*
===================
=
= CONFIG_SetupJoystick
=
===================
*/
void CONFIG_SetupJoystick(void)
{
int32 i;
char str[80],*p;
char temp[80];
int32 function, scale;
if (scripthandle < 0) return;
for (i=0; i<MAXJOYBUTTONS; i++)
{
Bsprintf(str,"JoystickButton%d",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle,"Controls", str,temp))
JoystickButtons[i] = CONFIG_FunctionNameToNum(temp);
Bsprintf(str,"JoystickButtonClicked%d",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle,"Controls", str,temp))
JoystickButtonsClicked[i] = CONFIG_FunctionNameToNum(temp);
}
// map over the axes
for (i=0; i<MAXJOYAXES; i++)
{
Bsprintf(str,"JoystickAnalogAxes%d",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle, "Controls", str,temp))
JoystickAnalogAxes[i] = CONFIG_AnalogNameToNum(temp);
Bsprintf(str,"JoystickDigitalAxes%d_0",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle, "Controls", str,temp))
JoystickDigitalAxes[i][0] = CONFIG_FunctionNameToNum(temp);
Bsprintf(str,"JoystickDigitalAxes%d_1",i); temp[0] = 0;
if (!SCRIPT_GetString(scripthandle, "Controls", str,temp))
JoystickDigitalAxes[i][1] = CONFIG_FunctionNameToNum(temp);
Bsprintf(str,"JoystickAnalogScale%d",i);
scale = JoystickAnalogScale[i];
SCRIPT_GetNumber(scripthandle, "Controls", str,&scale);
JoystickAnalogScale[i] = scale;
Bsprintf(str,"JoystickAnalogDead%d",i);
scale = JoystickAnalogDead[i];
SCRIPT_GetNumber(scripthandle, "Controls", str,&scale);
JoystickAnalogDead[i] = scale;
Bsprintf(str,"JoystickAnalogSaturate%d",i);
scale = JoystickAnalogSaturate[i];
SCRIPT_GetNumber(scripthandle, "Controls", str,&scale);
JoystickAnalogSaturate[i] = scale;
}
for (i=0; i<MAXJOYBUTTONS; i++)
{
CONTROL_MapButton(JoystickButtons[i], i, FALSE, controldevice_joystick);
CONTROL_MapButton(JoystickButtonsClicked[i], i, TRUE, controldevice_joystick);
}
for (i=0; i<MAXJOYAXES; i++)
{
CONTROL_MapAnalogAxis(i, JoystickAnalogAxes[i], controldevice_joystick);
CONTROL_MapDigitalAxis(i, JoystickDigitalAxes[i][0], 0, controldevice_joystick);
CONTROL_MapDigitalAxis(i, JoystickDigitalAxes[i][1], 1, controldevice_joystick);
CONTROL_SetAnalogAxisScale(i, JoystickAnalogScale[i], controldevice_joystick);
CONTROL_SetJoyAxisDead(i, JoystickAnalogDead[i]);
CONTROL_SetJoyAxisSaturate(i, JoystickAnalogSaturate[i]);
}
}
/*
===================
=
= CONFIG_ReadSetup
=
===================
*/
int32 CONFIG_ReadSetup(void)
{
int32 dummy;
char ret;
extern char ds[];
extern char PlayerNameArg[32];
char oggtrackname[MAXOGGTRACKLENGTH] = {0};
CONTROL_ClearAssignments();
CONFIG_SetDefaults();
if (SafeFileExists(setupfilename))
scripthandle = SCRIPT_Load(setupfilename);
if (scripthandle < 0) return -1;
SCRIPT_GetNumber(scripthandle, "Screen Setup", "ScreenMode",&ScreenMode);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "ScreenWidth",&ScreenWidth);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "ScreenHeight",&ScreenHeight);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "ScreenBPP", &ScreenBPP);
if (ScreenBPP < 8) ScreenBPP = 8;
#ifdef RENDERTYPEWIN
SCRIPT_GetNumber(scripthandle, "Screen Setup", "MaxRefreshFreq", (int32 *)&maxrefreshfreq);
#endif
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLTextureMode", &gltexfiltermode);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLAnisotropy", &glanisotropy);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLUseTextureCompr", &glusetexcompr);
SCRIPT_GetNumber(scripthandle, "Sound Setup", "FXDevice",&FXDevice);
SCRIPT_GetNumber(scripthandle, "Sound Setup", "MusicDevice",&MusicDevice);
SCRIPT_GetNumber(scripthandle, "Sound Setup", "FXVolume",&dummy);
gs.SoundVolume = dummy;
SCRIPT_GetNumber(scripthandle, "Sound Setup", "MusicVolume",&dummy);
gs.MusicVolume = dummy;
SCRIPT_GetNumber(scripthandle, "Sound Setup", "NumVoices",&NumVoices);
SCRIPT_GetNumber(scripthandle, "Sound Setup", "NumChannels",&NumChannels);
SCRIPT_GetNumber(scripthandle, "Sound Setup", "NumBits",&NumBits);
SCRIPT_GetNumber(scripthandle, "Sound Setup", "MixRate",&MixRate);
SCRIPT_GetNumber(scripthandle, "Sound Setup", "ReverseStereo",&dummy);
gs.FlipStereo = dummy;
if (gs.FlipStereo) gs.FlipStereo = 1;
SCRIPT_GetString(scripthandle, "Sound Setup", "OggTrackName", oggtrackname);
if (oggtrackname[0] != '\0')
memcpy(gs.OggTrackName, oggtrackname, MAXOGGTRACKLENGTH);
SCRIPT_GetNumber(scripthandle, "Setup", "ForceSetup",&ForceSetup);
SCRIPT_GetNumber(scripthandle, "Controls","UseMouse",&UseMouse);
SCRIPT_GetNumber(scripthandle, "Controls","UseJoystick",&UseJoystick);
SCRIPT_GetString(scripthandle, "Comm Setup", "RTSName",RTSName);
SCRIPT_GetString(scripthandle, "Comm Setup","PlayerName",CommPlayerName);
ReadGameSetup(scripthandle);
CONFIG_ReadKeys(scripthandle);
//CONFIG_SetupMouse(scripthandle);
//CONFIG_SetupJoystick(scripthandle);
if (PlayerNameArg[0] != '\0')
{
strcpy(CommPlayerName, PlayerNameArg);
}
return 0;
}
/*
===================
=
= CONFIG_WriteSetup
=
===================
*/
void CONFIG_WriteSetup(void)
{
int32 dummy;
char buf[80];
if (scripthandle < 0)
scripthandle = SCRIPT_Init(setupfilename);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "ScreenWidth", ScreenWidth,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "ScreenHeight",ScreenHeight,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "ScreenMode",ScreenMode,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "ScreenBPP",ScreenBPP,FALSE,FALSE);
#ifdef RENDERTYPEWIN
SCRIPT_PutNumber(scripthandle, "Screen Setup", "MaxRefreshFreq",maxrefreshfreq,FALSE,FALSE);
#endif
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLTextureMode",gltexfiltermode,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLAnisotropy",glanisotropy,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLUseTextureCompr",glusetexcompr,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Sound Setup", "FXDevice", FXDevice, FALSE, FALSE);
SCRIPT_PutNumber(scripthandle, "Sound Setup", "MusicDevice", MusicDevice, FALSE, FALSE);
SCRIPT_PutNumber(scripthandle, "Sound Setup", "NumVoices", NumVoices, FALSE, FALSE);
SCRIPT_PutNumber(scripthandle, "Sound Setup", "NumChannels", NumChannels, FALSE, FALSE);
SCRIPT_PutNumber(scripthandle, "Sound Setup", "NumBits", NumBits, FALSE, FALSE);
SCRIPT_PutNumber(scripthandle, "Sound Setup", "MixRate", MixRate, FALSE, FALSE);
SCRIPT_PutNumber(scripthandle, "Sound Setup", "FXVolume",gs.SoundVolume,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Sound Setup", "MusicVolume",gs.MusicVolume,FALSE,FALSE);
dummy = gs.FlipStereo;
SCRIPT_PutNumber(scripthandle, "Sound Setup", "ReverseStereo",dummy,FALSE,FALSE);
SCRIPT_PutString(scripthandle, "Sound Setup", "OggTrackName", gs.OggTrackName);
SCRIPT_PutNumber(scripthandle, "Setup", "ForceSetup",ForceSetup,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Controls","UseMouse",UseMouse,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Controls","UseJoystick",UseJoystick,FALSE,FALSE);
SCRIPT_PutNumber(scripthandle, "Controls","MouseSensitivity",gs.MouseSpeed,FALSE,FALSE);
WriteGameSetup(scripthandle);
for (dummy=0; dummy<NUMGAMEFUNCTIONS; dummy++)
{
SCRIPT_PutDoubleString(scripthandle, "KeyDefinitions", CONFIG_FunctionNumToName(dummy),
KB_ScanCodeToString(KeyboardKeys[dummy][0]), KB_ScanCodeToString(KeyboardKeys[dummy][1]));
}
for (dummy=0; dummy<MAXMOUSEBUTTONS; dummy++)
{
Bsprintf(buf,"MouseButton%d",dummy);
SCRIPT_PutString(scripthandle,"Controls", buf, CONFIG_FunctionNumToName(MouseButtons[dummy]));
if (dummy >= (MAXMOUSEBUTTONS-2)) continue; // scroll wheel
Bsprintf(buf,"MouseButtonClicked%d",dummy);
SCRIPT_PutString(scripthandle,"Controls", buf, CONFIG_FunctionNumToName(MouseButtonsClicked[dummy]));
}
for (dummy=0; dummy<MAXMOUSEAXES; dummy++)
{
Bsprintf(buf,"MouseAnalogAxes%d",dummy);
SCRIPT_PutString(scripthandle, "Controls", buf, CONFIG_AnalogNumToName(MouseAnalogAxes[dummy]));
Bsprintf(buf,"MouseDigitalAxes%d_0",dummy);
SCRIPT_PutString(scripthandle, "Controls", buf, CONFIG_FunctionNumToName(MouseDigitalAxes[dummy][0]));
Bsprintf(buf,"MouseDigitalAxes%d_1",dummy);
SCRIPT_PutString(scripthandle, "Controls", buf, CONFIG_FunctionNumToName(MouseDigitalAxes[dummy][1]));
Bsprintf(buf,"MouseAnalogScale%d",dummy);
SCRIPT_PutNumber(scripthandle, "Controls", buf, MouseAnalogScale[dummy], FALSE, FALSE);
}
for (dummy=0; dummy<MAXJOYBUTTONS; dummy++)
{
Bsprintf(buf,"JoystickButton%d",dummy);
SCRIPT_PutString(scripthandle,"Controls", buf, CONFIG_FunctionNumToName(JoystickButtons[dummy]));
Bsprintf(buf,"JoystickButtonClicked%d",dummy);
SCRIPT_PutString(scripthandle,"Controls", buf, CONFIG_FunctionNumToName(JoystickButtonsClicked[dummy]));
}
for (dummy=0; dummy<MAXJOYAXES; dummy++)
{
Bsprintf(buf,"JoystickAnalogAxes%d",dummy);
SCRIPT_PutString(scripthandle, "Controls", buf, CONFIG_AnalogNumToName(JoystickAnalogAxes[dummy]));
Bsprintf(buf,"JoystickDigitalAxes%d_0",dummy);
SCRIPT_PutString(scripthandle, "Controls", buf, CONFIG_FunctionNumToName(JoystickDigitalAxes[dummy][0]));
Bsprintf(buf,"JoystickDigitalAxes%d_1",dummy);
SCRIPT_PutString(scripthandle, "Controls", buf, CONFIG_FunctionNumToName(JoystickDigitalAxes[dummy][1]));
Bsprintf(buf,"JoystickAnalogScale%d",dummy);
SCRIPT_PutNumber(scripthandle, "Controls", buf, JoystickAnalogScale[dummy], FALSE, FALSE);
Bsprintf(buf,"JoystickAnalogDead%d",dummy);
SCRIPT_PutNumber(scripthandle, "Controls", buf, JoystickAnalogDead[dummy], FALSE, FALSE);
Bsprintf(buf,"JoystickAnalogSaturate%d",dummy);
SCRIPT_PutNumber(scripthandle, "Controls", buf, JoystickAnalogSaturate[dummy], FALSE, FALSE);
}
SCRIPT_Save(scripthandle, setupfilename);
SCRIPT_Free(scripthandle);
}

View file

@ -0,0 +1,133 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef config_public_
#define config_public_
#ifdef __cplusplus
extern "C" {
#endif
#include "function.h"
#define SETUPNAMEPARM "SETUPFILE"
// screen externs
extern int32 ScreenMode; // Screen mode
extern int32 ScreenWidth;
extern int32 ScreenHeight;
extern int32 ScreenBPP;
extern int32 ScreenBufferMode;
extern int32 VesaBufferMode;
extern int32 ForceSetup;
// sound externs
extern int32 FXDevice; // Sound FX Card number
extern int32 MusicDevice; // Music Card number
extern int32 FXVolume; // FX Volume
extern int32 MusicVolume; // Music Volume
extern int32 NumVoices; // Number of voices
extern int32 NumChannels; // Number of channels
extern int32 NumBits; // Number of bits
extern int32 MixRate; // Mixing rate
extern int32 MidiPort; // Midi Port
extern int32 ReverseStereo; // Reverse Stereo Channels
// comm externs
extern int32 ComPort;
extern int32 IrqNumber;
extern int32 UartAddress;
extern int32 PortSpeed;
extern int32 ToneDial;
extern char ModemName[MAXMODEMSTRING];
extern char InitString[MAXMODEMSTRING];
extern char HangupString[MAXMODEMSTRING];
extern char DialoutString[MAXMODEMSTRING];
extern int32 SocketNumber;
extern char CommbatMacro[MAXMACROS][MAXMACROLENGTH];
extern char PhoneNames[MAXPHONEENTRIES][PHONENAMELENGTH];
extern char PhoneNumbers[MAXPHONEENTRIES][PHONENUMBERLENGTH];
extern char PhoneNumber[PHONENUMBERLENGTH];
extern int32 NumberPlayers;
extern int32 ConnectType;
extern char PlayerName[MAXPLAYERNAMELENGTH];
extern char RTSName[MAXRTSNAMELENGTH];
extern char UserLevel[MAXUSERLEVELNAMELENGTH];
extern char RTSPath[MAXRTSPATHLENGTH];
extern char UserPath[MAXUSERLEVELPATHLENGTH];
// controller externs
extern int32 UseMouse, UseJoystick;
extern int32 JoystickPort;
extern int32 MouseSensitivity;
extern int32 MouseAiming;
extern int32 MouseAimingFlipped;
extern byte KeyboardKeys[NUMGAMEFUNCTIONS][2];
extern int32 MouseButtons[MAXMOUSEBUTTONS];
extern int32 MouseButtonsClicked[MAXMOUSEBUTTONS];
extern int32 JoystickButtons[MAXJOYBUTTONS];
extern int32 JoystickButtonsClicked[MAXJOYBUTTONS];
extern int32 MouseAnalogAxes[MAXMOUSEAXES];
extern int32 JoystickAnalogAxes[MAXJOYAXES];
extern int32 MouseAnalogScale[MAXMOUSEAXES];
extern int32 JoystickAnalogScale[MAXJOYAXES];
extern int32 JoystickAnalogDead[MAXJOYAXES];
extern int32 JoystickAnalogSaturate[MAXJOYAXES];
extern int32 EnableRudder;
extern int32 MouseDigitalAxes[MAXMOUSEAXES][2];
extern int32 JoystickDigitalAxes[MAXJOYAXES][2];
extern char setupfilename[64];
extern char ExternalControlFilename[64];
//style=0: classic
//style=1: modern
void SetMouseDefaults(int style);
void SetJoystickDefaults(void);
void SetDefaultKeyDefinitions(int style);
int32 CONFIG_ReadSetup(void);
void CONFIG_SetupMouse(void);
void CONFIG_SetupJoystick(void);
void CONFIG_WriteSetup(void);
void WriteCommitFile(int32 gametype);
void CONFIG_GetSetupFilename(void);
const char *CONFIG_FunctionNumToName(int32 func);
int32 CONFIG_FunctionNameToNum(const char *func);
const char *CONFIG_AnalogNumToName(int32 func);
int32 CONFIG_AnalogNameToNum(const char *func);
#ifdef __cplusplus
};
#endif
#endif

View file

@ -0,0 +1,479 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "names.h"
#include "names2.h"
//#include "panel.h"
#ifdef MAKE_CONPIC_ENUM
#define CONPIC_ENTRY(tile,name) ID_ ## name = tile,
#endif
////////////////////////////////////////////////////////////////////////////////
//
// SWORD
//
////////////////////////////////////////////////////////////////////////////////
#define SWORD_REST 2080
#define SWORD_SWING0 2081
#define SWORD_SWING1 2082
#define SWORD_SWING2 2083
CONPIC_ENTRY(SWORD_REST+0,SwordPresent0)
CONPIC_ENTRY(SWORD_SWING0,SwordSwing0)
CONPIC_ENTRY(SWORD_SWING1,SwordSwing1)
CONPIC_ENTRY(SWORD_SWING2,SwordSwing2)
CONPIC_ENTRY(SWORD_SWING0,SwordSwingR0)
CONPIC_ENTRY(SWORD_SWING1,SwordSwingR1)
CONPIC_ENTRY(SWORD_SWING2,SwordSwingR2)
#define BLOODYSWORD_REST 4090
#define BLOODYSWORD_SWING0 4091
#define BLOODYSWORD_SWING1 4092
#define BLOODYSWORD_SWING2 4093
CONPIC_ENTRY(BLOODYSWORD_REST,BloodySwordPresent0)
CONPIC_ENTRY(BLOODYSWORD_SWING0,BloodySwordSwing0)
CONPIC_ENTRY(BLOODYSWORD_SWING1,BloodySwordSwing1)
CONPIC_ENTRY(BLOODYSWORD_SWING2,BloodySwordSwing2)
CONPIC_ENTRY(BLOODYSWORD_SWING0,BloodySwordSwingR0)
CONPIC_ENTRY(BLOODYSWORD_SWING1,BloodySwordSwingR1)
CONPIC_ENTRY(BLOODYSWORD_SWING2,BloodySwordSwingR2)
////////////////////////////////////////////////////////////////////////////////
//
// FIST
//
////////////////////////////////////////////////////////////////////////////////
#define FIST_REST 4070
#define FIST_SWING0 4071
#define FIST_SWING1 4072
#define FIST_SWING2 4073
CONPIC_ENTRY(FIST_REST+0,FistPresent0)
CONPIC_ENTRY(FIST_SWING0,FistSwing0)
CONPIC_ENTRY(FIST_SWING1,FistSwing1)
CONPIC_ENTRY(FIST_SWING2,FistSwing2)
#define BLOODYFIST_REST 4074
#define BLOODYFIST_SWING0 4075
#define BLOODYFIST_SWING1 4076
#define BLOODYFIST_SWING2 4077
#define FIST2_REST 4050
#define FIST2_SWING0 4051
#define FIST2_SWING1 4052
#define FIST2_SWING2 4053
CONPIC_ENTRY(FIST2_REST+0,Fist2Present0)
CONPIC_ENTRY(FIST2_SWING0,Fist2Swing0)
CONPIC_ENTRY(FIST2_SWING1,Fist2Swing1)
CONPIC_ENTRY(FIST2_SWING2,Fist2Swing2)
#define BLOODYFIST2_REST 4054
#define BLOODYFIST2_SWING0 4055
#define BLOODYFIST2_SWING1 4056
#define BLOODYFIST2_SWING2 4057
#define FIST3_REST 4060
#define FIST3_SWING0 4061
#define FIST3_SWING1 4062
#define FIST3_SWING2 4063
CONPIC_ENTRY(FIST3_REST+0,Fist3Present0)
CONPIC_ENTRY(FIST3_SWING0,Fist3Swing0)
CONPIC_ENTRY(FIST3_SWING1,Fist3Swing1)
CONPIC_ENTRY(FIST3_SWING2,Fist3Swing2)
#define BLOODYFIST3_REST 4064
#define BLOODYFIST3_SWING0 4065
#define BLOODYFIST3_SWING1 4066
#define BLOODYFIST3_SWING2 4067
////////////////////////////////////////////////////////////////////////////////
//
// KICK
//
////////////////////////////////////////////////////////////////////////////////
#define KICK0 4080
#define KICK1 4081
CONPIC_ENTRY(KICK0,Kick0)
CONPIC_ENTRY(KICK1,Kick1)
#define BLOODYKICK0 4082
#define BLOODYKICK1 4083
///////////////////////////////////////////////////////////////////////////////
//
// SHRUIKEN
//
///////////////////////////////////////////////////////////////////////////////
#define STAR_REST 2130
#define STAR_THROW 2133
CONPIC_ENTRY(STAR_REST+0,StarPresent0)
CONPIC_ENTRY(STAR_REST+1,StarDown0)
CONPIC_ENTRY(STAR_REST+2,StarDown1)
CONPIC_ENTRY(STAR_THROW+0,ThrowStar0)
CONPIC_ENTRY(STAR_THROW+1,ThrowStar1)
CONPIC_ENTRY(STAR_THROW+2,ThrowStar2)
CONPIC_ENTRY(STAR_THROW+3,ThrowStar3)
CONPIC_ENTRY(STAR_THROW+4,ThrowStar4)
///////////////////////////////////////////////////////////////////////////////////////
//
// UZI
//
///////////////////////////////////////////////////////////////////////////////////////
#if 0
#define UZI_REST 2000
#define UZI_FIRE_0 2001
#define UZI_FIRE_1 2001
#define UZI_EJECT 2003
#define UZI_CLIP 2005
#define UZI_RELOAD 2007
#else
// silencer
#define UZI_REST 2004
#define UZI_FIRE_0 2006
#define UZI_FIRE_1 2008
#define UZI_EJECT 2009
#define UZI_CLIP 2005
#define UZI_RELOAD 2007
#endif
#define UZI_SHELL 2152
// RIGHT UZI
CONPIC_ENTRY(UZI_REST,UziPresent0)
CONPIC_ENTRY(UZI_FIRE_0,UziFire0)
CONPIC_ENTRY(UZI_FIRE_1,UziFire1)
// LEFT UZI
CONPIC_ENTRY(UZI_REST,Uzi2Present0)
CONPIC_ENTRY(UZI_FIRE_0,Uzi2Fire0)
CONPIC_ENTRY(UZI_FIRE_1,Uzi2Fire1)
//eject
CONPIC_ENTRY(UZI_EJECT,UziEject0)
//clip
CONPIC_ENTRY(UZI_CLIP,UziClip0)
//reload
CONPIC_ENTRY(UZI_RELOAD,UziReload0)
CONPIC_ENTRY(UZI_SHELL+0,UziShell0)
CONPIC_ENTRY(UZI_SHELL+1,UziShell1)
CONPIC_ENTRY(UZI_SHELL+2,UziShell2)
CONPIC_ENTRY(UZI_SHELL+3,UziShell3)
CONPIC_ENTRY(UZI_SHELL+4,UziShell4)
CONPIC_ENTRY(UZI_SHELL+5,UziShell5)
CONPIC_ENTRY(UZI_SHELL+0,Uzi2Shell0)
CONPIC_ENTRY(UZI_SHELL+1,Uzi2Shell1)
CONPIC_ENTRY(UZI_SHELL+2,Uzi2Shell2)
CONPIC_ENTRY(UZI_SHELL+3,Uzi2Shell3)
CONPIC_ENTRY(UZI_SHELL+4,Uzi2Shell4)
CONPIC_ENTRY(UZI_SHELL+5,Uzi2Shell5)
////////////////////////////////////////////////////////////////////////////////
//
// SHOTGUN
//
////////////////////////////////////////////////////////////////////////////////
#define SHOTGUN_REST 2213
#define SHOTGUN_FIRE 2214
#define SHOTGUN_RELOAD0 2216
#define SHOTGUN_RELOAD1 2211
#define SHOTGUN_RELOAD2 2212
CONPIC_ENTRY(SHOTGUN_REST,ShotgunPresent0)
CONPIC_ENTRY(SHOTGUN_REST,ShotgunRest0)
CONPIC_ENTRY(SHOTGUN_RELOAD0,ShotgunReload0)
CONPIC_ENTRY(SHOTGUN_RELOAD1,ShotgunReload1)
CONPIC_ENTRY(SHOTGUN_RELOAD2,ShotgunReload2)
CONPIC_ENTRY(SHOTGUN_FIRE+0,ShotgunFire0)
CONPIC_ENTRY(SHOTGUN_FIRE+1,ShotgunFire1)
#define SHOTGUN_SHELL 2180
CONPIC_ENTRY(SHOTGUN_SHELL+0,ShotgunShell0)
CONPIC_ENTRY(SHOTGUN_SHELL+1,ShotgunShell1)
CONPIC_ENTRY(SHOTGUN_SHELL+2,ShotgunShell2)
CONPIC_ENTRY(SHOTGUN_SHELL+3,ShotgunShell3)
CONPIC_ENTRY(SHOTGUN_SHELL+4,ShotgunShell4)
CONPIC_ENTRY(SHOTGUN_SHELL+5,ShotgunShell5)
CONPIC_ENTRY(SHOTGUN_SHELL+6,ShotgunShell6)
CONPIC_ENTRY(SHOTGUN_SHELL+7,ShotgunShell7)
////////////////////////////////////////////////////////////////////////////////
//
// ROCKET
//
////////////////////////////////////////////////////////////////////////////////
#define ROCKET_REST 2211
#define ROCKET_FIRE 2212
CONPIC_ENTRY(ROCKET_REST+0,RocketPresent0)
CONPIC_ENTRY(ROCKET_REST+0,RocketRest0)
CONPIC_ENTRY(ROCKET_FIRE+0,RocketFire0)
CONPIC_ENTRY(ROCKET_FIRE+1,RocketFire1)
CONPIC_ENTRY(ROCKET_FIRE+2,RocketFire2)
CONPIC_ENTRY(ROCKET_FIRE+3,RocketFire3)
CONPIC_ENTRY(ROCKET_FIRE+4,RocketFire4)
CONPIC_ENTRY(ROCKET_FIRE+5,RocketFire5)
////////////////////////////////////////////////////////////////////////////////
//
// RAIL
//
////////////////////////////////////////////////////////////////////////////////
#define RAIL_REST 2010
#define RAIL_CHARGE 2015
#define RAIL_FIRE 2018
CONPIC_ENTRY(RAIL_REST+0,RailPresent0)
CONPIC_ENTRY(RAIL_REST+0,RailRest0)
CONPIC_ENTRY(RAIL_REST+1,RailRest1)
CONPIC_ENTRY(RAIL_REST+2,RailRest2)
CONPIC_ENTRY(RAIL_REST+3,RailRest3)
CONPIC_ENTRY(RAIL_REST+4,RailRest4)
CONPIC_ENTRY(RAIL_FIRE+0,RailFire0)
CONPIC_ENTRY(RAIL_FIRE+1,RailFire1)
CONPIC_ENTRY(RAIL_CHARGE+0,RailCharge0)
CONPIC_ENTRY(RAIL_CHARGE+1,RailCharge1)
CONPIC_ENTRY(RAIL_CHARGE+2,RailCharge2)
////////////////////////////////////////////////////////////////////////////////
//
// FIREBALL
//
////////////////////////////////////////////////////////////////////////////////
//#define HOTHEAD_REST 2327
//#define HOTHEAD_ATTACK 2327
#define HOTHEAD_REST 2048
#define HOTHEAD_ATTACK 2049
#define HOTHEAD_CENTER 2327
#define HOTHEAD_TURN 2314
#define HOTHEAD_CHOMP 2318
CONPIC_ENTRY(HOTHEAD_REST+0,HotheadPresent0)
CONPIC_ENTRY(HOTHEAD_REST+0,HotheadRest0)
CONPIC_ENTRY(HOTHEAD_ATTACK+0,HotheadAttack0)
CONPIC_ENTRY(HOTHEAD_CENTER+0,HotheadCenter0)
CONPIC_ENTRY(HOTHEAD_TURN+0,HotheadTurn0)
CONPIC_ENTRY(HOTHEAD_TURN+1,HotheadTurn1)
CONPIC_ENTRY(HOTHEAD_TURN+2,HotheadTurn2)
CONPIC_ENTRY(HOTHEAD_TURN+3,HotheadTurn3)
CONPIC_ENTRY(HOTHEAD_CHOMP+0,HotheadChomp0)
#define ON_FIRE 3157
CONPIC_ENTRY(ON_FIRE+0,OnFire0)
CONPIC_ENTRY(ON_FIRE+1,OnFire1)
CONPIC_ENTRY(ON_FIRE+2,OnFire2)
CONPIC_ENTRY(ON_FIRE+3,OnFire3)
CONPIC_ENTRY(ON_FIRE+4,OnFire4)
CONPIC_ENTRY(ON_FIRE+5,OnFire5)
CONPIC_ENTRY(ON_FIRE+6,OnFire6)
CONPIC_ENTRY(ON_FIRE+7,OnFire7)
CONPIC_ENTRY(ON_FIRE+8,OnFire8)
CONPIC_ENTRY(ON_FIRE+9,OnFire9)
CONPIC_ENTRY(ON_FIRE+10,OnFire10)
CONPIC_ENTRY(ON_FIRE+11,OnFire11)
CONPIC_ENTRY(ON_FIRE+12,OnFire12)
////////////////////////////////////////////////////////////////////////////////
//
// MICRO
//
////////////////////////////////////////////////////////////////////////////////
#define MICRO_REST 2070
#define MICRO_FIRE 2071
#define MICRO_SINGLE_FIRE 2071
CONPIC_ENTRY(MICRO_REST+0,MicroPresent0)
CONPIC_ENTRY(MICRO_FIRE+0,MicroFire0)
CONPIC_ENTRY(MICRO_FIRE+1,MicroFire1)
CONPIC_ENTRY(MICRO_FIRE+2,MicroFire2)
CONPIC_ENTRY(MICRO_FIRE+3,MicroFire3)
CONPIC_ENTRY(MICRO_SINGLE_FIRE+0,MicroSingleFire0)
CONPIC_ENTRY(MICRO_SINGLE_FIRE+1,MicroSingleFire1)
CONPIC_ENTRY(MICRO_SINGLE_FIRE+2,MicroSingleFire2)
CONPIC_ENTRY(MICRO_SINGLE_FIRE+3,MicroSingleFire3)
#if 0
////////////////////////////////////////////////////////////////////////////////
//
// NAPALM
//
////////////////////////////////////////////////////////////////////////////////
#define NAPALM_REST 2020
#define NAPALM_FIRE 2021
CONPIC_ENTRY(NAPALM_REST+0,NapalmPresent0)
CONPIC_ENTRY(NAPALM_FIRE+0,NapalmFire0)
CONPIC_ENTRY(NAPALM_FIRE+1,NapalmFire1)
CONPIC_ENTRY(NAPALM_FIRE+2,NapalmFire2)
CONPIC_ENTRY(NAPALM_FIRE+3,NapalmFire3)
////////////////////////////////////////////////////////////////////////////////
//
// RING
//
////////////////////////////////////////////////////////////////////////////////
#define RING_REST 2020
#define RING_FIRE 2021
CONPIC_ENTRY(RING_REST+0,RingPresent0)
CONPIC_ENTRY(RING_FIRE+0,RingFire0)
CONPIC_ENTRY(RING_FIRE+1,RingFire1)
CONPIC_ENTRY(RING_FIRE+2,RingFire2)
CONPIC_ENTRY(RING_FIRE+3,RingFire3)
////////////////////////////////////////////////////////////////////////////////
//
// ELECTRO
//
////////////////////////////////////////////////////////////////////////////////
#define ELECTRO_REST 2020
#define ELECTRO_FIRE 2021
CONPIC_ENTRY(ELECTRO_REST+0,ElectroPresent0)
CONPIC_ENTRY(ELECTRO_FIRE+0,ElectroFire0)
CONPIC_ENTRY(ELECTRO_FIRE+1,ElectroFire1)
CONPIC_ENTRY(ELECTRO_FIRE+2,ElectroFire2)
CONPIC_ENTRY(ELECTRO_FIRE+3,ElectroFire3)
#endif
////////////////////////////////////////////////////////////////////////////////
//
// GRENADE
//
////////////////////////////////////////////////////////////////////////////////
#define GRENADE_REST 2121
#define GRENADE_FIRE 2122
#define GRENADE_RELOAD 2125
CONPIC_ENTRY(GRENADE_REST+0,GrenadePresent0)
CONPIC_ENTRY(GRENADE_FIRE+0,GrenadeFire0)
CONPIC_ENTRY(GRENADE_FIRE+1,GrenadeFire1)
CONPIC_ENTRY(GRENADE_FIRE+2,GrenadeFire2)
CONPIC_ENTRY(GRENADE_RELOAD+0,GrenadeReload0)
CONPIC_ENTRY(GRENADE_RELOAD+1,GrenadeReload1)
////////////////////////////////////////////////////////////////////////////////
//
// MINE
//
////////////////////////////////////////////////////////////////////////////////
#define MINE_REST 2220
#define MINE_THROW 2222
#define MINE_RELOAD 2222
CONPIC_ENTRY(MINE_REST+0,MinePresent0)
CONPIC_ENTRY(MINE_REST+1,MinePresent1)
CONPIC_ENTRY(MINE_THROW+0,MineThrow0)
CONPIC_ENTRY(MINE_RELOAD+0,MineReload0)
////////////////////////////////////////////////////////////////////////////////
//
// HEART
//
////////////////////////////////////////////////////////////////////////////////
#define HEART_REST 2050
#define HEART_ATTACK 2052
CONPIC_ENTRY(HEART_REST+0,HeartPresent0)
CONPIC_ENTRY(HEART_REST+1,HeartPresent1)
CONPIC_ENTRY(HEART_ATTACK+0,HeartAttack0)
CONPIC_ENTRY(HEART_ATTACK+1,HeartAttack1)
//#define HEART_BLOOD 2430
#define HEART_BLOOD 2420
CONPIC_ENTRY(HEART_BLOOD+0,HeartBlood0)
CONPIC_ENTRY(HEART_BLOOD+1,HeartBlood1)
CONPIC_ENTRY(HEART_BLOOD+2,HeartBlood2)
CONPIC_ENTRY(HEART_BLOOD+3,HeartBlood3)
CONPIC_ENTRY(HEART_BLOOD+4,HeartBlood4)
CONPIC_ENTRY(HEART_BLOOD+5,HeartBlood5)
#undef CONPIC_ENTRY

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,996 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "game.h"
#include "tags.h"
#include "ai.h"
#include "sprite.h"
#include "actor.h"
#include "weapon.h"
#include "track.h"
ANIMATOR DoCoolgCircle,InitCoolgCircle;
DECISION CoolgBattle[] =
{
{50, InitCoolgCircle },
{450, InitActorMoveCloser },
//{456, InitActorAmbientNoise },
//{760, InitActorRunAway },
{1024, InitActorAttack }
};
DECISION CoolgOffense[] =
{
{449, InitActorMoveCloser },
//{554, InitActorAmbientNoise },
{1024, InitActorAttack }
};
DECISION CoolgBroadcast[] =
{
//{1, InitActorAlertNoise },
{1, InitActorAmbientNoise },
{1024, InitActorDecide }
};
DECISION CoolgSurprised[] =
{
{100, InitCoolgCircle },
{701, InitActorMoveCloser },
{1024, InitActorDecide }
};
DECISION CoolgEvasive[] =
{
{20, InitCoolgCircle },
{1024, InitActorRunAway },
};
DECISION CoolgLostTarget[] =
{
{900, InitActorFindPlayer },
{1024, InitActorWanderAround }
};
DECISION CoolgCloseRange[] =
{
{800, InitActorAttack },
{1024, InitActorReposition }
};
DECISION CoolgTouchTarget[] =
{
//{50, InitCoolgCircle },
{1024, InitActorAttack },
};
PERSONALITY CoolgPersonality =
{
CoolgBattle,
CoolgOffense,
CoolgBroadcast,
CoolgSurprised,
CoolgEvasive,
CoolgLostTarget,
CoolgCloseRange,
CoolgTouchTarget
};
ATTRIBUTE CoolgAttrib =
{
{60, 80, 150, 190}, // Speeds
{3, 0, -2, -3}, // Tic Adjusts
3, // MaxWeapons;
{
DIGI_CGAMBIENT, DIGI_CGALERT, 0,
DIGI_CGPAIN, DIGI_CGSCREAM, DIGI_CGMATERIALIZE,
DIGI_CGTHIGHBONE,DIGI_CGMAGIC,DIGI_CGMAGICHIT,0
}
};
//////////////////////
//
// COOLG RUN
//////////////////////
#define COOLG_RUN_RATE 40
ANIMATOR DoCoolgMove,NullAnimator,DoStayOnFloor, DoActorDebris, NullCoolg, DoCoolgBirth;
STATE s_CoolgRun[5][4] =
{
{
{COOLG_RUN_R0 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[0][1]},
{COOLG_RUN_R0 + 1, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[0][2]},
{COOLG_RUN_R0 + 2, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[0][3]},
{COOLG_RUN_R0 + 3, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[0][0]},
},
{
{COOLG_RUN_R1 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[1][1]},
{COOLG_RUN_R1 + 1, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[1][2]},
{COOLG_RUN_R1 + 2, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[1][3]},
{COOLG_RUN_R1 + 3, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[1][0]},
},
{
{COOLG_RUN_R2 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[2][1]},
{COOLG_RUN_R2 + 1, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[2][2]},
{COOLG_RUN_R2 + 2, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[2][3]},
{COOLG_RUN_R2 + 3, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[2][0]},
},
{
{COOLG_RUN_R3 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[3][1]},
{COOLG_RUN_R3 + 1, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[3][2]},
{COOLG_RUN_R3 + 2, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[3][3]},
{COOLG_RUN_R3 + 3, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[3][0]},
},
{
{COOLG_RUN_R4 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[4][1]},
{COOLG_RUN_R4 + 1, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[4][2]},
{COOLG_RUN_R4 + 2, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[4][3]},
{COOLG_RUN_R4 + 3, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgRun[4][0]},
}
};
STATEp sg_CoolgRun[] =
{
&s_CoolgRun[0][0],
&s_CoolgRun[1][0],
&s_CoolgRun[2][0],
&s_CoolgRun[3][0],
&s_CoolgRun[4][0]
};
//////////////////////
//
// COOLG STAND
//
//////////////////////
STATE s_CoolgStand[5][1] =
{
{
{COOLG_RUN_R0 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgStand[0][0]},
},
{
{COOLG_RUN_R1 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgStand[1][0]},
},
{
{COOLG_RUN_R2 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgStand[2][0]},
},
{
{COOLG_RUN_R3 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgStand[3][0]},
},
{
{COOLG_RUN_R4 + 0, COOLG_RUN_RATE, DoCoolgMove, &s_CoolgStand[4][0]},
}
};
STATEp sg_CoolgStand[] =
{
&s_CoolgStand[0][0],
&s_CoolgStand[1][0],
&s_CoolgStand[2][0],
&s_CoolgStand[3][0],
&s_CoolgStand[4][0]
};
//////////////////////
//
// COOLG CLUB
//
//////////////////////
#define COOLG_RATE 16
ANIMATOR InitCoolgBash;
STATE s_CoolgClub[5][6] =
{
{
{COOLG_CLUB_R0 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[0][1]},
{COOLG_RUN_R0 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[0][2]},
{COOLG_CLUB_R0 + 1, 0|SF_QUICK_CALL, InitCoolgBash, &s_CoolgClub[0][3]},
{COOLG_CLUB_R0 + 1, COOLG_RATE, NullCoolg, &s_CoolgClub[0][4]},
{COOLG_CLUB_R0 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgClub[0][5]},
{COOLG_CLUB_R0 + 1, COOLG_RATE, DoCoolgMove, &s_CoolgClub[0][5]}
},
{
{COOLG_CLUB_R1 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[1][1]},
{COOLG_RUN_R1 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[1][2]},
{COOLG_CLUB_R1 + 1, 0|SF_QUICK_CALL, InitCoolgBash, &s_CoolgClub[1][3]},
{COOLG_CLUB_R1 + 1, COOLG_RATE, NullCoolg, &s_CoolgClub[1][4]},
{COOLG_CLUB_R1 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgClub[1][5]},
{COOLG_CLUB_R1 + 1, COOLG_RATE, DoCoolgMove, &s_CoolgClub[1][5]}
},
{
{COOLG_CLUB_R2 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[2][1]},
{COOLG_RUN_R2 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[2][2]},
{COOLG_CLUB_R2 + 1, 0|SF_QUICK_CALL, InitCoolgBash, &s_CoolgClub[2][3]},
{COOLG_CLUB_R2 + 1, COOLG_RATE, NullCoolg, &s_CoolgClub[2][4]},
{COOLG_CLUB_R2 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgClub[2][5]},
{COOLG_CLUB_R2 + 1, COOLG_RATE, DoCoolgMove, &s_CoolgClub[2][5]}
},
{
{COOLG_CLUB_R3 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[3][1]},
{COOLG_RUN_R3 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[3][2]},
{COOLG_CLUB_R3 + 1, 0|SF_QUICK_CALL, InitCoolgBash, &s_CoolgClub[3][3]},
{COOLG_CLUB_R3 + 1, COOLG_RATE, NullCoolg, &s_CoolgClub[3][4]},
{COOLG_CLUB_R3 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgClub[3][5]},
{COOLG_CLUB_R3 + 1, COOLG_RATE, DoCoolgMove, &s_CoolgClub[3][5]}
},
{
{COOLG_CLUB_R4 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[4][1]},
{COOLG_RUN_R4 + 0, COOLG_RATE, NullCoolg, &s_CoolgClub[4][2]},
{COOLG_CLUB_R4 + 1, 0|SF_QUICK_CALL, InitCoolgBash, &s_CoolgClub[4][3]},
{COOLG_CLUB_R4 + 1, COOLG_RATE, NullCoolg, &s_CoolgClub[4][4]},
{COOLG_CLUB_R4 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgClub[4][5]},
{COOLG_CLUB_R4 + 1, COOLG_RATE, DoCoolgMove, &s_CoolgClub[4][5]}
}
};
STATEp sg_CoolgClub[] =
{
&s_CoolgClub[0][0],
&s_CoolgClub[1][0],
&s_CoolgClub[2][0],
&s_CoolgClub[3][0],
&s_CoolgClub[4][0]
};
//////////////////////
//
// COOLG FIRE
//
//////////////////////
ANIMATOR InitCoolgFire;
#define COOLG_FIRE_RATE 12
STATE s_CoolgAttack[5][7] =
{
{
{COOLG_FIRE_R0 + 0, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[0][1]},
{COOLG_FIRE_R0 + 1, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[0][2]},
{COOLG_FIRE_R0 + 2, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[0][3]},
{COOLG_FIRE_R0 + 2, 0|SF_QUICK_CALL, InitCoolgFire, &s_CoolgAttack[0][4]},
{COOLG_FIRE_R0 + 2, COOLG_FIRE_RATE, NullCoolg, &s_CoolgAttack[0][5]},
{COOLG_FIRE_R0 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgAttack[0][6]},
{COOLG_RUN_R0 + 2, COOLG_FIRE_RATE, DoCoolgMove, &s_CoolgAttack[0][6]}
},
{
{COOLG_FIRE_R1 + 0, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[1][1]},
{COOLG_FIRE_R1 + 1, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[1][2]},
{COOLG_FIRE_R1 + 2, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[1][3]},
{COOLG_FIRE_R1 + 2, 0|SF_QUICK_CALL, InitCoolgFire, &s_CoolgAttack[1][4]},
{COOLG_FIRE_R1 + 2, COOLG_FIRE_RATE, NullCoolg, &s_CoolgAttack[1][5]},
{COOLG_FIRE_R1 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgAttack[1][6]},
{COOLG_RUN_R0 + 2, COOLG_FIRE_RATE, DoCoolgMove, &s_CoolgAttack[1][6]}
},
{
{COOLG_FIRE_R2 + 0, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[2][1]},
{COOLG_FIRE_R2 + 1, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[2][2]},
{COOLG_FIRE_R2 + 2, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[2][3]},
{COOLG_FIRE_R2 + 2, 0|SF_QUICK_CALL, InitCoolgFire, &s_CoolgAttack[2][4]},
{COOLG_FIRE_R2 + 2, COOLG_FIRE_RATE, NullCoolg, &s_CoolgAttack[2][5]},
{COOLG_FIRE_R2 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgAttack[2][6]},
{COOLG_RUN_R0 + 2, COOLG_FIRE_RATE, DoCoolgMove, &s_CoolgAttack[2][6]}
},
{
{COOLG_RUN_R3 + 0, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[3][1]},
{COOLG_RUN_R3 + 1, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[3][2]},
{COOLG_RUN_R3 + 2, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[3][3]},
{COOLG_RUN_R3 + 2, 0|SF_QUICK_CALL, InitCoolgFire, &s_CoolgAttack[3][4]},
{COOLG_RUN_R3 + 2, COOLG_FIRE_RATE, NullCoolg, &s_CoolgAttack[3][5]},
{COOLG_RUN_R3 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgAttack[3][6]},
{COOLG_RUN_R0 + 2, COOLG_FIRE_RATE, DoCoolgMove, &s_CoolgAttack[3][6]}
},
{
{COOLG_RUN_R4 + 0, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[4][1]},
{COOLG_RUN_R4 + 1, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[4][2]},
{COOLG_RUN_R4 + 2, COOLG_FIRE_RATE*2, NullCoolg, &s_CoolgAttack[4][3]},
{COOLG_RUN_R4 + 2, 0|SF_QUICK_CALL, InitCoolgFire, &s_CoolgAttack[4][4]},
{COOLG_RUN_R4 + 2, COOLG_FIRE_RATE, NullCoolg, &s_CoolgAttack[4][5]},
{COOLG_RUN_R4 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_CoolgAttack[4][6]},
{COOLG_RUN_R0 + 2, COOLG_FIRE_RATE, DoCoolgMove, &s_CoolgAttack[4][6]}
}
};
STATEp sg_CoolgAttack[] =
{
&s_CoolgAttack[0][0],
&s_CoolgAttack[1][0],
&s_CoolgAttack[2][0],
&s_CoolgAttack[3][0],
&s_CoolgAttack[4][0]
};
//////////////////////
//
// COOLG PAIN
//
//////////////////////
#define COOLG_PAIN_RATE 15
ANIMATOR DoCoolgPain;
STATE s_CoolgPain[5][2] =
{
{
{COOLG_PAIN_R0 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[0][1]},
{COOLG_PAIN_R0 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[0][1]},
},
{
{COOLG_RUN_R1 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[1][1]},
{COOLG_RUN_R1 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[1][1]},
},
{
{COOLG_RUN_R2 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[2][1]},
{COOLG_RUN_R2 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[2][1]},
},
{
{COOLG_RUN_R3 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[3][1]},
{COOLG_RUN_R3 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[3][1]},
},
{
{COOLG_RUN_R4 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[4][1]},
{COOLG_RUN_R4 + 0, COOLG_PAIN_RATE, DoCoolgPain, &s_CoolgPain[4][1]},
},
};
STATEp sg_CoolgPain[] =
{
s_CoolgPain[0],
s_CoolgPain[1],
s_CoolgPain[2],
s_CoolgPain[3],
s_CoolgPain[4]
};
//////////////////////
//
// COOLG DIE
//
//////////////////////
#define COOLG_DIE_RATE 20
#define COOLG_DIE 4307
#define COOLG_DEAD 4307+5
ANIMATOR DoCoolgDeath;
STATE s_CoolgDie[] =
{
{COOLG_DIE + 0, COOLG_DIE_RATE, DoCoolgDeath, &s_CoolgDie[1]},
{COOLG_DIE + 1, COOLG_DIE_RATE, DoCoolgDeath, &s_CoolgDie[2]},
{COOLG_DIE + 2, COOLG_DIE_RATE, DoCoolgDeath, &s_CoolgDie[3]},
{COOLG_DIE + 3, COOLG_DIE_RATE, DoCoolgDeath, &s_CoolgDie[4]},
{COOLG_DIE + 4, COOLG_DIE_RATE, DoCoolgDeath, &s_CoolgDie[5]},
{COOLG_DIE + 5, COOLG_DIE_RATE, DoCoolgDeath, &s_CoolgDie[5]},
};
STATEp sg_CoolgDie[] =
{
s_CoolgDie
};
STATE s_CoolgDead[] =
{
{COOLG_DEAD, SF_QUICK_CALL, QueueFloorBlood, &s_CoolgDead[1]},
{COOLG_DEAD, COOLG_DIE_RATE, DoActorDebris, &s_CoolgDead[1]},
};
STATEp sg_CoolgDead[] =
{
s_CoolgDead
};
//////////////////////
//
// COOLG BIRTH
//
//////////////////////
#define COOLG_BIRTH_RATE 20
#define COOLG_BIRTH 4268
STATE s_CoolgBirth[] =
{
{COOLG_BIRTH + 0, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[1]},
{COOLG_BIRTH + 1, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[2]},
{COOLG_BIRTH + 2, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[3]},
{COOLG_BIRTH + 3, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[4]},
{COOLG_BIRTH + 4, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[5]},
{COOLG_BIRTH + 5, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[6]},
{COOLG_BIRTH + 6, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[7]},
{COOLG_BIRTH + 7, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[8]},
{COOLG_BIRTH + 8, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[9]},
{COOLG_BIRTH + 8, COOLG_BIRTH_RATE, NullAnimator, &s_CoolgBirth[10]},
{COOLG_BIRTH + 8, 0|SF_QUICK_CALL, DoCoolgBirth, &s_CoolgBirth[10]}
};
STATEp sg_CoolgBirth[] =
{
s_CoolgBirth
};
/*
STATEp *Stand[MAX_WEAPONS];
STATEp *Run;
STATEp *Jump;
STATEp *Fall;
STATEp *Crawl;
STATEp *Swim;
STATEp *Fly;
STATEp *Rise;
STATEp *Sit;
STATEp *Look;
STATEp *Climb;
STATEp *Pain;
STATEp *Death1;
STATEp *Death2;
STATEp *Dead;
STATEp *DeathJump;
STATEp *DeathFall;
STATEp *CloseAttack[2];
STATEp *Attack[6];
STATEp *Special[2];
*/
ACTOR_ACTION_SET CoolgActionSet =
{
sg_CoolgStand,
sg_CoolgRun,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL, //climb
sg_CoolgPain, //pain
sg_CoolgDie,
NULL,
sg_CoolgDead,
NULL,
NULL,
// {sg_CoolgClub},
{sg_CoolgAttack},
{1024},
{sg_CoolgAttack},
{1024},
{NULL,NULL},
NULL,
NULL
};
int DoCoolgMatchPlayerZ(short SpriteNum);
void
CoolgCommon(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
sp->clipdist = (200) >> 2;
//u->floor_dist = Z(5);
u->floor_dist = Z(16);
u->ceiling_dist = Z(20);
u->sz = sp->z;
sp->xrepeat = 42;
sp->yrepeat = 42;
SET(sp->extra, SPRX_PLAYER_OR_ENEMY);
}
int
SetupCoolg(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u;
ANIMATOR DoActorDecide;
if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
{
u = User[SpriteNum];
ASSERT(u);
}
else
{
User[SpriteNum] = u = SpawnUser(SpriteNum,COOLG_RUN_R0,s_CoolgRun[0]);
u->Health = HEALTH_COOLIE_GHOST;
}
ChangeState(SpriteNum, s_CoolgRun[0]);
u->Attrib = &CoolgAttrib;
DoActorSetSpeed(SpriteNum, NORM_SPEED);
u->StateEnd = s_CoolgDie;
u->Rot = sg_CoolgRun;
EnemyDefaults(SpriteNum, &CoolgActionSet, &CoolgPersonality);
SET(u->Flags, SPR_NO_SCAREDZ|SPR_XFLIP_TOGGLE);
CoolgCommon(SpriteNum);
return 0;
}
extern short TotalKillable;
int
NewCoolg(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
USERp nu;
SPRITEp np;
ANIMATOR DoActorDecide;
short new;
new = SpawnSprite(STAT_ENEMY, COOLG_RUN_R0, &s_CoolgBirth[0], sp->sectnum, sp->x, sp->y, sp->z, sp->ang, 50);
nu = User[new];
np = &sprite[new];
ChangeState(new, &s_CoolgBirth[0]);
nu->StateEnd = s_CoolgDie;
nu->Rot = sg_CoolgRun;
np->pal = nu->spal = u->spal;
nu->ActorActionSet = &CoolgActionSet;
np->shade = sp->shade;
nu->Personality = &CoolgPersonality;
nu->Attrib = &CoolgAttrib;
// special case
TotalKillable++;
CoolgCommon(new);
return 0;
}
int
DoCoolgBirth(short new)
{
SPRITEp sp;
USERp u;
ANIMATOR DoActorDecide;
u = User[new];
sp = &sprite[new];
u->Health = HEALTH_COOLIE_GHOST;
u->Attrib = &CoolgAttrib;
DoActorSetSpeed(new, NORM_SPEED);
ChangeState(new, s_CoolgRun[0]);
u->StateEnd = s_CoolgDie;
u->Rot = sg_CoolgRun;
EnemyDefaults(new, &CoolgActionSet, &CoolgPersonality);
// special case
TotalKillable--;
SET(u->Flags, SPR_NO_SCAREDZ|SPR_XFLIP_TOGGLE);
CoolgCommon(new);
return 0;
}
int NullCoolg(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
u->ShellNum -= ACTORMOVETICS;
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
DoCoolgMatchPlayerZ(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
int DoCoolgMatchPlayerZ(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
SPRITEp tsp = User[SpriteNum]->tgt_sp;
int zdiff,zdist;
int loz,hiz;
int bound;
// If blocking bits get unset, just die
if (!TEST(sp->cstat,CSTAT_SPRITE_BLOCK) || !TEST(sp->cstat,CSTAT_SPRITE_BLOCK_HITSCAN))
{
InitBloodSpray(SpriteNum, TRUE, 105);
InitBloodSpray(SpriteNum, TRUE, 105);
UpdateSinglePlayKills(SpriteNum);
SetSuicide(SpriteNum);
}
// actor does a sine wave about u->sz - this is the z mid point
zdiff = (SPRITEp_MID(tsp)) - u->sz;
// check z diff of the player and the sprite
zdist = Z(20 + RANDOM_RANGE(100)); // put a random amount
//zdist = Z(20);
if (labs(zdiff) > zdist)
{
if (zdiff > 0)
u->sz += 170 * ACTORMOVETICS;
else
u->sz -= 170 * ACTORMOVETICS;
}
#define COOLG_BOB_AMT (Z(8))
// save off lo and hi z
loz = u->loz;
hiz = u->hiz;
// adjust loz/hiz for water depth
if (u->lo_sectp && SectUser[u->lo_sectp - sector] && SectUser[u->lo_sectp - sector]->depth)
loz -= Z(SectUser[u->lo_sectp - sector]->depth) - Z(8);
// lower bound
if (u->lo_sp)
bound = loz - u->floor_dist;
else
bound = loz - u->floor_dist - COOLG_BOB_AMT;
if (u->sz > bound)
{
u->sz = bound;
}
// upper bound
if (u->hi_sp)
bound = hiz + u->ceiling_dist;
else
bound = hiz + u->ceiling_dist + COOLG_BOB_AMT;
if (u->sz < bound)
{
u->sz = bound;
}
u->sz = min(u->sz, loz - u->floor_dist);
u->sz = max(u->sz, hiz + u->ceiling_dist);
u->Counter = (u->Counter + (ACTORMOVETICS<<3)) & 2047;
sp->z = u->sz + ((COOLG_BOB_AMT * (int)sintable[u->Counter]) >> 14);
bound = u->hiz + u->ceiling_dist + COOLG_BOB_AMT;
if (sp->z < bound)
{
// bumped something
sp->z = u->sz = bound + COOLG_BOB_AMT;
}
return 0;
}
int InitCoolgCircle(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
u->ActorActionFunc = DoCoolgCircle;
NewStateGroup(SpriteNum, u->ActorActionSet->Run);
// set it close
DoActorSetSpeed(SpriteNum, FAST_SPEED);
// set to really fast
sp->xvel = 400;
// angle adjuster
u->Counter2 = sp->xvel/3;
// random angle direction
if (RANDOM_P2(1024) < 512)
u->Counter2 = -u->Counter2;
// z velocity
u->jump_speed = 400 + RANDOM_P2(256);
if (labs(u->sz - u->hiz) < labs(u->sz - u->loz))
u->jump_speed = -u->jump_speed;
u->WaitTics = (RANDOM_RANGE(3)+1) * 120;
(*u->ActorActionFunc)(SpriteNum);
return 0;
}
int DoCoolgCircle(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
SPRITEp tsp = User[SpriteNum]->tgt_sp;
int nx,ny,bound;
sp->ang = NORM_ANGLE(sp->ang + u->Counter2);
nx = sp->xvel * (int) sintable[NORM_ANGLE(sp->ang + 512)] >> 14;
ny = sp->xvel * (int) sintable[sp->ang] >> 14;
if (!move_actor(SpriteNum, nx, ny, 0L))
{
InitActorReposition(SpriteNum);
return 0;
}
// move in the z direction
u->sz -= u->jump_speed * ACTORMOVETICS;
bound = u->hiz + u->ceiling_dist + COOLG_BOB_AMT;
if (u->sz < bound)
{
// bumped something
u->sz = bound;
InitActorReposition(SpriteNum);
return 0;
}
// time out
if ((u->WaitTics -= ACTORMOVETICS) < 0)
{
InitActorReposition(SpriteNum);
u->WaitTics = 0;
return 0;
}
return 0;
}
int
DoCoolgDeath(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
int nx, ny;
RESET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
RESET(sp->cstat, CSTAT_SPRITE_INVISIBLE);
sp->xrepeat = 42;
sp->shade = -10;
if (TEST(u->Flags, SPR_FALLING))
{
DoFall(SpriteNum);
}
else
{
DoFindGroundPoint(SpriteNum);
u->floor_dist = 0;
DoBeginFall(SpriteNum);
}
if (TEST(u->Flags, SPR_SLIDING))
DoActorSlide(SpriteNum);
// slide while falling
nx = sp->xvel * (int) sintable[NORM_ANGLE(sp->ang + 512)] >> 14;
ny = sp->xvel * (int) sintable[sp->ang] >> 14;
u->ret = move_sprite(SpriteNum, nx, ny, 0L, u->ceiling_dist, u->floor_dist, CLIPMASK_MISSILE, ACTORMOVETICS);
DoFindGroundPoint(SpriteNum);
// on the ground
if (sp->z >= u->loz)
{
RESET(u->Flags, SPR_FALLING|SPR_SLIDING);
RESET(sp->cstat, CSTAT_SPRITE_YFLIP); // If upside down, reset it
NewStateGroup(SpriteNum, u->ActorActionSet->Dead);
return 0;
}
return 0;
}
int DoCoolgMove(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
if ((u->ShellNum -= ACTORMOVETICS) <= 0)
{
switch (u->FlagOwner)
{
case 0:
SET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
u->ShellNum = SEC(2);
break;
case 1:
PlaySound(DIGI_VOID3, &sp->x, &sp->y, &sp->z, v3df_follow);
RESET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
SET(sp->cstat, CSTAT_SPRITE_INVISIBLE);
u->ShellNum = SEC(1) + SEC(RANDOM_RANGE(2));
break;
case 2:
SET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
RESET(sp->cstat, CSTAT_SPRITE_INVISIBLE);
u->ShellNum = SEC(2);
break;
case 3:
PlaySound(DIGI_VOID3, &sp->x, &sp->y, &sp->z, v3df_follow);
RESET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
RESET(sp->cstat, CSTAT_SPRITE_INVISIBLE);
u->ShellNum = SEC(2) + SEC(RANDOM_RANGE(3));
break;
default:
u->FlagOwner = 0;
break;
}
u->FlagOwner++;
if (u->FlagOwner > 3) u->FlagOwner = 0;
}
if (u->FlagOwner-1 == 0)
{
sp->xrepeat--;
sp->shade++;
if (sp->xrepeat < 4) sp->xrepeat = 4;
if (sp->shade > 126)
{
sp->shade = 127;
sp->hitag = 9998;
}
}
else if (u->FlagOwner-1 == 2)
{
sp->hitag = 0;
sp->xrepeat++;
sp->shade--;
if (sp->xrepeat > 42) sp->xrepeat = 42;
if (sp->shade < -10) sp->shade = -10;
}
else if (u->FlagOwner == 0)
{
sp->xrepeat = 42;
sp->shade = -10;
sp->hitag = 0;
}
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
if (u->track >= 0)
ActorFollowTrack(SpriteNum, ACTORMOVETICS);
else
{
(*u->ActorActionFunc)(SpriteNum);
}
if (RANDOM_P2(1024) < 32 && !TEST(sp->cstat, CSTAT_SPRITE_INVISIBLE))
InitCoolgDrip(SpriteNum);
DoCoolgMatchPlayerZ(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
int DoCoolgPain(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
NullCoolg(SpriteNum);
if ((u->WaitTics -= ACTORMOVETICS) <= 0)
InitActorDecide(SpriteNum);
return 0;
}
#include "saveable.h"
static saveable_code saveable_coolg_code[] =
{
SAVE_CODE(CoolgCommon),
SAVE_CODE(SetupCoolg),
SAVE_CODE(NewCoolg),
SAVE_CODE(DoCoolgBirth),
SAVE_CODE(NullCoolg),
SAVE_CODE(DoCoolgMatchPlayerZ),
SAVE_CODE(InitCoolgCircle),
SAVE_CODE(DoCoolgCircle),
SAVE_CODE(DoCoolgDeath),
SAVE_CODE(DoCoolgMove),
SAVE_CODE(DoCoolgPain),
};
static saveable_data saveable_coolg_data[] =
{
SAVE_DATA(CoolgBattle),
SAVE_DATA(CoolgOffense),
SAVE_DATA(CoolgBroadcast),
SAVE_DATA(CoolgSurprised),
SAVE_DATA(CoolgEvasive),
SAVE_DATA(CoolgLostTarget),
SAVE_DATA(CoolgCloseRange),
SAVE_DATA(CoolgTouchTarget),
SAVE_DATA(CoolgPersonality),
SAVE_DATA(CoolgAttrib),
SAVE_DATA(s_CoolgRun),
SAVE_DATA(sg_CoolgRun),
SAVE_DATA(s_CoolgStand),
SAVE_DATA(sg_CoolgStand),
SAVE_DATA(s_CoolgClub),
SAVE_DATA(sg_CoolgClub),
SAVE_DATA(s_CoolgAttack),
SAVE_DATA(sg_CoolgAttack),
SAVE_DATA(s_CoolgPain),
SAVE_DATA(sg_CoolgPain),
SAVE_DATA(s_CoolgDie),
SAVE_DATA(sg_CoolgDie),
SAVE_DATA(s_CoolgDead),
SAVE_DATA(sg_CoolgDead),
SAVE_DATA(s_CoolgBirth),
SAVE_DATA(sg_CoolgBirth),
SAVE_DATA(CoolgActionSet),
};
saveable_module saveable_coolg =
{
// code
saveable_coolg_code,
SIZ(saveable_coolg_code),
// data
saveable_coolg_data,
SIZ(saveable_coolg_data)
};

View file

@ -0,0 +1,736 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "tags.h"
#include "ai.h"
#include "sprite.h"
#include "actor.h"
#include "track.h"
#include "weapon.h"
ANIMATOR InitCoolieCharge;
DECISION CoolieBattle[] =
{
{700, InitCoolieCharge },
{990, InitActorMoveCloser },
{1000, InitActorAttackNoise },
{1024, InitActorRunAway }
};
DECISION CoolieOffense[] =
{
{700, InitCoolieCharge },
{1015, InitActorMoveCloser },
{1024, InitActorAttackNoise }
};
DECISION CoolieBroadcast[] =
{
//{1, InitActorAlertNoise },
{16, InitActorAmbientNoise },
{1024, InitActorDecide }
};
DECISION CoolieSurprised[] =
{
{700, InitActorMoveCloser },
{703, InitActorAmbientNoise },
{1024, InitActorDecide }
};
DECISION CoolieEvasive[] =
{
{10, InitActorEvade },
{1024, NULL }
};
DECISION CoolieLostTarget[] =
{
{900, InitActorFindPlayer },
{1024, InitActorWanderAround }
};
DECISION CoolieCloseRange[] =
{
{400, InitCoolieCharge },
{1024, InitActorReposition }
};
PERSONALITY CooliePersonality =
{
CoolieBattle,
CoolieOffense,
CoolieBroadcast,
CoolieSurprised,
CoolieEvasive,
CoolieLostTarget,
CoolieCloseRange,
CoolieCloseRange
};
ATTRIBUTE CoolieAttrib =
{
{60, 80, 100, 200}, // Speeds
{3, 0, -2, -3}, // Tic Adjusts
3, // MaxWeapons;
{
DIGI_COOLIEAMBIENT, DIGI_COOLIEALERT, DIGI_COOLIEALERT,
DIGI_COOLIEPAIN, 0, DIGI_CGMATERIALIZE,
DIGI_COOLIEEXPLODE,0,0,0
}
};
//////////////////////
//
// COOLIE RUN
//
//////////////////////
#define COOLIE_RATE 12
ANIMATOR DoCoolieMove,NullCoolie,DoStayOnFloor,
DoActorDebris, SpawnCoolieExp,
SpawnCoolg;
STATE s_CoolieRun[5][4] =
{
{
{COOLIE_RUN_R0 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[0][1]},
{COOLIE_RUN_R0 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[0][2]},
{COOLIE_RUN_R0 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[0][3]},
{COOLIE_RUN_R0 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[0][0]}
},
{
{COOLIE_RUN_R1 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[1][1]},
{COOLIE_RUN_R1 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[1][2]},
{COOLIE_RUN_R1 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[1][3]},
{COOLIE_RUN_R1 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[1][0]}
},
{
{COOLIE_RUN_R2 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[2][1]},
{COOLIE_RUN_R2 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[2][2]},
{COOLIE_RUN_R2 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[2][3]},
{COOLIE_RUN_R2 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[2][0]}
},
{
{COOLIE_RUN_R3 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[3][1]},
{COOLIE_RUN_R3 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[3][2]},
{COOLIE_RUN_R3 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[3][3]},
{COOLIE_RUN_R3 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[3][0]}
},
{
{COOLIE_RUN_R4 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[4][1]},
{COOLIE_RUN_R4 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[4][2]},
{COOLIE_RUN_R4 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[4][3]},
{COOLIE_RUN_R4 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieRun[4][0]},
}
};
STATEp sg_CoolieRun[] =
{
&s_CoolieRun[0][0],
&s_CoolieRun[1][0],
&s_CoolieRun[2][0],
&s_CoolieRun[3][0],
&s_CoolieRun[4][0]
};
//////////////////////
//
// COOLIE CHARGE
//
//////////////////////
#define COOLIE_RATE 12
ANIMATOR DoCoolieMove,NullCoolie,DoStayOnFloor,
DoActorDebris, SpawnCoolieExp,
SpawnCoolg;
STATE s_CoolieCharge[5][4] =
{
{
{COOLIE_CHARGE_R0 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[0][1]},
{COOLIE_CHARGE_R0 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[0][2]},
{COOLIE_CHARGE_R0 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[0][3]},
{COOLIE_CHARGE_R0 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[0][0]}
},
{
{COOLIE_CHARGE_R1 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[1][1]},
{COOLIE_CHARGE_R1 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[1][2]},
{COOLIE_CHARGE_R1 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[1][3]},
{COOLIE_CHARGE_R1 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[1][0]}
},
{
{COOLIE_CHARGE_R2 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[2][1]},
{COOLIE_CHARGE_R2 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[2][2]},
{COOLIE_CHARGE_R2 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[2][3]},
{COOLIE_CHARGE_R2 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[2][0]}
},
{
{COOLIE_CHARGE_R3 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[3][1]},
{COOLIE_CHARGE_R3 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[3][2]},
{COOLIE_CHARGE_R3 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[3][3]},
{COOLIE_CHARGE_R3 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[3][0]}
},
{
{COOLIE_CHARGE_R4 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[4][1]},
{COOLIE_CHARGE_R4 + 1, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[4][2]},
{COOLIE_CHARGE_R4 + 2, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[4][3]},
{COOLIE_CHARGE_R4 + 3, COOLIE_RATE, DoCoolieMove, &s_CoolieCharge[4][0]},
}
};
STATEp sg_CoolieCharge[] =
{
&s_CoolieCharge[0][0],
&s_CoolieCharge[1][0],
&s_CoolieCharge[2][0],
&s_CoolieCharge[3][0],
&s_CoolieCharge[4][0]
};
//////////////////////
//
// COOLIE STAND
//
//////////////////////
STATE s_CoolieStand[5][6] =
{
{
{COOLIE_RUN_R0 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieStand[0][0]}
},
{
{COOLIE_RUN_R1 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieStand[1][0]}
},
{
{COOLIE_RUN_R2 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieStand[2][0]}
},
{
{COOLIE_RUN_R3 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieStand[3][0]}
},
{
{COOLIE_RUN_R4 + 0, COOLIE_RATE, DoCoolieMove, &s_CoolieStand[4][0]}
}
};
STATEp sg_CoolieStand[] =
{
&s_CoolieStand[0][0],
&s_CoolieStand[1][0],
&s_CoolieStand[2][0],
&s_CoolieStand[3][0],
&s_CoolieStand[4][0]
};
//////////////////////
//
// COOLIE PAIN
//
//////////////////////
#define COOLIE_PAIN_RATE 60
ANIMATOR CooliePain;
STATE s_CooliePain[5][1] =
{
{
{COOLIE_PAIN_R0 + 0, COOLIE_PAIN_RATE, CooliePain, &s_CooliePain[0][0]},
//{COOLIE_PAIN_R0 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_CooliePain[0][0]}
},
{
{COOLIE_PAIN_R1 + 0, COOLIE_PAIN_RATE, CooliePain, &s_CooliePain[1][0]},
//{COOLIE_PAIN_R1 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_CooliePain[1][0]}
},
{
{COOLIE_PAIN_R2 + 0, COOLIE_PAIN_RATE, CooliePain, &s_CooliePain[2][0]},
//{COOLIE_PAIN_R2 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_CooliePain[2][0]}
},
{
{COOLIE_PAIN_R3 + 0, COOLIE_PAIN_RATE, CooliePain, &s_CooliePain[3][0]},
//{COOLIE_PAIN_R3 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_CooliePain[3][0]}
},
{
{COOLIE_PAIN_R4 + 0, COOLIE_PAIN_RATE, CooliePain, &s_CooliePain[4][0]},
//{COOLIE_PAIN_R4 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_CooliePain[4][0]}
}
};
STATEp sg_CooliePain[] =
{
&s_CooliePain[0][0],
&s_CooliePain[1][0],
&s_CooliePain[2][0],
&s_CooliePain[3][0],
&s_CooliePain[4][0]
};
//////////////////////
//
// COOLIE DIE
//
//////////////////////
#define COOLIE_DIE_RATE 30
ANIMATOR DoCoolieWaitBirth;
STATE s_CoolieDie[] =
{
{COOLIE_DIE + 0, COOLIE_DIE_RATE, NullCoolie, &s_CoolieDie[1]},
{COOLIE_DIE + 0, 0|SF_QUICK_CALL, SpawnCoolieExp, &s_CoolieDie[2]},
{COOLIE_DIE + 1, COOLIE_DIE_RATE, NullCoolie, &s_CoolieDie[3]},
{COOLIE_DIE + 2, COOLIE_DIE_RATE, NullCoolie, &s_CoolieDie[4]},
{COOLIE_DIE + 3, COOLIE_DIE_RATE, NullCoolie, &s_CoolieDie[5]},
{COOLIE_DIE + 4, COOLIE_DIE_RATE, NullCoolie, &s_CoolieDie[6]},
{COOLIE_DIE + 5, COOLIE_DIE_RATE, NullCoolie, &s_CoolieDie[7]},
{COOLIE_DIE + 6, COOLIE_DIE_RATE, NullCoolie, &s_CoolieDie[8]},
{COOLIE_DIE + 7, COOLIE_DIE_RATE, DoCoolieWaitBirth, &s_CoolieDie[8]},
{COOLIE_DIE + 7, COOLIE_DIE_RATE*5, DoActorDebris, &s_CoolieDie[10]},
{COOLIE_DIE + 7, 0|SF_QUICK_CALL, SpawnCoolg, &s_CoolieDie[11]},
{COOLIE_DEAD_NOHEAD, SF_QUICK_CALL, QueueFloorBlood, &s_CoolieDie[12]},
{COOLIE_DEAD_NOHEAD, COOLIE_DIE_RATE, DoActorDebris, &s_CoolieDie[12]}
};
STATEp sg_CoolieDie[] =
{
s_CoolieDie
};
STATE s_CoolieDead[] =
{
{COOLIE_DEAD, COOLIE_DIE_RATE, DoActorDebris, &s_CoolieDead[0]},
};
STATEp sg_CoolieDead[] =
{
s_CoolieDead
};
/*
typedef struct
{
#define MAX_ACTOR_CLOSE_ATTACK 2
#define MAX_ACTOR_ATTACK 6
STATEp *Stand;
STATEp *Run;
STATEp *Jump;
STATEp *Fall;
STATEp *Crawl;
STATEp *Swim;
STATEp *Fly;
STATEp *Rise;
STATEp *Sit;
STATEp *Look;
STATEp *Climb;
STATEp *Pain;
STATEp *Death1;
STATEp *Death2;
STATEp *Dead;
STATEp *DeathJump;
STATEp *DeathFall;
STATEp *CloseAttack[MAX_ACTOR_CLOSE_ATTACK];
short CloseAttackPercent[MAX_ACTOR_CLOSE_ATTACK];
STATEp *Attack[MAX_ACTOR_ATTACK];
short AttackPercent[MAX_ACTOR_ATTACK];
STATEp *Special[2];
STATEp *Duck;
STATEp *Dive;
}ACTOR_ACTION_SET,*ACTOR_ACTION_SETp;
*/
ACTOR_ACTION_SET CoolieActionSet =
{
sg_CoolieStand,
sg_CoolieRun,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL, //climb
sg_CooliePain, //pain
sg_CoolieDie,
NULL,
sg_CoolieDead,
NULL,
NULL,
{sg_CoolieCharge},
{1024},
{sg_CoolieCharge},
{1024},
{NULL},
NULL,
NULL
};
VOID EnemyDefaults(short SpriteNum, ACTOR_ACTION_SETp action, PERSONALITYp person)
{
USERp u = User[SpriteNum];
SPRITEp sp = &sprite[SpriteNum];
unsigned int wpn;
short wpn_cnt;
short depth = 0;
extern short TotalKillable;
extern BOOL DebugSecret;
switch (u->ID)
{
case PACHINKO1:
case PACHINKO2:
case PACHINKO3:
case PACHINKO4:
case 623:
case TOILETGIRL_R0:
case WASHGIRL_R0:
case CARGIRL_R0:
case MECHANICGIRL_R0:
case SAILORGIRL_R0:
case PRUNEGIRL_R0:
case TRASHCAN:
case BUNNY_RUN_R0:
break;
default:
{
TotalKillable++;
#if DEBUG
if (DebugSecret)
{
sprintf(ds,"COUNTED: spnum %d, pic %d, x %d, y %d",SpriteNum,sp->picnum,sp->x,sp->y);
DebugWriteString(ds);
}
#endif
}
break;
}
RESET(sp->cstat, CSTAT_SPRITE_RESTORE);
u->spal = sp->pal;
u->RotNum = 5;
sp->clipdist = (256) >> 2;
u->zclip = Z(48);
u->lo_step = Z(32);
u->floor_dist = u->zclip - u->lo_step;
u->ceiling_dist = SPRITEp_SIZE_Z(sp) - u->zclip;
u->Radius = 400;
u->MaxHealth = u->Health;
u->PainThreshold = DIV16(u->Health) - 1;
//u->PainThreshold = DIV4(u->Health) - 1;
SET(sp->cstat,CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN);
SET(sp->extra,SPRX_PLAYER_OR_ENEMY);
sprite[SpriteNum].picnum = u->State->Pic;
change_sprite_stat(SpriteNum, STAT_ENEMY);
u->Personality = person;
u->ActorActionSet = action;
DoActorZrange(SpriteNum);
//KeepActorOnFloor(SpriteNum); // for swimming actors
// make sure we start in the water if thats where we are
if (u->lo_sectp) // && SectUser[u->lo_sectp - sector])
{
short i,nexti;
short sectnum = u->lo_sectp - sector;
if (SectUser[sectnum] && TEST(u->lo_sectp->extra, SECTFX_SINK))
{
depth = SectUser[sectnum]->depth;
}
else
{
TRAVERSE_SPRITE_SECT(headspritesect[sectnum],i,nexti)
{
SPRITEp np = &sprite[i];
if (np->picnum == ST1 && np->hitag == SECT_SINK)
{
depth = np->lotag;
}
}
}
}
if (depth && labs(sp->z - u->loz) < Z(8))
{
sp->z += Z(depth);
u->loz = sp->z;
u->oz = sp->z;
}
if (!action)
return;
NewStateGroup(SpriteNum, u->ActorActionSet->Run);
u->ActorActionFunc = DoActorDecide;
// find the number of long range attacks
for (wpn = wpn_cnt = 0; wpn < SIZ(u->ActorActionSet->Attack); wpn++)
{
if (u->ActorActionSet->Attack[wpn])
wpn_cnt++;
else
break;
}
// for actors this tells the number of weapons available
// for player it tells the current weapon
u->WeaponNum = wpn_cnt;
}
int
SetupCoolie(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u;
ANIMATOR DoActorDecide;
if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
{
u = User[SpriteNum];
ASSERT(u);
}
else
{
User[SpriteNum] = u = SpawnUser(SpriteNum,COOLIE_RUN_R0,s_CoolieRun[0]);
u->Health = HEALTH_COOLIE;
}
ChangeState(SpriteNum,s_CoolieRun[0]);
u->Attrib = &CoolieAttrib;
DoActorSetSpeed(SpriteNum, NORM_SPEED);
u->StateEnd = s_CoolieDie;
u->Rot = sg_CoolieRun;
EnemyDefaults(SpriteNum, &CoolieActionSet, &CooliePersonality);
sp->xrepeat = 42;
sp->yrepeat = 42;
SET(u->Flags, SPR_XFLIP_TOGGLE);
return 0;
}
int SpawnCoolg(short SpriteNum)
{
int NewCoolg(short);
USERp u = User[SpriteNum];
// Don't do a ghost every time
if (RANDOM_RANGE(1000) > 700) return 0;
NewCoolg(SpriteNum);
PlaySpriteSound(SpriteNum,attr_extra1,v3df_follow);
return 0;
}
int CooliePain(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
if (!TEST(u->Flags,SPR_CLIMBING))
KeepActorOnFloor(SpriteNum);
DoActorSectorDamage(SpriteNum);
if ((u->WaitTics -= ACTORMOVETICS) <= 0)
InitActorDecide(SpriteNum);
return 0;
}
int NullCoolie(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
if (!TEST(u->Flags,SPR_CLIMBING))
KeepActorOnFloor(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
int DoCoolieMove(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
if (u->track >= 0)
ActorFollowTrack(SpriteNum, ACTORMOVETICS);
else
(*u->ActorActionFunc)(SpriteNum);
KeepActorOnFloor(SpriteNum);
if (DoActorSectorDamage(SpriteNum))
{
return 0;
}
if (Distance(sp->x, sp->y, u->tgt_sp->x, u->tgt_sp->y) < 1200)
{
//DoActorDie(SpriteNum, -3);
UpdateSinglePlayKills(SpriteNum);
DoActorDie(SpriteNum, SpriteNum);
return 0;
}
return 0;
}
int InitCoolieCharge(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
if (RANDOM_P2(1024) > 950)
PlaySound(DIGI_COOLIESCREAM, &sp->x, &sp->y, &sp->z, v3df_follow);
DoActorSetSpeed(SpriteNum, FAST_SPEED);
InitActorMoveCloser(SpriteNum);
NewStateGroup(SpriteNum, sg_CoolieCharge);
return 0;
}
int
DoCoolieWaitBirth(short SpriteNum)
{
SPRITEp sp;
USERp u;
u = User[SpriteNum];
sp = &sprite[SpriteNum];
if ((u->Counter -= ACTORMOVETICS) <= 0)
{
ChangeState(SpriteNum,&s_CoolieDie[9]);
}
return 0;
}
#include "saveable.h"
static saveable_code saveable_coolie_code[] =
{
SAVE_CODE(EnemyDefaults),
SAVE_CODE(SetupCoolie),
SAVE_CODE(SpawnCoolg),
SAVE_CODE(CooliePain),
SAVE_CODE(NullCoolie),
SAVE_CODE(DoCoolieMove),
SAVE_CODE(InitCoolieCharge),
SAVE_CODE(DoCoolieWaitBirth),
};
static saveable_data saveable_coolie_data[] =
{
SAVE_DATA(CoolieBattle),
SAVE_DATA(CoolieOffense),
SAVE_DATA(CoolieBroadcast),
SAVE_DATA(CoolieSurprised),
SAVE_DATA(CoolieEvasive),
SAVE_DATA(CoolieLostTarget),
SAVE_DATA(CoolieCloseRange),
SAVE_DATA(CooliePersonality),
SAVE_DATA(CoolieAttrib),
SAVE_DATA(s_CoolieRun),
SAVE_DATA(sg_CoolieRun),
SAVE_DATA(s_CoolieCharge),
SAVE_DATA(sg_CoolieCharge),
SAVE_DATA(s_CoolieStand),
SAVE_DATA(sg_CoolieStand),
SAVE_DATA(s_CooliePain),
SAVE_DATA(sg_CooliePain),
SAVE_DATA(s_CoolieDie),
SAVE_DATA(sg_CoolieDie),
SAVE_DATA(s_CoolieDead),
SAVE_DATA(sg_CoolieDead),
SAVE_DATA(CoolieActionSet),
};
saveable_module saveable_coolie =
{
// code
saveable_coolie_code,
SIZ(saveable_coolie_code),
// data
saveable_coolie_data,
SIZ(saveable_coolie_data)
};

View file

@ -0,0 +1,238 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "names2.h"
#include "game.h"
#include "tags.h"
#include "weapon.h"
#include "sprite.h"
#include "track.h"
void CopySectorWalls(short dest_sectnum, short src_sectnum)
{
short dest_wall_num, src_wall_num, start_wall;
dest_wall_num = sector[dest_sectnum].wallptr;
src_wall_num = sector[src_sectnum].wallptr;
start_wall = dest_wall_num;
do
{
wall[dest_wall_num].picnum = wall[src_wall_num].picnum;
wall[dest_wall_num].xrepeat = wall[src_wall_num].xrepeat;
wall[dest_wall_num].yrepeat = wall[src_wall_num].yrepeat;
wall[dest_wall_num].overpicnum = wall[src_wall_num].overpicnum;
wall[dest_wall_num].pal = wall[src_wall_num].pal;
wall[dest_wall_num].cstat = wall[src_wall_num].cstat;
wall[dest_wall_num].shade = wall[src_wall_num].shade;
wall[dest_wall_num].xpanning = wall[src_wall_num].xpanning;
wall[dest_wall_num].ypanning = wall[src_wall_num].ypanning;
wall[dest_wall_num].hitag = wall[src_wall_num].hitag;
wall[dest_wall_num].lotag = wall[src_wall_num].lotag;
wall[dest_wall_num].extra = wall[src_wall_num].extra;
if (wall[dest_wall_num].nextwall >= 0 && wall[src_wall_num].nextwall >= 0)
{
wall[wall[dest_wall_num].nextwall].picnum = wall[wall[src_wall_num].nextwall].picnum;
wall[wall[dest_wall_num].nextwall].xrepeat = wall[wall[src_wall_num].nextwall].xrepeat;
wall[wall[dest_wall_num].nextwall].yrepeat = wall[wall[src_wall_num].nextwall].yrepeat;
wall[wall[dest_wall_num].nextwall].overpicnum = wall[wall[src_wall_num].nextwall].overpicnum;
wall[wall[dest_wall_num].nextwall].pal = wall[wall[src_wall_num].nextwall].pal;
wall[wall[dest_wall_num].nextwall].cstat = wall[wall[src_wall_num].nextwall].cstat;
wall[wall[dest_wall_num].nextwall].shade = wall[wall[src_wall_num].nextwall].shade;
wall[wall[dest_wall_num].nextwall].xpanning = wall[wall[src_wall_num].nextwall].xpanning;
wall[wall[dest_wall_num].nextwall].ypanning = wall[wall[src_wall_num].nextwall].ypanning;
wall[wall[dest_wall_num].nextwall].hitag = wall[wall[src_wall_num].nextwall].hitag;
wall[wall[dest_wall_num].nextwall].lotag = wall[wall[src_wall_num].nextwall].lotag;
wall[wall[dest_wall_num].nextwall].extra = wall[wall[src_wall_num].nextwall].extra;
}
dest_wall_num = wall[dest_wall_num].point2;
src_wall_num = wall[src_wall_num].point2;
}
while (dest_wall_num != start_wall);
}
void CopySectorMatch(short match)
{
short ed,nexted,ss,nextss;
SPRITEp dest_sp, src_sp;
SECTORp dsectp,ssectp;
short kill, nextkill;
SPRITEp k;
TRAVERSE_SPRITE_STAT(headspritestat[STAT_COPY_DEST], ed, nexted)
{
dest_sp = &sprite[ed];
dsectp = &sector[dest_sp->sectnum];
if (match != sprite[ed].lotag)
continue;
TRAVERSE_SPRITE_STAT(headspritestat[STAT_COPY_SOURCE], ss, nextss)
{
src_sp = &sprite[ss];
if (SP_TAG2(src_sp) == SPRITE_TAG2(ed) &&
SP_TAG3(src_sp) == SPRITE_TAG3(ed))
{
short src_move, nextsrc_move;
ssectp = &sector[src_sp->sectnum];
// !!!!!AAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHH
// Don't kill anything you don't have to
// this wall killing things on a Queue causing
// invalid situations
#if 1
// kill all sprites in the dest sector that need to be
TRAVERSE_SPRITE_SECT(headspritesect[dest_sp->sectnum], kill, nextkill)
{
k = &sprite[kill];
// kill anything not invisible
if (!TEST(k->cstat, CSTAT_SPRITE_INVISIBLE))
{
if (User[kill])
{
// be safe with the killing
//SetSuicide(kill);
}
else
{
SpriteQueueDelete(kill); // new function to allow killing - hopefully
KillSprite(kill);
}
}
}
#endif
CopySectorWalls(dest_sp->sectnum, src_sp->sectnum);
TRAVERSE_SPRITE_SECT(headspritesect[src_sp->sectnum], src_move, nextsrc_move)
{
// don't move ST1 Copy Tags
if (SPRITE_TAG1(src_move) != SECT_COPY_SOURCE)
{
int sx,sy,dx,dy,src_xoff,src_yoff,trash;
// move sprites from source to dest - use center offset
// get center of src and dest sect
SectorMidPoint(src_sp->sectnum, &sx, &sy, &trash);
SectorMidPoint(dest_sp->sectnum, &dx, &dy, &trash);
// get offset
src_xoff = sx - sprite[src_move].x;
src_yoff = sy - sprite[src_move].y;
// move sprite to dest sector
sprite[src_move].x = dx - src_xoff;
sprite[src_move].y = dy - src_yoff;
// change sector
changespritesect(src_move, dest_sp->sectnum);
// check to see if it moved on to a sector object
if (TEST(sector[dest_sp->sectnum].extra, SECTFX_SECTOR_OBJECT))
{
SECTOR_OBJECTp sop;
extern short GlobSpeedSO;
// find and add sprite to SO
sop = DetectSectorObject(&sector[sprite[src_move].sectnum]);
AddSpriteToSectorObject(src_move, sop);
// update sprites postions so they aren't in the
// wrong place for one frame
GlobSpeedSO = 0;
RefreshPoints(sop, 0, 0, TRUE);
}
}
}
// copy sector user if there is one
if (SectUser[src_sp->sectnum] || SectUser[dest_sp->sectnum])
{
SECT_USERp ssectu = GetSectUser(src_sp->sectnum);
SECT_USERp dsectu = GetSectUser(dest_sp->sectnum);
memcpy(dsectu, ssectu, sizeof(SECT_USER));
}
dsectp->hitag = ssectp->hitag;
dsectp->lotag = ssectp->lotag;
dsectp->floorz = ssectp->floorz;
dsectp->ceilingz = ssectp->ceilingz;
dsectp->floorshade = ssectp->floorshade;
dsectp->ceilingshade = ssectp->ceilingshade;
dsectp->floorpicnum = ssectp->floorpicnum;
dsectp->ceilingpicnum = ssectp->ceilingpicnum;
dsectp->floorheinum = ssectp->floorheinum;
dsectp->ceilingheinum = ssectp->ceilingheinum;
dsectp->floorpal = ssectp->floorpal;
dsectp->ceilingpal = ssectp->ceilingpal;
dsectp->floorxpanning = ssectp->floorxpanning;
dsectp->ceilingxpanning = ssectp->ceilingxpanning;
dsectp->floorypanning = ssectp->floorypanning;
dsectp->ceilingypanning = ssectp->ceilingypanning;
dsectp->floorstat = ssectp->floorstat;
dsectp->ceilingstat = ssectp->ceilingstat;
dsectp->extra = ssectp->extra;
dsectp->visibility = ssectp->visibility;
}
}
}
// do this outside of processing loop for safety
// kill all matching dest
TRAVERSE_SPRITE_STAT(headspritestat[STAT_COPY_DEST], ed, nexted)
{
if (match == sprite[ed].lotag)
KillSprite(ed);
}
// kill all matching sources
TRAVERSE_SPRITE_STAT(headspritestat[STAT_COPY_SOURCE], ss, nextss)
{
if (match == sprite[ss].lotag)
KillSprite(ss);
}
}

View file

@ -0,0 +1,108 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifdef DAMAGE_TABLE
#define DAMAGE_ENTRY(id, init_func, damage_lo, damage_hi, radius, max_ammo, min_ammo, with_weapon) \
{ init_func, damage_lo, damage_hi, radius, max_ammo, min_ammo, with_weapon, NULL, NULL, -1, -1 },
#define DAMAGE_ENTRY_WPN(id, init_func, damage_lo, damage_hi, radius, max_ammo, min_ammo, with_weapon, weapon_name, ammo_name, weapon_pickup, ammo_pickup ) \
{ init_func, damage_lo, damage_hi, radius, max_ammo, min_ammo, with_weapon, weapon_name, ammo_name, weapon_pickup, ammo_pickup },
#endif
#ifdef DAMAGE_ENUM
#define DAMAGE_ENTRY(id, init_func, damage_lo, damage_hi, radius, max_ammo, min_ammo, with_weapon) \
id,
#define DAMAGE_ENTRY_WPN(id, init_func, damage_lo, damage_hi, radius, max_ammo, min_ammo, with_weapon, weapon_name, ammo_name, weapon_pickup, ammo_pickup ) \
id,
#endif
// DAMAGES ////////////////////////////////////////////////////////////////////
// weapon
DAMAGE_ENTRY(WPN_FIST, InitWeaponFist, 10, 40, 0, -1, -1, -1)
DAMAGE_ENTRY_WPN(WPN_STAR, InitWeaponStar, 5, 10, 0, 99, 3, -1, "Shurikens", NULL, 9, -1)
DAMAGE_ENTRY_WPN(WPN_SHOTGUN, InitWeaponShotgun, 4, 4, 0, 52, 1, -1, "Riot Gun", "Shotshells", 8, 24)
DAMAGE_ENTRY_WPN(WPN_UZI, InitWeaponUzi, 5, 7, 0, 200, 1, -1, "UZI Submachine Gun", "UZI Clip", 50, 50)
DAMAGE_ENTRY_WPN(WPN_MICRO, InitWeaponMicro, 15, 30, 0, 50, 1, -1, "Missile Launcher", "Missiles", 5, 5)
DAMAGE_ENTRY_WPN(WPN_GRENADE, InitWeaponGrenade, 15, 30, 0, 50, 1, -1, "Grenade Launcher", "Grenade Shells", 6, 8)
DAMAGE_ENTRY_WPN(WPN_MINE, InitWeaponMine, 5, 10, 0, 20, 1, -1, "Sticky Bombs", NULL, 5, -1)
DAMAGE_ENTRY_WPN(WPN_RAIL, InitWeaponRail, 40, 60, 0, 20, 1, -1, "Rail Gun", "Rail Gun Rods", 10, 10)
DAMAGE_ENTRY_WPN(WPN_HOTHEAD, InitWeaponHothead, 10, 25, 0, 80, 1, -1, "Guardian Head", "Firebursts", 30, 60)
DAMAGE_ENTRY_WPN(WPN_HEART, InitWeaponHeart, 75, 100, 0, 5, 1, -1, "Ripper Heart", "Deathcoils", 1, 6)
DAMAGE_ENTRY(WPN_NAPALM, InitWeaponHothead, 50, 100, 0, 100, 40, WPN_HOTHEAD)
DAMAGE_ENTRY(WPN_RING, InitWeaponHothead, 15, 50, 0, 100, 20, WPN_HOTHEAD)
DAMAGE_ENTRY(WPN_ROCKET, InitWeaponMicro, 30, 60, 0, 100, 1, WPN_MICRO)
DAMAGE_ENTRY(WPN_SWORD, InitWeaponSword, 50, 80, 0, -1, -1, -1)
// extra weapons connected to other
// spell
DAMAGE_ENTRY(DMG_NAPALM, NULL, 90, 150, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_MIRV_METEOR, NULL, 35, 65, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_SERP_METEOR, NULL, 7, 15, 0, -1, -1, -1)
// radius damage
DAMAGE_ENTRY(DMG_ELECTRO_SHARD, NULL, 2, 6, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_SECTOR_EXP, NULL, 50, 100, 3200, -1, -1, -1)
DAMAGE_ENTRY(DMG_BOLT_EXP, NULL, 80, 160, 3200, -1, -1, -1)
DAMAGE_ENTRY(DMG_TANK_SHELL_EXP, NULL, 80, 200, 4500, -1, -1, -1)
DAMAGE_ENTRY(DMG_FIREBALL_EXP, NULL, -1, -1, 1000, -1, -1, -1)
DAMAGE_ENTRY(DMG_NAPALM_EXP, NULL, 60, 90, 3200, -1, -1, -1)
DAMAGE_ENTRY(DMG_SKULL_EXP, NULL, 40, 75, 4500, -1, -1, -1)
DAMAGE_ENTRY(DMG_BASIC_EXP, NULL, 10, 25, 1000, -1, -1, -1)
DAMAGE_ENTRY(DMG_GRENADE_EXP, NULL, 70, 140, 6500, -1, -1, -1)
DAMAGE_ENTRY(DMG_MINE_EXP, NULL, 85, 115, 6500, -1, -1, -1)
DAMAGE_ENTRY(DMG_MINE_SHRAP, NULL, 15, 30, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_MICRO_EXP, NULL, 50, 100, 4500, -1, -1, -1)
DAMAGE_ENTRY_WPN(DMG_NUCLEAR_EXP, NULL, 0, 800, 30000, -1, -1, -1, "Nuclear Warhead", "Heat Seeker Card", 1, 5)
DAMAGE_ENTRY(DMG_RADIATION_CLOUD, NULL, 2, 6, 5000, -1, -1, -1)
DAMAGE_ENTRY(DMG_FLASHBOMB, NULL, 100, 150, 16384, -1, -1, -1)
DAMAGE_ENTRY(DMG_FIREBALL_FLAMES, NULL, 2, 6, 300, -1, -1, -1)
// actor
DAMAGE_ENTRY(DMG_RIPPER_SLASH, NULL, 10, 30, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_SKEL_SLASH, NULL, 10, 20, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_COOLG_BASH, NULL, 10, 20, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_COOLG_FIRE, NULL, 15, 30, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_GORO_CHOP, NULL, 20, 40, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_GORO_FIREBALL, NULL, 5, 20, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_SERP_SLASH, NULL, 75, 75, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_LAVA_BOULDER, NULL, 100, 100, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_LAVA_SHARD, NULL, 25, 25, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_HORNET_STING, NULL, 5, 10, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_EEL_ELECTRO, NULL, 10, 40, 3400, -1, -1, -1)
// misc
DAMAGE_ENTRY(DMG_SPEAR_TRAP, NULL, 15, 20, 0, -1, -1, -1)
DAMAGE_ENTRY(DMG_VOMIT, NULL, 5, 15, 0, -1, -1, -1)
// inanimate objects
DAMAGE_ENTRY(DMG_BLADE, NULL, 10, 20, 0, -1, -1, -1)
DAMAGE_ENTRY(MAX_WEAPONS, NULL, 10, 20, 0, -1, -1, -1)
#undef DAMAGE_ENTRY
#undef DAMAGE_ENTRY_WPN

View file

@ -0,0 +1,656 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
//#define MAIN
//#define QUIET
#include "build.h"
#include "cache1d.h"
#include "keys.h"
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "net.h"
#include "mytypes.h"
#include "control.h"
#include "function.h"
#include "demo.h"
#include "player.h"
#include "menus.h"
DFILE DemoFileIn = DF_ERR;
FILE *DemoFileOut;
BOOL DemoPlaying = FALSE;
BOOL DemoRecording = FALSE;
BOOL DemoEdit = FALSE;
BOOL DemoMode = FALSE;
BOOL DemoModeMenuState = FALSE;
BOOL DemoOverride = FALSE;
char DemoFileName[16] = "demo.dmo";
char DemoLevelName[16] = "";
extern BOOL NewGame;
// Demo sync stuff
FILE *DemoSyncFile;
BOOL DemoSyncTest = FALSE, DemoSyncRecord = FALSE;
char DemoTmpName[16] = "";
SW_PACKET DemoBuffer[DEMO_BUFFER_MAX];
int DemoRecCnt = 0; // Can only record 1-player game
BOOL DemoDone;
VOID DemoWriteHeader(VOID);
VOID DemoReadHeader(VOID);
VOID DemoReadBuffer(VOID);
//
// DemoDebug Vars
//
// DemoDebugMode will close the file after every write
BOOL DemoDebugMode = FALSE;
//BOOL DemoDebugMode = TRUE;
BOOL DemoInitOnce = FALSE;
short DemoDebugBufferMax = 1;
extern char LevelName[];
extern char LevelSong[16];
extern BYTE FakeMultiNumPlayers;
extern BOOL QuitFlag;
///////////////////////////////////////////
//
// Demo File Manipulation
//
///////////////////////////////////////////
char *DemoSyncFileName(VOID)
{
static char file_name[32];
char *ptr;
strcpy(file_name, DemoFileName);
if ((ptr = strchr(file_name, '.')) == 0)
strcat(file_name, ".dms");
else
{
*ptr = '\0';
strcat(file_name, ".dms");
}
return file_name;
}
VOID
DemoSetup(VOID)
{
if (DemoRecording)
{
if (DemoSyncRecord)
DemoSyncFile = fopen(DemoSyncFileName(),"wb");
DemoWriteHeader();
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
}
if (DemoPlaying)
{
if (DemoSyncRecord)
DemoSyncFile = fopen(DemoSyncFileName(),"wb");
if (DemoSyncTest)
DemoSyncFile = fopen(DemoSyncFileName(),"rb");
DemoReadHeader();
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
DemoReadBuffer();
}
}
VOID
DemoRecordSetup(VOID)
{
if (DemoRecording)
{
if (DemoSyncRecord)
DemoSyncFile = fopen(DemoSyncFileName(),"wb");
DemoWriteHeader();
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
}
}
VOID
DemoPlaySetup(VOID)
{
if (DemoPlaying)
{
if (DemoSyncRecord)
DemoSyncFile = fopen(DemoSyncFileName(),"wb");
if (DemoSyncTest)
DemoSyncFile = fopen(DemoSyncFileName(),"rb");
DemoReadHeader();
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
DemoReadBuffer();
}
}
VOID
DemoWriteHeader(VOID)
{
DEMO_HEADER dh;
DEMO_START_POS dsp;
PLAYERp pp;
DemoFileOut = fopen(DemoFileName, "wb");
if (!DemoFileOut)
return;
strcpy(dh.map_name, LevelName);
strcpy(dh.LevelSong, LevelSong);
dh.Level = Level;
if (FakeMultiNumPlayers)
dh.numplayers = FakeMultiNumPlayers;
else
dh.numplayers = numplayers;
fwrite(&dh, sizeof(dh), 1, DemoFileOut);
for (pp = Player; pp < Player + dh.numplayers; pp++)
{
dsp.x = pp->posx;
dsp.y = pp->posy;
dsp.z = pp->posz;
fwrite(&dsp, sizeof(dsp), 1, DemoFileOut);
fwrite(&pp->Flags, sizeof(pp->Flags), 1, DemoFileOut);
fwrite(&pp->pang, sizeof(pp->pang), 1, DemoFileOut);
}
fwrite(&Skill, sizeof(Skill), 1, DemoFileOut);
fwrite(&gNet, sizeof(gNet), 1, DemoFileOut);
if (DemoDebugMode)
{
DemoDebugBufferMax = numplayers;
fclose(DemoFileOut);
}
}
VOID
DemoReadHeader(VOID)
{
DEMO_HEADER dh;
DEMO_START_POS dsp;
PLAYERp pp;
#if DEMO_FILE_TYPE != DEMO_FILE_GROUP
if (DemoEdit)
{
DemoFileIn = fopen(DemoFileName, "rb+");
}
else
#endif
{
//DemoFileIn = fopen(DemoFileName, "rb");
DemoFileIn = DOPEN_READ(DemoFileName);
}
if (DemoFileIn == DF_ERR)
{
TerminateGame();
printf("File %s is not a valid demo file.",DemoFileName);
exit(0);
}
DREAD(&dh, sizeof(dh), 1, DemoFileIn);
strcpy(DemoLevelName, dh.map_name);
strcpy(LevelSong, dh.LevelSong);
Level = dh.Level;
if (dh.numplayers > 1)
{
FakeMultiNumPlayers = dh.numplayers;
}
else
numplayers = dh.numplayers;
for (pp = Player; pp < Player + dh.numplayers; pp++)
{
DREAD(&dsp, sizeof(dsp), 1, DemoFileIn);
pp->posx = dsp.x;
pp->posy = dsp.y;
pp->posz = dsp.z;
COVERupdatesector(pp->posx, pp->posy, &pp->cursectnum);
//pp->cursectnum = 0;
//updatesectorz(pp->posx, pp->posy, pp->posz, &pp->cursectnum);
DREAD(&pp->Flags, sizeof(pp->Flags), 1, DemoFileIn);
DREAD(&pp->pang, sizeof(pp->pang), 1, DemoFileIn);
}
DREAD(&Skill, sizeof(Skill), 1, DemoFileIn);
DREAD(&gNet, sizeof(gNet), 1, DemoFileIn);
}
VOID
DemoDebugWrite(VOID)
{
int size;
DemoFileOut = fopen(DemoFileName, "ab");
ASSERT(DemoFileOut);
size = sizeof(SW_PACKET) * DemoDebugBufferMax;
fwrite(&DemoBuffer, size, 1, DemoFileOut);
memset(&DemoBuffer, -1, size);
fclose(DemoFileOut);
}
VOID
DemoWriteBuffer(VOID)
{
fwrite(&DemoBuffer, sizeof(DemoBuffer), 1, DemoFileOut);
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
}
VOID
DemoReadBuffer(VOID)
{
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
DREAD(&DemoBuffer, sizeof(DemoBuffer), 1, DemoFileIn);
}
VOID
DemoBackupBuffer(VOID)
{
#if DEMO_FILE_TYPE != DEMO_FILE_GROUP
FILE *NewDemoFile;
FILE *OldDemoFile = DemoFileIn;
int pos,i;
char copy_buffer;
char NewDemoFileName[16] = "!";
// seek backwards to beginning of last buffer
fseek(OldDemoFile, -sizeof(DemoBuffer), SEEK_CUR);
pos = ftell(OldDemoFile);
// open a new edit file
strcat(NewDemoFileName, DemoFileName);
NewDemoFile = fopen(NewDemoFileName, "wb");
rewind(OldDemoFile);
// copy old demo to new demo
for (i = 0; i < pos; i++)
{
fread(&copy_buffer, sizeof(copy_buffer), 1, OldDemoFile);
fwrite(&copy_buffer,sizeof(copy_buffer), 1, NewDemoFile);
}
DemoFileOut = NewDemoFile;
fclose(OldDemoFile);
#endif
}
VOID
DemoTerm(VOID)
{
if (DemoRecording)
{
// if already closed
if (DemoFileOut == NULL)
return;
if (DemoDebugMode)
{
DemoFileOut = fopen(DemoFileName, "ab");
ASSERT(DemoFileOut);
}
else
{
// paste on a -1 record to the current buffer
if (DemoRecCnt < DEMO_BUFFER_MAX)
memset(&DemoBuffer[DemoRecCnt], -1, sizeof(DemoBuffer[DemoRecCnt]));
DemoWriteBuffer();
}
// write at least 1 record at the end filled with -1
// just for good measure
memset(&DemoBuffer[0], -1, sizeof(DemoBuffer[0]));
fwrite(&DemoBuffer[0], sizeof(DemoBuffer[0]), 1, DemoFileOut);
fclose(DemoFileOut);
DemoFileOut = NULL;
}
if (DemoPlaying)
{
if (DemoFileIn == DF_ERR)
return;
DCLOSE(DemoFileIn);
DemoFileIn = DF_ERR;
}
if (DemoSyncTest||DemoSyncRecord)
{
fclose(DemoSyncFile);
DemoSyncFile = NULL;
}
}
///////////////////////////////////////////
//
// Demo Play Back
//
///////////////////////////////////////////
VOID
DemoPlayBack(VOID)
{
int pnum, cnt;
static int buf_ndx;
PLAYERp pp;
ControlInfo info;
int Xdim, Ydim, ScreenSize;
if (SW_SHAREWARE)
{
// code here needs to be similar to RunLevel startup code
PlaySong(LevelSong, -1, TRUE, TRUE);
}
// Initialize Game part of network code (When ready2send != 0)
InitNetVars();
// IMPORTANT - MUST be right before game loop
InitTimingVars();
// THIS STUFF DEPENDS ON MYCONNECTINDEX BEING SET RIGHT
pp = Player + myconnectindex;
SetRedrawScreen(pp);
if (!DemoInitOnce)
buf_ndx = 0;
// everything has been inited at least once for PLAYBACK
DemoInitOnce = TRUE;
cnt = 0;
ready2send = 0;
DemoDone = FALSE;
while (TRUE)
{
// makes code run at the same rate
while (totalclock > totalsynctics)
{
handleevents();
TRAVERSE_CONNECT(pnum)
{
pp = Player + pnum;
pp->inputfifo[pp->movefifoend & (MOVEFIFOSIZ-1)] = DemoBuffer[buf_ndx];
pp->movefifoend++;
buf_ndx++;
if (pp->inputfifo[(pp->movefifoend - 1) & (MOVEFIFOSIZ-1)].bits == -1)
{
DemoDone = TRUE;
break;
}
if (buf_ndx > DEMO_BUFFER_MAX - 1)
{
DemoReadBuffer();
buf_ndx = 0;
}
}
if (DemoDone)
break;
cnt++;
CONTROL_GetInput(&info);
domovethings();
MNU_CheckForMenus();
// fast forward and slow mo
if (DemoEdit)
{
if (KEY_PRESSED(KEYSC_F))
{
if (KEY_PRESSED(KEYSC_LSHIFT) || KEY_PRESSED(KEYSC_RSHIFT))
totalclock += synctics;
else
totalclock += synctics-1;
}
if (KEY_PRESSED(KEYSC_S))
totalclock += 1-synctics;
}
else
{
#if DEBUG
if (KEY_PRESSED(KEYSC_ALT) && KEY_PRESSED(KEYSC_CTRL) && KEY_PRESSED(KEYSC_S))
{
KEY_PRESSED(KEYSC_ALT) = KEY_PRESSED(KEYSC_CTRL) = KEY_PRESSED(KEYSC_S) = 0;
saveboard("demosave.map", &Player->posx, &Player->posy, &Player->posz, &Player->pang, &Player->cursectnum);
}
#endif
if (BUTTON(gamefunc_See_Co_Op_View))
{
CONTROL_ClearButton(gamefunc_See_Co_Op_View);
screenpeek = connectpoint2[screenpeek];
if (screenpeek < 0)
screenpeek = connecthead;
}
#if DEBUG
if (KEY_PRESSED(KEYSC_RIGHT) || KEY_PRESSED(KEYSC_UP))
{
if (KEY_PRESSED(KEYSC_LSHIFT) || KEY_PRESSED(KEYSC_RSHIFT))
totalclock += synctics;
else
totalclock += synctics-1;
}
if (KEY_PRESSED(KEYSC_LEFT) || KEY_PRESSED(KEYSC_DOWN))
totalclock += 1-synctics;
#endif
}
if (DemoSyncRecord)
demosync_record();
if (DemoSyncTest)
demosync_test(cnt);
}
// Put this back in later when keyboard stuff is stable
if (DemoEdit)
{
//CONTROL_GetButtonInput();
CONTROL_GetInput(&info);
// if a key is pressed, start recording from the point the key
// was pressed
if (BUTTON(gamefunc_Move_Forward) ||
BUTTON(gamefunc_Move_Backward) ||
BUTTON(gamefunc_Turn_Left) ||
BUTTON(gamefunc_Turn_Right) ||
BUTTON(gamefunc_Fire) ||
BUTTON(gamefunc_Open) ||
BUTTON(gamefunc_Jump) ||
BUTTON(gamefunc_Crouch) ||
BUTTON(gamefunc_Look_Up) ||
BUTTON(gamefunc_Look_Down))
{
DemoBackupBuffer();
DemoRecCnt = buf_ndx;
DemoPlaying = FALSE;
DemoRecording = TRUE;
return;
}
}
if (BUTTON(gamefunc_See_Co_Op_View))
{
screenpeek += 1;
if (screenpeek > numplayers-1)
screenpeek = 0;
}
// demo is over
if (DemoDone)
break;
if (QuitFlag)
{
DemoMode = FALSE;
break;
}
if (ExitLevel)
{
// Quiting Demo
ExitLevel = FALSE;
if (DemoMode)
{
DemoPlaying = FALSE;
DemoMode = FALSE;
}
break;
}
drawscreen(Player + screenpeek);
}
// only exit if conditions are write
if (DemoDone && !DemoMode && !NewGame)
{
TerminateLevel();
TerminateGame();
exit(0);
}
}
//
// Still using old method of playback - this was for opening demo
//
VOID
ScenePlayBack(VOID)
{
int buf_ndx, pnum, cnt;
PLAYERp pp;
if (SW_SHAREWARE)
{
// code here needs to be similar to RunLevel startup code
strcpy(LevelSong,"yokoha03.mid");
PlaySong(LevelSong, -1, TRUE, TRUE);
}
// IMPORTANT - MUST be right before game loop
InitTimingVars();
buf_ndx = 0;
cnt = 0;
ready2send = 0;
DemoDone = FALSE;
ResetKeys();
while (TRUE)
{
// makes code run at the same rate
while ((totalclock > totalsynctics))
{
TRAVERSE_CONNECT(pnum)
{
pp = Player + pnum;
pp->inputfifo[pp->movefifoend & (MOVEFIFOSIZ - 1)] = DemoBuffer[buf_ndx];
pp->movefifoend++;
buf_ndx++;
if (pp->inputfifo[(pp->movefifoend - 1) & (MOVEFIFOSIZ - 1)].bits == -1)
{
DemoDone = TRUE;
break;
}
if (buf_ndx > DEMO_BUFFER_MAX - 1)
{
DemoReadBuffer();
buf_ndx = 0;
}
}
if (KeyPressed())
DemoDone = TRUE;
if (DemoDone)
break;
cnt++;
//movethings();
domovethings();
MNU_CheckForMenus();
}
// demo is over
if (DemoDone)
break;
drawscreen(Player + screenpeek);
}
}

View file

@ -0,0 +1,76 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
extern FILE *DemoFile;
extern BOOL DemoPlaying;
extern BOOL DemoRecording;
extern BOOL DemoEdit;
extern BOOL DemoMode;
extern BOOL DemoOverride;
extern char DemoFileName[16];
extern char DemoLevelName[16];
extern FILE *DemoSyncFile;
extern BOOL DemoSyncTest;
extern BOOL DemoSyncRecord;
extern char DemoTmpName[16];
extern BOOL DemoDebugMode;
extern BOOL DemoInitOnce;
extern short DemoDebugBufferMax;
#define DEMO_BUFFER_MAX 2048
extern SW_PACKET DemoBuffer[DEMO_BUFFER_MAX];
extern int DemoRecCnt; // Can only record 1-player game
#define DEMO_FILE_GROUP 0
#define DEMO_FILE_STD 1
#define DEMO_FILE_TYPE DEMO_FILE_GROUP
// Demo File - reading from group
#if DEMO_FILE_TYPE == DEMO_FILE_GROUP
typedef long DFILE;
#define DREAD(ptr, size, num, handle) kread((handle),(ptr),(size)*(num))
#define DOPEN_READ(name) kopen4load(name,0)
#define DCLOSE(handle) kclose(handle)
#define DF_ERR -1
#else
typedef FILE *DFILE;
#define DREAD(ptr, size, num,handle) fread((ptr),(size),(num),(handle))
#define DWRITE(ptr, size, num,handle) fwrite((ptr),(size),(num),(handle))
#define DOPEN_WRITE(name) fopen(name,"wb")
#define DOPEN_READ(name) fopen(name,"rb")
#define DCLOSE(handle) fclose(handle)
#define DF_ERR NULL
#endif
void DemoTerm(void);
void DemoPlaySetup(void);
void DemoPlayBack(void);
void ScenePlayBack(void);
void DemoRecordSetup(void);
void DemoDebugWrite(void);
void DemoWriteBuffer(void);

View file

@ -0,0 +1,992 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifdef DIGI_TABLE
#define DIGI_ENTRY(name, id, id_num, pri, pitch_lo, pitch_hi, voc_num, voc_dist, voc_flags) { name, NULL, 0, pitch_lo, pitch_hi, pri, voc_num, voc_dist, voc_flags, 0,0},
#endif
#ifdef DIGI_ENUM
#define DIGI_ENTRY(name, id, id_num, pri, pitch_lo, pitch_hi, voc_num, voc_dist, voc_flags) id = id_num,
#endif
// !JIM! 09/20/95
// NOTE: HIGHER priority numbers have the highest precedence in the play list.
#define PRI_MAX 100
#define PRI_PLAYERDEATH 51
#define PRI_PLAYERVOICE 50
#define PRI_HI_PLAYERWEAP 49
#define PRI_LOW_PLAYERWEAP 48
#define PRI_PLAYERAMBIENT 40
#define PRI_NPCDEATH 49
#define PRI_NPCWEAP 47
#define PRI_NPCATTACK 42
#define PRI_NPCAMBIENT 39
#define PRI_ITEM 41
#define PRI_SWITCH PRI_MAX // To give a clue to player location
#define PRI_SECTOROBJ 30
#define PRI_ENVIRONMENT 20
#define PRI_AMBIENT 10
// Distance definitions for effective sound ranges
// Note: These are some useful constants, but you can type in whatever you want!
#define DIST_NORMAL 0 // Just play sound normaly
#define DIST_MAXNORMAL 16384 // This is max distance constant for normal sounds
// This is the limiting constant in Sound_Dist function.
#define DIST_WIDE 65536 // Half Level at full volume before sound begins to fade.
#define DIST_LEVELWIDE 131072 // Full Level
// VOC Flag definitions
#define VF_NORMAL 0
#define VF_LOOP 1
// WEAPONS ////////////////////////////////////////////////////////////////////
// NULL Entry used to detect a sound's presence in sprite attrib structs.
DIGI_ENTRY("NULL.VOC", DIGI_NULL, 0, 0, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// SWORD
DIGI_ENTRY("SWRDSTR1.VOC", DIGI_SWORDSWOOSH, 1, PRI_HI_PLAYERWEAP, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
// SHURIKEN
DIGI_ENTRY("THROW.VOC", DIGI_STAR, 2, PRI_HI_PLAYERWEAP, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("STRCLNK.VOC", DIGI_STARCLINK, 3, PRI_PLAYERAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
//DIGI_ENTRY("STRWIZ.VOC", DIGI_STARWIZ, 4, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP )
DIGI_ENTRY("NULL.VOC", DIGI_NULL_STARWIZ, 4, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// UZI
DIGI_ENTRY("UZIFIRE1.VOC", DIGI_UZIFIRE, 5, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RICH1.VOC", DIGI_RICHOCHET1, 6, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RICH2.VOC", DIGI_RICHOCHET2, 7, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RMVCLIP.VOC", DIGI_REMOVECLIP, 8, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RPLCLIP.VOC", DIGI_REPLACECLIP, 9, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// SPENT SHELL HITTING FLOOR
DIGI_ENTRY("SHELL.VOC", DIGI_SHELL, 10, PRI_NPCATTACK, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
// CROSSRIOT
DIGI_ENTRY("RIOTFIR1.VOC", DIGI_RIOTFIRE, 11, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SHOTGUN.VOC", DIGI_RIOTFIRE2, 12, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIOTRLD.VOC", DIGI_RIOTRELOAD, 13, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("EXPMED.VOC", DIGI_BOLTEXPLODE, 14, PRI_HI_PLAYERWEAP, -100, 100, 0, DIST_MAXNORMAL, VF_NORMAL)
DIGI_ENTRY("RIOTWIZ.VOC", DIGI_BOLTWIZ, 15, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// 30MM GRENADE LAUNCHER
DIGI_ENTRY("40MMFIR2.VOC", DIGI_30MMFIRE, 16, PRI_HI_PLAYERWEAP, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIOTRLD.VOC", DIGI_30MMRELOAD, 17, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("40MMEXP2.VOC", DIGI_30MMEXPLODE, 18, PRI_HI_PLAYERWEAP, -100, 100, 0, DIST_WIDE, VF_NORMAL)
DIGI_ENTRY("RIOTWIZ.VOC", DIGI_30MMWIZ, 19, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// GORO HEAD
DIGI_ENTRY("GHFIR1.VOC", DIGI_HEADFIRE, 20, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GHWIZ.VOC", DIGI_HEADSHOTWIZ, 21, PRI_PLAYERAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("EXPSML.VOC", DIGI_HEADSHOTHIT, 22, PRI_LOW_PLAYERWEAP,-100, 100, 0, DIST_NORMAL, VF_NORMAL)
// MINES
DIGI_ENTRY("THROW.VOC", DIGI_MINETHROW, 23, PRI_HI_PLAYERWEAP,-100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("PHITGRND.VOC", DIGI_MINEBOUNCE, 24, PRI_LOW_PLAYERWEAP,-100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("EXPLRG.VOC", DIGI_MINEBLOW, 25, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_WIDE, VF_NORMAL)
DIGI_ENTRY("STSCAN2.VOC", DIGI_MINEBEEP, 26, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// HEART ATTACK
DIGI_ENTRY("HBLOOP1.VOC", DIGI_HEARTBEAT, 27, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
//#ifndef SW_SHAREWARE
DIGI_ENTRY("HSQUEEZ1.VOC", DIGI_HEARTFIRE, 28, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
//#else
//DIGI_ENTRY("NULL.VOC", DIGI_HEARTFIRE, 28, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL )
//#endif
DIGI_ENTRY("HRTWIZ.VOC", DIGI_HEARTWIZ, 29, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// MISSILE BATTERY
DIGI_ENTRY("RIOTFIR1.VOC", DIGI_MISSLFIRE, 30, PRI_HI_PLAYERWEAP, -75, 75, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("EXPMED.VOC", DIGI_MISSLEXP, 31, PRI_HI_PLAYERWEAP, -100, 100, 0, DIST_WIDE, VF_NORMAL)
// RING OF FIRE SPELL
//#ifndef SW_SHAREWARE
DIGI_ENTRY("RFWIZ.VOC", DIGI_RFWIZ, 32, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
//#else
//DIGI_ENTRY("NULL.VOC", DIGI_NULL_RFWIZ, 32, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL )
//#endif
// NAPALM SPELL
DIGI_ENTRY("NAPFIRE.VOC", DIGI_NAPFIRE, 33, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NAPTWIZ.VOC", DIGI_NAPWIZ, 34, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("NAPPUFF.VOC", DIGI_NAPPUFF, 35, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// MAGIC MIRV SPELL
DIGI_ENTRY("MMFIRE.VOC", DIGI_MIRVFIRE, 36, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MMWIZ.VOC", DIGI_MIRVWIZ, 37, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// SPIRAL SPELL
DIGI_ENTRY("SPRLFIRE.VOC", DIGI_SPIRALFIRE, 38, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SPRLWIZ.VOC", DIGI_SPIRALWIZ, 39, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// MAGIC SOUNDS, GENERIC
// (USED FOR MAGIC CARPET RIDES,ETC.)
DIGI_ENTRY("MAGIC1.VOC", DIGI_MAGIC1, 40, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MAGIC2.VOC", DIGI_MAGIC2, 41, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MAGIC3.VOC", DIGI_MAGIC3, 42, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MAGIC4.VOC", DIGI_MAGIC4, 43, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MAGIC5.VOC", DIGI_MAGIC5, 44, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MAGIC6.VOC", DIGI_MAGIC6, 45, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MAGIC7.VOC", DIGI_MAGIC7, 46, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// SHADOW WARRIOR SPELL
//#ifndef SW_SHAREWARE
DIGI_ENTRY("SWSPELL.VOC", DIGI_SWCLOAKUNCLOAK, 47, PRI_LOW_PLAYERWEAP,-100, 100, 0, DIST_NORMAL, VF_NORMAL)
//#else
//DIGI_ENTRY("NULL.VOC", DIGI_NULL_SWCLOAK, 47, PRI_LOW_PLAYERWEAP,-100, 100, 0, DIST_NORMAL, VF_NORMAL )
//#endif
// PLAYER DEAD HEAD
DIGI_ENTRY("DHVOMIT.VOC", DIGI_DHVOMIT, 48, PRI_PLAYERAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("DHCLUNK.VOC", DIGI_DHCLUNK, 49, PRI_PLAYERAMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
//DIGI_ENTRY("DHSQSH.VOC", DIGI_DHSQUISH, 50, PRI_PLAYERAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL )
DIGI_ENTRY("NULL.VOC", DIGI_NULL_DHSQUISH, 50, PRI_PLAYERAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// WEAPON RELATED
DIGI_ENTRY("LAVAHIT.VOC", DIGI_PROJECTILELAVAHIT,51, PRI_PLAYERAMBIENT,-100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("STSPL01.VOC", DIGI_PROJECTILEWATERHIT,52, PRI_PLAYERAMBIENT,-100, 100, 0, DIST_NORMAL, VF_NORMAL)
// ITEMS
DIGI_ENTRY("KEY.VOC", DIGI_KEY, 53, PRI_ITEM, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ITEM5A.VOC", DIGI_ITEM, 54, PRI_ITEM, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ITEMBIG2.VOC", DIGI_BIGITEM, 55, PRI_ITEM, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// DEATH/HURT
DIGI_ENTRY("BODY9.VOC", DIGI_BODYFALL1, 56, PRI_PLAYERDEATH, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("PHITGRND.VOC", DIGI_HITGROUND, 57, PRI_PLAYERAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BODY2.VOC", DIGI_BODYSQUISH1, 58, PRI_PLAYERAMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BURN1.VOC", DIGI_BODYBURN, 59, PRI_PLAYERAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BURNSCRM.VOC", DIGI_BODYBURNSCREAM, 60, PRI_PLAYERDEATH, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BODY3.VOC", DIGI_BODYCRUSHED1, 61, PRI_PLAYERAMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BODY4.VOC", DIGI_BODYHACKED1, 62, PRI_PLAYERAMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BURN2.VOC", DIGI_BODYSINGED, 63, PRI_PLAYERAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("DROWN1.VOC", DIGI_DROWN, 64, PRI_PLAYERDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SCREAM1.VOC", DIGI_SCREAM1, 65, PRI_PLAYERDEATH, -200, 400, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SCREAM2.VOC", DIGI_SCREAM2, 66, PRI_PLAYERDEATH, -200, 400, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SCREAM3.VOC", DIGI_SCREAM3, 67, PRI_PLAYERDEATH, -200, 400, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HIT1.VOC", DIGI_HIT1, 68, PRI_LOW_PLAYERWEAP, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ELECTRC1.VOC", DIGI_ELECTRICUTE1, 69, PRI_PLAYERAMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWDIE02.VOC", DIGI_REMOVEME, 70, PRI_PLAYERDEATH, -200, 500, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("IMPALE1.VOC", DIGI_IMPALED, 71, PRI_PLAYERDEATH, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("OOF1.VOC", DIGI_OOF1, 72, PRI_PLAYERAMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
// ACTOR SOUNDS THAT USER
// PLAYER SOUNDS AT A LOWER PRIORITY
DIGI_ENTRY("BODY1.VOC", DIGI_ACTORBODYFALL1, 73, PRI_NPCWEAP, 0, 0, DIGI_BODYFALL1, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HITGRND.VOC", DIGI_ACTORHITGROUND, 74, PRI_NPCWEAP, 0, 0, DIGI_HITGROUND, DIST_NORMAL, VF_NORMAL)
// NPC'S //////////////////////////////////////////////////////////////////////
// COOLIE
DIGI_ENTRY("COLEXP.VOC", DIGI_COOLIEEXPLODE, 75, PRI_NPCDEATH, -100, 100, 0, DIST_MAXNORMAL, VF_NORMAL)
DIGI_ENTRY("COLSCRM.VOC", DIGI_COOLIESCREAM, 76, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("COLALRT.VOC", DIGI_COOLIEALERT, 77, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("COLAMB.VOC", DIGI_COOLIEAMBIENT, 78, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("COLPAIN.VOC", DIGI_COOLIEPAIN, 79, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// COOLIE GHOST
DIGI_ENTRY("CGMAT.VOC", DIGI_CGMATERIALIZE, 80, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CGALRT.VOC", DIGI_CGALERT, 81, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CGWHACK.VOC", DIGI_CGTHIGHBONE, 82, PRI_NPCWEAP, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CGAMB.VOC", DIGI_CGAMBIENT, 83, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CGPAIN.VOC", DIGI_CGPAIN, 84, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CGSHOOT.VOC", DIGI_CGMAGIC, 85, PRI_NPCWEAP, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CGHIT.VOC", DIGI_CGMAGICHIT, 86, PRI_NPCWEAP, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CGSCRM.VOC", DIGI_CGSCREAM, 87, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// NINJA
DIGI_ENTRY("NINAMB.VOC", DIGI_NINJAAMBIENT, 88, PRI_NPCAMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NINSTAR.VOC", DIGI_NINJASTAR, 89, PRI_NPCWEAP, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NINPAIN.VOC", DIGI_NINJAPAIN, 90, PRI_NPCWEAP, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NINSCRM.VOC", DIGI_NINJASCREAM, 91, PRI_NPCDEATH, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NINALRT.VOC", DIGI_NINJAALERT, 92, PRI_NPCATTACK, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NINSHOOT.VOC", DIGI_NINJAUZIATTACK, 93, PRI_NPCWEAP, 0, 0, DIGI_UZIFIRE, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIOTFIR1.VOC", DIGI_NINJARIOTATTACK, 94, PRI_NPCWEAP, 0, 0, DIGI_RIOTFIRE, DIST_NORMAL, VF_NORMAL)
// RIPPER
DIGI_ENTRY("RIPAMB.VOC", DIGI_RIPPERAMBIENT, 95, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIPALRT.VOC", DIGI_RIPPERALERT, 96, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIPATCK.VOC", DIGI_RIPPERATTACK, 97, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIPPAIN.VOC", DIGI_RIPPERPAIN, 98, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIPSCRM.VOC", DIGI_RIPPERSCREAM, 99, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIPHRT.VOC", DIGI_RIPPERHEARTOUT, 100, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// GUARDIAN
DIGI_ENTRY("GRDAMB.VOC", DIGI_GRDAMBIENT, 101, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GRDALRT.VOC", DIGI_GRDALERT, 102, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GRDPAIN.VOC", DIGI_GRDPAIN, 103, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GRDSCRM.VOC", DIGI_GRDSCREAM, 104, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GRDFIR.VOC", DIGI_GRDFIREBALL, 105, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GRDAXE.VOC", DIGI_GRDSWINGAXE, 106, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GRDAXHT.VOC", DIGI_GRDAXEHIT, 107, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// SKELETOR PRIEST
DIGI_ENTRY("SPAMB.VOC", DIGI_SPAMBIENT, 108, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SPALRT.VOC", DIGI_SPALERT, 109, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SPPAIN.VOC", DIGI_SPPAIN, 110, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SPSCRM.VOC", DIGI_SPSCREAM, 111, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SPBLADE.VOC", DIGI_SPBLADE, 112, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SPELEC.VOC", DIGI_SPELEC, 113, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SPTLPRT.VOC", DIGI_SPTELEPORT, 114, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// ACCURSED HEAD
DIGI_ENTRY("AHAMB.VOC", DIGI_AHAMBIENT, 115, PRI_NPCAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("AHSCRM.VOC", DIGI_AHSCREAM, 116, PRI_NPCDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("AHEXP.VOC", DIGI_AHEXPLODE, 117, PRI_NPCDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("AHSHWSH.VOC", DIGI_AHSWOOSH, 118, PRI_NPCATTACK, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// HORNET
DIGI_ENTRY("HBUZZ.VOC", DIGI_HORNETBUZZ, 119, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("HSTING.VOC", DIGI_HORNETSTING, 120, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HPAIN.VOC", DIGI_HORNETPAIN, 121, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HDEATH.VOC", DIGI_HORNETDEATH, 122, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// SERPENT GOD BOSS
DIGI_ENTRY("SGAMB.VOC", DIGI_SERPAMBIENT, 123, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SGALRT.VOC", DIGI_SERPALERT, 124, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SGPAIN.VOC", DIGI_SERPPAIN, 125, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SGSCRM.VOC", DIGI_SERPSCREAM, 126, PRI_MAX, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SGDETH.VOC", DIGI_SERPDEATHEXPLODE,127, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SGSWORD.VOC", DIGI_SERPSWORDATTACK, 128, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SGMAGIC.VOC", DIGI_SERPMAGICLAUNCH, 129, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SGHEADS.VOC", DIGI_SERPSUMMONHEADS, 130, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SGTAUNT.VOC", DIGI_SERPTAUNTYOU, 131, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// LAVA BOSS
DIGI_ENTRY("LVAMB.VOC", DIGI_LAVABOSSAMBIENT, 132, PRI_NPCAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LVSWIM.VOC", DIGI_LAVABOSSSWIM, 133, PRI_NPCAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LVRISE.VOC", DIGI_LAVABOSSRISE, 134, PRI_NPCAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LVALRT.VOC", DIGI_LAVABOSSALERT, 135, PRI_NPCATTACK, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LVFLAME.VOC", DIGI_LAVABOSSFLAME, 136, PRI_NPCATTACK, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LVMETEOR.VOC", DIGI_LAVABOSSMETEOR, 137, PRI_NPCATTACK, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LVMETEXP.VOC", DIGI_LAVABOSSMETEXP, 138, PRI_NPCATTACK, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LVPAIN.VOC", DIGI_LAVABOSSPAIN, 139, PRI_NPCATTACK, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LVSIZZLE.VOC", DIGI_LAVABOSSSIZZLE, 140, PRI_NPCAMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LVEXPL.VOC", DIGI_LAVABOSSEXPLODE, 141, PRI_NPCDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// LEVEL AND SECTOR OBJECT SOUNDS ///////////
// MOTOR BOAT
DIGI_ENTRY("BTSTRT.VOC", DIGI_BOATSTART, 142, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BTRUN01.VOC", DIGI_BOATRUN, 143, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("BTSTOP.VOC", DIGI_BOATSTOP, 144, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BTFIRE.VOC", DIGI_BOATFIRE, 145, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// ARMY TANK
DIGI_ENTRY("TNKSTRT.VOC", DIGI_TANKSTART, 146, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TNKRUN.VOC", DIGI_TANKRUN, 147, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("TNKSTOP.VOC", DIGI_TANKSTOP, 148, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TNKIDLE.VOC", DIGI_TANKIDLE, 149, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("TNKFIRE.VOC", DIGI_TANKFIRE, 150, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// ARMY TRUCK
DIGI_ENTRY("TRUKRUN.VOC", DIGI_TRUKRUN, 151, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("TRUKIDLE.VOC", DIGI_TRUKIDLE, 152, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// SUBMARINE
DIGI_ENTRY("SUBRUN.VOC", DIGI_SUBRUN, 153, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("SUBIDLE.VOC", DIGI_SUBIDLE, 154, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("SUBDOOR.VOC", DIGI_SUBDOOR, 155, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// WWII JAP BOMBER PLANE
DIGI_ENTRY("BMBFLY.VOC", DIGI_BOMBRFLYING, 156, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("BMBDROP.VOC", DIGI_BOMBRDROPBOMB, 157, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// BUBBLES
DIGI_ENTRY("BUBBLE.VOC", DIGI_BUBBLES, 158, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// CHAIN MOVING
// SOUND NOT AVAILABLE -- DELTED
DIGI_ENTRY("CHAIN.VOC", DIGI_CHAIN, 159, PRI_ENVIRONMENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// CHAIN DOOR
DIGI_ENTRY("CHNDOOR.VOC", DIGI_CHAINDOOR, 160, PRI_ENVIRONMENT, 0, 0, 0, 8000, VF_NORMAL)
// CRICKETS
DIGI_ENTRY("CRCKT2.VOC", DIGI_CRICKETS, 161, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// WOOD DOOR OPEN/CLOSE
DIGI_ENTRY("DRWOODO.VOC", DIGI_WOODDOOROPEN, 162, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
DIGI_ENTRY("DRWOODC.VOC", DIGI_WOODDOORCLOSE, 163, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
// METAL DOOR OPEN/CLOSE
DIGI_ENTRY("DRMETO.VOC", DIGI_METALDOOROPEN, 164, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
DIGI_ENTRY("DRMETC.VOC", DIGI_METALDOORCLOSE, 165, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
// SLIDING DOOR OPEN/CLOSE
DIGI_ENTRY("DRSLDO.VOC", DIGI_SLIDEDOOROPEN, 166, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
DIGI_ENTRY("DRSLDC.VOC", DIGI_SLIDEDOORCLOSE, 167, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
// STONE SLIDING DOOR OPEN/CLOSE
DIGI_ENTRY("DRSTNO.VOC", DIGI_STONEDOOROPEN, 168, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
DIGI_ENTRY("DRSTNC.VOC", DIGI_STONEDOORCLOSE, 169, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
// SQUEAKY DOOR OPEN/CLOSE
DIGI_ENTRY("DRSQKO.VOC", DIGI_SQUEAKYDOOROPEN, 170, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
DIGI_ENTRY("DRSQKC.VOC", DIGI_SQUEAKYDOORCLOSE,171, PRI_ENVIRONMENT, -100, 100, 0, 8000, VF_NORMAL)
// GIANT DRILL MACHINE
DIGI_ENTRY("DRILL.VOC", DIGI_DRILL, 172, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// AMBIENT WATER DRIPPING IN CAVE
DIGI_ENTRY("CAVE1.VOC", DIGI_CAVEDRIP1, 173, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("CAVE2.VOC", DIGI_CAVEDRIP2, 174, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("DRIP.VOC", DIGI_DRIP, 175, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// WATER FALL
DIGI_ENTRY("WTRFAL1.VOC", DIGI_WATERFALL1, 176, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// THERE IS NO WTRFAL2 -- DELETED!!!
DIGI_ENTRY("WTRFAL2.VOC", DIGI_WATERFALL2, 177, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// WATER FLOWING
DIGI_ENTRY("WTRFLW1.VOC", DIGI_WATERFLOW1, 178, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// THERE IS NO WTRFLW2 -- DELETED!!!
DIGI_ENTRY("WTRFLW2.VOC", DIGI_WATERFLOW2, 179, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// ELEVATOR START/STOP
DIGI_ENTRY("ELEV1.VOC", DIGI_ELEVATOR, 180, PRI_ENVIRONMENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// SMALL EXP
DIGI_ENTRY("EXPSML.VOC", DIGI_SMALLEXP, 181, PRI_ENVIRONMENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
// MEDIUM EXP
DIGI_ENTRY("EXPMED.VOC", DIGI_MEDIUMEXP, 182, PRI_ENVIRONMENT, -200, 200, 0, DIST_WIDE, VF_NORMAL)
// LARGE EXP
DIGI_ENTRY("EXPLRG.VOC", DIGI_LARGEEXP, 183, PRI_ENVIRONMENT, -200, 200, 0, DIST_WIDE, VF_NORMAL)
// HUGE EXP
//DIGI_ENTRY("BIGEXP.VOC", DIGI_HUGEEXP, 184, PRI_ENVIRONMENT, -200, 200, 0, DIST_WIDE, VF_NORMAL )
DIGI_ENTRY("NULL.VOC", DIGI_NULL_HUGEEXP, 184, PRI_ENVIRONMENT, -200, 200, 0, DIST_WIDE, VF_NORMAL)
// CRACKLING FIRE FOR CONTINUOUS BURN
DIGI_ENTRY("FIRE1.VOC", DIGI_FIRE1, 185, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// POWERFULL HIGH HEAT CONTINUOUS BURN
DIGI_ENTRY("FIRE2.VOC", DIGI_FIRE2, 186, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// SHOOTING FIREBALL FOR FIREBALL TRAP
DIGI_ENTRY("FBALL1.VOC", DIGI_FIREBALL1, 187, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// SHOOTING FIREBALL FOR FIREBALL TRAP
DIGI_ENTRY("FIREBALL1.VOC", DIGI_FIREBALL2, 188, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// SECTOR GEAR COG TURNING
DIGI_ENTRY("GEAR1.VOC", DIGI_GEAR1, 189, PRI_ENVIRONMENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// AMBIENT GONG FOR USE IN TEMPLE/PALACE LEVELS
DIGI_ENTRY("GONG.VOC", DIGI_GONG, 190, PRI_HI_PLAYERWEAP,-100, 100, 0, 32336, VF_NORMAL)
// AMBIENT LAVA FLOW
DIGI_ENTRY("LAVAFLW1.VOC", DIGI_LAVAFLOW1, 191, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// GENERIC SECTOR OBJECT MACHINE RUNNING
DIGI_ENTRY("MACHN1.VOC", DIGI_MACHINE1, 192, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// AMBIENT MUD BUBBLES
DIGI_ENTRY("MUD1.VOC", DIGI_MUBBUBBLES1, 193, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// AMBIENT EARTH QUAKE
DIGI_ENTRY("QUAKE1.VOC", DIGI_EARTHQUAKE, 194, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// YUCKY SEWER FLOW
DIGI_ENTRY("SEWER1.VOC", DIGI_SEWERFLOW1, 195, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// WATER SPLASHING
//(USE FOR PLAYER/NPC'S JUMPING AROUND IN WATER)
DIGI_ENTRY("SPLASH1.VOC", DIGI_SPLASH1, 196, PRI_ENVIRONMENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// STEAM FLOW
DIGI_ENTRY("STEAM1.VOC", DIGI_STEAM1, 197, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// VOLCANIC STEAM VENT
DIGI_ENTRY("VOLSTM1.VOC", DIGI_VOLCANOSTEAM1, 198, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// STOMPER THUD SECTOR OBJECT
DIGI_ENTRY("STMPR.VOC", DIGI_STOMPER, 199, PRI_SECTOROBJ, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// SCARY AMBIENT SWAMP SOUNDS
DIGI_ENTRY("SWAMP1.VOC", DIGI_SWAMP, 200, PRI_AMBIENT, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// FLIP SWITCH
DIGI_ENTRY("SWITCH1.VOC", DIGI_REGULARSWITCH, 201, PRI_ENVIRONMENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// FLIP LARGE SWITCH
DIGI_ENTRY("SWITCH2.VOC", DIGI_BIGSWITCH, 202, PRI_ENVIRONMENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// STONE SWITCH
DIGI_ENTRY("SWITCH3.VOC", DIGI_STONESWITCH, 203, PRI_ENVIRONMENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// BREAKABLE GLASS SWITCH
DIGI_ENTRY("SWITCH4.VOC", DIGI_GLASSSWITCH, 204, PRI_ENVIRONMENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// HUGE ECHOING SWITCH
DIGI_ENTRY("SWITCH5.VOC", DIGI_HUGESWITCH, 205, PRI_ENVIRONMENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// AMBIENT ROLLING THUNDER
DIGI_ENTRY("THUNDR.VOC", DIGI_THUNDER, 206, PRI_AMBIENT, -200, 200, 0, DIST_LEVELWIDE, VF_NORMAL)
// TELEPORTER
DIGI_ENTRY("TELPORT.VOC", DIGI_TELEPORT, 207, PRI_ENVIRONMENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// UNDERWATER AMBIENCE
DIGI_ENTRY("UNDRWTR.VOC", DIGI_UNDERWATER, 208, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// UNLOCK BIG LOCKED DOOR
DIGI_ENTRY("UNLOCK.VOC", DIGI_UNLOCK, 209, PRI_ENVIRONMENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// SQUEAKY VALVE TURNING
DIGI_ENTRY("VALVE.VOC", DIGI_SQUEAKYVALVE, 210, PRI_ENVIRONMENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// SPOOKY ETHERAL VOID AMBIENCE
//(NETHERWORLDLY SOUNDS)
DIGI_ENTRY("VOID1.VOC", DIGI_VOID1, 211, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("VOID2.VOC", DIGI_VOID2, 212, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("VOID3.VOC", DIGI_VOID3, 213, PRI_NPCWEAP, 0, 0, 0, -8000, VF_NORMAL)
DIGI_ENTRY("VOID4.VOC", DIGI_VOID4, 214, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("VOID5.VOC", DIGI_VOID5, 215, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// VOLCANIC ERUPTION
DIGI_ENTRY("ERUPT.VOC", DIGI_ERUPTION, 216, PRI_AMBIENT, 0, 0, 0, DIST_MAXNORMAL, VF_LOOP)
// VOLCANIC SIZZLING PROJECTILES FLYING THROUGH AIR
DIGI_ENTRY("VOLPRJCT.VOC", DIGI_VOLCANOPROJECTILE, 217, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// LIGHT WIND AMBIENCE
DIGI_ENTRY("WIND1.VOC", DIGI_LIGHTWIND, 218, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// STRONG BLOWING WIND AMBIENCE
DIGI_ENTRY("WIND2.VOC", DIGI_STRONGWIND, 219, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// BREAKING WOOD AMBIENCE
DIGI_ENTRY("WOODBRK.VOC", DIGI_BREAKINGWOOD, 220, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// BREAKING, TUMBLING STONES FALLING AMBIENCE
DIGI_ENTRY("STONEBRK.VOC", DIGI_BREAKSTONES, 221, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// ENGINE ROOM SOUND
DIGI_ENTRY("ENGROOM1.VOC", DIGI_ENGROOM1, 222, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("ENGROOM2.VOC", DIGI_ENGROOM2, 223, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("ENGROOM3.VOC", DIGI_ENGROOM3, 224, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("ENGROOM4.VOC", DIGI_ENGROOM4, 225, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("ENGROOM5.VOC", DIGI_ENGROOM5, 226, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// BREAKING GLASS, LARGE WINDOW PANE
DIGI_ENTRY("GLASS3.VOC", DIGI_BREAKGLASS, 227, PRI_NPCDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// MUSICAL STINGER
DIGI_ENTRY("MUSSTING.VOC", DIGI_MUSSTING, 228, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// HELICOPTER LIKE SOUND
DIGI_ENTRY("HELI.VOC", DIGI_HELI, 229, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// HUGE ECHOING HEART LIKE AMBIENCE
DIGI_ENTRY("BIGHART.VOC", DIGI_BIGHART, 230, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// EERIE ETHERAL TYPE WIND
DIGI_ENTRY("WIND4.VOC", DIGI_WIND4, 231, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// SPOOKY SINE WAVE SOUND
DIGI_ENTRY("SPOOKY1.VOC", DIGI_SPOOKY1, 232, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// SPOOKY SINE WAVE SOUND
DIGI_ENTRY("DRILL1.VOC", DIGI_DRILL1, 233, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
// JET ENGINE
DIGI_ENTRY("JET.VOC", DIGI_JET, 234, PRI_AMBIENT, 0, 0, 0, DIST_MAXNORMAL, VF_LOOP)
// CERIMONIAL DRUM CHANT
DIGI_ENTRY("DRUMCHNT.VOC", DIGI_DRUMCHANT, 235, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("FLY.VOC", DIGI_BUZZZ, 236, PRI_MAX, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("UZICLK.VOC", DIGI_CHOP_CLICK, 237, PRI_MAX, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// !IMPORTANT! Make sure all player voices stay together
DIGI_ENTRY("STICKY2R.VOC", DIGI_SWORD_UP, 238, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("UZI1R.VOC", DIGI_UZI_UP, 239, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SHOTG1R.VOC", DIGI_SHOTGUN_UP, 240, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BOLT1R.VOC", DIGI_ROCKET_UP, 241, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BOLT1R.VOC", DIGI_GRENADE_UP, 242, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BOLT1R.VOC", DIGI_RAIL_UP, 243, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("STICKY1R.VOC", DIGI_MINE_UP, 244, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("", DIGI_FIRSTPLAYERVOICE,245, 0, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BADMAN04.VOC", DIGI_TAUNTAI1, 246, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("COMEGET2.VOC", DIGI_TAUNTAI2, 247, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GHOP07.VOC", DIGI_TAUNTAI3, 248, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GOODDAY4.VOC", DIGI_TAUNTAI4, 249, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("KILLU05.VOC", DIGI_TAUNTAI5, 250, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NATURAL4.VOC", DIGI_TAUNTAI6, 251, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NOHONOR6.VOC", DIGI_TAUNTAI7, 252, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SAYON09.VOC", DIGI_TAUNTAI8, 253, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TAKSAN1.VOC", DIGI_TAUNTAI9, 254, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SNATCH01.VOC", DIGI_TAUNTAI10, 255, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CHOTO7.VOC", DIGI_PLAYERPAIN1, 256, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWPAIN05.VOC", DIGI_PLAYERPAIN2, 257, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWPAIN03.VOC", DIGI_PLAYERPAIN3, 258, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWPAIN07.VOC", DIGI_PLAYERPAIN4, 259, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWPAIN22.VOC", DIGI_PLAYERPAIN5, 260, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWYELL03.VOC", DIGI_PLAYERYELL1, 261, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWYELL05.VOC", DIGI_PLAYERYELL2, 262, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWYELL06.VOC", DIGI_PLAYERYELL3, 263, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GRUNT06.VOC", DIGI_SEARCHWALL, 264, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NOWAY1.VOC", DIGI_NOURINAL, 265, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWDIE02.VOC", DIGI_FALLSCREAM, 266, PRI_PLAYERDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("AHSO5.VOC", DIGI_GOTITEM1, 267, PRI_PLAYERDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("", DIGI_LASTPLAYERVOICE, 268, 0, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
//#ifndef SW_SHAREWARE
// was RAILB10.VOC
DIGI_ENTRY("HSHOT1.VOC", DIGI_RAILFIRE, 269, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
//#else
//DIGI_ENTRY("NULL.VOC", DIGI_NULL_RAILFIRE, 269, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL )
//#endif
DIGI_ENTRY("RAIL2.VOC", DIGI_RAILREADY, 270, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("RAILUP09.VOC", DIGI_RAILPWRUP, 271, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HBOMB2.VOC", DIGI_NUCLEAREXP, 272, PRI_MAX, 0, 0, 0, DIST_LEVELWIDE, VF_NORMAL)
DIGI_ENTRY("STANDBY.VOC", DIGI_NUKESTDBY, 273, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CDOWN.VOC", DIGI_NUKECDOWN, 274, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SYSREAD.VOC", DIGI_NUKEREADY, 275, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HISS1.VOC", DIGI_CHEMGAS, 276, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("CHBNCE1.VOC", DIGI_CHEMBOUNCE, 277, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("THROW.VOC", DIGI_THROW, 278, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("PULL.VOC", DIGI_PULL, 279, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("STSCAN2.VOC", DIGI_MINEARM, 280, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HBDOWN1.VOC", DIGI_HEARTDOWN, 281, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
//DIGI_ENTRY("TOOLUSE1.VOC", DIGI_TOOLBOX, 282, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL )
DIGI_ENTRY("NULL.VOC", DIGI_NULL_TOOLBOX, 282, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GASPOP.VOC", DIGI_GASPOP, 283, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("40MMBNCE.VOC", DIGI_40MMBNCE, 284, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BURGALRM.VOC", DIGI_BURGLARALARM, 285, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("CARALRM2.VOC", DIGI_CARALARM, 286, PRI_LOW_PLAYERWEAP, 0, 0, 0, 25000, VF_NORMAL)
DIGI_ENTRY("CAOFF1.VOC", DIGI_CARALARMOFF, 287, PRI_LOW_PLAYERWEAP, 0, 0, 0, 25000, VF_NORMAL)
DIGI_ENTRY("TACK1.VOC", DIGI_CALTROPS, 288, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NVON3.VOC", DIGI_NIGHTON, 289, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NVOFF2.VOC", DIGI_NIGHTOFF, 290, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SGSH01.VOC", DIGI_SHOTSHELLSPENT, 291, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SKID3.VOC", DIGI_BUSSKID, 292, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CRASH4.VOC", DIGI_BUSCRASH, 293, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BUS1.VOC", DIGI_BUSENGINE, 294, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BIMP01.VOC", DIGI_ARMORHIT, 295, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ASIREN1.VOC", DIGI_ASIREN1, 296, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("FIRETRK1.VOC", DIGI_FIRETRK1, 297, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAFFIC1.VOC", DIGI_TRAFFIC1, 298, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAFFIC2.VOC", DIGI_TRAFFIC2, 299, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAFFIC3.VOC", DIGI_TRAFFIC3, 300, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAFFIC4.VOC", DIGI_TRAFFIC4, 301, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAFFIC5.VOC", DIGI_TRAFFIC5, 302, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAFFIC6.VOC", DIGI_TRAFFIC6, 303, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HELI1.VOC", DIGI_HELI1, 304, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JET1.VOC", DIGI_JET1, 305, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MOTO1.VOC", DIGI_MOTO1, 306, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MOTO2.VOC", DIGI_MOTO2, 307, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NEON1.VOC", DIGI_NEON1, 308, PRI_AMBIENT, 0, 0, 0, -8000, VF_NORMAL)
DIGI_ENTRY("SUBWAY1.VOC", DIGI_SUBWAY, 309, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAINS01.VOC", DIGI_TRAIN1, 310, PRI_PLAYERDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("COIN.VOC", DIGI_COINS, 311, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWRDSMK1.VOC", DIGI_SWORDCLANK, 312, PRI_HI_PLAYERWEAP, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
// RIPPER2
DIGI_ENTRY("RIP2AMB.VOC", DIGI_RIPPER2AMBIENT, 313, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIP2ALRT.VOC", DIGI_RIPPER2ALERT, 314, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIP2ATCK.VOC", DIGI_RIPPER2ATTACK, 315, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIP2PAIN.VOC", DIGI_RIPPER2PAIN, 316, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIP2SCRM.VOC", DIGI_RIPPER2SCREAM, 317, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIP2HRT.VOC", DIGI_RIPPER2HEARTOUT,318, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("M60.VOC", DIGI_M60, 319, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// SUMO
DIGI_ENTRY("SUMSCRM.VOC", DIGI_SUMOSCREAM, 320, PRI_MAX, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SUMALRT.VOC", DIGI_SUMOALERT, 321, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SUMAMB.VOC", DIGI_SUMOAMBIENT, 322, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SUMPAIN.VOC", DIGI_SUMOPAIN, 323, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// UNLOCK RAM LOCKED DOOR
DIGI_ENTRY("RAMLOCK.VOC", DIGI_RAMUNLOCK, 324, PRI_ENVIRONMENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// UNLOCK CARD LOCKED DOOR
DIGI_ENTRY("CARDLOCK.VOC", DIGI_CARDUNLOCK, 325, PRI_ENVIRONMENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// More player voices
DIGI_ENTRY("ACS10.VOC", DIGI_ANCIENTSECRET, 326, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("AMDRIV01.VOC", DIGI_AMERICANDRIVER, 327, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BABOON03.VOC", DIGI_DRIVELIKEBABOON, 328, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BBURN04.VOC", DIGI_BURNBABY, 329, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BIGWPN01.VOC", DIGI_LIKEBIGWEAPONS, 330, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CBUNG01.VOC", DIGI_COWABUNGA, 331, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CHARAD09.VOC", DIGI_NOCHARADE, 332, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("DTIME.VOC", DIGI_TIMETODIE, 333, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("EAT02.VOC", DIGI_EATTHIS, 334, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("FCRACK01.VOC", DIGI_FIRECRACKERUPASS,335, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HCOW03.VOC", DIGI_HOLYCOW, 336, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HCOW06.VOC", DIGI_HOLYPEICESOFCOW, 337, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HSHIT03.VOC", DIGI_HOLYSHIT, 338, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HSHIT04.VOC", DIGI_HOLYPEICESOFSHIT,339, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("IHOPE01.VOC", DIGI_PAYINGATTENTION, 340, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ILIKE01.VOC", DIGI_EVERYBODYDEAD, 341, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("KUNGFU06.VOC", DIGI_KUNGFU, 342, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LMOVE01.VOC", DIGI_HOWYOULIKEMOVE, 343, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LWANG05.VOC", DIGI_NOMESSWITHWANG, 344, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RAW01.VOC", DIGI_RAWREVENGE, 345, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("STUPID01.VOC", DIGI_YOULOOKSTUPID, 346, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TDICK02.VOC", DIGI_TINYDICK, 347, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TOURN01.VOC", DIGI_NOTOURNAMENT, 348, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("WWANG11.VOC", DIGI_WHOWANTSWANG, 349, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("YAK02.VOC", DIGI_MOVELIKEYAK, 350, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("REFLEX08.VOC", DIGI_ALLINREFLEXES, 351, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("EVADE01.VOC", DIGI_EVADEFOREVER, 352, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MFLY03.VOC", DIGI_MRFLY, 353, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SHISEI03.VOC", DIGI_SHISEISI, 354, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("FWORKS01.VOC", DIGI_LIKEFIREWORKS, 355, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HIRO03.VOC", DIGI_LIKEHIROSHIMA, 356, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NAGA06.VOC", DIGI_LIKENAGASAKI, 357, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("PEARL03.VOC", DIGI_LIKEPEARL, 358, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("IAM01.VOC", DIGI_IAMSHADOW, 359, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LIKNUK01.VOC", DIGI_ILIKENUKES, 360, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LIKSRD01.VOC", DIGI_ILIKESWORD, 361, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LIKSHK02.VOC", DIGI_ILIKESHURIKEN, 362, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LUCK06.VOC", DIGI_BADLUCK, 363, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MCHAN01.VOC", DIGI_NOMOVIEMRCHAN, 364, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RCHAN13.VOC", DIGI_REALLIFEMRCHAN, 365, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MUSIC03.VOC", DIGI_NOLIKEMUSIC, 366, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NODIFF07.VOC", DIGI_NODIFFERENCE, 367, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NOFEAR01.VOC", DIGI_NOFEAR, 368, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("NOPAIN.VOC", DIGI_NOPAIN, 369, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("REPMAN15.VOC", DIGI_NOREPAIRMAN, 370, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SOB15.VOC", DIGI_SONOFABITCH, 371, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("WEAK03.VOC", DIGI_PAINFORWEAK, 372, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SPEED04.VOC", DIGI_GOSPEEDY, 373, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("STIFF01.VOC", DIGI_GETTINGSTIFF, 374, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TOMB05.VOC", DIGI_TOMBRAIDER, 375, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TSTICK01.VOC", DIGI_STICKYGOTU1, 376, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TSTICK05.VOC", DIGI_STICKYGOTU2, 377, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TSTICK07.VOC", DIGI_STICKYGOTU3, 378, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TSTICK10.VOC", DIGI_STICKYGOTU4, 379, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TSWORD05.VOC", DIGI_SWORDGOTU1, 380, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TSWORD08.VOC", DIGI_SWORDGOTU2, 381, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TSWORD01.VOC", DIGI_SWORDGOTU3, 382, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWYELL22.VOC", DIGI_HURTBAD1, 383, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWYELL14.VOC", DIGI_HURTBAD2, 384, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWYELL23.VOC", DIGI_HURTBAD3, 385, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWYELL16.VOC", DIGI_HURTBAD4, 386, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SWYELL13.VOC", DIGI_HURTBAD5, 387, PRI_PLAYERVOICE, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
// TOILETGIRL
DIGI_ENTRY("TGSCRM.VOC", DIGI_TOILETGIRLSCREAM, 388, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TGALRT.VOC", DIGI_TOILETGIRLALERT, 389, PRI_NPCATTACK, -300, 300, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TGAMB.VOC", DIGI_TOILETGIRLAMBIENT,390, PRI_NPCAMBIENT, -300, 300, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TGPAIN.VOC", DIGI_TOILETGIRLPAIN, 391, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TGTNT1.VOC", DIGI_TOILETGIRLTAUNT1, 392, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TGTNT2.VOC", DIGI_TOILETGIRLTAUNT2, 393, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
// MORE SUMO
DIGI_ENTRY("SUMOFART.VOC", DIGI_SUMOFART, 394, PRI_PLAYERVOICE, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GIBS04.VOC", DIGI_GIBS1, 395, PRI_LOW_PLAYERWEAP, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GIBS05.VOC", DIGI_GIBS2, 396, PRI_LOW_PLAYERWEAP, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BIRDS01.VOC", DIGI_BIRDS1, 397, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BIRDS02.VOC", DIGI_BIRDS2, 398, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TOILET01.VOC", DIGI_TOILET, 399, PRI_AMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("FLIDLE.VOC", DIGI_FORKLIFTIDLE, 400, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("FLRUN01.VOC", DIGI_FORKLIFTRUN, 401, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TOYCAR03.VOC", DIGI_TOYCAR, 402, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("PRESS03.VOC", DIGI_UZIMATIC, 403, PRI_AMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("COMPON01.VOC", DIGI_COMPUTERPOWER, 404, PRI_LOW_PLAYERWEAP, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TURBON01.VOC", DIGI_GENERATORON, 405, PRI_LOW_PLAYERWEAP, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TURBRN01.VOC", DIGI_GENERATORRUN, 406, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("BIGDRL03.VOC", DIGI_BIGDRILL, 407, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("FLUOR01.VOC", DIGI_FLUORLIGHT, 408, PRI_AMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("AMOEBA03.VOC", DIGI_AMOEBA, 409, PRI_SECTOROBJ, -200, 200, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("BODY6.VOC", DIGI_BODYFALL2, 410, PRI_PLAYERDEATH, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GIBS01.VOC", DIGI_GIBS3, 411, PRI_LOW_PLAYERWEAP, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CHOK01.VOC", DIGI_NINJACHOKE, 412, PRI_NPCDEATH, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAIN3.VOC", DIGI_TRAIN3, 413, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAINR02.VOC", DIGI_TRAINR02, 414, PRI_PLAYERDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TRAIN8.VOC", DIGI_TRAIN8, 415, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TCLID01.VOC", DIGI_TRASHLID, 416, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// player voices
DIGI_ENTRY("ACCU01.VOC", DIGI_GETMEDKIT, 417, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("AHH03.VOC", DIGI_AHH, 418, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// Pachinko
DIGI_ENTRY("PALARM1.VOC", DIGI_PALARM, 419, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("PFLIP4.VOC", DIGI_PFLIP, 420, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("PROLL1.VOC", DIGI_PROLL1, 421, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("PROLL2.VOC", DIGI_PROLL2, 422, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("PROLL3.VOC", DIGI_PROLL3, 423, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// BUNNY
DIGI_ENTRY("RABATK1.VOC", DIGI_BUNNYATTACK, 424, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RABDIE1.VOC", DIGI_BUNNYDIE1, 425, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RABDIE2.VOC", DIGI_BUNNYDIE2, 426, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RABDIE3.VOC", DIGI_BUNNYDIE3, 427, PRI_NPCDEATH, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RABAMB.VOC", DIGI_BUNNYAMBIENT, 428, PRI_NPCAMBIENT, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("STONE2.VOC", DIGI_STONESLIDE, 429, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("NINCUT3.VOC", DIGI_NINJAINHALF, 430, PRI_NPCDEATH, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("RIPCHST1.VOC", DIGI_RIPPER2CHEST, 431, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("WHIPIN2.VOC", DIGI_WHIPME, 432, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("ENDLEV3.VOC", DIGI_ENDLEV, 433, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MDALARM1.VOC", DIGI_MDALARM, 434, PRI_PLAYERDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("METALBRK.VOC", DIGI_BREAKMETAL, 435, PRI_AMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("DEBRIBRK.VOC", DIGI_BREAKDEBRIS, 436, PRI_AMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MARBELS.VOC", DIGI_BREAKMARBELS, 437, PRI_AMBIENT, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BANZAI1.VOC", DIGI_BANZAI, 438, PRI_PLAYERDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HAHA19.VOC", DIGI_HAHA1, 439, PRI_PLAYERDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HAHA11.VOC", DIGI_HAHA2, 440, PRI_PLAYERDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("HAHA15.VOC", DIGI_HAHA3, 441, PRI_PLAYERDEATH, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TELEPT02.VOC", DIGI_ITEM_SPAWN, 442, PRI_ITEM, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// More Player Voices
DIGI_ENTRY("JG1075.VOC", DIGI_NOREPAIRMAN2, 443, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG1082.VOC", DIGI_NOPOWER, 444, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG1087.VOC", DIGI_DOUBLEUZI, 445, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG1088.VOC", DIGI_NOTORDBUNNY, 446, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG1103.VOC", DIGI_CANBEONLYONE, 447, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2000.VOC", DIGI_MIRROR1, 448, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2005.VOC", DIGI_MIRROR2, 449, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2020.VOC", DIGI_HITTINGWALLS, 450, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2032.VOC", DIGI_GOTRAILGUN, 451, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2053.VOC", DIGI_RABBITHUMP1, 452, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2054.VOC", DIGI_RABBITHUMP2, 453, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2045.VOC", DIGI_RABBITHUMP3, 454, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2087.VOC", DIGI_RABBITHUMP4, 455, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2074.VOC", DIGI_FAGRABBIT1, 456, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2075.VOC", DIGI_FAGRABBIT2, 457, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2078.VOC", DIGI_FAGRABBIT3, 458, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG3005.VOC", DIGI_STINKLIKEBABBOON, 459, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG3017.VOC", DIGI_WHATYOUEATBABY, 460, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG3047.VOC", DIGI_WHATDIEDUPTHERE, 461, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG3022.VOC", DIGI_YOUGOPOOPOO, 462, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG6053.VOC", DIGI_PULLMYFINGER, 463, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG3059.VOC", DIGI_SOAPYOUGOOD, 464, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG4012.VOC", DIGI_WASHWANG, 465, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG3070.VOC", DIGI_DROPSOAP, 466, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG6051.VOC", DIGI_REALTITS, 467, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG4002.VOC", DIGI_MSTRLEEP, 468, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG4024.VOC", DIGI_SEEKLEEPADVICE, 469, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG5042.VOC", DIGI_AVENGELEEPDEATH, 470, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG5049A.VOC", DIGI_LEEPGHOST, 471, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("WDOOR02.VOC", DIGI_DOOR1, 472, PRI_SECTOROBJ, -200, 200, 0, 8000, VF_NORMAL)
DIGI_ENTRY("MDOOR03.VOC", DIGI_DOOR2, 473, PRI_SECTOROBJ, -200, 200, 0, 8000, VF_NORMAL)
DIGI_ENTRY("603981_1.VOC", DIGI_DOOR3, 474, PRI_SECTOROBJ, -200, 200, 0, 8000, VF_NORMAL)
DIGI_ENTRY("FLAG03.VOC", DIGI_FLAGWAVE, 475, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("JG7009.VOC", DIGI_SURFACE, 476, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG7001.VOC", DIGI_GASHURT, 477, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG2001.VOC", DIGI_BONUS_GRAB, 478, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ACHCRY04.VOC", DIGI_ANIMECRY, 479, PRI_SECTOROBJ, 0, 0, 0, -8000, VF_LOOP)
DIGI_ENTRY("ACHS010.VOC", DIGI_ANIMESING1, 480, PRI_SECTOROBJ, 0, 0, 0, -8000, VF_NORMAL)
DIGI_ENTRY("ACHT1006.VOC", DIGI_ANIMEMAD1, 481, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ACHS016.VOC", DIGI_ANIMESING2, 482, PRI_SECTOROBJ, 0, 0, 0, -8000, VF_NORMAL)
DIGI_ENTRY("ACHT120A.VOC", DIGI_ANIMEMAD2, 483, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TELEPT02.VOC", DIGI_PLAYER_TELEPORT, 484, PRI_LOW_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SLASH1.VOC", DIGI_INTRO_SLASH, 485, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("WARNING.VOC", DIGI_WARNING, 486, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("WHIRL1.VOC", DIGI_INTRO_WHIRL, 487, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ACHF1003.VOC", DIGI_TOILETGIRLFART1, 488, PRI_NPCAMBIENT, -300, 300, 0, -16000, VF_NORMAL)
DIGI_ENTRY("ACHF1002.VOC", DIGI_TOILETGIRLFART2, 489, PRI_NPCAMBIENT, -300, 300, 0, -16000, VF_NORMAL)
DIGI_ENTRY("ACHF1016.VOC", DIGI_TOILETGIRLFART3, 490, PRI_NPCAMBIENT, -300, 300, 0, -16000, VF_NORMAL)
DIGI_ENTRY("CHIMES4.VOC", DIGI_WINDCHIMES, 491, PRI_SECTOROBJ, 0, 0, 0, -8000, VF_LOOP)
// Yet more LoWang voices
DIGI_ENTRY("JGB023.VOC", DIGI_MADATCARPET, 492, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGB020.VOC", DIGI_JUMPONCARPET, 493, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGB080.VOC", DIGI_USEBROKENVEHICLE, 494, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGB106.VOC", DIGI_STEPONCALTROPS, 495, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGB130.VOC", DIGI_WANGSEESERP, 496, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGSB4.VOC", DIGI_SERPTAUNTWANG, 497, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGB166.VOC", DIGI_WANGTAUNTSERP1, 498, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGB156.VOC", DIGI_WANGTAUNTSERP2, 499, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGB193.VOC", DIGI_WANGORDER1, 500, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGB202.VOC", DIGI_WANGORDER2, 501, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGB340A.VOC", DIGI_WANGDROWNING, 502, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JGEN06.VOC", DIGI_ZILLAREGARDS, 503, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("MSG9.VOC", DIGI_PMESSAGE, 504, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("UGLY1A.VOC", DIGI_SHAREND_UGLY1, 505, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("UGLY1B.VOC", DIGI_SHAREND_UGLY2, 506, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("TELEPT07.VOC", DIGI_SHAREND_TELEPORT, 507, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("GOROSW1.VOC", DIGI_HOTHEADSWITCH, 508, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BTCREAK2.VOC", DIGI_BOATCREAK, 509, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("BTRUN05.VOC", DIGI_BOATRUN2, 510, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("BTIDLE4.VOC", DIGI_BOATIDLE, 511, PRI_SECTOROBJ, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("SHIPBELL.VOC", DIGI_SHIPBELL, 512, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("SHIPHRN1.VOC", DIGI_FOGHORN, 513, PRI_AMBIENT, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("EXP3.VOC", DIGI_CANNON, 514, PRI_HI_PLAYERWEAP, 0, 0, 0, DIST_WIDE, VF_NORMAL)
// Yet even more player voices!
DIGI_ENTRY("JG41001.VOC", DIGI_JG41001, 515, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG41012.VOC", DIGI_JG41012, 516, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG41018.VOC", DIGI_JG41018, 517, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG41028.VOC", DIGI_JG41028, 518, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG41048.VOC", DIGI_JG41048, 519, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG41052.VOC", DIGI_JG41052, 520, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG41058.VOC", DIGI_JG41058, 521, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG41060.VOC", DIGI_JG41060, 522, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG41075.VOC", DIGI_JG41075, 523, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG42004.VOC", DIGI_JG42004, 524, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG42019.VOC", DIGI_JG42019, 525, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG42021.VOC", DIGI_JG42021, 526, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG42028.VOC", DIGI_JG42028, 527, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG42033.VOC", DIGI_JG42033, 528, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG42034.VOC", DIGI_JG42034, 529, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG42050.VOC", DIGI_JG42050, 530, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG42056.VOC", DIGI_JG42056, 531, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG42061.VOC", DIGI_JG42061, 532, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG43004.VOC", DIGI_JG43004, 533, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG43015.VOC", DIGI_JG43015, 534, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG43019.VOC", DIGI_JG43019, 535, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG43021.VOC", DIGI_JG43021, 536, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG44011.VOC", DIGI_JG44011, 537, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG44014.VOC", DIGI_JG44014, 538, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG44027.VOC", DIGI_JG44027, 539, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG44038.VOC", DIGI_JG44038, 540, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG44039.VOC", DIGI_JG44039, 541, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG44048.VOC", DIGI_JG44048, 542, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG44052.VOC", DIGI_JG44052, 543, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG45014.VOC", DIGI_JG45014, 544, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG44068.VOC", DIGI_JG44068, 545, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG45010.VOC", DIGI_JG45010, 546, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG45018.VOC", DIGI_JG45018, 547, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG45030.VOC", DIGI_JG45030, 548, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG45033.VOC", DIGI_JG45033, 549, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG45043.VOC", DIGI_JG45043, 550, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG45053.VOC", DIGI_JG45053, 551, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG45067.VOC", DIGI_JG45067, 552, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG46005.VOC", DIGI_JG46005, 553, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG46010.VOC", DIGI_JG46010, 554, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
// And the girls talk back to Wang
// Car Girl
DIGI_ENTRY("LANI049.VOC", DIGI_LANI049, 555, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI051.VOC", DIGI_LANI051, 556, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI052.VOC", DIGI_LANI052, 557, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI054.VOC", DIGI_LANI054, 558, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
// Sailor Moon
DIGI_ENTRY("LANI060.VOC", DIGI_LANI060, 559, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI063.VOC", DIGI_LANI063, 560, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI065.VOC", DIGI_LANI065, 561, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI066.VOC", DIGI_LANI066, 562, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
// Mechanic
DIGI_ENTRY("LANI073.VOC", DIGI_LANI073, 563, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI075.VOC", DIGI_LANI075, 564, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI077.VOC", DIGI_LANI077, 565, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI079.VOC", DIGI_LANI079, 566, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
// Prune
DIGI_ENTRY("LANI089.VOC", DIGI_LANI089, 567, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI091.VOC", DIGI_LANI091, 568, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI093.VOC", DIGI_LANI093, 569, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("LANI095.VOC", DIGI_LANI095, 570, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("AD5.VOC", DIGI_VENTWALK, 571, PRI_ENVIRONMENT, -300, 300, 0, 8000, VF_NORMAL)
DIGI_ENTRY("AD6.VOC", DIGI_CARWALK, 572, PRI_ENVIRONMENT, -300, 300, 0, 8000, VF_NORMAL)
DIGI_ENTRY("JET05.VOC", DIGI_JETSOAR, 573, PRI_SECTOROBJ, -100, 100, 0, 8000, VF_NORMAL)
DIGI_ENTRY("VC04.VOC", DIGI_VACUUM, 574, PRI_SECTOROBJ, -100, 100, 0, DIST_NORMAL, VF_LOOP)
// GIRL NINJA
DIGI_ENTRY("LANI017.VOC", DIGI_GIRLNINJAALERTT, 575, PRI_NPCATTACK, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LANI033.VOC", DIGI_GIRLNINJASCREAM, 576, PRI_NPCDEATH, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("LANI001.VOC", DIGI_GIRLNINJAALERT, 577, PRI_NPCATTACK, -200, 200, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("CACKLE.VOC", DIGI_PRUNECACKLE, 578, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("CACKLE2.VOC", DIGI_PRUNECACKLE2, 579, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("CACKLE3.VOC", DIGI_PRUNECACKLE3, 580, PRI_NPCAMBIENT, -200, 200, 0, -16000, VF_NORMAL)
DIGI_ENTRY("SUMO058.VOC", DIGI_SUMOSTOMP, 581, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ELEV01.VOC", DIGI_VATOR, 582, PRI_SECTOROBJ, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG9009.VOC", DIGI_JG9009, 583, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("Z16004.VOC", DIGI_Z16004, 584, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("Z16012.VOC", DIGI_Z16012, 585, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("Z16022.VOC", DIGI_Z16022, 586, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("Z16027.VOC", DIGI_Z16027, 587, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG93030.VOC", DIGI_JG93030, 588, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG94002.VOC", DIGI_JG94002, 589, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("Z17010.VOC", DIGI_Z17010, 590, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("Z17052.VOC", DIGI_Z17052, 591, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("Z17025.VOC", DIGI_Z17025, 592, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ML25014.VOC", DIGI_ML25014, 593, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ML250101.VOC",DIGI_ML250101, 594, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG9022.VOC", DIGI_JG9022, 595, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG9032.VOC", DIGI_JG9032, 596, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG9038.VOC", DIGI_JG9038, 597, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG9055.VOC", DIGI_JG9055, 598, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG9060.VOC", DIGI_JG9060, 599, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG92055.VOC", DIGI_JG92055, 600, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ML25032.VOC", DIGI_ML25032, 601, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG92036.VOC", DIGI_JG92036, 602, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG92042.VOC", DIGI_JG92042, 603, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ML26001.VOC", DIGI_ML26001, 604, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG93000.VOC", DIGI_JG93000, 605, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG93011.VOC", DIGI_JG93011, 606, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG93018.VOC", DIGI_JG93018, 607, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG93023.VOC", DIGI_JG93023, 608, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ML26008.VOC", DIGI_ML26008, 609, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ML26011.VOC", DIGI_ML26011, 610, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG94007.VOC", DIGI_JG94007, 611, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG94024.VOC", DIGI_JG94024, 612, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG94039.VOC", DIGI_JG94039, 613, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("JG95012.VOC", DIGI_JG95012, 614, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ZWALK5.VOC", DIGI_ZILLASTOMP, 615, PRI_NPCATTACK, -100, 100, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ZC1.VOC", DIGI_ZC1, 616, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ZC2.VOC", DIGI_ZC2, 617, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ZC3.VOC", DIGI_ZC3, 618, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ZC4.VOC", DIGI_ZC4, 619, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ZC5.VOC", DIGI_ZC5, 620, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ZC6.VOC", DIGI_ZC6, 621, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ZC7.VOC", DIGI_ZC7, 622, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_LOOP)
DIGI_ENTRY("ZC8.VOC", DIGI_ZC8, 623, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("ZC9.VOC", DIGI_ZC9, 624, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
DIGI_ENTRY("Z16043.VOC", DIGI_Z16043, 625, PRI_PLAYERVOICE, 0, 0, 0, DIST_NORMAL, VF_NORMAL)
#undef DIGI_ENTRY

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,682 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "game.h"
#include "tags.h"
#include "ai.h"
#include "actor.h"
#include "weapon.h"
#include "track.h"
DECISION EelBattle[] =
{
{649, InitActorMoveCloser },
{650, InitActorAlertNoise },
{1024, InitActorMoveCloser }
};
DECISION EelOffense[] =
{
{649, InitActorMoveCloser },
{750, InitActorAlertNoise },
{1024, InitActorMoveCloser }
};
DECISION EelBroadcast[] =
{
{3, InitActorAlertNoise },
{6, InitActorAmbientNoise },
{1024, InitActorDecide }
};
DECISION EelSurprised[] =
{
{701, InitActorMoveCloser },
{1024, InitActorDecide }
};
DECISION EelEvasive[] =
{
{ 790, InitActorRunAway },
{1024, InitActorMoveCloser },
};
DECISION EelLostTarget[] =
{
{900, InitActorFindPlayer },
{1024, InitActorWanderAround }
};
DECISION EelCloseRange[] =
{
{950, InitActorAttack },
{1024, InitActorReposition }
};
ANIMATOR InitEelFire;
DECISION EelTouchTarget[] =
{
{1024, InitActorAttack },
};
PERSONALITY EelPersonality =
{
EelBattle,
EelOffense,
EelBroadcast,
EelSurprised,
EelEvasive,
EelLostTarget,
EelCloseRange,
EelTouchTarget
};
ATTRIBUTE EelAttrib =
{
{100, 110, 120, 130}, // Speeds
{3, 0, -2, -3}, // Tic Adjusts
3, // MaxWeapons;
{
0, 0, 0,
0, 0, 0,
0,0,0,0
}
};
//////////////////////
// EEL RUN
//////////////////////
#define EEL_RUN_RATE 20
ANIMATOR DoEelMove,NullAnimator,DoStayOnFloor, DoActorDebris, NullEel;
STATE s_EelRun[5][4] =
{
{
{EEL_RUN_R0 + 0, EEL_RUN_RATE, DoEelMove, &s_EelRun[0][1]},
{EEL_RUN_R0 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[0][2]},
{EEL_RUN_R0 + 2, EEL_RUN_RATE, DoEelMove, &s_EelRun[0][3]},
{EEL_RUN_R0 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[0][0]},
},
{
{EEL_RUN_R1 + 0, EEL_RUN_RATE, DoEelMove, &s_EelRun[1][1]},
{EEL_RUN_R1 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[1][2]},
{EEL_RUN_R1 + 2, EEL_RUN_RATE, DoEelMove, &s_EelRun[1][3]},
{EEL_RUN_R1 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[1][0]},
},
{
{EEL_RUN_R2 + 0, EEL_RUN_RATE, DoEelMove, &s_EelRun[2][1]},
{EEL_RUN_R2 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[2][2]},
{EEL_RUN_R2 + 2, EEL_RUN_RATE, DoEelMove, &s_EelRun[2][3]},
{EEL_RUN_R2 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[2][0]},
},
{
{EEL_RUN_R3 + 0, EEL_RUN_RATE, DoEelMove, &s_EelRun[3][1]},
{EEL_RUN_R3 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[3][2]},
{EEL_RUN_R3 + 2, EEL_RUN_RATE, DoEelMove, &s_EelRun[3][3]},
{EEL_RUN_R3 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[3][0]},
},
{
{EEL_RUN_R4 + 0, EEL_RUN_RATE, DoEelMove, &s_EelRun[4][1]},
{EEL_RUN_R4 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[4][2]},
{EEL_RUN_R4 + 2, EEL_RUN_RATE, DoEelMove, &s_EelRun[4][3]},
{EEL_RUN_R4 + 1, EEL_RUN_RATE, DoEelMove, &s_EelRun[4][0]},
}
};
STATEp sg_EelRun[] =
{
&s_EelRun[0][0],
&s_EelRun[1][0],
&s_EelRun[2][0],
&s_EelRun[3][0],
&s_EelRun[4][0]
};
//////////////////////
//
// EEL STAND
//
//////////////////////
STATE s_EelStand[5][1] =
{
{
{EEL_RUN_R0 + 0, EEL_RUN_RATE, DoEelMove, &s_EelStand[0][0]},
},
{
{EEL_RUN_R1 + 0, EEL_RUN_RATE, DoEelMove, &s_EelStand[1][0]},
},
{
{EEL_RUN_R2 + 0, EEL_RUN_RATE, DoEelMove, &s_EelStand[2][0]},
},
{
{EEL_RUN_R3 + 0, EEL_RUN_RATE, DoEelMove, &s_EelStand[3][0]},
},
{
{EEL_RUN_R4 + 0, EEL_RUN_RATE, DoEelMove, &s_EelStand[4][0]},
}
};
STATEp sg_EelStand[] =
{
&s_EelStand[0][0],
&s_EelStand[1][0],
&s_EelStand[2][0],
&s_EelStand[3][0],
&s_EelStand[4][0]
};
//////////////////////
//
// EEL FIRE
//
//////////////////////
ANIMATOR InitEelFire, EelShock;
#define EEL_FIRE_RATE 12
STATE s_EelAttack[5][7] =
{
{
{EEL_FIRE_R0 + 0, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[0][1]},
{EEL_FIRE_R0 + 1, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[0][2]},
{EEL_FIRE_R0 + 2, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[0][3]},
{EEL_FIRE_R0 + 2, 0|SF_QUICK_CALL, InitEelFire, &s_EelAttack[0][4]},
{EEL_FIRE_R0 + 2, EEL_FIRE_RATE, NullEel, &s_EelAttack[0][5]},
{EEL_FIRE_R0 + 3, 0|SF_QUICK_CALL, InitActorDecide, &s_EelAttack[0][6]},
{EEL_RUN_R0 + 3, EEL_FIRE_RATE, DoEelMove, &s_EelAttack[0][6]}
},
{
{EEL_FIRE_R1 + 0, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[1][1]},
{EEL_FIRE_R1 + 1, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[1][2]},
{EEL_FIRE_R1 + 2, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[1][3]},
{EEL_FIRE_R1 + 2, 0|SF_QUICK_CALL, InitEelFire, &s_EelAttack[1][5]},
{EEL_FIRE_R1 + 2, EEL_FIRE_RATE, NullEel, &s_EelAttack[1][6]},
{EEL_FIRE_R1 + 3, 0|SF_QUICK_CALL, InitActorDecide, &s_EelAttack[1][7]},
{EEL_RUN_R0 + 3, EEL_FIRE_RATE, DoEelMove, &s_EelAttack[1][7]}
},
{
{EEL_FIRE_R2 + 0, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[2][1]},
{EEL_FIRE_R2 + 1, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[2][2]},
{EEL_FIRE_R2 + 2, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[2][3]},
{EEL_FIRE_R2 + 2, 0|SF_QUICK_CALL, InitEelFire, &s_EelAttack[2][4]},
{EEL_FIRE_R2 + 2, EEL_FIRE_RATE, NullEel, &s_EelAttack[2][5]},
{EEL_FIRE_R2 + 3, 0|SF_QUICK_CALL, InitActorDecide, &s_EelAttack[2][6]},
{EEL_RUN_R0 + 3, EEL_FIRE_RATE, DoEelMove, &s_EelAttack[2][6]}
},
{
{EEL_RUN_R3 + 0, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[3][1]},
{EEL_RUN_R3 + 1, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[3][2]},
{EEL_RUN_R3 + 2, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[3][3]},
{EEL_RUN_R3 + 2, 0|SF_QUICK_CALL, InitEelFire, &s_EelAttack[3][4]},
{EEL_RUN_R3 + 2, EEL_FIRE_RATE, NullEel, &s_EelAttack[3][5]},
{EEL_RUN_R3 + 3, 0|SF_QUICK_CALL, InitActorDecide, &s_EelAttack[3][6]},
{EEL_RUN_R0 + 3, EEL_FIRE_RATE, DoEelMove, &s_EelAttack[3][6]}
},
{
{EEL_RUN_R4 + 0, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[4][1]},
{EEL_RUN_R4 + 1, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[4][2]},
{EEL_RUN_R4 + 2, EEL_FIRE_RATE*2, NullEel, &s_EelAttack[4][3]},
{EEL_RUN_R4 + 2, 0|SF_QUICK_CALL, InitEelFire, &s_EelAttack[4][4]},
{EEL_RUN_R4 + 2, EEL_FIRE_RATE, NullEel, &s_EelAttack[4][5]},
{EEL_RUN_R4 + 3, 0|SF_QUICK_CALL, InitActorDecide, &s_EelAttack[4][6]},
{EEL_RUN_R0 + 3, EEL_FIRE_RATE, DoEelMove, &s_EelAttack[4][6]}
}
};
STATEp sg_EelAttack[] =
{
&s_EelAttack[0][0],
&s_EelAttack[1][0],
&s_EelAttack[2][0],
&s_EelAttack[3][0],
&s_EelAttack[4][0]
};
//////////////////////
//
// EEL DIE
//
//////////////////////
#define EEL_DIE_RATE 20
ANIMATOR DoEelDeath;
STATE s_EelDie[] =
{
{EEL_DIE + 0, EEL_DIE_RATE, DoEelDeath, &s_EelDie[1]},
{EEL_DIE + 0, EEL_DIE_RATE, DoEelDeath, &s_EelDie[2]},
{EEL_DIE + 0, EEL_DIE_RATE, DoEelDeath, &s_EelDie[3]},
{EEL_DIE + 0, EEL_DIE_RATE, DoEelDeath, &s_EelDie[4]},
{EEL_DIE + 0, EEL_DIE_RATE, DoEelDeath, &s_EelDie[5]},
{EEL_DIE + 0, EEL_DIE_RATE, DoEelDeath, &s_EelDie[5]},
};
STATEp sg_EelDie[] =
{
s_EelDie
};
STATE s_EelDead[] =
{
// {EEL_DEAD, SF_QUICK_CALL , QueueFloorBlood, &s_EelDead[1]},
{EEL_DEAD, EEL_DIE_RATE, DoActorDebris, &s_EelDead[0]},
};
STATEp sg_EelDead[] =
{
s_EelDead
};
/*
STATEp *Stand[MAX_WEAPONS];
STATEp *Run;
STATEp *Jump;
STATEp *Fall;
STATEp *Crawl;
STATEp *Swim;
STATEp *Fly;
STATEp *Rise;
STATEp *Sit;
STATEp *Look;
STATEp *Climb;
STATEp *Pain;
STATEp *Death1;
STATEp *Death2;
STATEp *Dead;
STATEp *DeathJump;
STATEp *DeathFall;
STATEp *CloseAttack[2];
STATEp *Attack[6];
STATEp *Special[2];
*/
ACTOR_ACTION_SET EelActionSet =
{
sg_EelStand,
sg_EelRun,
NULL,
NULL,
NULL,
sg_EelRun,
NULL,
NULL,
sg_EelStand,
NULL,
NULL, //climb
sg_EelStand, //pain
sg_EelDie,
NULL,
sg_EelDead,
NULL,
NULL,
{sg_EelAttack},
{1024},
{sg_EelAttack},
{1024},
{NULL,NULL},
NULL,
NULL
};
int DoEelMatchPlayerZ(short SpriteNum);
void
EelCommon(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
sp->clipdist = (100) >> 2;
u->floor_dist = Z(16);
u->floor_dist = Z(16);
u->ceiling_dist = Z(20);
u->sz = sp->z;
sp->xrepeat = 35;
sp->yrepeat = 27;
u->Radius = 400;
}
int
SetupEel(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u;
ANIMATOR DoActorDecide;
if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
{
u = User[SpriteNum];
ASSERT(u);
}
else
{
User[SpriteNum] = u = SpawnUser(SpriteNum,EEL_RUN_R0,s_EelRun[0]);
u->Health = 40;
}
ChangeState(SpriteNum, s_EelRun[0]);
u->Attrib = &EelAttrib;
DoActorSetSpeed(SpriteNum, NORM_SPEED);
u->StateEnd = s_EelDie;
u->Rot = sg_EelRun;
EnemyDefaults(SpriteNum, &EelActionSet, &EelPersonality);
SET(u->Flags, SPR_NO_SCAREDZ|SPR_XFLIP_TOGGLE);
EelCommon(SpriteNum);
RESET(u->Flags, SPR_SHADOW); // Turn off shadows
u->zclip = Z(8);
return 0;
}
#if 0
int
NewEel(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
USERp nu;
SPRITEp np;
ANIMATOR DoActorDecide;
short new;
new = SpawnSprite(STAT_ENEMY, EEL_RUN_R0, &s_EelBirth, sp->sectnum, sp->x, sp->y, sp->z, sp->ang, 50);
nu = User[new];
np = &sprite[new];
ChangeState(new, &s_EelBirth);
nu->StateEnd = s_EelDie;
nu->Rot = sg_EelRun;
np->pal = nu->spal = u->spal;
nu->ActorActionSet = &EelActionSet;
np->shade = sp->shade;
EelCommon(new);
return 0;
}
#endif
int NullEel(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
DoEelMatchPlayerZ(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
int DoEelMatchPlayerZ(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
SPRITEp tsp = User[SpriteNum]->tgt_sp;
int zdiff,zdist;
int loz,hiz;
int dist,a,b,c;
int bound;
if (FAF_ConnectArea(sp->sectnum))
{
if (u->hi_sectp)
{
u->hiz = sector[sp->sectnum].ceilingz + Z(16);
u->hi_sectp = &sector[sp->sectnum];
}
else
{
if (u->hiz < sector[sp->sectnum].ceilingz + Z(16))
u->hiz = sector[sp->sectnum].ceilingz + Z(16);
}
}
// actor does a sine wave about u->sz - this is the z mid point
zdiff = (SPRITEp_BOS(tsp) - Z(8)) - u->sz;
// check z diff of the player and the sprite
zdist = Z(20 + RANDOM_RANGE(64)); // put a random amount
if (labs(zdiff) > zdist)
{
if (zdiff > 0)
// manipulate the z midpoint
u->sz += 160 * ACTORMOVETICS;
else
u->sz -= 160 * ACTORMOVETICS;
}
#define EEL_BOB_AMT (Z(4))
// save off lo and hi z
loz = u->loz;
hiz = u->hiz;
// adjust loz/hiz for water depth
if (u->lo_sectp && SectUser[u->lo_sectp - sector] && SectUser[u->lo_sectp - sector]->depth)
loz -= Z(SectUser[u->lo_sectp - sector]->depth) - Z(8);
// lower bound
if (u->lo_sp && u->tgt_sp == u->hi_sp)
{
DISTANCE(sp->x, sp->y, u->lo_sp->x, u->lo_sp->y, dist, a, b, c);
if (dist <= 300)
bound = u->sz;
else
bound = loz - u->floor_dist;
}
else
bound = loz - u->floor_dist - EEL_BOB_AMT;
if (u->sz > bound)
{
u->sz = bound;
}
// upper bound
if (u->hi_sp && u->tgt_sp == u->hi_sp)
{
DISTANCE(sp->x, sp->y, u->hi_sp->x, u->hi_sp->y, dist, a, b, c);
if (dist <= 300)
bound = u->sz;
else
bound = hiz + u->ceiling_dist;
}
else
bound = hiz + u->ceiling_dist + EEL_BOB_AMT;
if (u->sz < bound)
{
u->sz = bound;
}
u->sz = min(u->sz, loz - u->floor_dist);
u->sz = max(u->sz, hiz + u->ceiling_dist);
u->Counter = (u->Counter + (ACTORMOVETICS << 3) + (ACTORMOVETICS << 1)) & 2047;
sp->z = u->sz + ((EEL_BOB_AMT * (int)sintable[u->Counter]) >> 14);
bound = u->hiz + u->ceiling_dist + EEL_BOB_AMT;
if (sp->z < bound)
{
// bumped something
sp->z = u->sz = bound + EEL_BOB_AMT;
}
return 0;
}
int
DoEelDeath(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
int nx, ny;
if (TEST(u->Flags, SPR_FALLING))
{
DoFall(SpriteNum);
}
else
{
DoFindGroundPoint(SpriteNum);
u->floor_dist = 0;
DoBeginFall(SpriteNum);
}
if (TEST(u->Flags, SPR_SLIDING))
DoActorSlide(SpriteNum);
// slide while falling
nx = sp->xvel * (int) sintable[NORM_ANGLE(sp->ang + 512)] >> 14;
ny = sp->xvel * (int) sintable[sp->ang] >> 14;
u->ret = move_sprite(SpriteNum, nx, ny, 0L, u->ceiling_dist, u->floor_dist, CLIPMASK_MISSILE, ACTORMOVETICS);
DoFindGroundPoint(SpriteNum);
// on the ground
if (sp->z >= u->loz)
{
RESET(u->Flags, SPR_FALLING|SPR_SLIDING);
if (RANDOM_RANGE(1000) > 500)
SET(sp->cstat, CSTAT_SPRITE_XFLIP);
if (RANDOM_RANGE(1000) > 500)
SET(sp->cstat, CSTAT_SPRITE_YFLIP);
NewStateGroup(SpriteNum, u->ActorActionSet->Dead);
return 0;
}
return 0;
}
int DoEelMove(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
ASSERT(u->Rot != NULL);
if (SpriteOverlap(SpriteNum, u->tgt_sp - sprite))
NewStateGroup(SpriteNum, u->ActorActionSet->CloseAttack[0]);
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
if (u->track >= 0)
ActorFollowTrack(SpriteNum, ACTORMOVETICS);
else
(*u->ActorActionFunc)(SpriteNum);
//if (TEST_SYNC_KEY((Player+myconnectindex), SK_OPERATE))
// CON_Message("Stop");
DoEelMatchPlayerZ(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
#include "saveable.h"
static saveable_code saveable_eel_code[] =
{
SAVE_CODE(EelCommon),
SAVE_CODE(SetupEel),
//SAVE_CODE(NewEel),
SAVE_CODE(DoEelMatchPlayerZ),
SAVE_CODE(DoEelDeath),
SAVE_CODE(DoEelMove)
};
static saveable_data saveable_eel_data[] =
{
SAVE_DATA(EelBattle),
SAVE_DATA(EelOffense),
SAVE_DATA(EelBroadcast),
SAVE_DATA(EelSurprised),
SAVE_DATA(EelEvasive),
SAVE_DATA(EelLostTarget),
SAVE_DATA(EelCloseRange),
SAVE_DATA(EelTouchTarget),
SAVE_DATA(EelPersonality),
SAVE_DATA(EelAttrib),
SAVE_DATA(s_EelRun),
SAVE_DATA(sg_EelRun),
SAVE_DATA(s_EelStand),
SAVE_DATA(sg_EelStand),
SAVE_DATA(s_EelAttack),
SAVE_DATA(sg_EelAttack),
SAVE_DATA(s_EelDie),
SAVE_DATA(sg_EelDie),
SAVE_DATA(s_EelDead),
SAVE_DATA(sg_EelDead),
SAVE_DATA(EelActionSet)
};
saveable_module saveable_eel =
{
// code
saveable_eel_code,
SIZ(saveable_eel_code),
// data
saveable_eel_data,
SIZ(saveable_eel_data)
};

View file

@ -0,0 +1,96 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
// function.h
// file created by makehead.exe
// these headers contain default key assignments, as well as
// default button assignments and game function names
// axis defaults are also included
#ifndef function_public_
#define function_public_
#define NUMGAMEFUNCTIONS 51
extern char *gamefunctions[];
enum
{
gamefunc_Move_Forward,
gamefunc_Move_Backward,
gamefunc_Turn_Left,
gamefunc_Turn_Right,
gamefunc_Strafe,
gamefunc_Fire,
gamefunc_Open,
gamefunc_Run,
gamefunc_AutoRun,
gamefunc_Jump,
gamefunc_Crouch,
gamefunc_Look_Up,
gamefunc_Look_Down,
gamefunc_Strafe_Left,
gamefunc_Strafe_Right,
gamefunc_Aim_Up,
gamefunc_Aim_Down,
gamefunc_Weapon_1,
gamefunc_Weapon_2,
gamefunc_Weapon_3,
gamefunc_Weapon_4,
gamefunc_Weapon_5,
gamefunc_Weapon_6,
gamefunc_Weapon_7,
gamefunc_Weapon_8,
gamefunc_Weapon_9,
gamefunc_Weapon_10,
gamefunc_Inventory,
gamefunc_Inventory_Left,
gamefunc_Inventory_Right,
gamefunc_Med_Kit,
gamefunc_Smoke_Bomb,
gamefunc_Night_Vision,
gamefunc_Gas_Bomb,
gamefunc_Flash_Bomb,
gamefunc_Caltrops,
gamefunc_TurnAround,
gamefunc_SendMessage,
gamefunc_Map,
gamefunc_Shrink_Screen,
gamefunc_Enlarge_Screen,
gamefunc_Center_View,
gamefunc_Holster_Weapon,
gamefunc_Map_Follow_Mode,
gamefunc_See_Co_Op_View,
gamefunc_Mouse_Aiming,
gamefunc_Toggle_Crosshair,
gamefunc_Next_Weapon,
gamefunc_Previous_Weapon,
gamefunc_Show_Menu,
gamefunc_Show_Console,
};
#endif

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,222 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
//****************************************************************************
//
// gamedefs.h
//
// common defines between the game and the setup program
//
//****************************************************************************
#ifndef gamedefs_public_
#define gamedefs_public_
#ifdef __cplusplus
extern "C" {
#endif
//****************************************************************************
//
// DEFINES
//
//****************************************************************************
//#define SHARE 1
//
// Setup program defines
//
// Max number of players
//#ifdef SHARE
//#define MAXPLAYERS 4
//#else
//#define MAXPLAYERS 8
//#endif
// Number of Mouse buttons
#define MAXMOUSEBUTTONS 6
// Number of JOY buttons
#define MAXJOYBUTTONS (32+4)
// Number of EXTERNAL buttons
//#define MAXEXTERNALBUTTONS 6
// max path+track length for OGG music files
#define MAXOGGTRACKLENGTH 256
//
// modem string defines
//
#define MAXMODEMSTRING 50
// MACRO defines
#define MAXMACROS 10
#define MAXMACROLENGTH 34
// Phone list defines
#define PHONENUMBERLENGTH 28
#define PHONENAMELENGTH 16
#define MAXPHONEENTRIES 16
// length of program functions
#define MAXFUNCTIONLENGTH 30
// length of axis functions
#define MAXAXISFUNCTIONLENGTH 30
// Max Player Name length
#define MAXPLAYERNAMELENGTH 11
// Max RTS Name length
#define MAXRTSNAMELENGTH 15
// Max User Level Name length
#define MAXUSERLEVELNAMELENGTH 15
// Max RTS Path length
#define MAXRTSPATHLENGTH 48
// Max User Level Path length
#define MAXUSERLEVELPATHLENGTH 48
// Number of Mouse Axes
#define MAXMOUSEAXES 2
// Number of JOY axes
#define MAXJOYAXES 6
// Number of GAMEPAD axes
#define MAXGAMEPADAXES 2
#ifdef __FLAT__
#define CONTROLSHIFT 0
#else
#define CONTROLSHIFT 4
#endif
// MIN/MAX scale value for controller scales
#define MAXCONTROLSCALEVALUE (1<<(18-CONTROLSHIFT))
// DEFAULT scale value for controller scales
#define DEFAULTCONTROLSCALEVALUE (1<<(16-CONTROLSHIFT))
// base value for controller scales
#define BASECONTROLSCALEVALUE (1<<(16-CONTROLSHIFT))
// MAX mouse sensitivity scale
#define MAXMOUSESENSITIVITY (1<<(17-CONTROLSHIFT))
// mouse sensitivity base
#define MOUSECONTROLBASE ((1<<(15-CONTROLSHIFT))-1)
// DEFAULT mouse sensitivity scale
#define DEFAULTMOUSESENSITIVITY (1<<(15-CONTROLSHIFT))
enum
{
gametype_network=3,
gametype_serial=1,
gametype_modem=2
};
enum
{
connecttype_dialing=0,
connecttype_answer=1,
connecttype_alreadyconnected=2
};
enum
{
screenbuffer_320x200,
screenbuffer_640x400,
screenbuffer_640x480,
screenbuffer_800x600,
screenbuffer_1024x768,
screenbuffer_1280x1024,
screenbuffer_1600x1200
};
enum
{
vesa_320x200,
vesa_360x200,
vesa_320x240,
vesa_360x240,
vesa_320x400,
vesa_360x400,
vesa_640x350,
vesa_640x400,
vesa_640x480,
vesa_800x600,
vesa_1024x768,
vesa_1280x1024,
vesa_1600x1200
};
enum
{
screenmode_chained,
screenmode_vesa,
screenmode_buffered,
screenmode_tseng,
screenmode_paradise,
screenmode_s3,
screenmode_crystal,
screenmode_redblue,
};
#ifdef __cplusplus
};
#endif
#endif

View file

@ -0,0 +1,932 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "tags.h"
#include "ai.h"
#include "pal.h"
#include "player.h"
#include "net.h"
#include "actor.h"
#include "track.h"
#include "sprite.h"
int DoHariKariBlood(short SpriteNum);
//int InitActorMoveCloser(short SpriteNum);
DECISION GirlNinjaBattle[] =
{
{499, InitActorMoveCloser},
//{509, InitActorAmbientNoise},
//{710, InitActorRunAway},
{1024, InitActorAttack}
};
DECISION GirlNinjaOffense[] =
{
{499, InitActorMoveCloser},
//{509, InitActorAmbientNoise},
{1024, InitActorAttack}
};
DECISION GirlNinjaBroadcast[] =
{
//{1, InitActorAlertNoise},
{6, InitActorAmbientNoise},
{1024, InitActorDecide}
};
DECISION GirlNinjaSurprised[] =
{
{701, InitActorMoveCloser},
{1024, InitActorDecide}
};
DECISION GirlNinjaEvasive[] =
{
{400, InitActorDuck}, // 100
// {300, InitActorEvade},
// {800, InitActorRunAway},
{1024, NULL}
};
DECISION GirlNinjaLostTarget[] =
{
{900, InitActorFindPlayer},
{1024, InitActorWanderAround}
};
DECISION GirlNinjaCloseRange[] =
{
{900, InitActorAttack },
{1024, InitActorReposition }
};
/*
!AIC - Collection of decision tables
*/
PERSONALITY GirlNinjaPersonality =
{
GirlNinjaBattle,
GirlNinjaOffense,
GirlNinjaBroadcast,
GirlNinjaSurprised,
GirlNinjaEvasive,
GirlNinjaLostTarget,
GirlNinjaCloseRange,
GirlNinjaCloseRange
};
ATTRIBUTE GirlNinjaAttrib =
{
{120, 140, 160, 190}, // Speeds
{4, 0, 0, -2}, // Tic Adjusts
3, // MaxWeapons;
{
DIGI_GIRLNINJAALERT, DIGI_GIRLNINJAALERT, DIGI_STAR,
DIGI_GIRLNINJAALERTT, DIGI_GIRLNINJASCREAM,0,0,0,0,0
}
};
//////////////////////
//
// GIRLNINJA RUN
//
//////////////////////
ANIMATOR DoGirlNinjaMove, DoGirlNinjaCrawl, DoStayOnFloor, NullGirlNinja, DoActorJump, DoActorFall, DoActorDebris, DoGirlNinjaHariKari, DoActorSlide;
ANIMATOR InitActorDecide;
#define GIRLNINJA_RATE 18
STATE s_GirlNinjaRun[5][4] =
{
{
{GIRLNINJA_RUN_R0 + 0, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[0][1]},
{GIRLNINJA_RUN_R0 + 1, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[0][2]},
{GIRLNINJA_RUN_R0 + 2, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[0][3]},
{GIRLNINJA_RUN_R0 + 3, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[0][0]},
},
{
{GIRLNINJA_RUN_R1 + 0, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[1][1]},
{GIRLNINJA_RUN_R1 + 1, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[1][2]},
{GIRLNINJA_RUN_R1 + 2, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[1][3]},
{GIRLNINJA_RUN_R1 + 3, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[1][0]},
},
{
{GIRLNINJA_RUN_R2 + 0, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[2][1]},
{GIRLNINJA_RUN_R2 + 1, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[2][2]},
{GIRLNINJA_RUN_R2 + 2, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[2][3]},
{GIRLNINJA_RUN_R2 + 3, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[2][0]},
},
{
{GIRLNINJA_RUN_R3 + 0, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[3][1]},
{GIRLNINJA_RUN_R3 + 1, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[3][2]},
{GIRLNINJA_RUN_R3 + 2, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[3][3]},
{GIRLNINJA_RUN_R3 + 3, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[3][0]},
},
{
{GIRLNINJA_RUN_R4 + 0, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[4][1]},
{GIRLNINJA_RUN_R4 + 1, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[4][2]},
{GIRLNINJA_RUN_R4 + 2, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[4][3]},
{GIRLNINJA_RUN_R4 + 3, GIRLNINJA_RATE | SF_TIC_ADJUST, DoGirlNinjaMove, &s_GirlNinjaRun[4][0]},
},
};
STATEp sg_GirlNinjaRun[] =
{
s_GirlNinjaRun[0],
s_GirlNinjaRun[1],
s_GirlNinjaRun[2],
s_GirlNinjaRun[3],
s_GirlNinjaRun[4]
};
//////////////////////
//
// GIRLNINJA STAND
//
//////////////////////
#define GIRLNINJA_STAND_RATE 10
STATE s_GirlNinjaStand[5][1] =
{
{
{GIRLNINJA_STAND_R0 + 0, GIRLNINJA_STAND_RATE, DoGirlNinjaMove, &s_GirlNinjaStand[0][0]},
},
{
{GIRLNINJA_STAND_R1 + 0, GIRLNINJA_STAND_RATE, DoGirlNinjaMove, &s_GirlNinjaStand[1][0]},
},
{
{GIRLNINJA_STAND_R2 + 0, GIRLNINJA_STAND_RATE, DoGirlNinjaMove, &s_GirlNinjaStand[2][0]},
},
{
{GIRLNINJA_STAND_R3 + 0, GIRLNINJA_STAND_RATE, DoGirlNinjaMove, &s_GirlNinjaStand[3][0]},
},
{
{GIRLNINJA_STAND_R4 + 0, GIRLNINJA_STAND_RATE, DoGirlNinjaMove, &s_GirlNinjaStand[4][0]},
},
};
STATEp sg_GirlNinjaStand[] =
{
s_GirlNinjaStand[0],
s_GirlNinjaStand[1],
s_GirlNinjaStand[2],
s_GirlNinjaStand[3],
s_GirlNinjaStand[4]
};
//////////////////////
//
// GIRLNINJA RISE
//
//////////////////////
#define GIRLNINJA_RISE_RATE 10
STATE s_GirlNinjaRise[5][3] =
{
{
{GIRLNINJA_KNEEL_R0 + 0, GIRLNINJA_RISE_RATE, NullGirlNinja, &s_GirlNinjaRise[0][1]},
{GIRLNINJA_STAND_R0 + 0, GIRLNINJA_STAND_RATE, NullGirlNinja, &s_GirlNinjaRise[0][2]},
{0, 0, NULL, (STATEp)sg_GirlNinjaRun}, // JBF: sg_GirlNinjaRun really is supposed to be the
// pointer to the state group. See StateControl() where
// it says "if (!u->State->Pic)".
},
{
{GIRLNINJA_KNEEL_R1 + 0, GIRLNINJA_RISE_RATE, NullGirlNinja, &s_GirlNinjaRise[1][1]},
{GIRLNINJA_STAND_R1 + 0, GIRLNINJA_STAND_RATE, NullGirlNinja, &s_GirlNinjaRise[1][2]},
{0, 0, NULL, (STATEp)sg_GirlNinjaRun},
},
{
{GIRLNINJA_KNEEL_R2 + 0, GIRLNINJA_RISE_RATE, NullGirlNinja, &s_GirlNinjaRise[2][1]},
{GIRLNINJA_STAND_R2 + 0, GIRLNINJA_STAND_RATE, NullGirlNinja, &s_GirlNinjaRise[2][2]},
{0, 0, NULL, (STATEp)sg_GirlNinjaRun},
},
{
{GIRLNINJA_KNEEL_R3 + 0, GIRLNINJA_RISE_RATE, NullGirlNinja, &s_GirlNinjaRise[3][1]},
{GIRLNINJA_STAND_R3 + 0, GIRLNINJA_STAND_RATE, NullGirlNinja, &s_GirlNinjaRise[3][2]},
{0, 0, NULL, (STATEp)sg_GirlNinjaRun},
},
{
{GIRLNINJA_KNEEL_R4 + 0, GIRLNINJA_RISE_RATE, NullGirlNinja, &s_GirlNinjaRise[4][1]},
{GIRLNINJA_STAND_R4 + 0, GIRLNINJA_STAND_RATE, NullGirlNinja, &s_GirlNinjaRise[4][2]},
{0, 0, NULL, (STATEp)sg_GirlNinjaRun},
},
};
STATEp sg_GirlNinjaRise[] =
{
s_GirlNinjaRise[0],
s_GirlNinjaRise[1],
s_GirlNinjaRise[2],
s_GirlNinjaRise[3],
s_GirlNinjaRise[4]
};
//////////////////////
//
// GIRLNINJA DUCK
//
//////////////////////
#define GIRLNINJA_DUCK_RATE 10
#define GIRLNINJA_CRAWL_RATE 14
STATE s_GirlNinjaDuck[5][2] =
{
{
{GIRLNINJA_KNEEL_R0 + 0, GIRLNINJA_DUCK_RATE, NullGirlNinja, &s_GirlNinjaDuck[0][1]},
{GIRLNINJA_CRAWL_R0 + 0, GIRLNINJA_CRAWL_RATE, DoGirlNinjaMove, &s_GirlNinjaDuck[0][1]},
},
{
{GIRLNINJA_KNEEL_R1 + 0, GIRLNINJA_DUCK_RATE, NullGirlNinja, &s_GirlNinjaDuck[1][1]},
{GIRLNINJA_CRAWL_R1 + 0, GIRLNINJA_CRAWL_RATE, DoGirlNinjaMove, &s_GirlNinjaDuck[1][1]},
},
{
{GIRLNINJA_KNEEL_R2 + 0, GIRLNINJA_DUCK_RATE, NullGirlNinja, &s_GirlNinjaDuck[2][1]},
{GIRLNINJA_CRAWL_R2 + 0, GIRLNINJA_CRAWL_RATE, DoGirlNinjaMove, &s_GirlNinjaDuck[2][1]},
},
{
{GIRLNINJA_KNEEL_R3 + 0, GIRLNINJA_DUCK_RATE, NullGirlNinja, &s_GirlNinjaDuck[3][1]},
{GIRLNINJA_CRAWL_R3 + 0, GIRLNINJA_CRAWL_RATE, DoGirlNinjaMove, &s_GirlNinjaDuck[3][1]},
},
{
{GIRLNINJA_KNEEL_R4 + 0, GIRLNINJA_DUCK_RATE, NullGirlNinja, &s_GirlNinjaDuck[4][1]},
{GIRLNINJA_CRAWL_R4 + 0, GIRLNINJA_CRAWL_RATE, DoGirlNinjaMove, &s_GirlNinjaDuck[4][1]},
},
};
STATEp sg_GirlNinjaDuck[] =
{
s_GirlNinjaDuck[0],
s_GirlNinjaDuck[1],
s_GirlNinjaDuck[2],
s_GirlNinjaDuck[3],
s_GirlNinjaDuck[4]
};
//////////////////////
//
// GIRLNINJA SIT
//
//////////////////////
STATE s_GirlNinjaSit[5][1] =
{
{
{GIRLNINJA_KNEEL_R0 + 0, GIRLNINJA_RISE_RATE, DoGirlNinjaMove, &s_GirlNinjaSit[0][0]},
},
{
{GIRLNINJA_KNEEL_R1 + 0, GIRLNINJA_RISE_RATE, DoGirlNinjaMove, &s_GirlNinjaSit[1][0]},
},
{
{GIRLNINJA_KNEEL_R2 + 0, GIRLNINJA_RISE_RATE, DoGirlNinjaMove, &s_GirlNinjaSit[2][0]},
},
{
{GIRLNINJA_KNEEL_R3 + 0, GIRLNINJA_RISE_RATE, DoGirlNinjaMove, &s_GirlNinjaSit[3][0]},
},
{
{GIRLNINJA_KNEEL_R4 + 0, GIRLNINJA_RISE_RATE, DoGirlNinjaMove, &s_GirlNinjaSit[4][0]},
},
};
STATEp sg_GirlNinjaSit[] =
{
s_GirlNinjaSit[0],
s_GirlNinjaSit[1],
s_GirlNinjaSit[2],
s_GirlNinjaSit[3],
s_GirlNinjaSit[4]
};
//////////////////////
//
// GIRLNINJA JUMP
//
//////////////////////
#define GIRLNINJA_JUMP_RATE 24
STATE s_GirlNinjaJump[5][2] =
{
{
{GIRLNINJA_JUMP_R0 + 0, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[0][1]},
{GIRLNINJA_JUMP_R0 + 1, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[0][1]},
},
{
{GIRLNINJA_JUMP_R1 + 0, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[1][1]},
{GIRLNINJA_JUMP_R1 + 1, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[1][1]},
},
{
{GIRLNINJA_JUMP_R2 + 0, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[2][1]},
{GIRLNINJA_JUMP_R2 + 1, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[2][1]},
},
{
{GIRLNINJA_JUMP_R3 + 0, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[3][1]},
{GIRLNINJA_JUMP_R3 + 1, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[3][1]},
},
{
{GIRLNINJA_JUMP_R4 + 0, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[4][1]},
{GIRLNINJA_JUMP_R4 + 1, GIRLNINJA_JUMP_RATE, DoGirlNinjaMove, &s_GirlNinjaJump[4][1]},
},
};
STATEp sg_GirlNinjaJump[] =
{
s_GirlNinjaJump[0],
s_GirlNinjaJump[1],
s_GirlNinjaJump[2],
s_GirlNinjaJump[3],
s_GirlNinjaJump[4]
};
//////////////////////
//
// GIRLNINJA FALL
//
//////////////////////
#define GIRLNINJA_FALL_RATE 16
STATE s_GirlNinjaFall[5][2] =
{
{
{GIRLNINJA_JUMP_R0 + 1, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[0][1]},
{GIRLNINJA_JUMP_R0 + 2, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[0][1]},
},
{
{GIRLNINJA_JUMP_R1 + 1, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[1][1]},
{GIRLNINJA_JUMP_R1 + 2, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[1][1]},
},
{
{GIRLNINJA_JUMP_R2 + 1, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[2][1]},
{GIRLNINJA_JUMP_R2 + 2, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[2][1]},
},
{
{GIRLNINJA_JUMP_R3 + 1, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[3][1]},
{GIRLNINJA_JUMP_R3 + 2, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[3][1]},
},
{
{GIRLNINJA_JUMP_R4 + 1, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[4][1]},
{GIRLNINJA_JUMP_R4 + 2, GIRLNINJA_FALL_RATE, DoGirlNinjaMove, &s_GirlNinjaFall[4][1]},
},
};
STATEp sg_GirlNinjaFall[] =
{
s_GirlNinjaFall[0],
s_GirlNinjaFall[1],
s_GirlNinjaFall[2],
s_GirlNinjaFall[3],
s_GirlNinjaFall[4]
};
//////////////////////
//
// GIRLNINJA PAIN
//
//////////////////////
#define GIRLNINJA_PAIN_RATE 15
ANIMATOR DoGirlNinjaPain;
STATE s_GirlNinjaPain[5][1] =
{
{
{GIRLNINJA_PAIN_R0 + 0, GIRLNINJA_PAIN_RATE, DoGirlNinjaPain, &s_GirlNinjaPain[0][0]},
},
{
{GIRLNINJA_PAIN_R1 + 0, GIRLNINJA_PAIN_RATE, DoGirlNinjaPain, &s_GirlNinjaPain[1][0]},
},
{
{GIRLNINJA_PAIN_R2 + 0, GIRLNINJA_PAIN_RATE, DoGirlNinjaPain, &s_GirlNinjaPain[2][0]},
},
{
{GIRLNINJA_PAIN_R3 + 0, GIRLNINJA_PAIN_RATE, DoGirlNinjaPain, &s_GirlNinjaPain[3][0]},
},
{
{GIRLNINJA_PAIN_R4 + 0, GIRLNINJA_PAIN_RATE, DoGirlNinjaPain, &s_GirlNinjaPain[4][0]},
},
};
STATEp sg_GirlNinjaPain[] =
{
s_GirlNinjaPain[0],
s_GirlNinjaPain[1],
s_GirlNinjaPain[2],
s_GirlNinjaPain[3],
s_GirlNinjaPain[4]
};
//////////////////////
//
// GIRLNINJA STICKY
//
//////////////////////
#define GIRLNINJA_STICKY_RATE 32
ANIMATOR InitEnemyMine;
STATE s_GirlNinjaSticky[5][6] =
{
{
{GIRLNINJA_THROW_R0 + 0, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[0][1]},
{GIRLNINJA_THROW_R0 + 0, GIRLNINJA_STICKY_RATE, NullGirlNinja, &s_GirlNinjaSticky[0][2]},
{GIRLNINJA_THROW_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyMine, &s_GirlNinjaSticky[0][3]},
{GIRLNINJA_THROW_R0 + 1, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[0][4]},
{GIRLNINJA_THROW_R0 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaSticky[0][5]},
{GIRLNINJA_THROW_R0 + 2, GIRLNINJA_STICKY_RATE, DoGirlNinjaMove, &s_GirlNinjaSticky[0][5]},
},
{
{GIRLNINJA_THROW_R1 + 0, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[1][1]},
{GIRLNINJA_THROW_R1 + 0, GIRLNINJA_STICKY_RATE, NullGirlNinja, &s_GirlNinjaSticky[1][2]},
{GIRLNINJA_THROW_R1 + 1, 0 | SF_QUICK_CALL, InitEnemyMine, &s_GirlNinjaSticky[1][3]},
{GIRLNINJA_THROW_R1 + 1, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[1][4]},
{GIRLNINJA_THROW_R1 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaSticky[1][5]},
{GIRLNINJA_THROW_R1 + 2, GIRLNINJA_STICKY_RATE, DoGirlNinjaMove, &s_GirlNinjaSticky[1][5]},
},
{
{GIRLNINJA_THROW_R2 + 0, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[2][1]},
{GIRLNINJA_THROW_R2 + 0, GIRLNINJA_STICKY_RATE, NullGirlNinja, &s_GirlNinjaSticky[2][2]},
{GIRLNINJA_THROW_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyMine, &s_GirlNinjaSticky[2][3]},
{GIRLNINJA_THROW_R2 + 1, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[2][4]},
{GIRLNINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaSticky[2][5]},
{GIRLNINJA_THROW_R2 + 2, GIRLNINJA_STICKY_RATE, DoGirlNinjaMove, &s_GirlNinjaSticky[2][5]},
},
{
{GIRLNINJA_THROW_R2 + 0, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[3][1]},
{GIRLNINJA_THROW_R2 + 0, GIRLNINJA_STICKY_RATE, NullGirlNinja, &s_GirlNinjaSticky[3][2]},
{GIRLNINJA_THROW_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyMine, &s_GirlNinjaSticky[3][3]},
{GIRLNINJA_THROW_R2 + 1, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[3][4]},
{GIRLNINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaSticky[3][5]},
{GIRLNINJA_THROW_R2 + 2, GIRLNINJA_STICKY_RATE, DoGirlNinjaMove, &s_GirlNinjaSticky[3][5]},
},
{
{GIRLNINJA_THROW_R2 + 0, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[4][1]},
{GIRLNINJA_THROW_R2 + 0, GIRLNINJA_STICKY_RATE, NullGirlNinja, &s_GirlNinjaSticky[4][2]},
{GIRLNINJA_THROW_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyMine, &s_GirlNinjaSticky[4][3]},
{GIRLNINJA_THROW_R2 + 1, GIRLNINJA_STICKY_RATE * 2, NullGirlNinja, &s_GirlNinjaSticky[4][4]},
{GIRLNINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaSticky[4][5]},
{GIRLNINJA_THROW_R2 + 2, GIRLNINJA_STICKY_RATE, DoGirlNinjaMove, &s_GirlNinjaSticky[4][5]},
},
};
STATEp sg_GirlNinjaSticky[] =
{
s_GirlNinjaSticky[0],
s_GirlNinjaSticky[1],
s_GirlNinjaSticky[2],
s_GirlNinjaSticky[3],
s_GirlNinjaSticky[4]
};
//////////////////////
//
// GIRLNINJA CROSSBOW
//
//////////////////////
#define GIRLNINJA_CROSSBOW_RATE 14
ANIMATOR InitEnemyCrossbow;
STATE s_GirlNinjaCrossbow[5][5] =
{
{
{GIRLNINJA_FIRE_R0 + 0, GIRLNINJA_CROSSBOW_RATE * 2, NullGirlNinja, &s_GirlNinjaCrossbow[0][1]},
{GIRLNINJA_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyCrossbow, &s_GirlNinjaCrossbow[0][2]},
{GIRLNINJA_FIRE_R0 + 1, GIRLNINJA_CROSSBOW_RATE, NullGirlNinja, &s_GirlNinjaCrossbow[0][3]},
{GIRLNINJA_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaCrossbow[0][4]},
{GIRLNINJA_FIRE_R0 + 1, GIRLNINJA_CROSSBOW_RATE, DoGirlNinjaMove, &s_GirlNinjaCrossbow[0][4]},
},
{
{GIRLNINJA_FIRE_R1 + 0, GIRLNINJA_CROSSBOW_RATE * 2, NullGirlNinja, &s_GirlNinjaCrossbow[1][1]},
{GIRLNINJA_FIRE_R1 + 1, 0 | SF_QUICK_CALL, InitEnemyCrossbow, &s_GirlNinjaCrossbow[1][2]},
{GIRLNINJA_FIRE_R1 + 1, GIRLNINJA_CROSSBOW_RATE, NullGirlNinja, &s_GirlNinjaCrossbow[1][3]},
{GIRLNINJA_FIRE_R1 + 1, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaCrossbow[1][4]},
{GIRLNINJA_FIRE_R1 + 1, GIRLNINJA_CROSSBOW_RATE, DoGirlNinjaMove, &s_GirlNinjaCrossbow[1][4]},
},
{
{GIRLNINJA_FIRE_R2 + 0, GIRLNINJA_CROSSBOW_RATE * 2, NullGirlNinja, &s_GirlNinjaCrossbow[2][1]},
{GIRLNINJA_FIRE_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyCrossbow, &s_GirlNinjaCrossbow[2][2]},
{GIRLNINJA_FIRE_R2 + 1, GIRLNINJA_CROSSBOW_RATE, NullGirlNinja, &s_GirlNinjaCrossbow[2][3]},
{GIRLNINJA_FIRE_R2 + 1, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaCrossbow[2][4]},
{GIRLNINJA_FIRE_R2 + 1, GIRLNINJA_CROSSBOW_RATE, DoGirlNinjaMove, &s_GirlNinjaCrossbow[2][4]},
},
{
{GIRLNINJA_FIRE_R3 + 0, GIRLNINJA_CROSSBOW_RATE * 2, NullGirlNinja, &s_GirlNinjaCrossbow[3][1]},
{GIRLNINJA_FIRE_R3 + 1, 0 | SF_QUICK_CALL, InitEnemyCrossbow, &s_GirlNinjaCrossbow[3][2]},
{GIRLNINJA_FIRE_R3 + 1, GIRLNINJA_CROSSBOW_RATE, NullGirlNinja, &s_GirlNinjaCrossbow[3][3]},
{GIRLNINJA_FIRE_R3 + 1, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaCrossbow[3][4]},
{GIRLNINJA_FIRE_R3 + 1, GIRLNINJA_CROSSBOW_RATE, DoGirlNinjaMove, &s_GirlNinjaCrossbow[3][4]},
},
{
{GIRLNINJA_FIRE_R4 + 0, GIRLNINJA_CROSSBOW_RATE * 2, NullGirlNinja, &s_GirlNinjaCrossbow[4][1]},
{GIRLNINJA_FIRE_R4 + 1, 0 | SF_QUICK_CALL, InitEnemyCrossbow, &s_GirlNinjaCrossbow[4][2]},
{GIRLNINJA_FIRE_R4 + 1, GIRLNINJA_CROSSBOW_RATE, NullGirlNinja, &s_GirlNinjaCrossbow[4][3]},
{GIRLNINJA_FIRE_R4 + 1, 0 | SF_QUICK_CALL, InitActorDecide, &s_GirlNinjaCrossbow[4][4]},
{GIRLNINJA_FIRE_R4 + 1, GIRLNINJA_CROSSBOW_RATE, DoGirlNinjaMove, &s_GirlNinjaCrossbow[4][4]},
},
};
STATEp sg_GirlNinjaCrossbow[] =
{
s_GirlNinjaCrossbow[0],
s_GirlNinjaCrossbow[1],
s_GirlNinjaCrossbow[2],
s_GirlNinjaCrossbow[3],
s_GirlNinjaCrossbow[4]
};
//////////////////////
//
// GIRLNINJA DIE
//
//////////////////////
#define GIRLNINJA_DIE_RATE 30
ANIMATOR DoGirlNinjaSpecial;
STATE s_GirlNinjaDie[] =
{
{GIRLNINJA_DIE + 0, GIRLNINJA_DIE_RATE*2, NullGirlNinja, &s_GirlNinjaDie[1]},
{GIRLNINJA_DIE + 1, GIRLNINJA_DIE_RATE, NullGirlNinja, &s_GirlNinjaDie[2]},
{GIRLNINJA_DIE + 2, GIRLNINJA_DIE_RATE, NullGirlNinja, &s_GirlNinjaDie[3]},
{GIRLNINJA_DIE + 3, GIRLNINJA_DIE_RATE, NullGirlNinja, &s_GirlNinjaDie[4]},
{GIRLNINJA_DIE + 4, GIRLNINJA_DIE_RATE, NullGirlNinja, &s_GirlNinjaDie[5]},
{GIRLNINJA_DIE + 5, GIRLNINJA_DIE_RATE, NullGirlNinja, &s_GirlNinjaDie[6]},
{GIRLNINJA_DIE + 6, GIRLNINJA_DIE_RATE, NullGirlNinja, &s_GirlNinjaDie[7]},
{GIRLNINJA_DIE + 6, SF_QUICK_CALL, DoGirlNinjaSpecial, &s_GirlNinjaDie[8]},
{GIRLNINJA_DIE + 7, GIRLNINJA_DIE_RATE, NullGirlNinja, &s_GirlNinjaDie[9]},
{GIRLNINJA_DIE + 8, SF_QUICK_CALL, QueueFloorBlood, &s_GirlNinjaDie[10]},
{GIRLNINJA_DIE + 8, GIRLNINJA_DIE_RATE, DoActorDebris, &s_GirlNinjaDie[10]},
};
STATE s_GirlNinjaDead[] =
{
{GIRLNINJA_DIE + 6, GIRLNINJA_DIE_RATE, DoActorDebris, &s_GirlNinjaDead[1]},
{GIRLNINJA_DIE + 7, SF_QUICK_CALL, DoGirlNinjaSpecial, &s_GirlNinjaDead[2]},
{GIRLNINJA_DIE + 7, GIRLNINJA_DIE_RATE, DoActorDebris, &s_GirlNinjaDead[3]},
{GIRLNINJA_DIE + 8, SF_QUICK_CALL, QueueFloorBlood,&s_GirlNinjaDead[4]},
{GIRLNINJA_DIE + 8, GIRLNINJA_DIE_RATE, DoActorDebris, &s_GirlNinjaDead[4]},
};
STATE s_GirlNinjaDeathJump[] =
{
{GIRLNINJA_DIE + 0, GIRLNINJA_DIE_RATE, DoActorDeathMove, &s_GirlNinjaDeathJump[1]},
{GIRLNINJA_DIE + 1, GIRLNINJA_DIE_RATE, DoActorDeathMove, &s_GirlNinjaDeathJump[2]},
{GIRLNINJA_DIE + 2, GIRLNINJA_DIE_RATE, DoActorDeathMove, &s_GirlNinjaDeathJump[2]},
};
STATE s_GirlNinjaDeathFall[] =
{
{GIRLNINJA_DIE + 3, GIRLNINJA_DIE_RATE, DoActorDeathMove, &s_GirlNinjaDeathFall[1]},
{GIRLNINJA_DIE + 4, GIRLNINJA_DIE_RATE, DoActorDeathMove, &s_GirlNinjaDeathFall[1]},
};
/*
STATEp *Stand[MAX_WEAPONS];
STATEp *Run;
STATEp *Jump;
STATEp *Fall;
STATEp *Crawl;
STATEp *Swim;
STATEp *Fly;
STATEp *Rise;
STATEp *Sit;
STATEp *Look;
STATEp *Climb;
STATEp *Pain;
STATEp *Death1;
STATEp *Death2;
STATEp *Dead;
STATEp *DeathJump;
STATEp *DeathFall;
STATEp *CloseAttack[2];
STATEp *Attack[6];
STATEp *Special[2];
*/
STATEp sg_GirlNinjaDie[] =
{
s_GirlNinjaDie
};
STATEp sg_GirlNinjaDead[] =
{
s_GirlNinjaDead
};
STATEp sg_GirlNinjaDeathJump[] =
{
s_GirlNinjaDeathJump
};
STATEp sg_GirlNinjaDeathFall[] =
{
s_GirlNinjaDeathFall
};
/*
!AIC - Collection of states that connect action to states
*/
ACTOR_ACTION_SET GirlNinjaActionSet =
{
sg_GirlNinjaStand,
sg_GirlNinjaRun,
sg_GirlNinjaJump,
sg_GirlNinjaFall,
NULL,
NULL,
NULL,
sg_GirlNinjaRise,
sg_GirlNinjaSit,
NULL,
NULL,
sg_GirlNinjaPain,
sg_GirlNinjaDie,
NULL,
sg_GirlNinjaDead,
sg_GirlNinjaDeathJump,
sg_GirlNinjaDeathFall,
{sg_GirlNinjaCrossbow, sg_GirlNinjaSticky},
{800, 1024},
{sg_GirlNinjaCrossbow, sg_GirlNinjaSticky},
{800, 1024},
{NULL},
sg_GirlNinjaDuck,
NULL
};
int
SetupGirlNinja(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u;
ANIMATOR DoActorDecide;
short pic = sp->picnum;
if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
{
u = User[SpriteNum];
ASSERT(u);
}
else
{
User[SpriteNum] = u = SpawnUser(SpriteNum, GIRLNINJA_RUN_R0, s_GirlNinjaRun[0]);
u->Health = 100;
}
u->StateEnd = s_GirlNinjaDie;
u->Rot = sg_GirlNinjaRun;
sp->xrepeat = 51;
sp->yrepeat = 43;
u->Attrib = &GirlNinjaAttrib;
sp->pal = u->spal = 26;
EnemyDefaults(SpriteNum, &GirlNinjaActionSet, &GirlNinjaPersonality);
ChangeState(SpriteNum, s_GirlNinjaRun[0]);
DoActorSetSpeed(SpriteNum, NORM_SPEED);
u->Radius = 280;
RESET(u->Flags, SPR_XFLIP_TOGGLE);
return 0;
}
int
DoGirlNinjaMove(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
// jumping and falling
if (TEST(u->Flags, SPR_JUMPING | SPR_FALLING) && !TEST(u->Flags, SPR_CLIMBING))
{
if (TEST(u->Flags, SPR_JUMPING))
DoActorJump(SpriteNum);
else if (TEST(u->Flags, SPR_FALLING))
DoActorFall(SpriteNum);
}
// sliding
if (TEST(u->Flags, SPR_SLIDING) && !TEST(u->Flags, SPR_CLIMBING))
DoActorSlide(SpriteNum);
// !AIC - do track or call current action function - such as DoActorMoveCloser()
if (u->track >= 0)
ActorFollowTrack(SpriteNum, ACTORMOVETICS);
else
{
(*u->ActorActionFunc)(SpriteNum);
}
// stay on floor unless doing certain things
if (!TEST(u->Flags, SPR_JUMPING | SPR_FALLING | SPR_CLIMBING))
{
KeepActorOnFloor(SpriteNum);
}
// take damage from environment
DoActorSectorDamage(SpriteNum);
return 0;
}
int
GirlNinjaJumpActionFunc(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
int nx, ny;
// Move while jumping
nx = sp->xvel * (int) sintable[NORM_ANGLE(sp->ang + 512)] >> 14;
ny = sp->xvel * (int) sintable[sp->ang] >> 14;
// if cannot move the sprite
if (!move_actor(SpriteNum, nx, ny, 0L))
{
return 0;
}
if (!TEST(u->Flags, SPR_JUMPING|SPR_FALLING))
{
InitActorDecide(SpriteNum);
}
return 0;
}
int
NullGirlNinja(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
if (u->WaitTics > 0) u->WaitTics -= ACTORMOVETICS;
if (TEST(u->Flags, SPR_SLIDING) && !TEST(u->Flags, SPR_CLIMBING) && !TEST(u->Flags, SPR_JUMPING|SPR_FALLING))
DoActorSlide(SpriteNum);
if (!TEST(u->Flags, SPR_CLIMBING) && !TEST(u->Flags, SPR_JUMPING|SPR_FALLING))
KeepActorOnFloor(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
int DoGirlNinjaPain(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
NullGirlNinja(SpriteNum);
if ((u->WaitTics -= ACTORMOVETICS) <= 0)
InitActorDecide(SpriteNum);
return 0;
}
int DoGirlNinjaSpecial(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
if (u->spal == PALETTE_PLAYER5)
{
RESET(sp->cstat,CSTAT_SPRITE_TRANSLUCENT);
sp->hitag = 0;
sp->shade = -10;
}
return 0;
}
#include "saveable.h"
static saveable_code saveable_girlninj_code[] =
{
SAVE_CODE(SetupGirlNinja),
SAVE_CODE(DoGirlNinjaMove),
SAVE_CODE(GirlNinjaJumpActionFunc),
SAVE_CODE(NullGirlNinja),
SAVE_CODE(DoGirlNinjaPain),
SAVE_CODE(DoGirlNinjaSpecial),
};
static saveable_data saveable_girlninj_data[] =
{
SAVE_DATA(GirlNinjaBattle),
SAVE_DATA(GirlNinjaOffense),
SAVE_DATA(GirlNinjaBroadcast),
SAVE_DATA(GirlNinjaSurprised),
SAVE_DATA(GirlNinjaEvasive),
SAVE_DATA(GirlNinjaLostTarget),
SAVE_DATA(GirlNinjaCloseRange),
SAVE_DATA(GirlNinjaPersonality),
SAVE_DATA(GirlNinjaAttrib),
SAVE_DATA(s_GirlNinjaRun),
SAVE_DATA(sg_GirlNinjaRun),
SAVE_DATA(s_GirlNinjaStand),
SAVE_DATA(sg_GirlNinjaStand),
SAVE_DATA(s_GirlNinjaRise),
SAVE_DATA(sg_GirlNinjaRise),
SAVE_DATA(s_GirlNinjaDuck),
SAVE_DATA(sg_GirlNinjaDuck),
SAVE_DATA(s_GirlNinjaSit),
SAVE_DATA(sg_GirlNinjaSit),
SAVE_DATA(s_GirlNinjaJump),
SAVE_DATA(sg_GirlNinjaJump),
SAVE_DATA(s_GirlNinjaFall),
SAVE_DATA(sg_GirlNinjaFall),
SAVE_DATA(s_GirlNinjaPain),
SAVE_DATA(sg_GirlNinjaPain),
SAVE_DATA(s_GirlNinjaSticky),
SAVE_DATA(sg_GirlNinjaSticky),
SAVE_DATA(s_GirlNinjaCrossbow),
SAVE_DATA(sg_GirlNinjaCrossbow),
SAVE_DATA(s_GirlNinjaDie),
SAVE_DATA(s_GirlNinjaDead),
SAVE_DATA(s_GirlNinjaDeathJump),
SAVE_DATA(s_GirlNinjaDeathFall),
SAVE_DATA(sg_GirlNinjaDie),
SAVE_DATA(sg_GirlNinjaDead),
SAVE_DATA(sg_GirlNinjaDeathJump),
SAVE_DATA(sg_GirlNinjaDeathFall),
SAVE_DATA(GirlNinjaActionSet),
};
saveable_module saveable_girlninj =
{
// code
saveable_girlninj_code,
SIZ(saveable_girlninj_code),
// data
saveable_girlninj_data,
SIZ(saveable_girlninj_data)
};

View file

@ -0,0 +1,619 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "tags.h"
#include "game.h"
#include "ai.h"
#include "actor.h"
#include "track.h"
#define GORO_PAIN_R0 GORO_STAND_R0
#define GORO_PAIN_R1 GORO_STAND_R1
#define GORO_PAIN_R2 GORO_STAND_R2
#define GORO_PAIN_R3 GORO_STAND_R3
#define GORO_PAIN_R4 GORO_STAND_R4
DECISION GoroBattle[] =
{
{697, InitActorMoveCloser },
{700, InitActorAmbientNoise },
{1024, InitActorAttack }
};
DECISION GoroOffense[] =
{
{797, InitActorMoveCloser },
{800, InitActorAttackNoise },
{1024, InitActorAttack }
};
DECISION GoroBroadcast[] =
{
{3, InitActorAmbientNoise },
{1024, InitActorDecide }
};
DECISION GoroSurprised[] =
{
{701, InitActorMoveCloser },
{1024, InitActorDecide }
};
DECISION GoroEvasive[] =
{
{10, InitActorEvade },
{1024, InitActorMoveCloser }
};
DECISION GoroLostTarget[] =
{
{900, InitActorFindPlayer },
{1024, InitActorWanderAround }
};
DECISION GoroCloseRange[] =
{
{700, InitActorAttack },
{1024, InitActorReposition }
};
PERSONALITY GoroPersonality =
{
GoroBattle,
GoroOffense,
GoroBroadcast,
GoroSurprised,
GoroEvasive,
GoroLostTarget,
GoroCloseRange,
GoroCloseRange
};
ATTRIBUTE GoroAttrib =
{
{160, 180, 200, 230}, // Speeds
{3, 0, -2, -3}, // Tic Adjusts
3, // MaxWeapons;
{
DIGI_GRDAMBIENT, DIGI_GRDALERT, 0,
DIGI_GRDPAIN, DIGI_GRDSCREAM, DIGI_GRDSWINGAXE,
DIGI_GRDFIREBALL,0,0,0
}
};
//////////////////////
//
// GORO RUN
//
//////////////////////
#define GORO_RUN_RATE 18
ANIMATOR DoGoroMove,NullGoro,DoActorDebris,NullAnimator,InitEnemyFireball;
STATE s_GoroRun[5][4] =
{
{
{GORO_RUN_R0 + 0, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[0][1]},
{GORO_RUN_R0 + 1, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[0][2]},
{GORO_RUN_R0 + 2, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[0][3]},
{GORO_RUN_R0 + 3, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[0][0]},
},
{
{GORO_RUN_R1 + 0, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[1][1]},
{GORO_RUN_R1 + 1, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[1][2]},
{GORO_RUN_R1 + 2, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[1][3]},
{GORO_RUN_R1 + 3, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[1][0]},
},
{
{GORO_RUN_R2 + 0, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[2][1]},
{GORO_RUN_R2 + 1, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[2][2]},
{GORO_RUN_R2 + 2, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[2][3]},
{GORO_RUN_R2 + 3, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[2][0]},
},
{
{GORO_RUN_R3 + 0, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[3][1]},
{GORO_RUN_R3 + 1, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[3][2]},
{GORO_RUN_R3 + 2, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[3][3]},
{GORO_RUN_R3 + 3, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[3][0]},
},
{
{GORO_RUN_R4 + 0, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[4][1]},
{GORO_RUN_R4 + 1, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[4][2]},
{GORO_RUN_R4 + 2, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[4][3]},
{GORO_RUN_R4 + 3, GORO_RUN_RATE|SF_TIC_ADJUST, DoGoroMove, &s_GoroRun[4][0]},
}
};
STATEp sg_GoroRun[] =
{
&s_GoroRun[0][0],
&s_GoroRun[1][0],
&s_GoroRun[2][0],
&s_GoroRun[3][0],
&s_GoroRun[4][0]
};
//////////////////////
//
// GORO CHOP
//
//////////////////////
#define GORO_CHOP_RATE 14
ANIMATOR InitActorDecide;
ANIMATOR InitGoroChop;
STATE s_GoroChop[5][7] =
{
{
{GORO_CHOP_R0 + 0, GORO_CHOP_RATE, NullGoro, &s_GoroChop[0][1]},
{GORO_CHOP_R0 + 1, GORO_CHOP_RATE, NullGoro, &s_GoroChop[0][2]},
{GORO_CHOP_R0 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[0][3]},
{GORO_CHOP_R0 + 2, 0|SF_QUICK_CALL, InitGoroChop, &s_GoroChop[0][4]},
{GORO_CHOP_R0 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[0][5]},
{GORO_CHOP_R0 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroChop[0][6]},
{GORO_CHOP_R0 + 2, GORO_CHOP_RATE, DoGoroMove, &s_GoroChop[0][6]},
},
{
{GORO_CHOP_R1 + 0, GORO_CHOP_RATE, NullGoro, &s_GoroChop[1][1]},
{GORO_CHOP_R1 + 1, GORO_CHOP_RATE, NullGoro, &s_GoroChop[1][2]},
{GORO_CHOP_R1 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[1][3]},
{GORO_CHOP_R1 + 2, 0|SF_QUICK_CALL, InitGoroChop, &s_GoroChop[1][4]},
{GORO_CHOP_R1 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[1][5]},
{GORO_CHOP_R1 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroChop[1][6]},
{GORO_CHOP_R1 + 2, GORO_CHOP_RATE, DoGoroMove, &s_GoroChop[1][6]},
},
{
{GORO_CHOP_R2 + 0, GORO_CHOP_RATE, NullGoro, &s_GoroChop[2][1]},
{GORO_CHOP_R2 + 1, GORO_CHOP_RATE, NullGoro, &s_GoroChop[2][2]},
{GORO_CHOP_R2 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[2][3]},
{GORO_CHOP_R2 + 2, 0|SF_QUICK_CALL, InitGoroChop, &s_GoroChop[2][4]},
{GORO_CHOP_R2 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[2][5]},
{GORO_CHOP_R2 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroChop[2][6]},
{GORO_CHOP_R2 + 2, GORO_CHOP_RATE, DoGoroMove, &s_GoroChop[2][6]},
},
{
{GORO_CHOP_R3 + 0, GORO_CHOP_RATE, NullGoro, &s_GoroChop[3][1]},
{GORO_CHOP_R3 + 1, GORO_CHOP_RATE, NullGoro, &s_GoroChop[3][2]},
{GORO_CHOP_R3 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[3][3]},
{GORO_CHOP_R3 + 2, 0|SF_QUICK_CALL, InitGoroChop, &s_GoroChop[3][4]},
{GORO_CHOP_R3 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[3][5]},
{GORO_CHOP_R3 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroChop[3][6]},
{GORO_CHOP_R3 + 2, GORO_CHOP_RATE, DoGoroMove, &s_GoroChop[3][6]},
},
{
{GORO_CHOP_R4 + 0, GORO_CHOP_RATE, NullGoro, &s_GoroChop[4][1]},
{GORO_CHOP_R4 + 1, GORO_CHOP_RATE, NullGoro, &s_GoroChop[4][2]},
{GORO_CHOP_R4 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[4][3]},
{GORO_CHOP_R4 + 2, 0|SF_QUICK_CALL, InitGoroChop, &s_GoroChop[4][4]},
{GORO_CHOP_R4 + 2, GORO_CHOP_RATE, NullGoro, &s_GoroChop[4][5]},
{GORO_CHOP_R4 + 2, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroChop[4][6]},
{GORO_CHOP_R4 + 2, GORO_CHOP_RATE, DoGoroMove, &s_GoroChop[4][6]},
}
};
STATEp sg_GoroChop[] =
{
&s_GoroChop[0][0],
&s_GoroChop[1][0],
&s_GoroChop[2][0],
&s_GoroChop[3][0],
&s_GoroChop[4][0]
};
//////////////////////
//
// GORO SPELL
//
//////////////////////
#define GORO_SPELL_RATE 6
#define GORO_SPELL_PAUSE 30
STATE s_GoroSpell[5][10] =
{
{
{GORO_SPELL_R0 + 0, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[0][1]},
{GORO_SPELL_R0 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[0][2]},
{GORO_SPELL_R0 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[0][3]},
{GORO_SPELL_R0 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[0][4]},
{GORO_SPELL_R0 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[0][5]},
{GORO_SPELL_R0 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[0][6]},
{GORO_SPELL_R0 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[0][7]},
{GORO_SPELL_R0 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[0][8]},
{GORO_SPELL_R0 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroSpell[0][9]},
{GORO_SPELL_R0 + 1, GORO_SPELL_RATE, DoGoroMove, &s_GoroSpell[0][9]},
},
{
{GORO_SPELL_R1 + 0, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[1][1]},
{GORO_SPELL_R1 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[1][2]},
{GORO_SPELL_R1 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[1][3]},
{GORO_SPELL_R1 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[1][4]},
{GORO_SPELL_R1 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[1][5]},
{GORO_SPELL_R1 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[1][6]},
{GORO_SPELL_R1 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[1][7]},
{GORO_SPELL_R1 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[1][8]},
{GORO_SPELL_R1 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroSpell[1][9]},
{GORO_SPELL_R1 + 1, GORO_SPELL_RATE, DoGoroMove, &s_GoroSpell[1][9]},
},
{
{GORO_SPELL_R2 + 0, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[2][1]},
{GORO_SPELL_R2 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[2][2]},
{GORO_SPELL_R2 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[2][3]},
{GORO_SPELL_R2 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[2][4]},
{GORO_SPELL_R2 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[2][5]},
{GORO_SPELL_R2 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[2][6]},
{GORO_SPELL_R2 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[2][7]},
{GORO_SPELL_R2 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[2][8]},
{GORO_SPELL_R2 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroSpell[2][9]},
{GORO_SPELL_R2 + 1, GORO_SPELL_RATE, DoGoroMove, &s_GoroSpell[2][9]},
},
{
{GORO_SPELL_R3 + 0, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[3][1]},
{GORO_SPELL_R3 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[3][2]},
{GORO_SPELL_R3 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[3][3]},
{GORO_SPELL_R3 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[3][4]},
{GORO_SPELL_R3 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[3][5]},
{GORO_SPELL_R3 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[3][6]},
{GORO_SPELL_R3 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[3][7]},
{GORO_SPELL_R3 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[3][8]},
{GORO_SPELL_R3 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroSpell[3][9]},
{GORO_SPELL_R3 + 1, GORO_SPELL_RATE, DoGoroMove, &s_GoroSpell[3][9]},
},
{
{GORO_SPELL_R4 + 0, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[4][1]},
{GORO_SPELL_R4 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[4][2]},
{GORO_SPELL_R4 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[4][3]},
{GORO_SPELL_R4 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[4][4]},
{GORO_SPELL_R4 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[4][5]},
{GORO_SPELL_R4 + 1, GORO_SPELL_RATE, NullGoro, &s_GoroSpell[4][6]},
{GORO_SPELL_R4 + 1, GORO_SPELL_RATE, InitEnemyFireball, &s_GoroSpell[4][7]},
{GORO_SPELL_R4 + 1, GORO_SPELL_PAUSE, NullGoro, &s_GoroSpell[4][8]},
{GORO_SPELL_R4 + 1, 0|SF_QUICK_CALL, InitActorDecide, &s_GoroSpell[4][9]},
{GORO_SPELL_R4 + 1, GORO_SPELL_RATE, DoGoroMove, &s_GoroSpell[4][9]},
}
};
STATEp sg_GoroSpell[] =
{
&s_GoroSpell[0][0],
&s_GoroSpell[1][0],
&s_GoroSpell[2][0],
&s_GoroSpell[3][0],
&s_GoroSpell[4][0]
};
//////////////////////
//
// GORO STAND
//
//////////////////////
#define GORO_STAND_RATE 12
STATE s_GoroStand[5][1] =
{
{
{GORO_STAND_R0 + 0, GORO_STAND_RATE, DoGoroMove, &s_GoroStand[0][0]},
},
{
{GORO_STAND_R1 + 0, GORO_STAND_RATE, DoGoroMove, &s_GoroStand[1][0]},
},
{
{GORO_STAND_R2 + 0, GORO_STAND_RATE, DoGoroMove, &s_GoroStand[2][0]},
},
{
{GORO_STAND_R3 + 0, GORO_STAND_RATE, DoGoroMove, &s_GoroStand[3][0]},
},
{
{GORO_STAND_R4 + 0, GORO_STAND_RATE, DoGoroMove, &s_GoroStand[4][0]},
},
};
STATEp sg_GoroStand[] =
{
s_GoroStand[0],
s_GoroStand[1],
s_GoroStand[2],
s_GoroStand[3],
s_GoroStand[4]
};
//////////////////////
//
// GORO PAIN
//
//////////////////////
#define GORO_PAIN_RATE 12
ANIMATOR DoGoroPain;
STATE s_GoroPain[5][1] =
{
{
{GORO_PAIN_R0 + 0, GORO_PAIN_RATE, DoGoroPain, &s_GoroPain[0][0]},
},
{
{GORO_PAIN_R1 + 0, GORO_PAIN_RATE, DoGoroPain, &s_GoroPain[1][0]},
},
{
{GORO_PAIN_R2 + 0, GORO_PAIN_RATE, DoGoroPain, &s_GoroPain[2][0]},
},
{
{GORO_PAIN_R3 + 0, GORO_PAIN_RATE, DoGoroPain, &s_GoroPain[3][0]},
},
{
{GORO_PAIN_R4 + 0, GORO_PAIN_RATE, DoGoroPain, &s_GoroPain[4][0]},
},
};
STATEp sg_GoroPain[] =
{
s_GoroPain[0],
s_GoroPain[1],
s_GoroPain[2],
s_GoroPain[3],
s_GoroPain[4]
};
//////////////////////
//
// GORO DIE
//
//////////////////////
#define GORO_DIE_RATE 16
STATE s_GoroDie[] =
{
{GORO_DIE + 0, GORO_DIE_RATE, NullGoro, &s_GoroDie[1]},
{GORO_DIE + 1, GORO_DIE_RATE, NullGoro, &s_GoroDie[2]},
{GORO_DIE + 2, GORO_DIE_RATE, NullGoro, &s_GoroDie[3]},
{GORO_DIE + 3, GORO_DIE_RATE, NullGoro, &s_GoroDie[4]},
{GORO_DIE + 4, GORO_DIE_RATE, NullGoro, &s_GoroDie[5]},
{GORO_DIE + 5, GORO_DIE_RATE, NullGoro, &s_GoroDie[6]},
{GORO_DIE + 6, GORO_DIE_RATE, NullGoro, &s_GoroDie[7]},
{GORO_DIE + 7, GORO_DIE_RATE, NullGoro, &s_GoroDie[8]},
{GORO_DIE + 8, GORO_DIE_RATE, NullGoro, &s_GoroDie[9]},
{GORO_DEAD, SF_QUICK_CALL, QueueFloorBlood, &s_GoroDie[10]},
{GORO_DEAD, GORO_DIE_RATE, DoActorDebris, &s_GoroDie[10]},
};
STATE s_GoroDead[] =
{
{GORO_DEAD, GORO_DIE_RATE, DoActorDebris, &s_GoroDead[0]},
};
STATEp sg_GoroDie[] =
{
s_GoroDie
};
STATEp sg_GoroDead[] =
{
s_GoroDead
};
/*
STATEp *Stand[MAX_WEAPONS];
STATEp *Run;
STATEp *Jump;
STATEp *Fall;
STATEp *Crawl;
STATEp *Swim;
STATEp *Fly;
STATEp *Rise;
STATEp *Sit;
STATEp *Look;
STATEp *Climb;
STATEp *Pain;
STATEp *Death1;
STATEp *Death2;
STATEp *Dead;
STATEp *DeathJump;
STATEp *DeathFall;
STATEp *CloseAttack[2];
STATEp *Attack[6];
STATEp *Special[2];
*/
ACTOR_ACTION_SET GoroActionSet =
{
sg_GoroStand,
sg_GoroRun,
NULL, //sg_GoroJump,
NULL, //sg_GoroFall,
NULL, //sg_GoroCrawl,
NULL, //sg_GoroSwim,
NULL, //sg_GoroFly,
NULL, //sg_GoroRise,
NULL, //sg_GoroSit,
NULL, //sg_GoroLook,
NULL, //climb
sg_GoroPain,
sg_GoroDie,
NULL, //sg_GoroHariKari,
sg_GoroDead,
NULL, //sg_GoroDeathJump,
NULL, //sg_GoroDeathFall,
{sg_GoroChop},
{1024},
{sg_GoroSpell},
{1024},
{NULL,NULL},
NULL,
NULL
};
int
SetupGoro(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u;
ANIMATOR DoActorDecide;
if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
{
u = User[SpriteNum];
ASSERT(u);
}
else
{
User[SpriteNum] = u = SpawnUser(SpriteNum,GORO_RUN_R0,s_GoroRun[0]);
u->Health = HEALTH_GORO;
}
ChangeState(SpriteNum, s_GoroRun[0]);
u->Attrib = &GoroAttrib;
DoActorSetSpeed(SpriteNum, NORM_SPEED);
u->StateEnd = s_GoroDie;
u->Rot = sg_GoroRun;
EnemyDefaults(SpriteNum, &GoroActionSet, &GoroPersonality);
sp->clipdist = 512 >> 2;
SET(u->Flags, SPR_XFLIP_TOGGLE);
return 0;
}
int NullGoro(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
ASSERT(SpriteNum >= 0);
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
KeepActorOnFloor(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
int DoGoroPain(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
ASSERT(SpriteNum >= 0);
NullGoro(SpriteNum);
if ((u->WaitTics -= ACTORMOVETICS) <= 0)
InitActorDecide(SpriteNum);
return 0;
}
int DoGoroMove(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
ASSERT(SpriteNum >= 0);
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
if (u->track >= 0)
ActorFollowTrack(SpriteNum, ACTORMOVETICS);
else
(*u->ActorActionFunc)(SpriteNum);
ASSERT(User[SpriteNum]);
KeepActorOnFloor(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
#include "saveable.h"
static saveable_code saveable_goro_code[] =
{
SAVE_CODE(SetupGoro),
SAVE_CODE(NullGoro),
SAVE_CODE(DoGoroPain),
SAVE_CODE(DoGoroMove),
};
static saveable_data saveable_goro_data[] =
{
SAVE_DATA(GoroBattle),
SAVE_DATA(GoroOffense),
SAVE_DATA(GoroBroadcast),
SAVE_DATA(GoroSurprised),
SAVE_DATA(GoroEvasive),
SAVE_DATA(GoroLostTarget),
SAVE_DATA(GoroCloseRange),
SAVE_DATA(GoroPersonality),
SAVE_DATA(GoroAttrib),
SAVE_DATA(s_GoroRun),
SAVE_DATA(sg_GoroRun),
SAVE_DATA(s_GoroChop),
SAVE_DATA(sg_GoroChop),
SAVE_DATA(s_GoroSpell),
SAVE_DATA(sg_GoroSpell),
SAVE_DATA(s_GoroStand),
SAVE_DATA(sg_GoroStand),
SAVE_DATA(s_GoroPain),
SAVE_DATA(sg_GoroPain),
SAVE_DATA(s_GoroDie),
SAVE_DATA(s_GoroDead),
SAVE_DATA(sg_GoroDie),
SAVE_DATA(sg_GoroDead),
SAVE_DATA(GoroActionSet),
};
saveable_module saveable_goro =
{
// code
saveable_goro_code,
SIZ(saveable_goro_code),
// data
saveable_goro_data,
SIZ(saveable_goro_data)
};

View file

@ -0,0 +1,214 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 2007 Jonathon Fowler <jf@jonof.id.au>
This file is part of JFShadowWarrior
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "baselayer.h"
#include "scriptfile.h"
#include "cache1d.h"
#include "crc32.h"
#include "grpscan.h"
struct grpfile grpfiles[numgrpfiles] =
{
{ "Registered Version", 0x7545319F, 47536148, NULL },
{ "Shareware Version", 0x08A7FA1F, 26056769, NULL },
{ "Wanton Destruction (Addon)", 0xA9AAA7B7, 48698128, NULL },
};
struct grpfile *foundgrps = NULL;
#define GRPCACHEFILE "grpfiles.cache"
static struct grpcache
{
struct grpcache *next;
char name[BMAX_PATH+1];
int size;
int mtime;
unsigned int crcval;
} *grpcache = NULL, *usedgrpcache = NULL;
static int LoadGroupsCache(void)
{
struct grpcache *fg;
int fsize, fmtime, fcrcval;
char *fname;
scriptfile *script;
script = scriptfile_fromfile(GRPCACHEFILE);
if (!script) return -1;
while (!scriptfile_eof(script))
{
if (scriptfile_getstring(script, &fname)) break; // filename
if (scriptfile_getnumber(script, &fsize)) break; // filesize
if (scriptfile_getnumber(script, &fmtime)) break; // modification time
if (scriptfile_getnumber(script, &fcrcval)) break; // crc checksum
fg = calloc(1, sizeof(struct grpcache));
fg->next = grpcache;
grpcache = fg;
strncpy(fg->name, fname, BMAX_PATH);
fg->size = fsize;
fg->mtime = fmtime;
fg->crcval = fcrcval;
}
scriptfile_close(script);
return 0;
}
static void FreeGroupsCache(void)
{
struct grpcache *fg;
while (grpcache)
{
fg = grpcache->next;
free(grpcache);
grpcache = fg;
}
}
int ScanGroups(void)
{
CACHE1D_FIND_REC *srch, *sidx;
struct grpcache *fg, *fgg;
struct grpfile *grp;
char *fn;
struct Bstat st;
buildputs("Scanning for GRP files...\n");
LoadGroupsCache();
srch = klistpath("/", "*.grp", CACHE1D_FIND_FILE);
for (sidx = srch; sidx; sidx = sidx->next)
{
for (fg = grpcache; fg; fg = fg->next)
{
if (!Bstrcmp(fg->name, sidx->name)) break;
}
if (fg)
{
if (findfrompath(sidx->name, &fn)) continue; // failed to resolve the filename
if (Bstat(fn, &st)) { free(fn); continue; } // failed to stat the file
free(fn);
if (fg->size == st.st_size && fg->mtime == st.st_mtime)
{
grp = (struct grpfile *)calloc(1, sizeof(struct grpfile));
grp->name = strdup(sidx->name);
grp->crcval = fg->crcval;
grp->size = fg->size;
grp->next = foundgrps;
foundgrps = grp;
fgg = (struct grpcache *)calloc(1, sizeof(struct grpcache));
strcpy(fgg->name, fg->name);
fgg->size = fg->size;
fgg->mtime = fg->mtime;
fgg->crcval = fg->crcval;
fgg->next = usedgrpcache;
usedgrpcache = fgg;
continue;
}
}
{
int b, fh;
unsigned int crcval;
unsigned char buf[16*512];
fh = openfrompath(sidx->name, BO_RDONLY|BO_BINARY, BS_IREAD);
if (fh < 0) continue;
if (fstat(fh, &st)) continue;
buildprintf(" Checksumming %s...", sidx->name);
crc32init(&crcval);
do
{
b = read(fh, buf, sizeof(buf));
if (b > 0) crc32block(&crcval, buf, b);
}
while (b == sizeof(buf));
crc32finish(&crcval);
close(fh);
buildputs(" Done\n");
grp = (struct grpfile *)calloc(1, sizeof(struct grpfile));
grp->name = strdup(sidx->name);
grp->crcval = crcval;
grp->size = st.st_size;
grp->next = foundgrps;
foundgrps = grp;
fgg = (struct grpcache *)calloc(1, sizeof(struct grpcache));
strncpy(fgg->name, sidx->name, BMAX_PATH);
fgg->size = st.st_size;
fgg->mtime = st.st_mtime;
fgg->crcval = crcval;
fgg->next = usedgrpcache;
usedgrpcache = fgg;
}
}
klistfree(srch);
FreeGroupsCache();
if (usedgrpcache)
{
FILE *fp;
fp = fopen(GRPCACHEFILE, "wt");
if (fp)
{
for (fg = usedgrpcache; fg; fg=fgg)
{
fgg = fg->next;
fprintf(fp, "\"%s\" %d %d %d\n", fg->name, fg->size, fg->mtime, fg->crcval);
free(fg);
}
fclose(fp);
}
}
return 0;
}
void FreeGroups(void)
{
struct grpfile *fg;
while (foundgrps)
{
fg = foundgrps->next;
free((char *)foundgrps->name);
free(foundgrps);
foundgrps = fg;
}
}

View file

@ -0,0 +1,40 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 2007 Jonathon Fowler <jf@jonof.id.au>
This file is part of JFShadowWarrior
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
#ifndef grpscan_h__
#define grpscan_h__
// List of internally-known GRP files
#define numgrpfiles 3
struct grpfile
{
const char *name;
int crcval;
int size;
struct grpfile *next;
} grpfiles[numgrpfiles], *foundgrps;
int ScanGroups(void);
void FreeGroups(void);
#endif

View file

@ -0,0 +1,675 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "game.h"
#include "tags.h"
#include "ai.h"
#include "actor.h"
#include "weapon.h"
#include "track.h"
#include "sprite.h"
ANIMATOR DoHornetCircle, InitHornetCircle;
DECISION HornetBattle[] =
{
{50, InitHornetCircle },
{798, InitActorMoveCloser },
{800, InitActorAlertNoise },
{1024, InitActorRunAway }
};
DECISION HornetOffense[] =
{
{1022, InitActorMoveCloser },
{1024, InitActorAlertNoise }
};
DECISION HornetBroadcast[] =
{
{3, InitActorAlertNoise },
{6, InitActorAmbientNoise },
{1024, InitActorDecide }
};
DECISION HornetSurprised[] =
{
{100, InitHornetCircle },
{701, InitActorMoveCloser },
{1024, InitActorDecide }
};
DECISION HornetEvasive[] =
{
{20, InitHornetCircle },
{1024, NULL },
};
DECISION HornetLostTarget[] =
{
{900, InitActorFindPlayer },
{1024, InitActorWanderAround }
};
DECISION HornetCloseRange[] =
{
{900, InitActorMoveCloser },
{1024, InitActorReposition }
};
ANIMATOR InitHornetSting;
DECISION HornetTouchTarget[] =
{
{500, InitHornetCircle },
{1024, InitHornetSting }
};
PERSONALITY HornetPersonality =
{
HornetBattle,
HornetOffense,
HornetBroadcast,
HornetSurprised,
HornetEvasive,
HornetLostTarget,
HornetCloseRange,
HornetTouchTarget
};
ATTRIBUTE HornetAttrib =
{
{300, 350, 375, 400}, // Speeds
{0, 0, 0, 0}, // Tic Adjusts
0, //MaxWeapons;
{
0, 0, DIGI_HORNETSTING, DIGI_HORNETSTING, DIGI_HORNETDEATH,
0,0,0,0,0
}
};
//////////////////////
//
// HORNET RUN
//////////////////////
#define HORNET_RUN_RATE 7
ANIMATOR DoHornetMove,NullHornet,DoStayOnFloor, DoActorDebris, NullHornet, DoHornetBirth;
STATE s_HornetRun[5][2] =
{
{
{HORNET_RUN_R0 + 0, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[0][1]},
{HORNET_RUN_R0 + 1, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[0][0]},
},
{
{HORNET_RUN_R1 + 0, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[1][1]},
{HORNET_RUN_R1 + 1, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[1][0]},
},
{
{HORNET_RUN_R2 + 0, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[2][1]},
{HORNET_RUN_R2 + 1, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[2][0]},
},
{
{HORNET_RUN_R3 + 0, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[3][1]},
{HORNET_RUN_R3 + 1, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[3][0]},
},
{
{HORNET_RUN_R4 + 0, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[4][1]},
{HORNET_RUN_R4 + 1, HORNET_RUN_RATE, DoHornetMove, &s_HornetRun[4][0]},
}
};
STATEp sg_HornetRun[] =
{
&s_HornetRun[0][0],
&s_HornetRun[1][0],
&s_HornetRun[2][0],
&s_HornetRun[3][0],
&s_HornetRun[4][0]
};
//////////////////////
//
// HORNET STAND
//
//////////////////////
#define HORNET_STAND_RATE (HORNET_RUN_RATE + 5)
STATE s_HornetStand[5][2] =
{
{
{HORNET_RUN_R0 + 0, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[0][1]},
{HORNET_RUN_R0 + 1, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[0][0]}
},
{
{HORNET_RUN_R1 + 0, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[1][1]},
{HORNET_RUN_R1 + 1, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[1][0]}
},
{
{HORNET_RUN_R2 + 0, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[2][1]},
{HORNET_RUN_R2 + 1, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[2][0]}
},
{
{HORNET_RUN_R3 + 0, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[3][1]},
{HORNET_RUN_R3 + 1, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[3][0]}
},
{
{HORNET_RUN_R4 + 0, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[4][1]},
{HORNET_RUN_R4 + 1, HORNET_STAND_RATE, DoHornetMove, &s_HornetStand[4][0]}
}
};
STATEp sg_HornetStand[] =
{
&s_HornetStand[0][0],
&s_HornetStand[1][0],
&s_HornetStand[2][0],
&s_HornetStand[3][0],
&s_HornetStand[4][0]
};
//////////////////////
//
// HORNET DIE
//
//////////////////////
#define HORNET_DIE_RATE 20
ANIMATOR DoHornetDeath;
STATE s_HornetDie[] =
{
#if 0
{HORNET_DIE + 0, HORNET_DIE_RATE, NullHornet, &s_HornetDie[1]},
{HORNET_DEAD, HORNET_DIE_RATE, DoActorDebris, &s_HornetDie[1]},
#else
{HORNET_DIE + 0, HORNET_DIE_RATE, DoHornetDeath, &s_HornetDie[0]},
#endif
};
STATEp sg_HornetDie[] =
{
s_HornetDie
};
STATE s_HornetDead[] =
{
{HORNET_DEAD, HORNET_DIE_RATE, DoActorDebris, &s_HornetDead[0]},
};
STATEp sg_HornetDead[] =
{
s_HornetDead
};
/*
STATEp *Stand[MAX_WEAPONS];
STATEp *Run;
STATEp *Jump;
STATEp *Fall;
STATEp *Crawl;
STATEp *Swim;
STATEp *Fly;
STATEp *Rise;
STATEp *Sit;
STATEp *Look;
STATEp *Climb;
STATEp *Pain;
STATEp *Death1;
STATEp *Death2;
STATEp *Dead;
STATEp *DeathJump;
STATEp *DeathFall;
STATEp *CloseAttack[2];
STATEp *Attack[6];
STATEp *Special[2];
*/
ACTOR_ACTION_SET HornetActionSet =
{
sg_HornetStand,
sg_HornetRun,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL, //climb
NULL, //pain
sg_HornetDie,
NULL,
sg_HornetDead,
NULL,
NULL,
{NULL},
{0},
{NULL},
{0},
{NULL},
NULL,
NULL
};
int DoHornetMatchPlayerZ(short SpriteNum);
int
SetupHornet(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u;
ANIMATOR DoActorDecide;
if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
{
u = User[SpriteNum];
ASSERT(u);
}
else
{
User[SpriteNum] = u = SpawnUser(SpriteNum,HORNET_RUN_R0,s_HornetRun[0]);
u->Health = HEALTH_HORNET;
}
ChangeState(SpriteNum, s_HornetRun[0]);
u->Attrib = &HornetAttrib;
DoActorSetSpeed(SpriteNum, NORM_SPEED);
u->StateEnd = s_HornetDie;
u->Rot = sg_HornetRun;
EnemyDefaults(SpriteNum, &HornetActionSet, &HornetPersonality);
SET(u->Flags, SPR_NO_SCAREDZ|SPR_XFLIP_TOGGLE);
SET(sp->cstat, CSTAT_SPRITE_YCENTER);
sp->clipdist = (100) >> 2;
u->floor_dist = Z(16);
u->ceiling_dist = Z(16);
u->sz = sp->z;
sp->xrepeat = 37;
sp->yrepeat = 32;
// Special looping buzz sound attached to each hornet spawned
PlaySound(DIGI_HORNETBUZZ,&sp->x,&sp->y,&sp->z,v3df_follow|v3df_init);
Set3DSoundOwner(SpriteNum);
return 0;
}
int NullHornet(short SpriteNum)
{
USERp u = User[SpriteNum];
SPRITEp sp = User[SpriteNum]->SpriteP;
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
DoHornetMatchPlayerZ(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
int DoHornetMatchPlayerZ(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
SPRITEp tsp = User[SpriteNum]->tgt_sp;
long zdiff,zdist;
long loz,hiz;
long bound;
// actor does a sine wave about u->sz - this is the z mid point
//zdiff = (SPRITEp_LOWER(tsp) - Z(8)) - u->sz;
zdiff = (SPRITEp_MID(tsp)) - u->sz;
// check z diff of the player and the sprite
zdist = Z(20 + RANDOM_RANGE(200)); // put a random amount
if (labs(zdiff) > zdist)
{
if (zdiff > 0)
// manipulate the z midpoint
//u->sz += 256 * ACTORMOVETICS;
u->sz += 1024 * ACTORMOVETICS;
else
u->sz -= 256 * ACTORMOVETICS;
}
#define HORNET_BOB_AMT (Z(16))
// save off lo and hi z
loz = u->loz;
hiz = u->hiz;
// adjust loz/hiz for water depth
if (u->lo_sectp && SectUser[u->lo_sectp - sector] && SectUser[u->lo_sectp - sector]->depth)
loz -= Z(SectUser[u->lo_sectp - sector]->depth) - Z(8);
// lower bound
if (u->lo_sp)
bound = loz - u->floor_dist;
else
bound = loz - u->floor_dist - HORNET_BOB_AMT;
if (u->sz > bound)
{
u->sz = bound;
}
// upper bound
if (u->hi_sp)
bound = hiz + u->ceiling_dist;
else
bound = hiz + u->ceiling_dist + HORNET_BOB_AMT;
if (u->sz < bound)
{
u->sz = bound;
}
u->sz = min(u->sz, loz - u->floor_dist);
u->sz = max(u->sz, hiz + u->ceiling_dist);
u->Counter = (u->Counter + (ACTORMOVETICS << 3) + (ACTORMOVETICS << 1)) & 2047;
sp->z = u->sz + ((HORNET_BOB_AMT * (long)sintable[u->Counter]) >> 14);
bound = u->hiz + u->ceiling_dist + HORNET_BOB_AMT;
if (sp->z < bound)
{
// bumped something
sp->z = u->sz = bound + HORNET_BOB_AMT;
}
return 0;
}
int InitHornetCircle(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
u->ActorActionFunc = DoHornetCircle;
NewStateGroup(SpriteNum, u->ActorActionSet->Run);
// set it close
DoActorSetSpeed(SpriteNum, FAST_SPEED);
// set to really fast
sp->xvel = 400;
// angle adjuster
u->Counter2 = sp->xvel/3;
// random angle direction
if (RANDOM_P2(1024) < 512)
u->Counter2 = -u->Counter2;
// z velocity
u->jump_speed = 200 + RANDOM_P2(128);
if (labs(u->sz - u->hiz) < labs(u->sz - u->loz))
u->jump_speed = -u->jump_speed;
u->WaitTics = (RANDOM_RANGE(3)+1) * 60;
(*u->ActorActionFunc)(SpriteNum);
return 0;
}
int DoHornetCircle(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
SPRITEp tsp = User[SpriteNum]->tgt_sp;
long nx,ny,bound;
sp->ang = NORM_ANGLE(sp->ang + u->Counter2);
nx = sp->xvel * (long) sintable[NORM_ANGLE(sp->ang + 512)] >> 14;
ny = sp->xvel * (long) sintable[sp->ang] >> 14;
if (!move_actor(SpriteNum, nx, ny, 0L))
{
//ActorMoveHitReact(SpriteNum);
// try moving in the opposite direction
u->Counter2 = -u->Counter2;
sp->ang = NORM_ANGLE(sp->ang + 1024);
nx = sp->xvel * (long) sintable[NORM_ANGLE(sp->ang + 512)] >> 14;
ny = sp->xvel * (long) sintable[sp->ang] >> 14;
if (!move_actor(SpriteNum, nx, ny, 0L))
{
InitActorReposition(SpriteNum);
return 0;
}
}
// move in the z direction
u->sz -= u->jump_speed * ACTORMOVETICS;
bound = u->hiz + u->ceiling_dist + HORNET_BOB_AMT;
if (u->sz < bound)
{
// bumped something
u->sz = bound;
InitActorReposition(SpriteNum);
return 0;
}
// time out
if ((u->WaitTics -= ACTORMOVETICS) < 0)
{
InitActorReposition(SpriteNum);
u->WaitTics = 0;
return 0;
}
return 0;
}
int
DoHornetDeath(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
long nx, ny;
if (TEST(u->Flags, SPR_FALLING))
{
u->loz = u->zclip;
DoFall(SpriteNum);
}
else
{
RESET(sp->cstat, CSTAT_SPRITE_YCENTER);
u->jump_speed = 0;
u->floor_dist = 0;
DoBeginFall(SpriteNum);
DoFindGroundPoint(SpriteNum);
u->zclip = u->loz;
}
if (TEST(u->Flags, SPR_SLIDING))
DoActorSlide(SpriteNum);
// slide while falling
nx = sp->xvel * (long) sintable[NORM_ANGLE(sp->ang + 512)] >> 14;
ny = sp->xvel * (long) sintable[sp->ang] >> 14;
u->ret = move_sprite(SpriteNum, nx, ny, 0L, u->ceiling_dist, u->floor_dist, 1, ACTORMOVETICS);
// on the ground
if (sp->z >= u->loz)
{
RESET(u->Flags, SPR_FALLING|SPR_SLIDING);
RESET(sp->cstat, CSTAT_SPRITE_YFLIP); // If upside down, reset it
NewStateGroup(SpriteNum, u->ActorActionSet->Dead);
DeleteNoSoundOwner(SpriteNum);
return 0;
}
return 0;
}
// Hornets can swarm around other hornets or whatever is tagged as swarm target
int DoCheckSwarm(short SpriteNum)
{
short i,nexti;
SPRITEp sp = &sprite[SpriteNum], tsp;
USERp u = User[SpriteNum], tu;
long dist, pdist, a,b,c;
PLAYERp pp;
if (!MoveSkip8) return 0; // Don't over check
if (!u->tgt_sp) return 0;
// Who's the closest meat!?
DoActorPickClosePlayer(SpriteNum);
if (User[u->tgt_sp - sprite]->PlayerP)
{
pp = User[u->tgt_sp - sprite]->PlayerP;
DISTANCE(sp->x, sp->y, pp->posx, pp->posy, pdist, a, b, c);
}
else
return 0;
// all enemys
TRAVERSE_SPRITE_STAT(headspritestat[STAT_ENEMY], i, nexti)
{
tsp = &sprite[i];
tu = User[i];
if (!tu) continue;
if (tsp->hitag != TAG_SWARMSPOT || tsp->lotag != 2) continue;
DISTANCE(sp->x, sp->y, tsp->x, tsp->y, dist, a, b, c);
if (dist < pdist && u->ID == tu->ID) // Only flock to your own kind
{
u->tgt_sp = tsp; // Set target to swarm center
}
}
return TRUE;
}
int DoHornetMove(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
// Check for swarming
// lotag of 1 = Swarm around lotags of 2
// lotag of 0 is normal
if (sp->hitag == TAG_SWARMSPOT && sp->lotag == 1)
DoCheckSwarm(SpriteNum);
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
if (u->track >= 0)
ActorFollowTrack(SpriteNum, ACTORMOVETICS);
else
(*u->ActorActionFunc)(SpriteNum);
DoHornetMatchPlayerZ(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
#include "saveable.h"
static saveable_code saveable_hornet_code[] =
{
SAVE_CODE(SetupHornet),
SAVE_CODE(NullHornet),
SAVE_CODE(DoHornetMatchPlayerZ),
SAVE_CODE(InitHornetCircle),
SAVE_CODE(DoHornetCircle),
SAVE_CODE(DoHornetDeath),
SAVE_CODE(DoCheckSwarm),
SAVE_CODE(DoHornetMove),
};
static saveable_data saveable_hornet_data[] =
{
SAVE_DATA(HornetBattle),
SAVE_DATA(HornetOffense),
SAVE_DATA(HornetBroadcast),
SAVE_DATA(HornetSurprised),
SAVE_DATA(HornetEvasive),
SAVE_DATA(HornetLostTarget),
SAVE_DATA(HornetCloseRange),
SAVE_DATA(HornetTouchTarget),
SAVE_DATA(HornetPersonality),
SAVE_DATA(HornetAttrib),
SAVE_DATA(s_HornetRun),
SAVE_DATA(sg_HornetRun),
SAVE_DATA(s_HornetStand),
SAVE_DATA(sg_HornetStand),
SAVE_DATA(s_HornetDie),
SAVE_DATA(sg_HornetDie),
SAVE_DATA(s_HornetDead),
SAVE_DATA(sg_HornetDead),
SAVE_DATA(HornetActionSet),
};
saveable_module saveable_hornet =
{
// code
saveable_hornet_code,
SIZ(saveable_hornet_code),
// data
saveable_hornet_data,
SIZ(saveable_hornet_data)
};

View file

@ -0,0 +1,109 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "compat.h"
#include "pragmas.h"
#include "interp.h"
#define MAXINTERPOLATIONS 1024
int numinterpolations = 0, startofdynamicinterpolations = 0;
int oldipos[MAXINTERPOLATIONS];
int bakipos[MAXINTERPOLATIONS];
int *curipos[MAXINTERPOLATIONS];
void setinterpolation(int *posptr)
{
int i;
if (numinterpolations >= MAXINTERPOLATIONS)
return;
for (i = numinterpolations - 1; i >= 0; i--)
{
if (curipos[i] == posptr)
return;
}
curipos[numinterpolations] = posptr;
oldipos[numinterpolations] = *posptr;
numinterpolations++;
}
void stopinterpolation(int *posptr)
{
int i;
for (i = numinterpolations - 1; i >= startofdynamicinterpolations; i--)
{
if (curipos[i] == posptr)
{
numinterpolations--;
oldipos[i] = oldipos[numinterpolations];
bakipos[i] = bakipos[numinterpolations];
curipos[i] = curipos[numinterpolations];
}
}
}
void updateinterpolations(void) // Stick at beginning of domovethings
{
int i;
for (i = numinterpolations - 1; i >= 0; i--)
oldipos[i] = *curipos[i];
}
// must call restore for every do interpolations
// make sure you don't exit
void dointerpolations(int smoothratio) // Stick at beginning of drawscreen
{
int i, j, odelta, ndelta;
ndelta = 0;
j = 0;
for (i = numinterpolations - 1; i >= 0; i--)
{
bakipos[i] = *curipos[i];
odelta = ndelta;
ndelta = (*curipos[i]) - oldipos[i];
if (odelta != ndelta)
j = mulscale16(ndelta, smoothratio);
*curipos[i] = oldipos[i] + j;
}
}
void restoreinterpolations(void) // Stick at end of drawscreen
{
int i;
for (i = numinterpolations - 1; i >= 0; i--)
*curipos[i] = bakipos[i];
}

View file

@ -0,0 +1,43 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#define SHORT_MAXINTERPOLATIONS 256
extern short short_numinterpolations, short_startofdynamicinterpolations;
extern short short_oldipos[SHORT_MAXINTERPOLATIONS];
extern short short_bakipos[SHORT_MAXINTERPOLATIONS];
extern short *short_curipos[SHORT_MAXINTERPOLATIONS];
#define MAXINTERPOLATIONS 1024
extern int numinterpolations, startofdynamicinterpolations;
extern int oldipos[MAXINTERPOLATIONS];
extern int bakipos[MAXINTERPOLATIONS];
extern int *curipos[MAXINTERPOLATIONS];
void setinterpolation(int *posptr);
void stopinterpolation(int *posptr);
void updateinterpolations(void);
void dointerpolations(int smoothratio);
void restoreinterpolations(void);

View file

@ -0,0 +1,109 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "compat.h"
#include "pragmas.h"
#include "interp.h"
#define SHORT_MAXINTERPOLATIONS 256
short short_numinterpolations = 0, short_startofdynamicinterpolations = 0;
short short_oldipos[SHORT_MAXINTERPOLATIONS];
short short_bakipos[SHORT_MAXINTERPOLATIONS];
short *short_curipos[SHORT_MAXINTERPOLATIONS];
void short_setinterpolation(short *posptr)
{
int i;
if (short_numinterpolations >= SHORT_MAXINTERPOLATIONS)
return;
for (i = short_numinterpolations - 1; i >= 0; i--)
{
if (short_curipos[i] == posptr)
return;
}
short_curipos[short_numinterpolations] = posptr;
short_oldipos[short_numinterpolations] = *posptr;
short_numinterpolations++;
}
void short_stopinterpolation(short *posptr)
{
int i;
for (i = short_numinterpolations - 1; i >= short_startofdynamicinterpolations; i--)
{
if (short_curipos[i] == posptr)
{
short_numinterpolations--;
short_oldipos[i] = short_oldipos[short_numinterpolations];
short_bakipos[i] = short_bakipos[short_numinterpolations];
short_curipos[i] = short_curipos[short_numinterpolations];
}
}
}
void short_updateinterpolations(void) // Stick at beginning of domovethings
{
int i;
for (i = short_numinterpolations - 1; i >= 0; i--)
short_oldipos[i] = *short_curipos[i];
}
// must call restore for every do interpolations
// make sure you don't exit
void short_dointerpolations(int smoothratio) // Stick at beginning of drawscreen
{
int i, j, odelta, ndelta;
ndelta = 0;
j = 0;
for (i = short_numinterpolations - 1; i >= 0; i--)
{
short_bakipos[i] = *short_curipos[i];
odelta = ndelta;
ndelta = (*short_curipos[i]) - short_oldipos[i];
if (odelta != ndelta)
j = mulscale16(ndelta, smoothratio);
*short_curipos[i] = short_oldipos[i] + j;
}
}
void short_restoreinterpolations(void) // Stick at end of drawscreen
{
int i;
for (i = short_numinterpolations - 1; i >= 0; i--)
*short_curipos[i] = short_bakipos[i];
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,61 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
enum InventoryNames
{
INVENTORY_MEDKIT,
INVENTORY_REPAIR_KIT,
INVENTORY_CLOAK, // de-cloak when firing
INVENTORY_NIGHT_VISION,
INVENTORY_CHEMBOMB,
INVENTORY_FLASHBOMB,
INVENTORY_CALTROPS,
MAX_INVENTORY
};
typedef struct
{
char *Name;
VOID (*Init)(PLAYERp);
VOID (*Stop)(PLAYERp, short);
PANEL_STATEp State;
short DecPerSec;
short MaxInv;
long Scale;
short Flags;
} INVENTORY_DATA, *INVENTORY_DATAp;
extern INVENTORY_DATA InventoryData[MAX_INVENTORY+1];
#define INVF_AUTO_USE (BIT(0))
#define INVF_TIMED (BIT(1))
#define INVF_COUNT (BIT(2))
void PlayerUpdateInventory(PLAYERp pp,short InventoryNum);
void UpdateMiniBar(PLAYERp pp);
void InventoryKeys(PLAYERp pp);
void UseInventoryRepairKit(PLAYERp pp);
void InventoryTimer(PLAYERp pp);

View file

@ -0,0 +1,221 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2005 - 3D Realms Entertainment
This file is NOT part of Shadow Warrior version 1.2
However, it is either an older version of a file that is, or is
some test code written during the development of Shadow Warrior.
This file is provided purely for educational interest.
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "editor.h"
#include "cache1d.h"
#include "keys.h"
#include "names2.h"
#include "game.h"
#define M_RED 12
#define M_BLUE 9
// Globals
static char tempbuf[256];
// Prototypes
void Message(char *string, char color);
long GetAToken(char *name, char *tc, long length);
BYTEp BKeyPressed(VOID);
VOID ResetKeys(VOID);
// Functions
void Msg(char *string, char color)
{
clearmidstatbar16();
printext16(1*4,ydim16+4*8,color,-1,string,1);
}
// @ symbol precedes a tag name target
// # symbol precedes a comment in the help file
long GetAToken(char *name, char *tc, long length)
{
int i,x=0;
char t,*tmp,tokenfound=0;
char token[10];
long count=0;
do
{
// Find the token symbol
do
{
t = *tc;
tc++;
count++;
}
while (t!='@' && count < length);
if (t=='@')
{
tmp = token;
x=1;
do
{
// Read in the token
*tmp = t;
tmp++;
t = *tc;
tc++;
x++;
count++;
}
while (t>=48 && t!='@' && x < 9 && count < length);
*tmp = 0;
if (!strcmp(name,Bstrupr(token)))
tokenfound = 1;
}
}
while (!tokenfound && count < length);
if (!tokenfound) count=0;
return count;
}
void ContextHelp(short spritenum)
{
int i,fp,x=0,y=4;
char t,*tc;
char name[20];
char *filebuffer;
SPRITEp sp;
short hitag=0;
long size=0,tokresult=0;
sp = &sprite[spritenum];
clearmidstatbar16();
if ((fp=kopen4load("swbhelp.hlp",0)) == -1)
{
Msg("ERROR: Help file not found.",M_RED);
return;
}
// Read in whole file
size = kfilelength(fp);
filebuffer = (char *)malloc(size);
if (filebuffer == NULL)
{
Msg("Not enough memory to load swhelp.hlp",M_RED);
return;
}
if (kread(fp, filebuffer, size) != size)
{
Msg("Unexpected end of file while reading swhelp.hlp",M_RED);
kclose(fp);
return;
}
// close the file
kclose(fp);
// Conver filebuffer to all upper case
//strupr(filebuffer);
// Assign a token name to search for based on the sprite being pointed to.
// Make the token
// Make sure 500-600 SOBJ bounding tags all say the same thing.
hitag = sp->hitag;
if (hitag > 500 && hitag <= 600) hitag = 500;
// Give help summary for unknown sprites.
if ((hitag == 0 || hitag > 1006) && sp->lotag == 0) hitag = 999;
sprintf(name,"@TAG%d",hitag);
tc = filebuffer;
if (!(tokresult = GetAToken(name,tc,size)))
{
// This message should never happen unless something is real wrong!
Msg("No help available.",M_RED);
return;
}
tc += tokresult;
do
{
tc++;
t = *tc;
while (t!='\n' && t!='@' && t!='#' && x<128)
{
tempbuf[x]=t;
tc++;
t = *tc;
x++;
if (x >= 128) break;
}
tempbuf[x]=0;
x=0;
printext16(x*4,ydim16+(y*6)+2,11,-1,tempbuf,1);
y++;
if (y>16)
{
y=18;
printext16(x*4,ydim16+(y*6)+2,11,-1,"Hit any key to continue or Q to quit....",1);
while (BKeyPressed() == NULL) ;
if (keystatus[KEYSC_Q])
{
clearmidstatbar16();
return;
}
ResetKeys();
clearmidstatbar16();
y=6;
}
}
while (t!='@' && t!='#');
}

View file

@ -0,0 +1,37 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
// My pic names file
#ifndef JNAMES_H
#define JNAMES_H
#define MIRROR 340
#define FLOORMIRROR 341
#define CAMSPRITE 3830
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,899 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
// JPLAYER.C
// Copyright (c) 1996 by Jim Norwood
#include "build.h"
#include "mytypes.h"
#include "keys.h"
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "tags.h"
#include "player.h"
#include "lists.h"
#include "warp.h"
#include "quake.h"
#include "common_game.h"
#include "function.h"
#include "control.h"
#include "trigger.h"
#include "savedef.h"
#include "menus.h"
#include "net.h"
#include "pal.h"
#include "bots.h"
BOOL WeaponOK(PLAYERp pp);
#define MAXANGVEL 80
// From build.h
#define CLIPMASK0 (((1L)<<16)+1L)
#define CLIPMASK1 (((256L)<<16)+64L)
// PLAYER QUOTES TO OTHER PLAYERS ////////////////////////////////////////////////////////////
#define STARTALPHANUM 4608 // New SW font for typing in stuff, It's in ASCII order.
#define ENDALPHANUM 4701
#define MINIFONT 2930 // Start of small font, it's blue for good palette swapping
#define NUMPAGES 1
#define NUMOFFIRSTTIMEACTIVE 100 // You can save up to 100 strings in the message history queue
char pus, pub; // Global text vars
char fta_quotes[NUMOFFIRSTTIMEACTIVE][64];
int gametext(int x,int y,char *t,char s,short dabits)
{
short ac,newx;
char centre, *oldt;
centre = (x == (320>>1));
newx = 0;
oldt = t;
if (centre)
{
while (*t)
{
if (*t == 32) {newx+=5; t++; continue; }
else ac = *t - '!' + STARTALPHANUM;
if (ac < STARTALPHANUM || ac > ENDALPHANUM) break;
if (*t >= '0' && *t <= '9')
newx += 8;
else newx += tilesizx[ac];
t++;
}
t = oldt;
x = (320>>1)-(newx>>1);
}
while (*t)
{
if (*t == 32) {x+=5; t++; continue; }
else ac = *t - '!' + STARTALPHANUM;
if (ac < STARTALPHANUM || ac > ENDALPHANUM)
break;
rotatesprite(x<<16,y<<16,65536L,0,ac,s,16,dabits,0,0,xdim-1,ydim-1);
if (*t >= '0' && *t <= '9')
x += 8;
else x += tilesizx[ac];
t++;
}
return x;
}
int minigametext(int x,int y,char *t,char s,short dabits)
{
short ac,newx;
char centre, *oldt;
centre = (x == (320>>1));
newx = 0;
oldt = t;
if (centre)
{
while (*t)
{
if (*t == 32) {newx+=4; t++; continue; }
else ac = *t - '!' + 2930;
if ((ac < 2930 || ac > 3023) && *t != asc_Space) break;
if (*t > asc_Space && *t < 127)
{
newx += tilesizx[ac];
}
else
x += 4;
t++;
}
t = oldt;
x = (320>>1)-(newx>>1);
}
while (*t)
{
if (*t == 32) {x+=4; t++; continue; }
else ac = *t - '!' + 2930;
if ((ac < 2930 || ac > 3023) && *t != asc_Space) break;
if (*t > asc_Space && *t < 127)
{
rotatesprite(x<<16,y<<16,65536L,0,ac,-128,17,dabits,0,0,xdim-1,ydim-1);
x += tilesizx[ac];
}
else
x += 4;
t++;
}
return x;
}
int minitext(int x,int y,char *t,char p,char sb)
{
short ac;
while (*t)
{
*t = toupper(*t);
if (*t == 32) {x+=5; t++; continue; }
else ac = *t - '!' + MINIFONT;
rotatesprite(x<<16,y<<16,65536L,0,ac,0,p,sb,0,0,xdim-1,ydim-1);
x += 4; // tilesizx[ac]+1;
t++;
}
return x;
}
int minitextshade(int x,int y,char *t,char s,char p,char sb)
{
short ac;
while (*t)
{
*t = toupper(*t);
if (*t == 32) {x+=5; t++; continue; }
else ac = *t - '!' + MINIFONT;
rotatesprite(x<<16,y<<16,65536L,0,ac,s,p,sb,0,0,xdim-1,ydim-1);
x += 4; // tilesizx[ac]+1;
t++;
}
return x;
}
int quotebot, quotebotgoal;
short user_quote_time[MAXUSERQUOTES];
char user_quote[MAXUSERQUOTES][256];
void adduserquote(char *daquote)
{
int i;
SetRedrawScreen(Player+myconnectindex);
for (i=MAXUSERQUOTES-1; i>0; i--)
{
strcpy(user_quote[i],user_quote[i-1]);
user_quote_time[i] = user_quote_time[i-1];
}
strcpy(user_quote[0],daquote);
user_quote_time[0] = 180;
}
void operatefta(void)
{
int i, j, k;
j=MESSAGE_LINE; // Base line position on screen
quotebot = min(quotebot,j);
quotebotgoal = min(quotebotgoal,j);
if (MessageInputMode)
j -= 6; // Bump all lines up one to make room for new line
quotebotgoal = j;
j = quotebot;
for (i=0; i<MAXUSERQUOTES; i++)
{
k = user_quote_time[i];
if (k <= 0)
break;
if (gs.BorderNum <= BORDER_BAR+1)
{
// dont fade out
if (k > 4)
minigametext(320>>1,j,user_quote[i],0,2+8);
else if (k > 2)
minigametext(320>>1,j,user_quote[i],0,2+8+1);
else
minigametext(320>>1,j,user_quote[i],0,2+8+1+32);
}
else
{
// dont fade out
minigametext(320>>1,j,user_quote[i],0,2+8);
}
j -= 6;
}
}
//////////// Console Message Queue ////////////////////////////////////
int conbot, conbotgoal;
char con_quote[MAXCONQUOTES][256];
void addconquote(char *daquote)
{
int i;
for (i=MAXCONQUOTES-1; i>0; i--)
{
strcpy(con_quote[i],con_quote[i-1]);
}
strcpy(con_quote[0],daquote);
}
#define CON_ROT_FLAGS (ROTATE_SPRITE_CORNER|ROTATE_SPRITE_SCREEN_CLIP|ROTATE_SPRITE_NON_MASK)
void operateconfta(void)
{
int i, j, k;
if (!ConPanel) return; // If panel isn't up, don't draw anything
// Draw the background console pic
rotatesprite((0)<<16,(0)<<16,65536L,0,5119,0,0,CON_ROT_FLAGS,0,0,xdim-1,ydim-1);
j=99; // Base line position on screen
conbot = min(conbot,j);
conbotgoal = min(conbotgoal,j);
if (ConInputMode) j -= 6; // Bump all lines up one to make room for new line
conbotgoal = j; j = conbot;
for (i=0; i<MAXCONQUOTES; i++)
{
MNU_DrawSmallString(27, j, con_quote[i], 0, 17); // 17 = white
j -= 6;
}
}
// BOT STUFF ////////////////////////////////////////////////////////////////////////////////
void BOT_UseInventory(PLAYERp p, short targetitem, SW_PACKET *syn)
{
// Try to get to item
if (p->InventoryNum == targetitem)
syn->bits |= (1<<SK_INV_USE);
else
{
syn->bits |= (1<<SK_INV_LEFT); // Scroll to it
syn->bits |= (1<<SK_INV_USE); // Use whatever you're on too
}
}
void BOT_ChooseWeapon(PLAYERp p, USERp u, SW_PACKET *syn)
{
short weap;
// If you have a nuke, fire it
if (u->WeaponNum == WPN_MICRO && p->WpnRocketNuke && p->WpnRocketType != 2)
{
syn->bits ^= 15;
syn->bits |= 4;
}
else
for (weap=9; weap>=0; weap--)
{
if (weap <= u->WeaponNum) break;
if (TEST(p->WpnFlags, BIT(weap)) && p->WpnAmmo[weap] > DamageData[weap].min_ammo)
{
syn->bits ^= 15;
syn->bits |= weap;
break;
}
}
}
int getspritescore(int snum, int dapicnum)
{
switch (dapicnum)
{
case ICON_STAR: return 5;
case ICON_UZI: return 20;
case ICON_UZIFLOOR: return 20;
case ICON_LG_UZI_AMMO: return 15;
case ICON_HEART: return 160;
case ICON_HEART_LG_AMMO: return 60;
case ICON_GUARD_HEAD: return 170;
case ICON_FIREBALL_LG_AMMO: return 70;
case ICON_ROCKET: return 100;
case ICON_SHOTGUN: return 130;
case ICON_LG_ROCKET: return 100;
case ICON_LG_SHOTSHELL: return 30;
case ICON_MICRO_GUN: return 200;
case ICON_MICRO_BATTERY: return 100;
case ICON_GRENADE_LAUNCHER: return 150;
case ICON_LG_GRENADE: return 50;
case ICON_LG_MINE: return 150;
case ICON_RAIL_GUN: return 180;
case ICON_RAIL_AMMO: return 80;
case ST_QUICK_EXIT:
case ST_QUICK_SCAN:
case ICON_MEDKIT:
case ICON_CHEMBOMB:
case ICON_FLASHBOMB:
case ICON_NUKE:
case ICON_CALTROPS:
case TRACK_SPRITE:
case ST1:
case ST2:
case ST_QUICK_JUMP:
case ST_QUICK_JUMP_DOWN:
case ST_QUICK_SUPER_JUMP: return 120; break;
// Commented out for now, example.
// case FREEZEAMMO: if (ps[snum].ammo_amount[FREEZE_WEAPON] < max_ammo_amount[FREEZE_WEAPON]) return(10); else return(0);
}
return 0;
}
static int fdmatrix[13][13] =
{
//SWRD SHUR UZI SHOT RPG 40MM MINE RAIL HEAD HEAD2HEAD3HEART
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, //SWRD
{1024, 512, 128, 128,2560, 128,2560, 128,2560,2560,2560, 128, 128}, //SHUR
{2560,1024, 512, 512,2560, 128,2560,2560,1024,2560,2560,2560,2560}, //UZI
{ 512, 512, 512, 512,2560, 128,2560, 512, 512, 512, 512, 512, 512}, //SHOT
{2560,2560,2560,2560,2560,2560,2560,2560,2560,2560,2560,2560,2560}, //RPG
{ 512, 512, 512, 512,2048, 512,2560,2560, 512,2560,2560,2560,2560}, //40MM
{ 128, 128, 128, 128, 512, 128, 128, 128, 128, 128, 128, 128, 128}, //MINE
{1536,1536,1536,1536,2560,1536,1536,1536,1536,1536,1536,1536,1536}, //RAIL
{2560,1024, 512,1024,1024,1024,2560, 512,1024,2560,2560, 512, 512}, //HEAD1
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, //HEAD2
{ 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512}, //HEAD3
{1024, 512, 128, 128,2560, 512,2560,1024, 128,2560,1024,1024,1024}, //HEART
};
static int goalx[MAX_SW_PLAYERS_REG], goaly[MAX_SW_PLAYERS_REG], goalz[MAX_SW_PLAYERS_REG];
static int goalsect[MAX_SW_PLAYERS_REG], goalwall[MAX_SW_PLAYERS_REG], goalsprite[MAX_SW_PLAYERS_REG];
static int goalplayer[MAX_SW_PLAYERS_REG], clipmovecount[MAX_SW_PLAYERS_REG];
short searchsect[MAXSECTORS], searchparent[MAXSECTORS];
char dashow2dsector[(MAXSECTORS+7)>>3];
void computergetinput(int snum, SW_PACKET *syn)
{
int i, j, k, l, x1, y1, z1, x2, y2, z2, x3, y3, z3, dx, dy, nextj;
int dist, daang, zang, fightdist, damyang, damysect;
int startsect, endsect, splc, send, startwall, endwall;
short dasect, dawall, daspr;
PLAYERp p;
walltype *wal;
int myx, myy, myz, myang, mycursectnum;
USERp u;
short weap;
//extern BOOL Pachinko_Win_Cheat;
if (!MoveSkip4) return; // Make it so the bots don't slow the game down so bad!
p = &Player[snum];
u = User[p->PlayerSprite]; // Set user struct
// Copy current weapon number to player struct
p->WpnNum = u->WeaponNum;
if (p->WpnNum >= MAX_WEAPONS) p->WpnNum = MAX_WEAPONS-1;
// Init local position variables
myx = p->posx;
myy = p->posy;
myz = p->posz;
myang = p->pang;
mycursectnum = p->cursectnum;
// Reset input bits
syn->vel = 0;
syn->svel = 0;
syn->angvel = 0;
syn->aimvel = 0;
syn->bits = 0;
x1 = p->posx;
y1 = p->posy;
z1 = p->posz;
damyang = p->pang;
damysect = sprite[p->PlayerSprite].sectnum;
if ((numplayers >= 2) && (snum == myconnectindex))
{ x1 = myx; y1 = myy; z1 = myz+PLAYER_HEIGHT; damyang = myang; damysect = mycursectnum; }
// Always operate everything
syn->bits |= (1<<SK_OPERATE);
// If bot can't see the goal enemy, set target to himself so that he
// will pick a new target
if (TEST(Player[goalplayer[snum]].Flags, PF_DEAD) || STD_RANDOM_RANGE(1000) > 800)
goalplayer[snum] = snum;
else
{
x2 = Player[goalplayer[snum]].posx;
y2 = Player[goalplayer[snum]].posy;
z2 = Player[goalplayer[snum]].posz;
if (!FAFcansee(x1,y1,z1-(48<<8),damysect,x2,y2,z2-(48<<8),sprite[Player[goalplayer[snum]].PlayerSprite].sectnum))
goalplayer[snum] = snum;
}
// Pick a new target player if goal is dead or target is itself
if (goalplayer[snum] == snum)
{
j = 0x7fffffff;
for (i=connecthead; i>=0; i=connectpoint2[i])
if (i != snum)
{
if (TEST(Player[i].Flags, PF_DEAD))
continue;
x2 = Player[i].posx;
y2 = Player[i].posy;
z2 = Player[i].posz;
if (!FAFcansee(x1,y1,z1-(48<<8),damysect,x2,y2,z2-(48<<8),sprite[Player[i].PlayerSprite].sectnum))
continue;
dist = ksqrt((sprite[Player[i].PlayerSprite].x-x1)*(sprite[Player[i].PlayerSprite].x-x1)+(sprite[Player[i].PlayerSprite].y-y1)*(sprite[Player[i].PlayerSprite].y-y1));
if (dist < j) { j = dist; goalplayer[snum] = i; }
}
}
// Pick a weapon
BOT_ChooseWeapon(p, u, syn);
// x2,y2,z2 is the coordinates of the target sprite
x2 = Player[goalplayer[snum]].posx;
y2 = Player[goalplayer[snum]].posy;
z2 = Player[goalplayer[snum]].posz;
// If bot is dead, either barf or respawn
if (TEST(p->Flags, PF_DEAD))
{
if (STD_RANDOM_RANGE(1000) > 990)
{
syn->bits |= (1<<SK_SPACE_BAR); // Respawn
}
else
syn->bits |= (1<<SK_SHOOT); // Try to barf
}
// Need Health?
if (u->Health < p->MaxHealth)
BOT_UseInventory(p, INVENTORY_MEDKIT, syn);
// Check the missile stat lists to see what's being fired and
// take the appropriate action
TRAVERSE_SPRITE_STAT(headspritestat[STAT_MISSILE], j, nextj)
{
switch (sprite[j].picnum)
{
case FIREBALL: k = 0; break;
case BOLT_THINMAN_R0:
k = 0;
syn->bits |= (1<<SK_JUMP); // Always jump when rockets being fired!
break;
default: k = 0; break;
}
if (k)
{
x3 = sprite[j].x;
y3 = sprite[j].y;
z3 = sprite[j].z;
for (l=0; l<=8; l++)
{
if (tmulscale11(x3-x1,x3-x1,y3-y1,y3-y1,(z3-z1)>>4,(z3-z1)>>4) < 3072)
{
dx = sintable[(sprite[j].ang+512)&2047];
dy = sintable[sprite[j].ang&2047];
if ((x1-x3)*dy > (y1-y3)*dx) i = -k*512; else i = k*512;
syn->vel -= mulscale17(dy,i);
syn->svel += mulscale17(dx,i);
}
if (l < 7)
{
x3 += (mulscale14(sprite[j].xvel,sintable[(sprite[j].ang+512)&2047])<<2);
y3 += (mulscale14(sprite[j].xvel,sintable[sprite[j].ang&2047])<<2);
z3 += (sprite[j].zvel<<2);
}
else
{
hitscan(sprite[j].x,sprite[j].y,sprite[j].z,sprite[j].sectnum,
mulscale14(sprite[j].xvel,sintable[(sprite[j].ang+512)&2047]),
mulscale14(sprite[j].xvel,sintable[sprite[j].ang&2047]),
(int)sprite[j].zvel,
&dasect,&dawall,&daspr,&x3,&y3,&z3,CLIPMASK1);
}
}
}
}
if (!TEST(Player[goalplayer[snum]].Flags, PF_DEAD) && snum != goalplayer[snum] &&
((FAFcansee(x1,y1,z1-(24<<8),damysect,x2,y2,z2-(24<<8),sprite[Player[goalplayer[snum]].PlayerSprite].sectnum)) ||
(FAFcansee(x1,y1,z1-(48<<8),damysect,x2,y2,z2-(48<<8),sprite[Player[goalplayer[snum]].PlayerSprite].sectnum))))
{
// Shoot how often by skill level
short shootrnd=0;
shootrnd = STD_RANDOM_RANGE(1000);
if ((Skill == 0 && shootrnd > 990) ||
(Skill == 1 && shootrnd > 550) ||
(Skill == 2 && shootrnd > 350) ||
(Skill == 3))
syn->bits |= (1<<SK_SHOOT);
else
syn->bits &= ~(1<<SK_SHOOT);
// Jump sometimes, to try to be evasive
if (STD_RANDOM_RANGE(256) > 252)
syn->bits |= (1<<SK_JUMP);
// Make sure selected weapon is in range
//ASSERT(p->WpnNum < MAX_WEAPONS);
//ASSERT(Player[goalplayer[snum]].WpnNum < MAX_WEAPONS);
// Only fire explosive type weaps if you are not too close to the target!
if (u->WeaponNum == WPN_MICRO || u->WeaponNum == WPN_GRENADE || u->WeaponNum == WPN_RAIL)
{
int x4,y4,z4;
hitscan(x1,y1,z1-PLAYER_HEIGHT,damysect,sintable[(damyang+512)&2047],sintable[damyang&2047],
(100-p->horiz-p->horizoff)*32,&dasect,&dawall,&daspr,&x4,&y4,&z4,CLIPMASK1);
if ((x4-x1)*(x4-x1)+(y4-y1)*(y4-y1) < 2560*2560) syn->bits &= ~(1<<SK_SHOOT);
}
// Get fighting distance based on you and your opponents current weapons
fightdist = fdmatrix[p->WpnNum][Player[goalplayer[snum]].WpnNum];
if (fightdist < 128) fightdist = 128;
// Figure out your distance from the enemy target sprite
dist = ksqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); if (dist == 0) dist = 1;
daang = NORM_ANGLE(getangle(x2+(Player[goalplayer[snum]].xvect>>14)-x1,y2+(Player[goalplayer[snum]].yvect>>14)-y1));
zang = 100-((z2-z1)*8)/dist;
fightdist = max(fightdist,(klabs(z2-z1)>>4));
x3 = x2+((x1-x2)*fightdist/dist);
y3 = y2+((y1-y2)*fightdist/dist);
syn->vel += (x3-x1)*2047/dist;
syn->svel += (y3-y1)*2047/dist;
//Strafe attack
if (fightdist)
{
j = totalclock+snum*13468;
i = sintable[(j<<6)&2047];
i += sintable[((j+4245)<<5)&2047];
i += sintable[((j+6745)<<4)&2047];
i += sintable[((j+15685)<<3)&2047];
dx = sintable[(sprite[Player[goalplayer[snum]].PlayerSprite].ang+512)&2047];
dy = sintable[sprite[Player[goalplayer[snum]].PlayerSprite].ang&2047];
if ((x1-x2)*dy > (y1-y2)*dx) i += 8192; else i -= 8192;
syn->vel += ((sintable[(daang+1024)&2047]*i)>>17);
syn->svel += ((sintable[(daang+512)&2047]*i)>>17);
}
// Make aiming and running speed suck by skill level
if (Skill == 0)
{
daang = NORM_ANGLE((daang-256) + STD_RANDOM_RANGE(512));
syn->vel -= syn->vel/2;
syn->svel -= syn->svel/2;
}
else if (Skill == 1)
{
daang = NORM_ANGLE((daang-128) + STD_RANDOM_RANGE(256));
syn->vel -= syn->vel/8;
syn->svel -= syn->svel/8;
}
else if (Skill == 2)
daang = NORM_ANGLE((daang-64) + STD_RANDOM_RANGE(128));
// Below formula fails in certain cases
//syn->angvel = min(max((((daang+1024-damyang)&2047)-1024)>>1,-MAXANGVEL),MAXANGVEL); //was 127
p->pang = daang;
syn->aimvel = min(max((zang-p->horiz)>>1,-PLAYER_HORIZ_MAX),PLAYER_HORIZ_MAX);
// Sets type of aiming, auto aim for bots
syn->bits |= (1<<SK_AUTO_AIM);
return;
}
goalsect[snum] = -1;
#if 1
if (goalsect[snum] < 0)
{
goalwall[snum] = -1;
startsect = sprite[p->PlayerSprite].sectnum;
endsect = sprite[Player[goalplayer[snum]].PlayerSprite].sectnum;
clearbufbyte(dashow2dsector,(MAXSECTORS+7)>>3,0L);
searchsect[0] = startsect;
searchparent[0] = -1;
dashow2dsector[startsect>>3] |= (1<<(startsect&7));
for (splc=0,send=1; splc<send; splc++)
{
startwall = sector[searchsect[splc]].wallptr;
endwall = startwall + sector[searchsect[splc]].wallnum;
for (i=startwall,wal=&wall[startwall]; i<endwall; i++,wal++)
{
j = wal->nextsector; if (j < 0) continue;
dx = ((wall[wal->point2].x+wal->x)>>1);
dy = ((wall[wal->point2].y+wal->y)>>1);
if ((getceilzofslope(j,dx,dy) > getflorzofslope(j,dx,dy)-(28<<8)) && ((sector[j].lotag < 15) || (sector[j].lotag > 22)))
continue;
if (getflorzofslope(j,dx,dy) < getflorzofslope(searchsect[splc],dx,dy)-(72<<8))
continue;
if ((dashow2dsector[j>>3]&(1<<(j&7))) == 0)
{
dashow2dsector[j>>3] |= (1<<(j&7));
searchsect[send] = (short)j;
searchparent[send] = (short)splc;
send++;
if (j == endsect)
{
clearbufbyte(dashow2dsector,(MAXSECTORS+7)>>3,0L);
for (k=send-1; k>=0; k=searchparent[k])
dashow2dsector[searchsect[k]>>3] |= (1<<(searchsect[k]&7));
for (k=send-1; k>=0; k=searchparent[k])
if (!searchparent[k]) break;
goalsect[snum] = searchsect[k];
startwall = sector[goalsect[snum]].wallptr;
endwall = startwall+sector[goalsect[snum]].wallnum;
x3 = y3 = 0;
for (i=startwall; i<endwall; i++)
{
x3 += wall[i].x;
y3 += wall[i].y;
}
x3 /= (endwall-startwall);
y3 /= (endwall-startwall);
startwall = sector[startsect].wallptr;
endwall = startwall+sector[startsect].wallnum;
l = 0; k = startwall;
for (i=startwall; i<endwall; i++)
{
if (wall[i].nextsector != goalsect[snum]) continue;
dx = wall[wall[i].point2].x-wall[i].x;
dy = wall[wall[i].point2].y-wall[i].y;
//if (dx*(y1-wall[i].y) <= dy*(x1-wall[i].x))
// if (dx*(y2-wall[i].y) >= dy*(x2-wall[i].x))
if ((x3-x1)*(wall[i].y-y1) <= (y3-y1)*(wall[i].x-x1))
if ((x3-x1)*(wall[wall[i].point2].y-y1) >= (y3-y1)*(wall[wall[i].point2].x-x1))
{ k = i; break; }
dist = ksqrt(dx*dx+dy*dy);
if (dist > l) { l = dist; k = i; }
}
goalwall[snum] = k;
daang = ((getangle(wall[wall[k].point2].x-wall[k].x,wall[wall[k].point2].y-wall[k].y)+1536)&2047);
goalx[snum] = ((wall[k].x+wall[wall[k].point2].x)>>1)+(sintable[(daang+512)&2047]>>8);
goaly[snum] = ((wall[k].y+wall[wall[k].point2].y)>>1)+(sintable[daang&2047]>>8);
goalz[snum] = sector[goalsect[snum]].floorz-(32<<8);
break;
}
}
}
#if 0
for (i=headspritesect[searchsect[splc]]; i>=0; i=nextspritesect[i])
if (sprite[i].lotag == 7)
{
j = sprite[sprite[i].owner].sectnum;
if ((dashow2dsector[j>>3]&(1<<(j&7))) == 0)
{
dashow2dsector[j>>3] |= (1<<(j&7));
searchsect[send] = (short)j;
searchparent[send] = (short)splc;
send++;
if (j == endsect)
{
clearbufbyte(dashow2dsector,(MAXSECTORS+7)>>3,0L);
for (k=send-1; k>=0; k=searchparent[k])
dashow2dsector[searchsect[k]>>3] |= (1<<(searchsect[k]&7));
for (k=send-1; k>=0; k=searchparent[k])
if (!searchparent[k]) break;
goalsect[snum] = searchsect[k];
startwall = sector[startsect].wallptr;
endwall = startwall+sector[startsect].wallnum;
l = 0; k = startwall;
for (i=startwall; i<endwall; i++)
{
dx = wall[wall[i].point2].x-wall[i].x;
dy = wall[wall[i].point2].y-wall[i].y;
dist = ksqrt(dx*dx+dy*dy);
if ((wall[i].nextsector == goalsect[snum]) && (dist > l))
{ l = dist; k = i; }
}
goalwall[snum] = k;
daang = ((getangle(wall[wall[k].point2].x-wall[k].x,wall[wall[k].point2].y-wall[k].y)+1536)&2047);
goalx[snum] = ((wall[k].x+wall[wall[k].point2].x)>>1)+(sintable[(daang+512)&2047]>>8);
goaly[snum] = ((wall[k].y+wall[wall[k].point2].y)>>1)+(sintable[daang&2047]>>8);
goalz[snum] = sector[goalsect[snum]].floorz-(32<<8);
break;
}
}
}
if (goalwall[snum] >= 0) break;
#endif
}
}
if ((goalsect[snum] < 0) || (goalwall[snum] < 0))
{
if (goalsprite[snum] < 0)
{
for (k=0; k<4; k++)
{
i = (rand()%numsectors);
for (j=headspritesect[i]; j>=0; j=nextspritesect[j])
{
if ((sprite[j].xrepeat <= 0) || (sprite[j].yrepeat <= 0)) continue;
if (getspritescore(snum,sprite[j].picnum) <= 0) continue;
if (FAFcansee(x1,y1,z1-(32<<8),damysect,sprite[j].x,sprite[j].y,sprite[j].z-(4<<8),i))
{ goalx[snum] = sprite[j].x; goaly[snum] = sprite[j].y; goalz[snum] = sprite[j].z; goalsprite[snum] = j; break; }
}
}
}
x2 = goalx[snum];
y2 = goaly[snum];
dist = ksqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); if (!dist) return;
daang = getangle(x2-x1,y2-y1);
syn->vel += (x2-x1)*2047/dist;
syn->svel += (y2-y1)*2047/dist;
syn->angvel = min(max((((daang+1024-damyang)&2047)-1024)>>3,-MAXANGVEL),MAXANGVEL);
}
else
goalsprite[snum] = -1;
#endif
x3 = p->posx; y3 = p->posy; z3 = p->posz; dasect = p->cursectnum;
i = clipmove(&x3,&y3,&z3,&dasect,p->xvect,p->yvect,164L,4L<<8,4L<<8,CLIPMASK0);
if (!i)
{
x3 = p->posx; y3 = p->posy; z3 = p->posz+(24<<8); dasect = p->cursectnum;
i = clipmove(&x3,&y3,&z3,&dasect,p->xvect,p->yvect,164L,4L<<8,4L<<8,CLIPMASK0);
}
if (i)
{
clipmovecount[snum]++;
j = 0;
if ((i&0xc000) == 32768) //Hit a wall (49152 for sprite)
if (wall[i&(MAXWALLS-1)].nextsector >= 0)
{
if (getflorzofslope(wall[i&(MAXWALLS-1)].nextsector,p->posx,p->posy) <= p->posz+(24<<8)) j |= 1;
if (getceilzofslope(wall[i&(MAXWALLS-1)].nextsector,p->posx,p->posy) >= p->posz-(24<<8)) j |= 2;
}
if ((i&0xc000) == 49152) j = 1;
// Jump
if (j&1) if (clipmovecount[snum] == 4) syn->bits |= (1<<SK_JUMP);
// Crawl
if (j&2) syn->bits |= (1<<SK_CRAWL);
//Strafe attack
daang = getangle(x2-x1,y2-y1);
if ((i&0xc000) == 32768)
daang = getangle(wall[wall[i&(MAXWALLS-1)].point2].x-wall[i&(MAXWALLS-1)].x,wall[wall[i&(MAXWALLS-1)].point2].y-wall[i&(MAXWALLS-1)].y);
j = totalclock+snum*13468;
i = sintable[(j<<6)&2047];
i += sintable[((j+4245)<<5)&2047];
i += sintable[((j+6745)<<4)&2047];
i += sintable[((j+15685)<<3)&2047];
syn->vel += ((sintable[(daang+1024)&2047]*i)>>17);
syn->svel += ((sintable[(daang+512)&2047]*i)>>17);
// Try to Open
if ((clipmovecount[snum]&31) == 2) syn->bits |= (1<<SK_OPERATE);
// *TODO: In Duke, this is Kick, but I need to select sword then fire in SW
// if ((clipmovecount[snum]&31) == 17) syn->bits |= (1<<22);
if (clipmovecount[snum] > 32) { goalsect[snum] = -1; goalwall[snum] = -1; clipmovecount[snum] = 0; }
goalsprite[snum] = -1;
}
else
clipmovecount[snum] = 0;
if ((goalsect[snum] >= 0) && (goalwall[snum] >= 0))
{
x2 = goalx[snum];
y2 = goaly[snum];
dist = ksqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); if (!dist) return;
daang = getangle(x2-x1,y2-y1);
if ((goalwall[snum] >= 0) && (dist < 4096))
daang = ((getangle(wall[wall[goalwall[snum]].point2].x-wall[goalwall[snum]].x,wall[wall[goalwall[snum]].point2].y-wall[goalwall[snum]].y)+1536)&2047);
syn->vel += (x2-x1)*2047/dist;
syn->svel += (y2-y1)*2047/dist;
syn->angvel = min(max((((daang+1024-damyang)&2047)-1024)>>3,-MAXANGVEL),MAXANGVEL);
}
/*
// Use extended bot logic for navigation through level
goalsect[snum] = -1;
goalwall[snum] = -1;
goalsprite[snum] = -1;
// Go to a goal place
if ((goalsect[snum] >= 0) && (goalwall[snum] >= 0))
{
x2 = goalx[snum];
y2 = goaly[snum];
dist = ksqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); if (!dist) return;
daang = getangle(x2-x1,y2-y1);
if ((goalwall[snum] >= 0) && (dist < 4096))
daang = ((getangle(wall[wall[goalwall[snum]].point2].x-wall[goalwall[snum]].x,wall[wall[goalwall[snum]].point2].y-wall[goalwall[snum]].y)+1536)&2047);
syn->vel += (x2-x1)*2047/dist;
syn->svel += (y2-y1)*2047/dist;
syn->angvel = min(max((((daang+1024-damyang)&2047)-1024)>>3,-MAXANGVEL),MAXANGVEL);
}
*/
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,80 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef JSECTOR_H
#define JSECTOR_H
#include "reserve.h"
#define MAXMIRRORDIST 3300 // At this distance, or less, the magic mirrors activate.
#define MAXMIRRORMONSTERS 4 // Max monsters any one magic mirror can spawn
typedef enum
{
m_normal, m_viewon, m_pissed
} MIRRORSTATE;
typedef struct
{
short mirrorwall; // Wall number containing the mirror
// tile
short mirrorsector; // nextsector used internally to draw
// mirror rooms
short camera; // Contains number of ST1 sprite used
// as a camera
short camsprite; // sprite pointing to campic
short campic; // Editart tile number to draw a
// screen to
short numspawnspots; // Number of spawnspots used
short spawnspots[MAXMIRRORMONSTERS]; // One spot for each possible skill
// level for a
// max of up to 4 coolie ghosts to spawn.
BOOL ismagic; // Is this a magic mirror?
MIRRORSTATE mstate; // What state the mirror is currently
// in
int maxtics; // Tic count used to time mirror
// events
int tics; // How much viewing time has been
// used on mirror?
} MIRRORTYPE, *MIRRORTYPEp;
extern MIRRORTYPE mirror[MAXMIRRORS];
extern short mirrorcnt, floormirrorcnt;
extern short floormirrorsector[MAXMIRRORS];
extern BOOL mirrorinview;
extern short NormalVisibility;
void JAnalyzeSprites(SPRITEp tspr);
void JS_DrawMirrors(PLAYERp pp,int tx,int ty,int tz,short tpang,int tphoriz);
void JS_InitMirrors(void);
void JS_InitLockouts(void);
void JS_ToggleLockouts(void);
void JS_UnInitLockouts(void);
void JS_ProcessEchoSpot(void);
void JS_SpriteSetup(void);
#endif

View file

@ -0,0 +1,96 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef JTAGS_H
#define JTAGS_H
//////////////////////////////////////////////////////////////////////////////////////////
//
// SPRITE TAGS (TAG THE SPRITES'S HITAG) ST1 tags
//
//////////////////////////////////////////////////////////////////////////////////////////
#define AI_NORMAL 0
#define AI_EVASIVE 1
#define AI_SNIPER 2
#define AI_GUNGHO 3
#define SWITCH_LOCKED 29
// My sprite sprite tags start at 1000 to be separate from Frank's
//* Magic mirror cameras
//* LOTAG is the unique camera number
#define MIRROR_CAM 1000
//* These are spots at which a pissed off mirror will spawn a coolie ghost
//* Make sure to set the skill levels on these sprites too.
#define MIRROR_SPAWNSPOT 1001
//* Ambient Sounds
//* LOTAG is the enumerated sound num to play
#define AMBIENT_SOUND 1002
#define TAG_NORESPAWN_FLAG 1003
#define TAG_GET_STAR 1004
#define TAG_ECHO_SOUND 1005
#define TAG_DRIPGEN 1006
#define TAG_BUBBLEGEN 1007
#define TAG_SWARMSPOT 1008
#define TAG_PACHINKOLIGHT 9997
#define TAG_INVISONINJA 9998
#define LUMINOUS 9999
//////////////////////////////////////////////////////////////////////////////////////////
//
// WALL TAGS (TAG THE WALL'S LOTAG)
//
//////////////////////////////////////////////////////////////////////////////////////////
//* Turns a regular mirror into a magic mirror that shows a room containing ST1 sprite at
//* sprite's angle and z height.
//* HITAG is unique camera sprite number matching the ST1 camera sprite
#define TAG_WALL_MAGIC_MIRROR 306
//////////////////////////////////////////////////////////////////////////////////////////
//
// LIGHTING TAGS (TAG THE SECTOR'S LOTAG)
//
//////////////////////////////////////////////////////////////////////////////////////////
//* Fade effect. Fades in and out smoothly.
//* Ceiling is minimum darkness.
//* Floor is maximum darkness.
//* High byte is speed of flicker.
//* The lower the number the faster. Default is 3. I recommend 8.
//* Use TAG_LIGHT_FADE_DIFFUSE tags around the initial torch sector just like light fade.
//* A good value to use for torches, is a 2 in high tag of TAG_LIGHT_FADE_DIFFUSE
#define TAG_LIGHT_TORCH_FADE 305
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,137 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef KEYS_H
#define KEYS_H
#include "mytypes.h"
#define NUM_CODES 128
#define ESC 0x1B
#define ENTER 0x0D
#define KEYSC_ESC 1
#define KEYSC_1 2
#define KEYSC_2 3
#define KEYSC_3 4
#define KEYSC_4 5
#define KEYSC_5 6
#define KEYSC_6 7
#define KEYSC_7 8
#define KEYSC_8 9
#define KEYSC_9 10
#define KEYSC_0 11
#define KEYSC_DASH 12
#define KEYSC_EQUAL 13
#define KEYSC_BS 14
#define KEYSC_TAB 15
#define KEYSC_Q 16
#define KEYSC_W 17
#define KEYSC_E 18
#define KEYSC_R 19
#define KEYSC_T 20
#define KEYSC_Y 21
#define KEYSC_U 22
#define KEYSC_I 23
#define KEYSC_O 24
#define KEYSC_P 25
#define KEYSC_LBRACK 26
#define KEYSC_RBRACK 27
#define KEYSC_ENTER 28
#define KEYSC_CTRL 29
#define KEYSC_A 30
#define KEYSC_S 31
#define KEYSC_D 32
#define KEYSC_F 33
#define KEYSC_G 34
#define KEYSC_H 35
#define KEYSC_J 36
#define KEYSC_K 37
#define KEYSC_L 38
#define KEYSC_SEMI 39
#define KEYSC_QUOTE 40
#define KEYSC_BQUOTE 41
#define KEYSC_TILDE 41
#define KEYSC_LSHIFT 42
#define KEYSC_BSLASH 43
#define KEYSC_Z 44
#define KEYSC_X 45
#define KEYSC_C 46
#define KEYSC_V 47
#define KEYSC_B 48
#define KEYSC_N 49
#define KEYSC_M 50
#define KEYSC_COMMA 51
#define KEYSC_PERIOD 52
#define KEYSC_SLASH 53
#define KEYSC_RSHIFT 54
#define KEYSC_STAR 55
#define KEYSC_ALT 56
#define KEYSC_SPACE 57
#define KEYSC_CAPS 58
#define KEYSC_F1 59
#define KEYSC_F2 60
#define KEYSC_F3 61
#define KEYSC_F4 62
#define KEYSC_F5 63
#define KEYSC_F6 64
#define KEYSC_F7 65
#define KEYSC_F8 66
#define KEYSC_F9 67
#define KEYSC_F10 68
#define KEYSC_F11 0x57
#define KEYSC_F12 0x58
#define KEYSC_NUM 69
#define KEYSC_SCROLL 70
#define KEYSC_HOME 71
#define KEYSC_UP 72
#define KEYSC_PGUP 73
#define KEYSC_GMINUS 74
#define KEYSC_LEFT 75
#define KEYSC_KP5 76
#define KEYSC_RIGHT 77
#define KEYSC_GPLUS 78
#define KEYSC_END 79
#define KEYSC_DOWN 80
#define KEYSC_PGDN 81
#define KEYSC_INS 82
#define KEYSC_DEL 83
#define asc_Esc 27
#define asc_Enter 13
#define asc_Space 32
#endif

View file

@ -0,0 +1,569 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "tags.h"
#include "ai.h"
#include "actor.h"
#include "track.h"
DECISION LavaBattle[] =
{
{600, InitActorMoveCloser },
{700, InitActorAlertNoise },
{710, InitActorRunAway },
{1024, InitActorAttack }
};
DECISION LavaOffense[] =
{
{700, InitActorMoveCloser },
{800, InitActorAlertNoise },
{1024, InitActorAttack }
};
DECISION LavaBroadcast[] =
{
{21, InitActorAlertNoise },
{51, InitActorAmbientNoise },
{1024, InitActorDecide }
};
DECISION LavaSurprised[] =
{
{701, InitActorMoveCloser },
{1024, InitActorDecide }
};
DECISION LavaEvasive[] =
{
{10, InitActorEvade },
{1024, NULL }
};
DECISION LavaLostTarget[] =
{
{900, InitActorFindPlayer },
{1024, InitActorWanderAround }
};
DECISION LavaCloseRange[] =
{
{700, InitActorAttack },
{1024, InitActorReposition }
};
PERSONALITY LavaPersonality =
{
LavaBattle,
LavaOffense,
LavaBroadcast,
LavaSurprised,
LavaEvasive,
LavaLostTarget,
LavaCloseRange,
LavaCloseRange
};
ATTRIBUTE LavaAttrib =
{
{200, 220, 240, 270}, // Speeds
{3, 0, -2, -3}, // Tic Adjusts
3, // MaxWeapons;
{
DIGI_LAVABOSSAMBIENT,DIGI_LAVABOSSALERT,DIGI_LAVABOSSMETEOR,
DIGI_LAVABOSSPAIN,DIGI_LAVABOSSEXPLODE,DIGI_LAVABOSSSWIM,
DIGI_LAVABOSSRISE,DIGI_LAVABOSSFLAME,DIGI_LAVABOSSMETEXP,
DIGI_LAVABOSSSIZZLE
}
};
ATTRIBUTE LavaPissedAttrib =
{
{200, 220, 240, 270}, // Speeds
{3, 0, -2, -3}, // Tic Adjusts
3, // MaxWeapons;
{
DIGI_LAVABOSSAMBIENT,DIGI_LAVABOSSALERT,DIGI_LAVABOSSMETEOR,
DIGI_LAVABOSSPAIN,DIGI_LAVABOSSEXPLODE,DIGI_LAVABOSSSWIM,
DIGI_LAVABOSSRISE,DIGI_LAVABOSSFLAME,DIGI_LAVABOSSMETEXP,
DIGI_LAVABOSSSIZZLE
}
};
//////////////////////
//
// LAVA STAND
//
//////////////////////
#define LAVA_STAND_RATE 12
ANIMATOR DoLavaMove,NullLava,DoActorDebris,NullLava;
STATE s_LavaStand[5][1] =
{
{
{LAVA_RUN_R0 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[0][0]},
},
{
{LAVA_RUN_R1 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[1][0]},
},
{
{LAVA_RUN_R2 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[2][0]},
},
{
{LAVA_RUN_R3 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[3][0]},
},
{
{LAVA_RUN_R4 + 0, LAVA_STAND_RATE, DoLavaMove, &s_LavaStand[4][0]},
},
};
STATEp sg_LavaStand[] =
{
s_LavaStand[0],
s_LavaStand[1],
s_LavaStand[2],
s_LavaStand[3],
s_LavaStand[4]
};
//////////////////////
//
// LAVA RUN
//
//////////////////////
#define LAVA_RUN_RATE 24
STATE s_LavaRun[5][4] =
{
{
{LAVA_RUN_R0 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[0][1]},
{LAVA_RUN_R0 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[0][2]},
{LAVA_RUN_R0 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[0][3]},
{LAVA_RUN_R0 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[0][0]},
},
{
{LAVA_RUN_R1 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[1][1]},
{LAVA_RUN_R1 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[1][2]},
{LAVA_RUN_R1 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[1][3]},
{LAVA_RUN_R1 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[1][0]},
},
{
{LAVA_RUN_R2 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[2][1]},
{LAVA_RUN_R2 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[2][2]},
{LAVA_RUN_R2 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[2][3]},
{LAVA_RUN_R2 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[2][0]},
},
{
{LAVA_RUN_R3 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[3][1]},
{LAVA_RUN_R3 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[3][2]},
{LAVA_RUN_R3 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[3][3]},
{LAVA_RUN_R3 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[3][0]},
},
{
{LAVA_RUN_R4 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[4][1]},
{LAVA_RUN_R4 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[4][2]},
{LAVA_RUN_R4 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[4][3]},
{LAVA_RUN_R4 + 0, LAVA_RUN_RATE, DoLavaMove, &s_LavaRun[4][0]},
}
};
STATEp sg_LavaRun[] =
{
&s_LavaRun[0][0],
&s_LavaRun[1][0],
&s_LavaRun[2][0],
&s_LavaRun[3][0],
&s_LavaRun[4][0]
};
//////////////////////
//
// LAVA THROW
//
//////////////////////
#define LAVA_THROW_RATE 9
ANIMATOR InitActorDecide;
ANIMATOR InitLavaThrow;
STATE s_LavaThrow[5][10] =
{
{
{LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][1]},
{LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][2]},
{LAVA_THROW_R0 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[0][3]},
{LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][4]},
{LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][5]},
{LAVA_THROW_R0 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[0][6]},
{LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][7]},
{LAVA_THROW_R0 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[0][8]},
{LAVA_THROW_R0 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[0][9]},
{LAVA_THROW_R0 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[0][9]},
},
{
{LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][1]},
{LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][2]},
{LAVA_THROW_R1 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[1][3]},
{LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][4]},
{LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][5]},
{LAVA_THROW_R1 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[1][6]},
{LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][7]},
{LAVA_THROW_R1 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[1][8]},
{LAVA_THROW_R1 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[1][9]},
{LAVA_THROW_R1 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[1][9]},
},
{
{LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][1]},
{LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][2]},
{LAVA_THROW_R2 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[2][3]},
{LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][4]},
{LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][5]},
{LAVA_THROW_R2 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[2][6]},
{LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][7]},
{LAVA_THROW_R2 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[2][8]},
{LAVA_THROW_R2 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[2][9]},
{LAVA_THROW_R2 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[2][9]},
},
{
{LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][1]},
{LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][2]},
{LAVA_THROW_R3 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[3][3]},
{LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][4]},
{LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][5]},
{LAVA_THROW_R3 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[3][6]},
{LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][7]},
{LAVA_THROW_R3 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[3][8]},
{LAVA_THROW_R3 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[3][9]},
{LAVA_THROW_R3 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[3][9]},
},
{
{LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][1]},
{LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][2]},
{LAVA_THROW_R4 + 0, LAVA_THROW_RATE*2, NullLava, &s_LavaThrow[4][3]},
{LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][4]},
{LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][5]},
{LAVA_THROW_R4 + 0, SF_QUICK_CALL, InitLavaThrow, &s_LavaThrow[4][6]},
{LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][7]},
{LAVA_THROW_R4 + 0, LAVA_THROW_RATE, NullLava, &s_LavaThrow[4][8]},
{LAVA_THROW_R4 + 0, 0|SF_QUICK_CALL, InitActorDecide, &s_LavaThrow[4][9]},
{LAVA_THROW_R4 + 0, LAVA_THROW_RATE, DoLavaMove, &s_LavaThrow[4][9]},
}
};
STATEp sg_LavaThrow[] =
{
&s_LavaThrow[0][0],
&s_LavaThrow[1][0],
&s_LavaThrow[2][0],
&s_LavaThrow[3][0],
&s_LavaThrow[4][0]
};
//////////////////////
//
// LAVA FLAME
//
//////////////////////
#define LAVA_FLAME_RATE 18
ANIMATOR InitLavaFlame;
STATE s_LavaFlame[5][8] =
{
{
{LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[0][1]},
{LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[0][2]},
{LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[0][3]},
{LAVA_FLAME_R0 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[0][4]},
{LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[0][5]},
{LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[0][6]},
{LAVA_FLAME_R0 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[0][7]},
{LAVA_FLAME_R0 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[0][7]},
},
{
{LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[1][1]},
{LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[1][2]},
{LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[1][3]},
{LAVA_FLAME_R1 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[1][4]},
{LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[1][5]},
{LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[1][6]},
{LAVA_FLAME_R1 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[1][7]},
{LAVA_FLAME_R1 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[1][7]},
},
{
{LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[2][1]},
{LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[2][2]},
{LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[2][3]},
{LAVA_FLAME_R2 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[2][4]},
{LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[2][5]},
{LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[2][6]},
{LAVA_FLAME_R2 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[2][7]},
{LAVA_FLAME_R2 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[2][7]},
},
{
{LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[3][1]},
{LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[3][2]},
{LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[3][3]},
{LAVA_FLAME_R3 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[3][4]},
{LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[3][5]},
{LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[3][6]},
{LAVA_FLAME_R3 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[3][7]},
{LAVA_FLAME_R3 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[3][7]},
},
{
{LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[4][1]},
{LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[4][2]},
{LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE*2, NullLava, &s_LavaFlame[4][3]},
{LAVA_FLAME_R4 + 0, SF_QUICK_CALL, InitLavaFlame, &s_LavaFlame[4][4]},
{LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[4][5]},
{LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE, NullLava, &s_LavaFlame[4][6]},
{LAVA_FLAME_R4 + 0, SF_QUICK_CALL, InitActorDecide, &s_LavaFlame[4][7]},
{LAVA_FLAME_R4 + 0, LAVA_FLAME_RATE, DoLavaMove, &s_LavaFlame[4][7]},
}
};
STATEp sg_LavaFlame[] =
{
&s_LavaFlame[0][0],
&s_LavaFlame[1][0],
&s_LavaFlame[2][0],
&s_LavaFlame[3][0],
&s_LavaFlame[4][0]
};
//////////////////////
//
// LAVA DIE
//
//////////////////////
#define LAVA_DIE_RATE 20
STATE s_LavaDie[] =
{
{LAVA_DIE + 0, LAVA_DIE_RATE, NullLava, &s_LavaDie[1]},
{LAVA_DEAD, LAVA_DIE_RATE, DoActorDebris, &s_LavaDie[1]}
};
STATE s_LavaDead[] =
{
{LAVA_DEAD, LAVA_DIE_RATE, DoActorDebris, &s_LavaDead[0]},
};
STATEp sg_LavaDie[] =
{
s_LavaDie
};
STATEp sg_LavaDead[] =
{
s_LavaDead
};
/*
STATEp *Stand[MAX_WEAPONS];
STATEp *Run;
STATEp *Jump;
STATEp *Fall;
STATEp *Crawl;
STATEp *Swim;
STATEp *Fly;
STATEp *Rise;
STATEp *Sit;
STATEp *Look;
STATEp *Climb;
STATEp *Pain;
STATEp *Death1;
STATEp *Death2;
STATEp *Dead;
STATEp *DeathJump;
STATEp *DeathFall;
STATEp *CloseAttack[2];
STATEp *Attack[6];
STATEp *Special[2];
*/
ACTOR_ACTION_SET LavaActionSet =
{
sg_LavaStand,
sg_LavaRun,
NULL, //sg_LavaJump,
NULL, //sg_LavaFall,
NULL, //sg_LavaCrawl,
NULL, //sg_LavaSwim,
NULL, //sg_LavaFly,
NULL, //sg_LavaRise,
NULL, //sg_LavaSit,
NULL, //sg_LavaLook,
NULL, //climb
NULL, //pain
sg_LavaDie,
NULL, //sg_LavaHariKari,
sg_LavaDead,
NULL, //sg_LavaDeathJump,
NULL, //sg_LavaDeathFall,
{sg_LavaFlame},
{1024},
{sg_LavaFlame, sg_LavaThrow, sg_LavaThrow, sg_LavaThrow},
{256, 512, 768, 1024},
{NULL},
NULL,
NULL
};
int
SetupLava(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u;
ANIMATOR DoActorDecide;
if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
{
u = User[SpriteNum];
ASSERT(u);
}
else
{
User[SpriteNum] = u = SpawnUser(SpriteNum,LAVA_RUN_R0,s_LavaRun[0]);
u->Health = 100;
}
ChangeState(SpriteNum, s_LavaRun[0]);
u->Attrib = &LavaAttrib;
DoActorSetSpeed(SpriteNum, NORM_SPEED);
u->StateEnd = s_LavaDie;
u->Rot = sg_LavaRun;
EnemyDefaults(SpriteNum, &LavaActionSet, &LavaPersonality);
sp->xrepeat = sp->yrepeat = 110;
sp->clipdist = (512) >> 2;
SET(u->Flags, SPR_XFLIP_TOGGLE|SPR_ELECTRO_TOLERANT);
u->loz = sp->z;
return 0;
}
int NullLava(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
KeepActorOnFloor(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
int DoLavaMove(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum];
if (TEST(u->Flags,SPR_SLIDING))
DoActorSlide(SpriteNum);
if (u->track >= 0)
ActorFollowTrack(SpriteNum, ACTORMOVETICS);
else
(*u->ActorActionFunc)(SpriteNum);
KeepActorOnFloor(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
#include "saveable.h"
static saveable_code saveable_lava_code[] =
{
SAVE_CODE(SetupLava),
SAVE_CODE(NullLava),
SAVE_CODE(DoLavaMove),
};
static saveable_data saveable_lava_data[] =
{
SAVE_DATA(LavaBattle),
SAVE_DATA(LavaOffense),
SAVE_DATA(LavaBroadcast),
SAVE_DATA(LavaSurprised),
SAVE_DATA(LavaEvasive),
SAVE_DATA(LavaLostTarget),
SAVE_DATA(LavaCloseRange),
SAVE_DATA(LavaPersonality),
SAVE_DATA(LavaAttrib),
SAVE_DATA(LavaPissedAttrib),
SAVE_DATA(s_LavaStand),
SAVE_DATA(sg_LavaStand),
SAVE_DATA(s_LavaRun),
SAVE_DATA(sg_LavaRun),
SAVE_DATA(s_LavaThrow),
SAVE_DATA(sg_LavaThrow),
SAVE_DATA(s_LavaFlame),
SAVE_DATA(sg_LavaFlame),
SAVE_DATA(s_LavaDie),
SAVE_DATA(s_LavaDead),
SAVE_DATA(sg_LavaDie),
SAVE_DATA(sg_LavaDead),
SAVE_DATA(LavaActionSet),
};
saveable_module saveable_lava =
{
// code
saveable_lava_code,
SIZ(saveable_lava_code),
// data
saveable_lava_data,
SIZ(saveable_lava_data)
};

View file

@ -0,0 +1,426 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "names2.h"
#include "game.h"
#include "light.h"
/* #define LIGHT_Match(sp) (SP_TAG2((sp))) */
/* #define LIGHT_Type(sp) (SP_TAG3((sp))) */
/* #define LIGHT_MaxTics(sp) (SP_TAG4((sp))) */
/* #define LIGHT_MaxBright(sp) (SP_TAG5((sp))) */
/* #define LIGHT_MaxDark(sp) (SP_TAG6((sp))) */
/* #define LIGHT_ShadeInc(sp) (SP_TAG7((sp))) */
/* */
/* #define LIGHT_Dir(sp) (!!(TEST((sp)->extra, SPRX_BOOL10))) */
/* #define LIGHT_DirChange(sp) (FLIP((sp)->extra, SPRX_BOOL10)) */
/* */
/* #define LIGHT_Shade(sp) ((sp)->shade) */
/* #define LIGHT_FloorShade(sp) ((sp)->xoffset) */
/* #define LIGHT_CeilingShade(sp) ((sp)->yoffset) */
/* #define LIGHT_Tics(sp) ((sp)->z) */
/* */
/* #define LIGHT_DiffuseNum(sp) (SP_TAG3((sp))) */
/* #define LIGHT_DiffuseMult(sp) (SP_TAG4((sp))) */
void SectorLightShade(SPRITEp sp, short intensity)
{
short w, startwall, endwall;
void *void_ptr;
CHARp wall_shade;
short base_shade;
short wallcount;
if (TEST_BOOL8(sp))
intensity = -intensity;
if (!TEST_BOOL2(sp))
{
if (!TEST_BOOL6(sp))
sector[sp->sectnum].floorpal = sp->pal;
sector[sp->sectnum].floorshade = LIGHT_FloorShade(sp) + intensity; // floor change
}
if (!TEST_BOOL3(sp))
{
if (!TEST_BOOL6(sp))
sector[sp->sectnum].ceilingpal = sp->pal;
sector[sp->sectnum].ceilingshade = LIGHT_CeilingShade(sp) + intensity; // ceiling change
}
// change wall
if (!TEST_BOOL4(sp))
{
ASSERT(User[sp - sprite] && User[sp - sprite]->WallShade);
wall_shade = User[sp - sprite]->WallShade;
startwall = sector[sp->sectnum].wallptr;
endwall = startwall + sector[sp->sectnum].wallnum - 1;
for (w = startwall, wallcount = 0; w <= endwall; w++)
{
base_shade = wall_shade[wallcount];
wall[w].shade = base_shade + intensity;
if (!TEST_BOOL6(sp))
wall[w].pal = sp->pal;
wallcount++;
if (TEST(sp->extra, SPRX_BOOL5) && wall[w].nextwall >= 0)
{
base_shade = wall_shade[wallcount];
wall[wall[w].nextwall].shade = base_shade + intensity;
if (!TEST_BOOL6(sp))
wall[wall[w].nextwall].pal = sp->pal;
wallcount++;
}
}
}
}
VOID DiffuseLighting(SPRITEp sp)
{
short i, nexti;
short count;
short shade;
SPRITEp dsp;
// diffused lighting
count = 0;
TRAVERSE_SPRITE_STAT(headspritestat[STAT_LIGHTING_DIFFUSE],i,nexti)
{
dsp = &sprite[i];
// make sure matchs match
if (LIGHT_Match(dsp) != LIGHT_Match(sp))
continue;
shade = sp->shade + ((LIGHT_DiffuseNum(dsp) + 1) * LIGHT_DiffuseMult(dsp));
if (shade > LIGHT_MaxDark(sp))
shade = LIGHT_MaxDark(sp);
if (!TEST_BOOL6(dsp))
dsp->pal = sp->pal;
SectorLightShade(dsp, shade);
count++;
}
}
VOID DoLightingMatch(short match, short state)
{
short i,nexti;
SPRITEp sp;
TRAVERSE_SPRITE_STAT(headspritestat[STAT_LIGHTING],i,nexti)
{
sp = &sprite[i];
if (LIGHT_Match(sp) != match)
continue;
switch (LIGHT_Type(sp))
{
case LIGHT_CONSTANT:
// initialized
SET_BOOL9(sp);
// toggle
if (state == -1)
state = !TEST_BOOL1(sp);
if (state == ON)
{
SET_BOOL1(sp);
sp->shade = -LIGHT_MaxBright(sp);
sp->pal = User[sp-sprite]->spal; // on
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
}
else
{
RESET_BOOL1(sp);
sp->shade = LIGHT_MaxDark(sp);
sp->pal = 0; // off
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
}
break;
case LIGHT_FLICKER:
case LIGHT_FADE:
// initialized
SET_BOOL9(sp);
// toggle
if (state == -1)
state = !TEST_BOOL1(sp);
if (state == ON)
{
// allow fade or flicker
SET_BOOL1(sp);
}
else
{
RESET_BOOL1(sp);
sp->shade = LIGHT_MaxDark(sp);
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
}
break;
case LIGHT_FADE_TO_ON_OFF:
// initialized
SET_BOOL9(sp);
// toggle
//if (state == -1)
// state = !TEST_BOOL1(sp);
if (state == ON)
{
if (LIGHT_Dir(sp) == 1)
{
LIGHT_DirChange(sp);
}
}
else if (state == OFF)
{
if (LIGHT_Dir(sp) == 0)
{
LIGHT_DirChange(sp);
}
}
// allow fade or flicker
SET_BOOL1(sp);
break;
case LIGHT_FLICKER_ON:
// initialized
SET_BOOL9(sp);
// toggle
if (state == -1)
state = !TEST_BOOL1(sp);
if (state == ON)
{
// allow fade or flicker
SET_BOOL1(sp);
}
else
{
// turn it off till next switch
short spal = sp->pal;
RESET_BOOL1(sp);
sp->pal = 0;
sp->shade = LIGHT_MaxDark(sp);
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
sp->pal = spal;
}
break;
}
}
}
VOID InitLighting(VOID)
{
short i,nexti;
SPRITEp sp;
// processed on level startup
// puts lights in correct state
TRAVERSE_SPRITE_STAT(headspritestat[STAT_LIGHTING],i,nexti)
{
sp = &sprite[i];
if (!TEST_BOOL9(sp))
{
DoLightingMatch(LIGHT_Match(sp), !!TEST_BOOL1(sp));
}
}
}
VOID DoLighting(VOID)
{
short i,nexti;
SPRITEp sp;
short count;
TRAVERSE_SPRITE_STAT(headspritestat[STAT_LIGHTING],i,nexti)
{
sp = &sprite[i];
// on/off test
if (TEST_BOOL1(sp) == OFF)
continue;
switch (LIGHT_Type(sp))
{
case LIGHT_CONSTANT:
break;
case LIGHT_FLICKER:
LIGHT_Tics(sp) += synctics;
while (LIGHT_Tics(sp) >= LIGHT_MaxTics(sp))
{
LIGHT_Tics(sp) -= LIGHT_MaxTics(sp);
if ((RANDOM_P2(128 << 8) >> 8) > 64)
{
sp->shade = -LIGHT_MaxBright(sp) + RANDOM_RANGE(LIGHT_MaxBright(sp) + LIGHT_MaxDark(sp));
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
}
else
{
// turn off lighting - even colored lighting
short spal = sp->pal;
sp->pal = 0;
sp->shade = LIGHT_MaxDark(sp);
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
sp->pal = spal;
}
}
break;
case LIGHT_FADE:
LIGHT_Tics(sp) += synctics;
while (LIGHT_Tics(sp) >= LIGHT_MaxTics(sp))
{
LIGHT_Tics(sp) -= LIGHT_MaxTics(sp);
if (LIGHT_Dir(sp) == 1)
{
sp->shade += LIGHT_ShadeInc(sp);
if (sp->shade >= LIGHT_MaxDark(sp))
LIGHT_DirChange(sp);
}
else
{
sp->shade -= LIGHT_ShadeInc(sp);
if (sp->shade <= -LIGHT_MaxBright(sp))
LIGHT_DirChange(sp);
}
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
}
break;
case LIGHT_FADE_TO_ON_OFF:
LIGHT_Tics(sp) += synctics;
while (LIGHT_Tics(sp) >= LIGHT_MaxTics(sp))
{
LIGHT_Tics(sp) -= LIGHT_MaxTics(sp);
if (LIGHT_Dir(sp) == 1)
{
sp->shade += LIGHT_ShadeInc(sp);
if (sp->shade >= LIGHT_MaxDark(sp))
{
sp->pal = 0; // off
LIGHT_DirChange(sp);
// stop it until switch is hit
RESET_BOOL1(sp);
}
}
else
{
sp->shade -= LIGHT_ShadeInc(sp);
sp->pal = User[sp-sprite]->spal; // on
if (sp->shade <= -LIGHT_MaxBright(sp))
{
LIGHT_DirChange(sp);
// stop it until switch is hit
RESET_BOOL1(sp);
}
}
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
}
break;
case LIGHT_FLICKER_ON:
LIGHT_Tics(sp) += synctics;
while (LIGHT_Tics(sp) >= LIGHT_MaxTics(sp))
{
LIGHT_Tics(sp) -= LIGHT_MaxTics(sp);
if ((RANDOM_P2(128 << 8) >> 8) > 64)
{
sp->shade = -LIGHT_MaxBright(sp) + RANDOM_RANGE(LIGHT_MaxBright(sp) + LIGHT_MaxDark(sp));
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
}
else
{
// turn off lighting - even colored lighting
short spal = sp->pal;
sp->pal = 0;
sp->shade = LIGHT_MaxDark(sp);
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
sp->pal = spal;
}
if ((RANDOM_P2(128 << 8) >> 8) < 8)
{
// set to full brightness
sp->shade = -LIGHT_MaxBright(sp);
SectorLightShade(sp, sp->shade);
DiffuseLighting(sp);
// turn it off until a swith happens
RESET_BOOL1(sp);
}
}
break;
}
}
}

View file

@ -0,0 +1,54 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
void SectorLightShade(SPRITEp sp, short intensity);
VOID DiffuseLighting(SPRITEp sp);
VOID DoLightingMatch(short match, short state);
VOID InitLighting(VOID);
VOID DoLighting(VOID);
// Descriptive Light variables mapped from other variables
#define LIGHT_Match(sp) (SP_TAG2((sp)))
#define LIGHT_Type(sp) (SP_TAG3((sp)))
#define LIGHT_MaxTics(sp) (SP_TAG4((sp)))
#define LIGHT_MaxBright(sp) (SP_TAG5((sp)))
#define LIGHT_MaxDark(sp) (SP_TAG6((sp)))
#define LIGHT_ShadeInc(sp) (SP_TAG7((sp)))
#define LIGHT_Dir(sp) (!!(TEST((sp)->extra, SPRX_BOOL10)))
#define LIGHT_DirChange(sp) (FLIP((sp)->extra, SPRX_BOOL10))
#define LIGHT_Shade(sp) ((sp)->shade)
#define LIGHT_FloorShade(sp) ((sp)->xoffset)
#define LIGHT_CeilingShade(sp) ((sp)->yoffset)
#define LIGHT_Tics(sp) ((sp)->z)
#define LIGHT_DiffuseNum(sp) (SP_TAG3((sp)))
#define LIGHT_DiffuseMult(sp) (SP_TAG4((sp)))
enum LightTypes {LIGHT_CONSTANT, LIGHT_FLICKER, LIGHT_FADE, LIGHT_FLICKER_ON, LIGHT_FADE_TO_ON_OFF};

View file

@ -0,0 +1,69 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef LISTS_H
#define LISTS_H
/********************************************************************/
typedef
struct List
{
struct List *Next;
struct List *Prev;
} LISTHEAD, *LIST;
#define FIRST(list) (list->Next)
#define LAST(list) (list->Prev)
#define INITLIST(list) ( ((LIST) list)->Prev = ((LIST) list)->Next = (LIST) list)
#define INSERT(list, nodep) ( ((LIST) nodep)->Prev = (LIST) list, \
((LIST) nodep)->Next = ((LIST) list)->Next, \
((LIST) list)->Next = (LIST) nodep, \
((LIST) nodep)->Next->Prev = (LIST) nodep)
#define INSERT_TAIL(list, nodep) ( ((LIST) nodep)->Next = (LIST) list, \
((LIST) nodep)->Prev = ((LIST) list)->Prev, \
((LIST) list)->Prev = (LIST) nodep, \
((LIST) nodep)->Prev->Next = (LIST) nodep)
#define DELETE(nodep) ( ((LIST) nodep)->Prev->Next = ((LIST) nodep)->Next, \
((LIST) nodep)->Next->Prev = ((LIST) nodep)->Prev)
#define TRAVERSE(l, o, n) ASSERT(((LIST)l)->Next && ((LIST)l)->Prev); for (o = (void*)(((LIST)l)->Next); \
n = o->Next, (LIST) o != (LIST) l; \
o = n)
#define EMPTY(list) (((LIST) list)->Next == (LIST) list)
#endif

View file

@ -0,0 +1,558 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "mytypes.h"
#include "keys.h"
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "tags.h"
#include "player.h"
#include "mclip.h"
#if 0
int MultiClipMove(PLAYERp pp, int z, int floor_dist)
{
int i;
int ox[MAX_CLIPBOX],oy[MAX_CLIPBOX];
SPRITEp sp = pp->sop->sp_child;
USERp u = User[sp - sprite];
SECTOR_OBJECTp sop = pp->sop;
short ang;
short min_ndx;
int min_dist = 999999;
int dist;
int ret_start;
int ret[MAX_CLIPBOX];
int x[MAX_CLIPBOX],y[MAX_CLIPBOX];
for (i = 0; i < sop->clipbox_num; i++)
{
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
ox[i] = x[i] = pp->posx + (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)] >> 14);
oy[i] = y[i] = pp->posy + (sop->clipbox_vdist[i] * sintable[ang] >> 14);
// move the box
ret[i] = clipmove(&x[i], &y[i], &z, &pp->cursectnum, pp->xvect, pp->yvect, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
// save the dist moved
dist = FindDistance2D(x[i] - ox[i], y[i] - oy[i]);
if (dist < min_dist)
{
min_dist = dist;
min_ndx = i;
}
}
// put posx and y off from offset
pp->posx -= ox[min_ndx] - x[min_ndx];
pp->posy -= oy[min_ndx] - y[min_ndx];
return ret[min_ndx];
}
#endif
#if 0
int MultiClipMove(PLAYERp pp, int z, int floor_dist)
{
int i;
int ox[MAX_CLIPBOX],oy[MAX_CLIPBOX];
SPRITEp sp = pp->sop->sp_child;
USERp u = User[sp - sprite];
SECTOR_OBJECTp sop = pp->sop;
short ang;
short min_ndx;
int min_dist = 999999;
int dist;
int ret_start;
int ret[MAX_CLIPBOX];
int x[MAX_CLIPBOX],y[MAX_CLIPBOX];
for (i = 0; i < sop->clipbox_num; i++)
{
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
ox[i] = x[i] = pp->posx + (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)] >> 14);
oy[i] = y[i] = pp->posy + (sop->clipbox_vdist[i] * sintable[ang] >> 14);
// move the box
//pushmove(&x[i], &y[i], &z, &pp->cursectnum, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
ret[i] = clipmove(&x[i], &y[i], &z, &pp->cursectnum, pp->xvect, pp->yvect, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
//pushmove(&x[i], &y[i], &z, &pp->cursectnum, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
// save the dist moved
dist = FindDistance2D(x[i] - ox[i], y[i] - oy[i]);
if (dist < min_dist)
{
min_dist = dist;
min_ndx = i;
}
}
// put posx and y off from offset
pp->posx -= ox[min_ndx] - x[min_ndx];
pp->posy -= oy[min_ndx] - y[min_ndx];
return ret[min_ndx];
}
#endif
#if 0
int MultiClipMove(PLAYERp pp, int z, int floor_dist)
{
int i;
int ox[MAX_CLIPBOX],oy[MAX_CLIPBOX];
SPRITEp sp = pp->sop->sp_child;
USERp u = User[sp - sprite];
SECTOR_OBJECTp sop = pp->sop;
short ang;
short min_ndx;
int min_dist = 999999;
int dist;
int ret_start;
int ret[MAX_CLIPBOX];
int x[MAX_CLIPBOX],y[MAX_CLIPBOX];
int xvect,yvect;
int xs,ys;
for (i = 0; i < sop->clipbox_num; i++)
{
// move the box to position instead of using offset- this prevents small rounding errors
// allowing you to move through wall
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
xs = pp->posx;
ys = pp->posy;
xvect = (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)]);
yvect = (sop->clipbox_vdist[i] * sintable[ang]);
ret_start = clipmove(&xs, &ys, &z, &pp->cursectnum, xvect, yvect, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
// save off the start position
ox[i] = x[i] = xs;
oy[i] = y[i] = ys;
// move the box
ret[i] = clipmove(&x[i], &y[i], &z, &pp->cursectnum, pp->xvect, pp->yvect, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
// save the dist moved
dist = ksqrt(SQ(x[i] - ox[i]) + SQ(y[i] - oy[i]));
//dist = FindDistance2D(x[i] - ox[i], y[i] - oy[i]);
if (ret[i])
{
//DSPRINTF(ds,"i %d, ret %d, dist %d",i, ret[i], dist);
//printf("%s\n",ds);
MONO_PRINT(ds);
}
if (dist < min_dist)
{
min_dist = dist;
min_ndx = i;
}
}
// put posx and y off from offset
pp->posx -= ox[min_ndx] - x[min_ndx];
pp->posy -= oy[min_ndx] - y[min_ndx];
return ret[min_ndx];
}
#endif
#if 0
int MultiClipMove(PLAYERp pp, int z, int floor_dist)
{
int i;
int ox[MAX_CLIPBOX],oy[MAX_CLIPBOX];
SPRITEp sp = pp->sop->sp_child;
USERp u = User[sp - sprite];
SECTOR_OBJECTp sop = pp->sop;
short ang;
short min_ndx;
int min_dist = 999999;
int dist;
int ret_start;
int ret[MAX_CLIPBOX];
int x[MAX_CLIPBOX],y[MAX_CLIPBOX];
int xvect,yvect;
int xs,ys;
for (i = 0; i < sop->clipbox_num; i++)
{
// move the box to position instead of using offset- this prevents small rounding errors
// allowing you to move through wall
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
xs = pp->posx;
ys = pp->posy;
xvect = (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)]);
yvect = (sop->clipbox_vdist[i] * sintable[ang]);
ret_start = clipmove(&xs, &ys, &z, &pp->cursectnum, xvect, yvect, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
if (ret_start)
{
// hit something moving into position
min_dist = 0;
min_ndx = i;
// ox is where it should be
ox[i] = x[i] = pp->posx + (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)] >> 14);
oy[i] = y[i] = pp->posy + (sop->clipbox_vdist[i] * sintable[ang] >> 14);
x[i] = xs;
y[i] = ys;
dist = ksqrt(SQ(x[i] - ox[i]) + SQ(y[i] - oy[i]));
//ox[i] = x[i] = oy[i] = y[i] = 0;
}
else
{
// save off the start position
ox[i] = x[i] = xs;
oy[i] = y[i] = ys;
// move the box
ret[i] = clipmove(&x[i], &y[i], &z, &pp->cursectnum, pp->xvect, pp->yvect, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
// save the dist moved
dist = ksqrt(SQ(x[i] - ox[i]) + SQ(y[i] - oy[i]));
//dist = FindDistance2D(x[i] - ox[i], y[i] - oy[i]);
if (ret[i])
{
//DSPRINTF(ds,"i %d, ret %d, dist %d",i, ret[i], dist);
MONO_PRINT(ds);
}
if (dist < min_dist)
{
min_dist = dist;
min_ndx = i;
}
}
}
// put posx and y off from offset
pp->posx -= ox[min_ndx] - x[min_ndx];
pp->posy -= oy[min_ndx] - y[min_ndx];
return ret[min_ndx];
}
#endif
int MultiClipMove(PLAYERp pp, int z, int floor_dist)
{
int i;
int ox[MAX_CLIPBOX],oy[MAX_CLIPBOX];
SPRITEp sp = pp->sop->sp_child;
USERp u = User[sp - sprite];
SECTOR_OBJECTp sop = pp->sop;
short ang;
short min_ndx = 0;
int min_dist = 999999;
int dist;
int ret_start;
int ret;
int min_ret=0;
int x[MAX_CLIPBOX],y[MAX_CLIPBOX];
int xvect,yvect;
int xs,ys;
for (i = 0; i < sop->clipbox_num; i++)
{
// move the box to position instead of using offset- this prevents small rounding errors
// allowing you to move through wall
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
xs = pp->posx;
ys = pp->posy;
xvect = (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)]);
yvect = (sop->clipbox_vdist[i] * sintable[ang]);
clipmoveboxtracenum = 1;
ret_start = clipmove(&xs, &ys, &z, &pp->cursectnum, xvect, yvect, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
clipmoveboxtracenum = 3;
if (ret_start)
{
// hit something moving into start position
min_dist = 0;
min_ndx = i;
// ox is where it should be
ox[i] = x[i] = pp->posx + (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)] >> 14);
oy[i] = y[i] = pp->posy + (sop->clipbox_vdist[i] * sintable[ang] >> 14);
// xs is where it hit
x[i] = xs;
y[i] = ys;
// see the dist moved
dist = ksqrt(SQ(x[i] - ox[i]) + SQ(y[i] - oy[i]));
// save it off
if (dist < min_dist)
{
min_dist = dist;
min_ndx = i;
min_ret = ret_start;
}
}
else
{
// save off the start position
ox[i] = x[i] = xs;
oy[i] = y[i] = ys;
// move the box
ret = clipmove(&x[i], &y[i], &z, &pp->cursectnum, pp->xvect, pp->yvect, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
// save the dist moved
dist = ksqrt(SQ(x[i] - ox[i]) + SQ(y[i] - oy[i]));
if (ret)
{
}
if (dist < min_dist)
{
min_dist = dist;
min_ndx = i;
min_ret = ret;
}
}
}
// put posx and y off from offset
pp->posx += x[min_ndx] - ox[min_ndx];
pp->posy += y[min_ndx] - oy[min_ndx];
return min_ret;
}
short MultiClipTurn(PLAYERp pp, short new_ang, int z, int floor_dist)
{
int i;
SECTOR_OBJECTp sop = pp->sop;
int ret;
int x,y;
short ang;
int xvect, yvect;
short cursectnum = pp->cursectnum;
for (i = 0; i < sop->clipbox_num; i++)
{
ang = NORM_ANGLE(new_ang + sop->clipbox_ang[i]);
x = pp->posx;
y = pp->posy;
xvect = (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)]);
yvect = (sop->clipbox_vdist[i] * sintable[ang]);
// move the box
ret = clipmove(&x, &y, &z, &cursectnum, xvect, yvect, (int)sop->clipbox_dist[i], Z(4), floor_dist, CLIPMASK_PLAYER);
ASSERT(cursectnum >= 0);
if (ret)
{
// attempt to move a bit when turning against a wall
//ang = NORM_ANGLE(ang + 1024);
//pp->xvect += 20 * sintable[NORM_ANGLE(ang + 512)];
//pp->yvect += 20 * sintable[ang];
return FALSE;
}
}
return TRUE;
}
int testquadinsect(int *point_num, int qx[], int qy[], short sectnum)
{
int i,next_i;
*point_num = -1;
for (i=0; i < 4; i++)
{
if (!inside(qx[i], qy[i], sectnum))
{
////DSPRINTF(ds,"inside %ld failed",i);
//MONO_PRINT(ds);
*point_num = i;
return FALSE;
}
}
for (i=0; i<4; i++)
{
next_i = MOD4(i+1);
if (!cansee(qx[i], qy[i],0x3fffffff, sectnum,
qx[next_i], qy[next_i],0x3fffffff, sectnum))
{
DSPRINTF(ds,"cansee %ld failed, x1 %d, y1 %d, x2 %d, y2 %d, sectnum %d",i, qx[i], qy[i], qx[next_i], qy[next_i], sectnum);
MONO_PRINT(ds);
return FALSE;
}
}
return TRUE;
}
//Ken gives the tank clippin' a try...
int RectClipMove(PLAYERp pp, int *qx, int *qy)
{
SECTORp *sectp;
SECTOR_OBJECTp sop = pp->sop;
WALLp wp;
int count=0;
int i, x[4], y[4];
short startwall,endwall;
int point_num;
for (i = 0; i < 4; i++)
{
x[i] = qx[i] + (pp->xvect>>14);
y[i] = qy[i] + (pp->yvect>>14);
}
//Given the 4 points: x[4], y[4]
if (testquadinsect(&point_num, x, y, pp->cursectnum))
{
pp->posx += (pp->xvect>>14);
pp->posy += (pp->yvect>>14);
return TRUE;
}
if (point_num < 0)
return FALSE;
if ((point_num == 0) || (point_num == 3)) //Left side bad - strafe right
{
for (i = 0; i < 4; i++)
{
x[i] = qx[i] - (pp->yvect>>15);
y[i] = qy[i] + (pp->xvect>>15);
}
if (testquadinsect(&point_num, x, y, pp->cursectnum))
{
pp->posx -= (pp->yvect>>15);
pp->posy += (pp->xvect>>15);
}
return FALSE;
}
if ((point_num == 1) || (point_num == 2)) //Right side bad - strafe left
{
for (i = 0; i < 4; i++)
{
x[i] = qx[i] + (pp->yvect>>15);
y[i] = qy[i] - (pp->xvect>>15);
}
if (testquadinsect(&point_num, x, y, pp->cursectnum))
{
pp->posx += (pp->yvect>>15);
pp->posy -= (pp->xvect>>15);
}
return FALSE;
}
return FALSE;
}
int testpointinquad(int x, int y, int *qx, int *qy)
{
int i, cnt, x1, y1, x2, y2;
cnt = 0;
for (i=0; i<4; i++)
{
y1 = qy[i]-y;
y2 = qy[(i+1)&3]-y;
if ((y1^y2) >= 0) continue;
x1 = qx[i]-x;
x2 = qx[(i+1)&3]-x;
if ((x1^x2) >= 0)
cnt ^= x1;
else
cnt ^= (x1*y2-x2*y1)^y2;
}
return cnt>>31;
}
short RectClipTurn(PLAYERp pp, short new_ang, int *qx, int *qy, int *ox, int *oy)
{
int i, x[4], y[4];
SECTOR_OBJECTp sop = pp->sop;
int ret;
short ang;
short rot_ang;
int point_num;
rot_ang = NORM_ANGLE(new_ang + sop->spin_ang - sop->ang_orig);
for (i = 0; i < 4; i++)
{
rotatepoint(pp->posx, pp->posy, ox[i], oy[i], rot_ang, &x[i], &y[i]);
// cannot use sop->xmid and ymid because the SO is off the map at this point
//rotatepoint(sop->xmid, sop->ymid, ox[i], oy[i], rot_ang, &x[i], &y[i]);
}
//Given the 4 points: x[4], y[4]
if (testquadinsect(&point_num, x, y, pp->cursectnum))
{
// move to new pos
for (i = 0; i < 4; i++)
{
qx[i] = x[i];
qy[i] = y[i];
}
return TRUE;
}
if (point_num < 0)
return FALSE;
return FALSE;
}

View file

@ -0,0 +1,35 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#define RECT_CLIP 1
int MultiClipMove(PLAYERp pp, int z, int floor_dist);
short MultiClipTurn(PLAYERp pp, short new_ang, int z, int floor_dist);
int testquadinsect(int *point_num, int *qx, int *qy, short sectnum);
int RectClipMove(PLAYERp pp, int *qx, int *qy);
int testpointinquad(int x, int y, int *qx, int *qy);
//short RectClipTurn(PLAYERp pp, short new_ang, int z, int floor_dist, int *qx, int *qy);
short RectClipTurn(PLAYERp pp, short new_ang, int *qx, int *qy, int *ox, int *oy);

View file

@ -0,0 +1,82 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "mytypes.h"
#include "keys.h"
#include "names2.h"
//#include "panel.h"
#include "game.h"
// macros this function needs
//#define MK_FP(seg,ofs) ((void _seg *)(seg)+(void near *)(ofs))
//#define PokeByte(a,b,c) (*((char far *)MK_FP((a),(b)))=(char)(c))
//#if DEBUG
VOID
PokeStringMono(BYTE Attr, BYTEp String)
{
fprintf(stderr,"MONO: %s\n",String);
#if 0
// Scrolls the monochrome display up one line, then prints the
// string with the desired attribute on the bottom line.
// EXAMPLE: PokeStringMono(MDA_NORMAL, "Hello, world.");
BYTEp Src, Dest;
LONGp s,d;
static char MonoBuf[4000];
#define BASE (MonoBuf)
#define LINE_SIZE 160
#define LINE_OFFSET(num) ((80*2)*(num))
// First scroll the screen up one line.
// copy lines 1-24 up to 0
s = (LONGp)(BASE + LINE_SIZE);
d = (LONGp)BASE;
memmove(d,s,LINE_OFFSET(24));
// clear bottom line
Dest = BASE + LINE_OFFSET(24);
//memset(Dest,0,LINE_SIZE);
memset(Dest,'.',LINE_SIZE);
// Now print the string on the bottom line.
Src = String;
Dest = BASE + LINE_OFFSET(24);
while (*Src)
{
*Dest++ = *Src++;
*Dest++ = Attr;
}
memcpy((char *)0xB0000, MonoBuf, sizeof(MonoBuf));
#endif
}
//#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,341 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
// MENUS.H
// Contains type definitions for all pop up menus
#ifndef MENUS_PUBLIC_
#define MENUS_PUBLIC_
#define MENU_SHADE_DEFAULT 0
#define MENU_SHADE_INACTIVE 20
typedef enum
{
ct_mainmenu, ct_savemenu, ct_loadmenu, ct_soundmenu, ct_optionmenu, ct_quickloadmenu,
ct_quitmenu, ct_ordermenu, ct_episodemenu, ct_max
} CTLType;
extern BOOL UsingMenus;
extern int SENSITIVITY;
extern CTLType ControlPanelType;
extern SHORT MenuTextShade;
extern SHORT MenuTextPalette;
// Prototypes
//void MNU_DoMenu( CTLType type, PLAYERp pp );
void MNU_InitMenus(void);
//void (*CustomRefresh)(void);
//void MNU_Refresh( void );
void MNU_DrawMenu(void); // This is used in drawscreen to refresh menus in
// multiplay situations.
void MNU_CheckForMenus(void);
void MNU_CheckForMenusAnyKey(void);
void MNU_MeasureString(const char *string, short *w, short *h);
void MNU_DrawString(short x, short y, const char *string, short shade, short pal);
void MNU_MeasureSmallString(const char *string,short *w,short *h);
void MNU_DrawSmallString(short x,short y,const char *string,short shade,short pal);
void MNU_MeasureStringLarge(const char *string, short *w, short *h);
void MNU_DrawStringLarge(short x, short y, const char *string);
// Functions from my other engine
//void Get_Palette (unsigned char *pal);
//void Set_Palette(unsigned char *buff);
//void Fade_Timer(int clicks);
void FadeIn(unsigned char targetcolor, unsigned int clicks);
void FadeOut(unsigned char targetcolor, unsigned int clicks);
VOID ResetPalette(PLAYERp pp);
void ExitMenus(void);
VOID ResetMenuInput(VOID);
#define BUTTONSET(x,value) \
( \
((x)>31) ? \
(CONTROL_ButtonState2 |= (value<<((x)-32))) : \
(CONTROL_ButtonState1 |= (value<<(x))) \
)
extern BOOL BorderAdjust;
extern int FXDevice,MusicDevice;
extern BOOL MultiPlayQuitFlag;
// Make memcpy an intrinsic function for an easy frame rate boost
//#pragma intrinsic( memcpy );
// L O C A L V A R I A B L E S ////////////////////////////////////////////////////////////////
// Default menu pic brightness
#define m_defshade 2
#define FLASHTIME 60 // One second per icon flash
// Defines for permanentwritesprite clipping box
#define M_CX1 0
#define M_CY1 0
#define M_CX2 319
#define M_CY2 199
#define MZ 65536
#define asc_Esc 27
#define asc_Enter 13
#define asc_Space 32
#define pic_none 0
#define pic_radiobuttn1 2816
#define pic_radiobuttn2 2817
#define pic_newgame 2819
#define pic_load 2820
#define pic_save 2821
#define pic_options 2822
#define pic_orderinfo 2823
#define pic_todemo 2824
#define pic_togame 2825
#define pic_quit 2826
#define pic_newgametitl 2827
#define pic_training 2828
#define pic_easy 2829
#define pic_normal 2830
#define pic_hard 2831
#define pic_impossible 2832
#define pic_optionstitl 2833
#define pic_endgame 2834
#define pic_detail 2835
#define pic_high 2836
#define pic_low 2837
#define pic_mousesense 2838
#define pic_soundvol 2839
#define pic_toggles 2845
#define pic_togglestitl 2844
#define pic_mousenable 2840
#define pic_joyenable 2841
#define pic_bobbing 2842
#define pic_slidelend 2846
#define pic_slidebar 2847
#define pic_sliderend 2848
#define pic_sliderknob 2849
#define pic_shuriken1 2850
#define pic_yinyang 2870
#define pic_soundtitl 2870
#define pic_sndfxvol 2871
#define pic_musicvol 2872
#define pic_episode1 2873
#define pic_episode2 2874
#define pic_episode3 2875
#define pic_modem 2876
#define pic_scrsize 2877
#define pic_loadsavecursor 2918
#define pic_loadgame 2915
#define pic_savegame 2916
#define pic_loading 2917
#define pic_loadsavescreen 2919
#define pic_loadsavescreenbak 2922
#define pic_savedescr 2924
#define pic_shadow_warrior 2366
// This is the current values set with all slider bar functions
#define SENSE_DEFAULT 10 // Default mouse sensitivity ** should be 5!!!
#define FXVOL_DEFAULT 8 // Default sound fx volume
#define MUSIC_DEFAULT 8 // Default music volume
#define SCRSIZE_DEFAULT 9 // Default screen size, max is 10
#define BRIGHTNESS_DEFAULT 0 // Default is no gamma-correction
#define BORDERTILE_DEFAULT 0 // Default is no gamma-correction
#define GAMETYPE_DEFAULT 0 // Regular DeathMatch
#define NETLEVEL_DEFAULT 0 // Default is level 1 (0)
#define MONSTERS_DEFAULT 0 // No Monsters
#define KILLLIMIT_DEFAULT 0 // No kill limit
#define TIMELIMIT_DEFAULT 0 // None
#define PLAYERCOLOR_DEFAULT 0
typedef enum
{
sldr_none,
sldr_mouse, sldr_sndfxvolume, sldr_musicvolume, sldr_scrsize, sldr_brightness,
sldr_bordertile, sldr_gametype, sldr_netlevel, sldr_monsters, sldr_killlimit,
sldr_timelimit, sldr_playercolor, sldr_videores, sldr_videobpp,
sldr_mousescalex, sldr_mousescaley,
sldr_joyaxisscale, sldr_joyaxisanalog, sldr_joyaxisdead, sldr_joyaxissatur,
sldr_max
} SLDRType;
#define MAX_SLDR_WIDTH 16 // maximum size of slider before x is compressed
#define SLDR_MOUSESENSEMAX 20
#define SLDR_SNDFXVOLMAX 16
#define SLDR_MUSICVOLMAX 16
#define SLDR_SCRSIZEMAX 14
#define SLDR_BRIGHTNESSMAX 8
#define SLDR_BORDERTILEMAX (isShareware ? 21 : 38) // counted from border.c
#define SLDR_GAMETYPEMAX 3
#define SLDR_NETLEVELMAX_REG 28
#define SLDR_NETLEVELMAX_SW 4
#define SLDR_NETLEVELMAX (isShareware ? SLDR_NETLEVELMAX_SW : SLDR_NETLEVELMAX_REG)
#define SLDR_MONSTERSMAX 5 // Skill Levels
#define SLDR_KILLLIMITMAX 11 // Increments of 10 up to 100, 1 is no limit
#define SLDR_TIMELIMITMAX 9
#define SLDR_PLAYERCOLORMAX 8 // Up to 8 players different colors
#define MOUSE_SENS_MAX_VALUE (1<<16)
#define MUSIC_VOL_MAX_VALUE 255
#define FX_VOL_MAX_VALUE 255
// These are all the toggle button settings
typedef enum
{
btn_none, btn_auto_run, btn_crosshair, btn_auto_aim,
btn_mouse_aim, btn_messages, btn_mouse_invert, btn_bobbing, btn_shadows,
btn_sound, btn_music, btn_talking, btn_ambience, btn_flipstereo,
btn_res0, btn_res1, btn_res2, btn_res3, btn_res4, btn_res5, btn_res6,
btn_markers, btn_teamplay, btn_friendlyfire,btn_parental,btn_nuke,
btn_voxels, btn_stats, btn_playcd,
btn_videofs,
btn_max
} BTNType;
typedef enum
{
mf_normal = BIT(0),
mf_pushed = BIT(1),
mf_selected = BIT(2),
mf_disabled = BIT(3),
mf_separated = BIT(4)
} MenuFlags;
#define MenuSelectFlags (mf_pushed | mf_selected | mf_disabled)
#define MenuDrawFlags (ROTATE_SPRITE_SCREEN_CLIP)
typedef enum
{
mt_none,
mt_inert, mt_slider, mt_button, mt_option, mt_layer
} MenuTag;
typedef enum
{
uc_setup, uc_draw, uc_touchup, uc_hit
} UserCall;
typedef struct MENU_ITEM
{
MenuTag type; // What kind of item is this on the
// menu?
MenuFlags flags; // Menu item flags
SLDRType slider; // Slider type, if any
BTNType button; // Button state, if any
unsigned char hotkey; // First letter of item
char *text; // Text appearing in item, if any.
void *child; // Should be menugroup, used to spawn
// sub-groups from items.
int x, y; // x,y position on screen.
short pic; // Startpic to use
char shade; // Shade of pic
int tics; // Ticcount for item
BOOL(*custom)(void); // Work function on item select
BOOL (*preprocess)(struct MENU_ITEM *);
BOOL (*postprocess)(struct MENU_ITEM *); // Can do things on items select
} MenuItem, *MenuItem_p;
typedef struct
{
int x, y; // Menu x,y position on screen.
char *text;
MenuItem_p items; // Array of menu items for this menu.
short titlepic; // Used to draw title on menu with.
short cursorpic; // Pic used for menu cursor, 1st in
// anim sequence if animated.
char shade; // Title pic shade
BOOL(*draw_custom)(UserCall, MenuItem *); // Custom routine
BOOL(*move_custom)(UserCall, MenuItem *); // Custom routine
short cursor; // This is the current menu item the
// cursor is resting on.
} MenuGroup, *MenuGroup_p;
// Custom Routine Prototypes ////////////////////////////////////////////////////////////////////
BOOL MNU_QuitCustom(UserCall call, MenuItem *item);
BOOL MNU_QuickLoadCustom(UserCall call, MenuItem *item);
BOOL MNU_LoadSaveTouchupCustom(UserCall call, MenuItem *item);
BOOL MNU_DoParentalPassword(UserCall call, MenuItem *item);
BOOL MNU_OrderCustom(UserCall call, MenuItem *item);
BOOL MNU_DoEpisodeSelect(UserCall call, MenuItem *item);
BOOL MNU_MusicFxCheck(MenuItem_p item);
BOOL MNU_MusicCheck(MenuItem_p item);
BOOL MNU_FxCheck(MenuItem_p item);
BOOL MNU_MouseCheck(MenuItem_p item);
BOOL MNU_JoystickCheck(MenuItem_p item);
BOOL MNU_BorderCheck(MenuItem_p item);
BOOL MNU_ShareWareCheck(MenuItem_p item);
BOOL MNU_MenuLevelCheck(MenuItem_p item);
BOOL MNU_ShareWareMessage(MenuItem_p item);
// Custom MenuItem Routines /////////////////////////////////////////////////////////////////////
BOOL MNU_StartGame(void);
BOOL MNU_StartNetGame(void);
BOOL MNU_EpisodeCustom(void);
BOOL MNU_GetDescripCustom(void);
BOOL MNU_LoadGameCustom(void);
BOOL MNU_SaveGameCustom(void);
BOOL MNU_GetLoadCustom(void);
BOOL MNU_GetSaveCustom(void);
BOOL MNU_ParentalCustom(void);
BOOL MNU_KeySetupCustom(UserCall call, MenuItem *item);
BOOL MNU_LoadModernDefaults(void);
BOOL MNU_LoadClassicDefaults(void);
// Menu Definitions /////////////////////////////////////////////////////////////////////////////
#define DefInert(key,text) mt_inert,mf_normal,sldr_none,btn_none,key,text,NULL
#define DefSlider(slider,key,text) mt_slider,mf_normal,slider,btn_none,key,text,NULL
#define DefOption(key,text) mt_option,mf_normal,sldr_none,btn_none,key,text,NULL
#define DefButton(button,key,text) mt_button,mf_normal,sldr_none,button,key,text,NULL
#define DefLayer(key,text,child) mt_layer,mf_normal,sldr_none,btn_none,key,text,child
#define DefDisabled(key,text,child) mt_layer,mf_disabled,sldr_none,btn_none,key,text,child
#define DefNone mt_none,0,0,0,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL
#define OPT_XS 30
#define OPT_YS 30
#define OPT_XSIDE (OPT_XS + 120)
#define OPT_YINC 10
#define OPT_LINE(line) (OPT_YS + (OPT_YINC * (line)))
typedef struct
{
int x,y;
} VMODE;
#endif

View file

@ -0,0 +1,64 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#define FILE_ANSI_STD 0
#define FILE_KEN 1
#define FILE_DOS 2
//#define FILE_TYPE FILE_ANSI_STD
#define FILE_TYPE FILE_KEN
#if FILE_TYPE == FILE_ANSI_STD
typedef FILE *MFILE;
#define MREAD(ptr, size, num,handle) fread((ptr),(size),(num),(handle))
#define MWRITE(ptr, size, num,handle) fwrite((ptr),(size),(num),(handle))
#define MOPEN_WRITE(name) fopen(name,"wb")
#define MOPEN_READ(name) fopen(name,"rb")
#define MCLOSE(handle) fclose(handle)
#define MF_ERR 0
#endif
#if FILE_TYPE == FILE_KEN
typedef FILE *MFILE;
size_t dfread(void *, size_t, size_t, FILE *);
size_t dfwrite(void *, size_t, size_t, FILE *);
#define MREAD(ptr, size, num,handle) dfread((ptr),(size),(num),(handle))
#define MWRITE(ptr, size, num,handle) dfwrite((ptr),(size),(num),(handle))
#define MOPEN_WRITE(name) fopen(name,"wb")
#define MOPEN_READ(name) fopen(name,"rb")
#define MCLOSE(handle) fclose(handle)
#define MF_ERR 0
#endif
#if FILE_TYPE == FILE_DOS
typedef long MFILE;
#define MREAD(ptr, size, num,handle) read((handle),(ptr),(size)*(num))
#define MWRITE(ptr, size, num,handle) write((handle),(ptr),(size)*(num))
#define MOPEN_WRITE(name) open(name,O_BINARY|O_TRUNC|O_CREAT|O_WRONLY,S_IREAD|S_IWRITE)
#define MOPEN_READ(name) open(name,O_BINARY|O_RDWR,S_IREAD)
#define MCLOSE(handle) close(handle)
#define MF_ERR -1
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,588 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "names2.h"
#include "panel.h"
//#include "keys.h"
#include "tags.h"
#include "sector.h"
#include "ai.h"
#include "player.h"
#include "game.h"
VOID ScaleSectorObject(SECTOR_OBJECTp);
short
DoSectorObjectSetScale(short match)
{
SECTOR_OBJECTp sop;
for (sop = SectorObject; sop < &SectorObject[MAX_SECTOR_OBJECTS]; sop++)
{
if (sop->xmid == MAXLONG)
continue;
if (sop->match_event == match)
{
SET(sop->flags, SOBJ_DYNAMIC);
sop->PreMoveAnimator = ScaleSectorObject;
switch (sop->scale_active_type)
{
case SO_SCALE_RANDOM_POINT:
if (sop->scale_type == SO_SCALE_HOLD || sop->scale_type == SO_SCALE_NONE)
{
// if holding start it up
sop->scale_type = sop->scale_active_type;
}
else
{
// if moving set to hold
sop->scale_type = SO_SCALE_HOLD;
}
break;
case SO_SCALE_DEST:
sop->scale_type = sop->scale_active_type;
if (sop->scale_dist == sop->scale_dist_max)
{
// make it negative
if (sop->scale_speed > 0)
sop->scale_speed = -sop->scale_speed;
}
else if (sop->scale_dist == sop->scale_dist_min)
{
// make it positive
if (sop->scale_speed < 0)
sop->scale_speed = -sop->scale_speed;
}
else
{
// make it positive
if (sop->scale_speed < 0)
sop->scale_speed = -sop->scale_speed;
}
break;
case SO_SCALE_RANDOM:
case SO_SCALE_CYCLE:
if (sop->scale_type == SO_SCALE_HOLD)
{
// if holding start it up
sop->scale_type = sop->scale_active_type;
}
else
{
// if moving set to hold
sop->scale_type = SO_SCALE_HOLD;
}
break;
}
}
}
return 0;
}
short
DoSOevent(short match, short state)
{
SECTOR_OBJECTp sop;
SPRITEp me_sp;
short vel_adj=0, spin_adj=0;
for (sop = SectorObject; sop < &SectorObject[MAX_SECTOR_OBJECTS]; sop++)
{
if (sop->xmid == MAXLONG)
continue;
if (sop->match_event == match)
{
if (TEST(sop->flags, SOBJ_WAIT_FOR_EVENT))
{
if (sop->save_vel > 0 || sop->save_spin_speed > 0)
{
RESET(sop->flags, SOBJ_WAIT_FOR_EVENT);
sop->vel = sop->save_vel;
sop->spin_speed = sop->save_spin_speed;
}
}
if (sop->match_event_sprite == -1)
continue;
me_sp = &sprite[sop->match_event_sprite];
// toggle
if (state == -1)
{
if (TEST_BOOL3(me_sp))
{
RESET_BOOL3(me_sp);
state = OFF;
}
else
{
SET_BOOL3(me_sp);
state = ON;
}
}
if (state == ON)
{
spin_adj = (int)SP_TAG3(me_sp);
vel_adj = SP_TAG7(me_sp);
}
else if (state == OFF)
{
spin_adj = -(int)SP_TAG3(me_sp);
vel_adj = -SP_TAG7(me_sp);
}
sop->spin_speed += spin_adj;
if (TEST_BOOL1(me_sp))
sop->vel_tgt += vel_adj;
else
sop->vel += vel_adj;
if (TEST_BOOL2(me_sp))
{
sop->dir *= -1;
}
}
}
return 0;
}
//
// SCALING - PreAnimator
//
VOID ScaleSectorObject(SECTOR_OBJECTp sop)
{
switch (sop->scale_type)
{
case SO_SCALE_NONE:
break;
case SO_SCALE_HOLD:
break;
// to dest
case SO_SCALE_DEST:
sop->scale_dist += sop->scale_speed;
if (sop->scale_dist > sop->scale_dist_max)
{
sop->scale_dist = sop->scale_dist_max;
sop->scale_type = SO_SCALE_HOLD;
}
else if (sop->scale_dist < sop->scale_dist_min)
{
sop->scale_dist = sop->scale_dist_min;
sop->scale_type = SO_SCALE_HOLD;
}
break;
// random direction change
case SO_SCALE_RANDOM:
sop->scale_dist += sop->scale_speed;
if (sop->scale_dist > sop->scale_dist_max)
{
sop->scale_speed *= -1;
sop->scale_dist = sop->scale_dist_max;
}
else if (sop->scale_dist < sop->scale_dist_min)
{
sop->scale_speed *= -1;
sop->scale_dist = sop->scale_dist_min;
}
if (RANDOM_P2(1024) < sop->scale_rand_freq<<3)
{
sop->scale_speed *= -1;
}
break;
// cycle through max and min
case SO_SCALE_CYCLE:
sop->scale_dist += sop->scale_speed;
if (sop->scale_dist > sop->scale_dist_max)
{
sop->scale_speed *= -1;
sop->scale_dist = sop->scale_dist_max;
}
else if (sop->scale_dist < sop->scale_dist_min)
{
sop->scale_speed *= -1;
sop->scale_dist = sop->scale_dist_min;
}
break;
}
}
VOID ScaleRandomPoint(SECTOR_OBJECTp sop, short k, short ang, int x, int y, int *dx, int *dy)
{
int xmul,ymul;
sop->scale_point_dist[k] += sop->scale_point_speed[k];
if (sop->scale_point_dist[k] > sop->scale_point_dist_max)
{
sop->scale_point_speed[k] *= -1;
sop->scale_point_dist[k] = sop->scale_point_dist_max;
}
else if (sop->scale_point_dist[k] < sop->scale_point_dist_min)
{
sop->scale_point_speed[k] *= -1;
sop->scale_point_dist[k] = sop->scale_point_dist_min;
}
if (RANDOM_P2(1024) < sop->scale_point_rand_freq)
{
sop->scale_point_speed[k] *= -1;
}
// change up speed at random
if (RANDOM_P2(1024) < (sop->scale_point_rand_freq/2))
{
//sop->scale_point_speed[k] = SCALE_POINT_SPEED;
short half = sop->scale_point_base_speed/2;
short quart = sop->scale_point_base_speed/4;
sop->scale_point_speed[k] = sop->scale_point_base_speed + (RANDOM_RANGE(half) - quart);
}
xmul = (sop->scale_point_dist[k] * sop->scale_x_mult)>>8;
ymul = (sop->scale_point_dist[k] * sop->scale_y_mult)>>8;
*dx = x + ((xmul * sintable[NORM_ANGLE(ang+512)]) >> 14);
*dy = y + ((ymul * sintable[ang]) >> 14);
}
//
// Morph point - move point around
//
VOID
MorphTornado(SECTOR_OBJECTp sop)
{
int mx, my;
int ceilingz;
int floorz;
SECTORp *sectp;
int j;
int x,y,sx,sy;
// z direction
ASSERT(sop->op_main_sector >= 0);
sop->morph_z += Z(sop->morph_z_speed);
// move vector
if (sop->morph_wall_point < 0)
return;
// place at correct x,y offset from center
x = sop->xmid - sop->morph_xoff;
y = sop->ymid - sop->morph_yoff;
sx = x;
sy = y;
// move it from last x,y
mx = x + (((sop->morph_speed) * sintable[NORM_ANGLE(sop->morph_ang+512)]) >> 14);
my = y + (((sop->morph_speed) * sintable[sop->morph_ang]) >> 14);
// bound check radius
if (ksqrt(SQ(sop->xmid - mx) + SQ(sop->ymid - my)) > sop->morph_dist_max + sop->scale_dist)
{
// find angle
sop->morph_ang = NORM_ANGLE(getangle(mx - sop->xmid, my - sop->ymid));
// reverse angle
sop->morph_ang = NORM_ANGLE(sop->morph_ang + 1024);
// move back some from last point
mx = sx + (((sop->morph_speed*2) * sintable[NORM_ANGLE(sop->morph_ang+512)]) >> 14);
my = sy + (((sop->morph_speed*2) * sintable[sop->morph_ang]) >> 14);
sop->morph_xoff = sop->xmid - mx;
sop->morph_yoff = sop->ymid - my;
}
// save x,y back as offset info
sop->morph_xoff = sop->xmid - mx;
sop->morph_yoff = sop->ymid - my;
if ((RANDOM_P2(1024<<4)>>4) < sop->morph_rand_freq)
sop->morph_ang = RANDOM_P2(2048);
// move it x,y
dragpoint(sop->morph_wall_point, mx, my);
// bound the Z
ceilingz = sector[sop->op_main_sector].ceilingz;
floorz = sector[sop->op_main_sector].floorz;
for (sectp = sop->sectp, j = 0; *sectp; sectp++, j++)
{
if (SectUser[*sectp - sector] &&
TEST(SectUser[*sectp - sector]->flags, SECTFU_SO_SLOPE_CEILING_TO_POINT))
{
#define TOR_LOW (floorz)
if (sop->morph_z > TOR_LOW)
{
sop->morph_z_speed *= -1;
sop->morph_z = TOR_LOW;
}
else if (sop->morph_z < ceilingz)
{
sop->morph_z_speed *= -1;
sop->morph_z = ceilingz;
}
alignceilslope(*sectp - sector, mx, my, sop->morph_z);
}
}
}
// moves center point around and aligns slope
VOID
MorphFloor(SECTOR_OBJECTp sop)
{
int mx, my;
int floorz;
SECTORp *sectp;
int j;
int x,y;
// z direction
ASSERT(sop->op_main_sector >= 0);
sop->morph_z -= Z(sop->morph_z_speed);
// move vector
if (sop->morph_wall_point < 0)
return;
// place at correct x,y offset from center
x = sop->xmid - sop->morph_xoff;
y = sop->ymid - sop->morph_yoff;
// move it from last x,y
mx = x + (((sop->morph_speed) * sintable[NORM_ANGLE(sop->morph_ang+512)]) >> 14);
my = y + (((sop->morph_speed) * sintable[sop->morph_ang]) >> 14);
// save x,y back as offset info
sop->morph_xoff = sop->xmid - mx;
sop->morph_yoff = sop->ymid - my;
// bound check radius
if (Distance(sop->xmid, sop->ymid, mx, my) > sop->morph_dist_max)
{
// go in the other direction
//sop->morph_speed *= -1;
sop->morph_ang = NORM_ANGLE(sop->morph_ang + 1024);
// back it up and save it off
mx = x + (((sop->morph_speed) * sintable[NORM_ANGLE(sop->morph_ang+512)]) >> 14);
my = y + (((sop->morph_speed) * sintable[sop->morph_ang]) >> 14);
sop->morph_xoff = sop->xmid - mx;
sop->morph_yoff = sop->ymid - my;
// turn it all the way around and then do a random -512 to 512 from there
//sop->morph_ang = NORM_ANGLE(sop->morph_ang + 1024 + (RANDOM_P2(1024) - 512));
}
if ((RANDOM_P2(1024<<4)>>4) < sop->morph_rand_freq)
sop->morph_ang = RANDOM_P2(2048);
// move x,y point "just like in build"
dragpoint(sop->morph_wall_point, mx, my);
// bound the Z
floorz = sector[sop->op_main_sector].floorz;
#define MORPH_FLOOR_ZRANGE Z(300)
if (sop->morph_z > MORPH_FLOOR_ZRANGE)
{
sop->morph_z = MORPH_FLOOR_ZRANGE;
//sop->morph_ang = NORM_ANGLE(sop->morph_ang + 1024);
sop->morph_z_speed *= -1;
}
else if (sop->morph_z < -MORPH_FLOOR_ZRANGE)
{
sop->morph_z = -MORPH_FLOOR_ZRANGE;
//sop->morph_ang = NORM_ANGLE(sop->morph_ang + 1024);
sop->morph_z_speed *= -1;
}
for (sectp = sop->sectp, j = 0; *sectp; sectp++, j++)
{
if (SectUser[*sectp - sector] &&
TEST(SectUser[*sectp - sector]->flags, SECTFU_SO_SLOPE_CEILING_TO_POINT))
{
alignflorslope(*sectp - sector, mx, my, floorz + sop->morph_z);
}
}
}
VOID
SOBJ_AlignFloorToPoint(SECTOR_OBJECTp sop, int x, int y, int z)
{
SECTORp *sectp;
int j;
for (sectp = sop->sectp, j = 0; *sectp; sectp++, j++)
{
if (SectUser[*sectp - sector] &&
TEST(SectUser[*sectp - sector]->flags, SECTFU_SO_SLOPE_CEILING_TO_POINT))
{
alignflorslope(*sectp - sector, x, y, z);
}
}
}
VOID
SOBJ_AlignCeilingToPoint(SECTOR_OBJECTp sop, int x, int y, int z)
{
SECTORp *sectp;
int j;
for (sectp = sop->sectp, j = 0; *sectp; sectp++, j++)
{
if (SectUser[*sectp - sector] &&
TEST(SectUser[*sectp - sector]->flags, SECTFU_SO_SLOPE_CEILING_TO_POINT))
{
alignceilslope(*sectp - sector, x, y, z);
}
}
}
VOID
SOBJ_AlignFloorCeilingToPoint(SECTOR_OBJECTp sop, int x, int y, int z)
{
SECTORp *sectp;
int j;
for (sectp = sop->sectp, j = 0; *sectp; sectp++, j++)
{
if (SectUser[*sectp - sector] &&
TEST(SectUser[*sectp - sector]->flags, SECTFU_SO_SLOPE_CEILING_TO_POINT))
{
alignflorslope(*sectp - sector, x, y, z);
alignceilslope(*sectp - sector, x, y, z);
}
}
}
// moves center point around and aligns slope
VOID
SpikeFloor(SECTOR_OBJECTp sop)
{
int mx, my;
int floorz;
SECTORp *sectp;
int j;
int x,y;
// z direction
ASSERT(sop->op_main_sector >= 0);
sop->morph_z -= Z(sop->morph_z_speed);
// move vector
if (sop->morph_wall_point < 0)
return;
// place at correct x,y offset from center
x = sop->xmid - sop->morph_xoff;
y = sop->ymid - sop->morph_yoff;
// move it from last x,y
mx = x;
my = y;
// bound the Z
floorz = sector[sop->op_main_sector].floorz;
#define MORPH_FLOOR_ZRANGE Z(300)
if (sop->morph_z > MORPH_FLOOR_ZRANGE)
{
sop->morph_z = MORPH_FLOOR_ZRANGE;
sop->morph_z_speed *= -1;
}
else if (sop->morph_z < -MORPH_FLOOR_ZRANGE)
{
sop->morph_z = -MORPH_FLOOR_ZRANGE;
sop->morph_z_speed *= -1;
}
SOBJ_AlignFloorToPoint(sop, mx, my, floorz + sop->morph_z);
#if 0
for (sectp = sop->sectp, j = 0; *sectp; sectp++, j++)
{
if (SectUser[*sectp - sector] &&
TEST(SectUser[*sectp - sector]->flags, SECTFU_SO_SLOPE_CEILING_TO_POINT))
{
alignflorslope(*sectp - sector, mx, my, floorz + sop->morph_z);
}
}
#endif
}
#include "saveable.h"
static saveable_code saveable_morph_code[] =
{
SAVE_CODE(DoSectorObjectSetScale),
SAVE_CODE(DoSOevent),
SAVE_CODE(ScaleSectorObject),
SAVE_CODE(ScaleRandomPoint),
SAVE_CODE(MorphTornado),
SAVE_CODE(MorphFloor),
SAVE_CODE(SOBJ_AlignFloorToPoint),
SAVE_CODE(SOBJ_AlignCeilingToPoint),
SAVE_CODE(SOBJ_AlignFloorCeilingToPoint),
SAVE_CODE(SpikeFloor),
};
saveable_module saveable_morph =
{
// code
saveable_morph_code,
SIZ(saveable_morph_code),
// data
NULL,0
};

View file

@ -0,0 +1,321 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef TYPES_H
#define TYPES_H
// CTW ADDITION (from Duke 3d TYPES.H)
typedef unsigned char uint8;
typedef uint8 byte;
typedef signed char int8;
typedef unsigned short int uint16;
typedef uint16 word;
typedef short int int16;
typedef unsigned int uint32;
typedef int int32;
typedef uint32 dword;
typedef int32 fixed;
typedef int32 boolean;
typedef float float32;
typedef double float64;
//typedef long double float128;
typedef float64 appfloat;
#define MAXINT32 0x7fffffff
#define MININT32 -0x80000000
#define MAXUINT32 0xffffffff
#define MINUINT32 0
#define MAXINT16 0x7fff
#define MININT16 -0x8000
#define MAXUINT16 0xffff
#define MINUINT16 0
// CTW ADDITION END
#define FALSE 0
#define TRUE (!FALSE)
#ifndef NULL
#define NULL 0
#endif
#define OFF 0
#define ON (!OFF)
typedef unsigned char BOOL;
typedef BOOL *BOOLp;
typedef BOOL *fBOOLp;
typedef signed char CHAR;
typedef CHAR *CHARp;
typedef CHAR *fCHARp;
#define MINCHAR ((CHAR) -128)
#define MAXCHAR ((CHAR) 127)
typedef short SHORT;
typedef SHORT *SHORTp;
typedef SHORT *fSHORTp;
typedef unsigned short USHORT;
typedef USHORT *USHORTp;
typedef USHORT *fUSHORTp;
typedef unsigned char UCHAR;
typedef UCHAR *UCHARp;
typedef UCHAR *fUCHARp;
#define MINUCHAR ((UCHAR) 0)
#define MAXUCHAR ((UCHAR) 255)
typedef UCHARp TEXT;
typedef fUCHARp fTEXT;
typedef UCHAR BYTE;
typedef BYTE *BYTEp;
typedef BYTE *fBYTEp;
#define MINBYTE ((BYTE) 0)
#define MAXBYTE ((BYTE) 255)
typedef int INT;
typedef int *INTp;
typedef int *fINTp;
#define MININT (-32768)
#define MAXINT 32767
typedef unsigned int WORD;
typedef WORD *WORDp;
typedef WORD *fWORDp;
#define MINWORD ((WORD) 0)
#define MAXWORD ((WORD) 65535U)
typedef int LONG;
typedef LONG *LONGp;
typedef LONG *fLONGp;
typedef
union
{
LONG l;
struct
{
WORD lsw;
WORD msw;
} w;
} DD, * DDp, * fDDp;
#define MINLONG (-2147483648L)
#define MAXLONG (2147483647L)
typedef unsigned int ULONG;
typedef ULONG *ULONGp;
typedef ULONG *fULONGp;
#define MINULONG (0L)
#define MAXULONG (ULONG(-1))
typedef float FLOAT;
typedef FLOAT *FLOATp;
typedef FLOAT *fFLOATp;
#define VOID void
typedef VOID *nPTR;
typedef VOID *fPTR;
#if 0
#define FN pascal
#define fFN pascal
#define cFN cdecl
#define fcFN cdecl
#else
#define FN
#define fFN
#define cFN
#define fcFN
#endif
typedef VOID FN VOIDfn (VOID);
typedef BOOL FN BOOLfn (VOID);
typedef CHAR FN CHARfn (VOID);
typedef SHORT FN SHORTfn (VOID);
typedef UCHAR FN UCHARfn (VOID);
typedef TEXT FN TEXTfn (VOID);
typedef fTEXT FN fTEXTfn (VOID);
typedef BYTE FN BYTEfn (VOID);
typedef int FN INTfn (VOID);
typedef WORD FN WORDfn (VOID);
typedef LONG FN LONGfn (VOID);
typedef ULONG FN ULONGfn (VOID);
typedef VOID fFN VOIDfFN (VOID);
typedef BOOL fFN BOOLfFN (VOID);
typedef CHAR fFN CHARfFN (VOID);
typedef SHORT fFN SHORTfFN (VOID);
typedef UCHAR fFN UCHARfFN (VOID);
typedef TEXT fFN TEXTfFN (VOID);
typedef fTEXT fFN fTEXTfFN (VOID);
typedef BYTE fFN BYTEfFN (VOID);
typedef int fFN INTfFN (VOID);
typedef WORD fFN WORDfFN (VOID);
typedef LONG fFN LONGfFN (VOID);
typedef ULONG fFN ULONGfFN (VOID);
/*
===========================
=
= FAST calculations
=
===========================
*/
// For fast DIVision of integers
#define DIV2(x) ((x) >> 1)
#define DIV4(x) ((x) >> 2)
#define DIV8(x) ((x) >> 3)
#define DIV16(x) ((x) >> 4)
#define DIV32(x) ((x) >> 5)
#define DIV64(x) ((x) >> 6)
#define DIV128(x) ((x) >> 7)
#define DIV256(x) ((x) >> 8)
// Constants used in fast mods
#define C_MOD2 1
#define C_MOD4 3
#define C_MOD8 7
#define C_MOD16 15
#define C_MOD32 31
#define C_MOD64 63
#define C_MOD128 127
#define C_MOD256 255
// Fast mods of select 2 power numbers
#define MOD2(x) ((x) & C_MOD2)
#define MOD4(x) ((x) & C_MOD4)
#define MOD8(x) ((x) & C_MOD8)
#define MOD16(x) ((x) & C_MOD16)
#define MOD32(x) ((x) & C_MOD32)
#define MOD64(x) ((x) & C_MOD64)
#define MOD128(x) ((x) & C_MOD128)
#define MOD256(x) ((x) & C_MOD256)
// Fast mods of any power of 2
#define MOD_P2(number,modby) ((number) & ((modby)-1))
// Truncates to select 2 power numbers
#define TRUNC2(x) ((x) & ~C_MOD2)
#define TRUNC4(x) ((x) & ~C_MOD4)
#define TRUNC8(x) ((x) & ~C_MOD8)
#define TRUNC16(x) ((x) & ~C_MOD16)
#define TRUNC32(x) ((x) & ~C_MOD32)
#define TRUNC64(x) ((x) & ~C_MOD64)
#define TRUNC128(x) ((x) & ~C_MOD128)
#define TRUNC256(x) ((x) & ~C_MOD256)
#define POWER2_TRUNC(number,truncby) ((number) & ~((truncby)-1))
// moves value to closest power of 2 pixel boundry
#define BOUND_2PIX(x) ( TRUNC2((x) + MOD2(x)) )
#define BOUND_4PIX(x) ( TRUNC4((x) + MOD4(x)) )
#define BOUND_8PIX(x) ( TRUNC8((x) + MOD8(x)) )
#define BOUND_16PIX(x) ( TRUNC16((x) + MOD16(x)) )
#define BOUND_32PIX(x) ( TRUNC32((x) + MOD32(x)) )
#define BOUND_64PIX(x) ( TRUNC64((x) + MOD64(x)) )
#define BOUND_128PIX(x) ( TRUNC128((x) + MOD128(x)) )
#define BOUND_256PIX(x) ( TRUNC256((x) + MOD256(x)) )
#define BOUND_POWER2_PIX(x,bound) ( POWER2_TRUNC((x,bound) + POWER2_MOD(x,bound)) )
// A few muls with shifts and adds
// probably not needed with good compiler
#define MUL2(x) ((x)*2)
#define MUL3(x) (((x)<<1) + (x))
#define MUL5(x) (((x)<<2) + (x))
#define MUL6(x) (((x)<<2) + (x) + (x))
#define MUL7(x) (((x)<<2) + (x) + (x) + (x))
#define MUL8(x) ((x)*8)
#define MUL9(x) (((x)<<3) + (x))
#define MUL10(x) (((x)<<3) + (x) + (x))
#define MUL11(x) (((x)<<3) + (x) + (x) + (x))
#define MUL12(x) (((x)<<3) + ((x)<<2))
#define MUL13(x) (((x)<<3) + ((x)<<2) + (x))
#define MUL14(x) (((x)<<3) + ((x)<<2) + (x) + (x))
#define MUL15(x) (((x)<<3) + ((x)<<2) + (x) + (x) + (x))
#define MUL16(x) ((x)*16)
/*
===========================
=
= Bit manipulation
=
===========================
*/
#define TEST(flags,mask) ((flags) & (mask))
#define SET(flags,mask) ((flags) |= (mask))
#define RESET(flags,mask) ((flags) &= ~(mask))
#define FLIP(flags,mask) ((flags) ^= (mask))
// mask definitions
#define BIT(shift) (1<<(shift))
/*
===========================
=
= Miscellaneous
=
===========================
*/
//#define ABS(num) ((num) < 0 ? -(num) : (num))
#define BETWEEN(x,low,high) (((x) >= (low)) && ((x) <= (high)))
#endif

View file

@ -0,0 +1,94 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
//Be careful when changing this file - it is parsed by Editart and Build.
#define ALPHABET 85
#define MENU_MAIN 295
#define MENU_OPTION 296
#define MENU_WHICH 297
#define MENU_CURSOR 298
#define DART1 2000
#define DART2 2001
#define DART3 2002
#define DART4 2003
#define DART 2004
#define FIRE1 2005
#define FIRE2 2006
#define FIRE3 2007
#define FIRE4 2008
#define FIRE5 2009
#define FIREBALL1 2010
#define FIREBALL2 2011
#define FIREBALL3 2012
#define FIREBALL4 2013
#define FLAMES1 2014
#define FLAMES2 2015
#define FLAMES3 2016
#define FLAMES4 2017
#define FLAMES5 2018
#define GAS1 2019
#define GAS2 2020
#define GAS3 2021
#define GAS4 2022
#define GAS5 2023
#define GAS6 2024
#define GAS7 2025
#define GASCLOUD1 2026
#define GASCLOUD2 2027
#define GASCLOUD3 2028
#define GASCLOUD4 2029
#define GASCLOUD5 2030
#define GASCLOUD6 2031
#define GASCLOUD7 2032
#define GASCLOUD8 2033
#define GASCLOUD9 2034
#define LIGHT1 2035
#define LIGHT2 2036
#define LIGHT3 2037
#define LIGHT4 2038
#define LIGHT5 2039
#define LIGHT6 2040
#define ELECTRO1 2041
#define ELECTRO2 2042
#define ELECTRO3 2043
#define RIFLE1 2044
#define RIFLE2 2045
#define RIFLE3 2046
#define DONTUSE_EXTRA 2047
#define RIFLE4 2048
#define CARTRIGE3 2053
#define STATUE1 2054
#define STATUE2 2055
#define STATUE3 2056
#define STATUE4 2057
#define SWORD3 2065
#define SWORD4 2066
#define SWORD1 2067
#define SWORD2 2068
#define SWORD5 2069
#define BLACK___ 2306
#define FragBarErase 2375
#define FragBarErase2 2376

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,206 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#define PACKET_TYPE_MASTER_TO_SLAVE 0
#define PACKET_TYPE_SLAVE_TO_MASTER 1
//#define PACKET_TYPE_PLAYER_NAME 3
#define PACKET_TYPE_MESSAGE 4
//#define PACKET_TYPE_GAME_INFO 8
#define PACKET_TYPE_BROADCAST 17
#define SERVER_GENERATED_BROADCAST 18
#define PACKET_TYPE_PROXY 19
#define PACKET_TYPE_NEW_GAME 30
//#define PACKET_TYPE_NEW_LEVEL 31
#define PACKET_TYPE_PLAYER_OPTIONS 32
#define PACKET_TYPE_RTS 33
#define PACKET_TYPE_DUMMY 34
#define PACKET_TYPE_MENU_LEVEL_QUIT 35
#define PACKET_TYPE_NAME_CHANGE 36
#define PACKET_TYPE_VERSION 38
#define PACKET_TYPE_NULL_PACKET 127
#define PACKET_TYPE_PLAYER_READY 250
#define PACKET_TYPE_DONT_USE 255 // old logoff
#define BIT_CODEC TRUE
#define SYNC_TEST TRUE
#define MAXSYNCBYTES 16
#ifdef __GNUC__
# define PACKED __attribute__ ((packed))
#else
# define PACKED
# ifdef _MSC_VER
# pragma pack(1)
# endif
# ifdef __WATCOMC__
# pragma pack(push,1);
# endif
#endif
// Slave->Master: PlayerIndex = who to send the packet to (-1 = all)
// Master->Slave: PlayerIndex = who sent the packet originally
typedef struct PACKED
{
BYTE PacketType; // first byte is always packet type
BYTE PlayerIndex;
} PACKET_PROXY,*PACKET_PROXYp;
typedef struct PACKED
{
BYTE PacketType; // first byte is always packet type
BYTE FirstPlayerIndex;
BOOL AutoAim;
BYTE Level;
BYTE Episode;
CHAR Skill;
BYTE GameType;
BOOL HurtTeammate;
BOOL SpawnMarkers;
BOOL TeamPlay;
BYTE KillLimit;
BYTE TimeLimit;
BOOL Nuke;
} PACKET_NEW_GAME,*PACKET_NEW_GAMEp;
typedef struct PACKED
{
BYTE PacketType; // first byte is always packet type
BOOL AutoRun;
BYTE Color;
char PlayerName[32];
} PACKET_OPTIONS,*PACKET_OPTIONSp;
typedef struct PACKED
{
BYTE PacketType; // first byte is always packet type
char PlayerName[32];
} PACKET_NAME_CHANGE,*PACKET_NAME_CHANGEp;
typedef struct PACKED
{
BYTE PacketType; // first byte is always packet type
BYTE RTSnum;
} PACKET_RTS,*PACKET_RTSp;
typedef struct PACKED
{
BYTE PacketType; // first byte is always packet type
int Version;
} PACKET_VERSION,*PACKET_VERSIONp;
#undef PACKED
#ifdef _MSC_VER
# pragma pack()
#endif
#ifdef __WATCOMC__
# pragma pack(pop);
#endif
extern BYTE syncstat[MAXSYNCBYTES];
extern BOOL PredictionOn;
extern PLAYER PredictPlayer;
extern PLAYERp ppp;
extern short predictangpos[MOVEFIFOSIZ];
extern int predictmovefifoplc;
extern BOOL Prediction;
extern short NumSyncBytes;
void InitPrediction(PLAYERp pp);
void DoPrediction(PLAYERp ppp);
void CorrectPrediction(int actualfifoplc);
//TENSW: safe packet senders
void netsendpacket(int ind, BYTEp buf, int len);
void netbroadcastpacket(BYTEp buf, int len);
int netgetpacket(int *ind, BYTEp buf);
enum MultiGameTypes
{
MULTI_GAME_NONE,
MULTI_GAME_COMMBAT,
MULTI_GAME_COMMBAT_NO_RESPAWN, // JUST a place holder for menus. DO NOT USE!!!
MULTI_GAME_COOPERATIVE,
MULTI_GAME_AI_BOTS
};
//extern SHORT MultiGameType; // defaults to NONE
// global net vars
// not saved in .CFG file
// used for current game
typedef struct
{
LONG KillLimit;
LONG TimeLimit;
LONG TimeLimitClock;
SHORT MultiGameType; // used to be a stand alone global
BOOL TeamPlay;
BOOL HurtTeammate;
BOOL SpawnMarkers;
BOOL AutoAim;
BOOL NoRespawn; // for commbat type games
BOOL Nuke;
} gNET,*gNETp;
extern gNET gNet;
typedef struct
{
int Rules,
Level,
Enemy,
Markers,
Team,
HurtTeam,
Kill,
Time,
Color,
Nuke;
} AUTO_NET, *AUTO_NETp;
extern AUTO_NET Auto;
extern BOOL AutoNet;
VOID getpackets(VOID);
VOID SendMulitNameChange(char *new_name);
VOID InitNetVars(void);
VOID InitTimingVars(void);
VOID PauseAction(void);
VOID ResumeAction(void);
void ErrorCorrectionQuit(void);
void Connect(void);
void waitforeverybody(void);
BOOL MenuCommPlayerQuit(short quit_player);
VOID SendVersion(int version);
VOID InitNetPlayerOptions(void);
VOID CheckVersion(int GameVersion);
VOID SendMessage(short pnum,char *text);
void PauseGame(void);
void ResumeGame(void);

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,42 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef NINJA_H
#define NINJA_H
#define NINJA_NORMAL_SPEED 60
#define NINJA_RUN_AWAY_SPEED 130
#define NINJA_FIND_PLAYER_SPEED 100
#define NINJA_CRAWL_SPEED 50
#define NINJA_SWIM_SPEED 50
void InitPlayerSprite(PLAYERp pp);
void InitAllPlayerSprites(void);
void PlayerPanelSetup(void);
void PlayerDeathReset(PLAYERp pp);
void SpawnPlayerUnderSprite(PLAYERp pp);
#endif

View file

@ -0,0 +1,121 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
////
//
// Misc Defines
//
////
#define LT_GREY (16 * 0 + 1)
#define DK_GREY (16 * 1)
#define LT_BROWN (16 * 2)
#define DK_BROWN (16 * 3)
#define LT_TAN (16 * 4)
#define DK_TAN (16 * 5)
#define RUST_RED (16 * 6)
#define RED (16 * 7)
#define YELLOW (16 * 8)
#define BRIGHT_GREEN (16 * 9)
#define DK_GREEN (16 * 10)
#define GREEN (16 * 11)
#define LT_BLUE (16 * 12)
#define DK_BLUE (16 * 13)
#define PURPLE (16 * 14)
#define FIRE (16 * 15)
//
// Palette numbers and meanings
//
#define PALETTE_DEFAULT 0
#define PALETTE_FOG 1
// blue sword blade test
#define PALETTE_MENU_HIGHLIGHT 2
// used for the elector gore pieces
#define PALETTE_ELECTRO_GORE 3
// turns ninjas belt and headband red
#define PALETTE_BASIC_NINJA 4
// diving in lava
#define PALETTE_DIVE_LAVA 5
// turns ninjas belt and headband red
#define PALETTE_RED_NINJA 6
// used for the mother ripper - she is bigger/stronger/brown
#define PALETTE_BROWN_RIPPER 7
// turns ninjas belt and headband red
#define PALETTE_GREEN_NINJA 8
// reserved diving palette this is copied over the default palette
// when needed - NOTE: could move this to a normal memory buffer if palette
// slot is needed.
#define PALETTE_DIVE 9
#define PALETTE_SKEL_GORE 10
// turns ALL colors to shades of GREEN/BLUE/RED
#define PALETTE_GREEN_LIGHTING 11
#define PALETTE_BLUE_LIGHTING 13
#define PALETTE_RED_LIGHTING 14
// for brown bubbling sludge
#define PALETTE_SLUDGE 15
// Player 0 uses default palette - others use these
// turns ninja's vests (when we get them) into different color ranges
#define PALETTE_PLAYER0 16
#define PAL_XLAT_BROWN 16
#define PALETTE_PLAYER1 17
#define PAL_XLAT_LT_GREY 17
#define PALETTE_PLAYER2 18
#define PAL_XLAT_PURPLE 18
#define PALETTE_PLAYER3 19
#define PAL_XLAT_RUST_RED 19
#define PALETTE_PLAYER4 20
#define PAL_XLAT_YELLOW 20
#define PALETTE_PLAYER5 21
#define PAL_XLAT_DK_GREEN 21
#define PALETTE_PLAYER6 22
#define PAL_XLAT_GREEN 22
#define PALETTE_PLAYER7 23
#define PAL_XLAT_LT_BLUE 23
#define PALETTE_PLAYER8 24
#define PAL_XLAT_LT_TAN 24
#define PALETTE_PLAYER9 25
#define PAL_XLAT_RED 25
#define PALETTE_PLAYER10 26
#define PAL_XLAT_DK_GREY 26
#define PALETTE_PLAYER11 27
#define PAL_XLAT_BRIGHT_GREEN 27
#define PALETTE_PLAYER12 28
#define PAL_XLAT_DK_BLUE 28
#define PALETTE_PLAYER13 29
#define PAL_XLAT_FIRE 29
#define PALETTE_PLAYER14 30
#define PALETTE_PLAYER15 31
#define PALETTE_ILLUMINATE 32 // Used to make sprites bright green in night vision

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,201 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef PANEL_H
#define PANEL_H
#include "mytypes.h"
#include "game.h"
#define FRAG_BAR 2920
#define PRI_FRONT_MAX 250
#define PRI_FRONT 192
#define PRI_MID 128
#define PRI_BACK 64
#define PRI_BACK_MAX 0
#define MAKE_CONPIC_ENUM
enum conpic_id
{
#include "conpic.h"
};
typedef enum conpic_id CONPIC_ID;
#undef MAKE_CONPIC_ENUM
enum PanelSpriteIDs
{
ID_BORDER_TOP = 1, ID_BORDER_BOTTOM, ID_BORDER_LEFT, ID_BORDER_RIGHT, ID_BORDER_SHADE,
ID_PANEL_BORDER_LEFT, ID_PANEL_BORDER_RIGHT,
ID_TEXT, ID_TEXT2, ID_TEXT3, ID_TEXT4
};
struct PANEL_STATEstruct
{
short picndx; // for pip stuff in conpic.h
int tics;
void (*Animator)(PANEL_SPRITEp); // JBF: return type was long
PANEL_STATEp NextState;
ULONG flags;
BYTE xvel;
BYTE yvel;
};
#define PANF_PRIMARY (BIT(0)) // denotes primary weapon
#define PANF_SECONDARY (BIT(1)) // denotes secondary weapon
#define PANF_BOB (BIT(2))
#define PANF_REST_POS (BIT(3)) // used for certain weapons - fireball
#define PANF_RELOAD (BIT(4)) // reload flag used for uzi
#define PANF_TRANS_FLIP (BIT(5)) // translucent flip - matches rotate sprite
#define PANF_ACTION_POS (BIT(6)) // used for certain weapons - fireball
#define PANF_WEAPON_HIDE (BIT(7)) // hide when climbing/driving
#define PANF_TRANSLUCENT (BIT(8)) // turn invisible
#define PANF_INVISIBLE (BIT(9)) // turn invisible
#define PANF_DEATH_HIDE (BIT(10)) // hide done when dead
#define PANF_KILL_AFTER_SHOW (BIT(11)) // kill after showing numpages times
#define PANF_SCREEN_CLIP (BIT(12)) // maintain aspect to the screen
#define PANF_STATUS_AREA (BIT(13)) // maintain aspect to the screen
#define PANF_IGNORE_START_MOST (BIT(14)) // maintain aspect to the screen
#define PANF_XFLIP (BIT(15)) // xflip
#define PANF_SUICIDE (BIT(16)) // kill myself
#define PANF_WEAPON_SPRITE (BIT(17)) // its a weapon sprite - for V mode
#define PANF_CORNER (BIT(18)) // draw from the corner
#define PANF_NOT_IN_VIEW (BIT(19)) // not in view
#define PANF_UNHIDE_SHOOT (BIT(20)) // shoot after un-hiding a weapon
#define PANF_JUMPING (BIT(21))
#define PANF_FALLING (BIT(22))
#define PANF_DRAW_BEFORE_VIEW (BIT(30)) // draw before drawrooms
#define PANF_NOT_ALL_PAGES (BIT(31)) // DONT use permanentwritesprite bit for rotatesprite
typedef VOID (*PANEL_SPRITE_FUNCp)(PANEL_SPRITEp);
typedef struct
{
PANEL_STATEp State;
int flags;
short tics;
short pic;
short xoff; // from panel sprite center x
short yoff; // from panel sprite center y
} PANEL_SPRITE_OVERLAY, *PANEL_SPRITE_OVERLAYp;
struct PANEL_SPRITEstruct
{
PANEL_SPRITEp Next, Prev;
PANEL_SPRITEp sibling;
PANEL_STATEp State, RetractState, PresentState, ActionState, RestState;
PLAYERp PlayerP;
// Do not change the order of this line
USHORT xfract;
SHORT x;
USHORT yfract;
SHORT y; // Do not change the order of this
// line
PANEL_SPRITE_OVERLAY over[8];
PANEL_SPRITE_FUNCp PanelSpriteFunc;
short ID; // id for finding sprite types on the
// list
short picndx; // for pip stuff in conpic.h
short picnum; // bypass pip stuff in conpic.h
short x1, y1, x2, y2; // for rotatesprites box cliping
short vel, vel_adj;
short numpages;
int xorig, yorig, flags, priority;
int scale;
int jump_speed, jump_grav; // jumping vars
int xspeed;
short tics, delay; // time vars
short ang, rotate_ang;
short sin_ndx, sin_amt, sin_arc_speed;
short bob_height_shift;
short shade, pal;
short kill_tics;
short WeaponType; // remember my own weapon type for weapons with secondary function
};
typedef struct
{
PANEL_STATEp pstate;
short state_size;
} PANEL_STATE_TABLE, *PANEL_STATE_TABLEp;
extern PANEL_STATE_TABLE PanelStateTable[];
// Panel State flags - also used for
#define psf_Invisible BIT(16)
#define psf_QuickCall BIT(23)
#define psf_Xflip BIT(24)
#define psf_ShadeHalf BIT(25)
#define psf_ShadeNone BIT(26)
enum BorderTypes
{
BORDER_NONE = 0,
BORDER_MINI_BAR = 1,
BORDER_BAR = 2
};
#define MICRO_SIGHT_NUM 0
#define MICRO_SIGHT 2075
#define MICRO_SHOT_NUM 2
#define MICRO_SHOT_20 2076
#define MICRO_SHOT_1 2077
#define MICRO_HEAT_NUM 1
#define MICRO_HEAT 2084
#define UZI_COPEN 2040
#define UZI_CCLOSED 2041
#define UZI_CLIT 2042
#define UZI_CRELOAD 2043
#define HEAD_MODE1 2055
#define HEAD_MODE2 2056
#define HEAD_MODE3 2057
#define SHOTGUN_AUTO_NUM 0
#define SHOTGUN_AUTO 2078
PANEL_SPRITEp pSpawnSprite(PLAYERp pp, PANEL_STATEp state, BYTE priority, int x, int y);
PANEL_SPRITEp pSpawnFullScreenSprite(PLAYERp pp, short pic, short pri, int x, int y);
PANEL_SPRITEp pSpawnFullViewSprite(PLAYERp pp,short pic,short pri,int x,int y);
void pSetSuicide(PANEL_SPRITEp psp);
BOOL pKillScreenSpiteIDs(PLAYERp pp, short id);
VOID pFlushPerms(PLAYERp pp);
VOID PreUpdatePanel(void);
void UpdatePanel(void);
void PlayerUpdateKeys(PLAYERp pp);
void PlayerUpdateArmor(PLAYERp pp,short value);
void pToggleCrosshair(PLAYERp pp);
void pKillSprite(PANEL_SPRITEp psp);
void InitChops(PLAYERp pp);
void ChopsSetRetract(PLAYERp pp);
VOID PlayerUpdateTimeLimit(PLAYERp pp);
#endif

Some files were not shown because too many files have changed in this diff Show more