mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-22 17:21:24 +00:00
Merge branch 'next' of https://git.do.srb2.org/STJr/SRB2 into buttered-lua
This commit is contained in:
commit
32a4b270df
71 changed files with 809 additions and 486 deletions
2
dep/.gitignore
vendored
Normal file
2
dep/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#All folders
|
||||||
|
*.d
|
2
dep/FreeBSD/SDL/Debug/.gitignore
vendored
Normal file
2
dep/FreeBSD/SDL/Debug/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/FreeBSD/SDL/Release/.gitignore
vendored
Normal file
2
dep/FreeBSD/SDL/Release/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Linux/SDL/Debug/.gitignore
vendored
Normal file
2
dep/Linux/SDL/Debug/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Linux/SDL/Release/.gitignore
vendored
Normal file
2
dep/Linux/SDL/Release/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Linux64/SDL/Debug/.gitignore
vendored
Normal file
2
dep/Linux64/SDL/Debug/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Linux64/SDL/Release/.gitignore
vendored
Normal file
2
dep/Linux64/SDL/Release/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/MasterClient/.gitignore
vendored
Normal file
2
dep/MasterClient/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/MasterServer/.gitignore
vendored
Normal file
2
dep/MasterServer/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Mingw/Debug/.gitignore
vendored
Normal file
2
dep/Mingw/Debug/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Mingw/Release/.gitignore
vendored
Normal file
2
dep/Mingw/Release/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Mingw/SDL/Debug/.gitignore
vendored
Normal file
2
dep/Mingw/SDL/Debug/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Mingw/SDL/Release/.gitignore
vendored
Normal file
2
dep/Mingw/SDL/Release/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Mingw64/Debug/.gitignore
vendored
Normal file
2
dep/Mingw64/Debug/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Mingw64/Release/.gitignore
vendored
Normal file
2
dep/Mingw64/Release/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Mingw64/SDL/Debug/.gitignore
vendored
Normal file
2
dep/Mingw64/SDL/Debug/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/Mingw64/SDL/Release/.gitignore
vendored
Normal file
2
dep/Mingw64/SDL/Release/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/SDL/Release/.gitignore
vendored
Normal file
2
dep/SDL/Release/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/VC/.gitignore
vendored
Normal file
2
dep/VC/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/VC9/.gitignore
vendored
Normal file
2
dep/VC9/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/cygwin/Debug/.gitignore
vendored
Normal file
2
dep/cygwin/Debug/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/cygwin/Release/.gitignore
vendored
Normal file
2
dep/cygwin/Release/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
2
dep/dummy/.gitignore
vendored
Normal file
2
dep/dummy/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# DON'T REMOVE
|
||||||
|
# This keeps the folder from disappearing
|
|
@ -1247,6 +1247,7 @@ patterns
|
||||||
sprite = "SPHRA0";
|
sprite = "SPHRA0";
|
||||||
width = 96;
|
width = 96;
|
||||||
height = 192;
|
height = 192;
|
||||||
|
}
|
||||||
609
|
609
|
||||||
{
|
{
|
||||||
title = "Circle of Rings and Spheres (Big)";
|
title = "Circle of Rings and Spheres (Big)";
|
||||||
|
|
111
src/Makefile
111
src/Makefile
|
@ -2,7 +2,7 @@
|
||||||
# GNU Make makefile for SRB2
|
# GNU Make makefile for SRB2
|
||||||
#############################################################################
|
#############################################################################
|
||||||
# Copyright (C) 1998-2000 by DooM Legacy Team.
|
# Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
# Copyright (C) 2003-2020 by Sonic Team Junior.
|
# Copyright (C) 2003-2021 by Sonic Team Junior.
|
||||||
#
|
#
|
||||||
# This program is free software distributed under the
|
# This program is free software distributed under the
|
||||||
# terms of the GNU General Public License, version 2.
|
# terms of the GNU General Public License, version 2.
|
||||||
|
@ -24,7 +24,9 @@
|
||||||
# clean
|
# clean
|
||||||
# Remove all object files
|
# Remove all object files
|
||||||
# cleandep
|
# cleandep
|
||||||
# Remove depend.dep
|
# Remove dependency files
|
||||||
|
# distclean
|
||||||
|
# Remove autogenerated files
|
||||||
# dll
|
# dll
|
||||||
# compile primary HW render DLL/SO
|
# compile primary HW render DLL/SO
|
||||||
# all_dll
|
# all_dll
|
||||||
|
@ -79,6 +81,17 @@
|
||||||
#
|
#
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
|
,=,
|
||||||
|
|
||||||
|
ifeq (,$(filter-out cleandep clean distclean,$(or $(MAKECMDGOALS),all)))
|
||||||
|
CLEANONLY=1
|
||||||
|
else ifndef SILENT
|
||||||
|
echo=@echo "$(1)"
|
||||||
|
ifndef MAKE_RESTARTS
|
||||||
|
print=$(info $(1))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
ALL_SYSTEMS=\
|
ALL_SYSTEMS=\
|
||||||
PANDORA\
|
PANDORA\
|
||||||
LINUX64\
|
LINUX64\
|
||||||
|
@ -98,7 +111,7 @@ ALL_SYSTEMS=\
|
||||||
ifeq (,$(filter $(ALL_SYSTEMS),$(.VARIABLES)))
|
ifeq (,$(filter $(ALL_SYSTEMS),$(.VARIABLES)))
|
||||||
ifeq ($(OS),Windows_NT) # all windows are Windows_NT...
|
ifeq ($(OS),Windows_NT) # all windows are Windows_NT...
|
||||||
|
|
||||||
$(info Detected a Windows system, compiling for 32-bit MinGW SDL2...)
|
$(call print,Detected a Windows system$(,) compiling for 32-bit MinGW SDL2...)
|
||||||
|
|
||||||
# go for a 32-bit sdl mingw exe by default
|
# go for a 32-bit sdl mingw exe by default
|
||||||
MINGW=1
|
MINGW=1
|
||||||
|
@ -123,7 +136,7 @@ else # if you on the *nix
|
||||||
new_system:=$(new_system)64
|
new_system:=$(new_system)64
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(info Detected $(system) ($(new_system))...)
|
$(call print,Detected $(system) ($(new_system))...)
|
||||||
$(new_system)=1
|
$(new_system)=1
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@ -237,6 +250,12 @@ endif
|
||||||
|
|
||||||
MSGFMT?=msgfmt
|
MSGFMT?=msgfmt
|
||||||
|
|
||||||
|
ifdef WINDOWSHELL
|
||||||
|
COMPTIME=-..\comptime.bat
|
||||||
|
else
|
||||||
|
COMPTIME=-../comptime.sh
|
||||||
|
endif
|
||||||
|
|
||||||
ifndef ECHO
|
ifndef ECHO
|
||||||
NASM:=@$(NASM)
|
NASM:=@$(NASM)
|
||||||
REMOVE:=@$(REMOVE)
|
REMOVE:=@$(REMOVE)
|
||||||
|
@ -251,6 +270,7 @@ ifndef ECHO
|
||||||
MSGFMT:=@$(MSGFMT)
|
MSGFMT:=@$(MSGFMT)
|
||||||
UPX:=@$(UPX)
|
UPX:=@$(UPX)
|
||||||
UPX_OPTS+=-q
|
UPX_OPTS+=-q
|
||||||
|
COMPTIME:=@$(COMPTIME)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef NONET
|
ifdef NONET
|
||||||
|
@ -415,7 +435,7 @@ ifdef GCC48
|
||||||
else
|
else
|
||||||
CFLAGS+=-O0
|
CFLAGS+=-O0
|
||||||
endif
|
endif
|
||||||
CFLAGS+= -Wall -DPARANOIA -DRANGECHECK -DPACKETDROP -DMOBJCONSISTANCY
|
CFLAGS+= -Wall -DPARANOIA -DRANGECHECK -DPACKETDROP
|
||||||
else
|
else
|
||||||
|
|
||||||
|
|
||||||
|
@ -455,7 +475,6 @@ DBGNAME?=$(EXENAME).debug
|
||||||
|
|
||||||
# not too sophisticated dependency
|
# not too sophisticated dependency
|
||||||
OBJS:=$(i_main_o) \
|
OBJS:=$(i_main_o) \
|
||||||
$(OBJDIR)/comptime.o \
|
|
||||||
$(OBJDIR)/string.o \
|
$(OBJDIR)/string.o \
|
||||||
$(OBJDIR)/d_main.o \
|
$(OBJDIR)/d_main.o \
|
||||||
$(OBJDIR)/d_clisrv.o \
|
$(OBJDIR)/d_clisrv.o \
|
||||||
|
@ -542,7 +561,10 @@ OBJS:=$(i_main_o) \
|
||||||
$(i_sound_o) \
|
$(i_sound_o) \
|
||||||
$(OBJS)
|
$(OBJS)
|
||||||
|
|
||||||
|
DEPS:=$(patsubst $(OBJDIR)/%.o,$(DEPDIR)/%.d,$(filter %.o,$(OBJS)))
|
||||||
|
OBJS+=$(OBJDIR)/comptime.o
|
||||||
|
|
||||||
|
ifndef SILENT
|
||||||
ifndef ECHO
|
ifndef ECHO
|
||||||
ifndef NOECHOFILENAMES
|
ifndef NOECHOFILENAMES
|
||||||
define echoName =
|
define echoName =
|
||||||
|
@ -550,6 +572,7 @@ define echoName =
|
||||||
endef
|
endef
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
# List of languages to compile.
|
# List of languages to compile.
|
||||||
# For reference, this is the command I use to build a srb2.pot file from the source code.
|
# For reference, this is the command I use to build a srb2.pot file from the source code.
|
||||||
|
@ -562,12 +585,12 @@ OPTS+=-DGETTEXT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef PANDORA
|
ifdef PANDORA
|
||||||
all: pre-build $(BIN)/$(PNDNAME)
|
all: $(BIN)/$(PNDNAME)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
ifdef SDL
|
ifdef SDL
|
||||||
all: pre-build $(BIN)/$(EXENAME)
|
all: $(BIN)/$(EXENAME)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef DUMMY
|
ifdef DUMMY
|
||||||
|
@ -575,20 +598,15 @@ all: $(BIN)/$(EXENAME)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
cleandep:
|
cleandep:
|
||||||
$(REMOVE) $(OBJDIR)/depend.dep
|
$(REMOVE) $(DEPS)
|
||||||
$(REMOVE) comptime.h
|
$(REMOVE) comptime.h
|
||||||
|
|
||||||
pre-build:
|
|
||||||
ifdef WINDOWSHELL
|
|
||||||
-..\comptime.bat .
|
|
||||||
else
|
|
||||||
-@../comptime.sh .
|
|
||||||
endif
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(REMOVE) *~ *.flc
|
$(REMOVE) *~ *.flc
|
||||||
$(REMOVE) $(OBJDIR)/*.o
|
$(REMOVE) $(OBJDIR)/*.o
|
||||||
|
|
||||||
|
distclean: clean cleandep
|
||||||
|
|
||||||
ifdef MINGW
|
ifdef MINGW
|
||||||
$(REMOVE) $(OBJDIR)/*.res
|
$(REMOVE) $(OBJDIR)/*.res
|
||||||
endif
|
endif
|
||||||
|
@ -608,11 +626,11 @@ asm:
|
||||||
|
|
||||||
$(BIN)/$(EXENAME): $(POS) $(OBJS)
|
$(BIN)/$(EXENAME): $(POS) $(OBJS)
|
||||||
-$(MKDIR) $(BIN)
|
-$(MKDIR) $(BIN)
|
||||||
@echo Linking $(EXENAME)...
|
$(call echo,Linking $(EXENAME)...)
|
||||||
$(LD) $(LDFLAGS) $(OBJS) -o $(BIN)/$(EXENAME) $(LIBS)
|
$(LD) $(LDFLAGS) $(OBJS) -o $(BIN)/$(EXENAME) $(LIBS)
|
||||||
ifndef VALGRIND
|
ifndef VALGRIND
|
||||||
ifndef NOOBJDUMP
|
ifndef NOOBJDUMP
|
||||||
@echo Dumping debugging info
|
$(call echo,Dumping debugging info)
|
||||||
$(OBJDUMP) $(OBJDUMP_OPTS) $(BIN)/$(EXENAME) > $(BIN)/$(DBGNAME).txt
|
$(OBJDUMP) $(OBJDUMP_OPTS) $(BIN)/$(EXENAME) > $(BIN)/$(DBGNAME).txt
|
||||||
ifdef WINDOWSHELL
|
ifdef WINDOWSHELL
|
||||||
-$(GZIP) $(GZIP_OPTS) $(BIN)/$(DBGNAME).txt
|
-$(GZIP) $(GZIP_OPTS) $(BIN)/$(DBGNAME).txt
|
||||||
|
@ -631,10 +649,10 @@ ifndef NOUPX
|
||||||
-$(UPX) $(UPX_OPTS) $(BIN)/$(EXENAME)
|
-$(UPX) $(UPX_OPTS) $(BIN)/$(EXENAME)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@echo Build is done, please look for $(EXENAME) in $(BIN), \(checking for post steps\)
|
$(call echo,Build is done$(,) please look for $(EXENAME) in $(BIN)$(,) (checking for post steps))
|
||||||
|
|
||||||
reobjdump:
|
reobjdump:
|
||||||
@echo Redumping debugging info
|
$(call echo,Redumping debugging info)
|
||||||
$(OBJDUMP) $(OBJDUMP_OPTS) $(BIN)/$(DBGNAME) > $(BIN)/$(DBGNAME).txt
|
$(OBJDUMP) $(OBJDUMP_OPTS) $(BIN)/$(DBGNAME) > $(BIN)/$(DBGNAME).txt
|
||||||
ifdef WINDOWSHELL
|
ifdef WINDOWSHELL
|
||||||
-$(GZIP) $(GZIP_OPTS) $(BIN)/$(DBGNAME).txt
|
-$(GZIP) $(GZIP_OPTS) $(BIN)/$(DBGNAME).txt
|
||||||
|
@ -670,24 +688,40 @@ endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#dependecy made by gcc itself !
|
#dependecy made by gcc itself !
|
||||||
$(OBJS):
|
|
||||||
ifndef DUMMY
|
ifndef DUMMY
|
||||||
-include $(OBJDIR)/depend.dep
|
ifndef CLEANONLY
|
||||||
|
$(call print,Checking dependency files...)
|
||||||
|
-include $(DEPS)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(OBJDIR)/depend.dep:
|
undefine deps_rule
|
||||||
@echo "Creating dependency file, depend.dep"
|
|
||||||
@echo > comptime.h
|
# windows makes it too hard !
|
||||||
-$(MKDIR) $(OBJDIR)
|
ifndef WINDOWSHELL
|
||||||
$(CC) $(CFLAGS) -MM *.c > $(OBJDIR)/depend.ped
|
ifdef echoName
|
||||||
$(CC) $(CFLAGS) -MM $(INTERFACE)/*.c >> $(OBJDIR)/depend.ped
|
define deps_rule =
|
||||||
ifndef NOHW
|
@printf "%-20.20s\r" $<
|
||||||
$(CC) $(CFLAGS) -MM hardware/*.c >> $(OBJDIR)/depend.ped
|
|
||||||
|
endef
|
||||||
endif
|
endif
|
||||||
$(CC) $(CFLAGS) -MM blua/*.c >> $(OBJDIR)/depend.ped
|
endif
|
||||||
@sed -e 's,\(.*\)\.o: ,$(subst /,\/,$(OBJDIR))\/&,g' < $(OBJDIR)/depend.ped > $(OBJDIR)/depend.dep
|
|
||||||
$(REMOVE) $(OBJDIR)/depend.ped
|
define deps_rule +=
|
||||||
@echo "Created dependency file, depend.dep"
|
$(CC) $(CFLAGS) -M -MF $@ -MT $(OBJDIR)/$< $<
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(DEPDIR)/%.d: %.c
|
||||||
|
$(deps_rule)
|
||||||
|
|
||||||
|
$(DEPDIR)/%.d: $(INTERFACE)/%.c
|
||||||
|
$(deps_rule)
|
||||||
|
|
||||||
|
$(DEPDIR)/%.d: hardware/%.c
|
||||||
|
$(deps_rule)
|
||||||
|
|
||||||
|
$(DEPDIR)/%.d: blua/%.c
|
||||||
|
$(deps_rule)
|
||||||
|
|
||||||
ifdef VALGRIND
|
ifdef VALGRIND
|
||||||
$(OBJDIR)/z_zone.o: z_zone.c
|
$(OBJDIR)/z_zone.o: z_zone.c
|
||||||
|
@ -695,9 +729,12 @@ $(OBJDIR)/z_zone.o: z_zone.c
|
||||||
$(CC) $(CFLAGS) $(WFLAGS) -DHAVE_VALGRIND $(VALGRIND_CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) $(WFLAGS) -DHAVE_VALGRIND $(VALGRIND_CFLAGS) -c $< -o $@
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(OBJDIR)/comptime.o: comptime.c pre-build
|
$(OBJDIR)/comptime.o::
|
||||||
$(echoName)
|
ifdef echoName
|
||||||
$(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@
|
@echo -- comptime.c ...
|
||||||
|
endif
|
||||||
|
$(COMPTIME) .
|
||||||
|
$(CC) $(CFLAGS) $(WFLAGS) -c comptime.c -o $@
|
||||||
|
|
||||||
$(BIN)/%.mo: locale/%.po
|
$(BIN)/%.mo: locale/%.po
|
||||||
-$(MKDIR) $(BIN)
|
-$(MKDIR) $(BIN)
|
||||||
|
|
|
@ -47,7 +47,8 @@ ifdef MACOSX
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Automatically set version flag, but not if one was manually set
|
# Automatically set version flag, but not if one was manually set
|
||||||
ifeq (,$(filter GCC%,$(.VARIABLES)))
|
# And don't bother if this is a clean only run
|
||||||
|
ifeq (,$(filter GCC% CLEANONLY,$(.VARIABLES)))
|
||||||
version:=$(shell $(CC) --version)
|
version:=$(shell $(CC) --version)
|
||||||
# check if this is in fact GCC
|
# check if this is in fact GCC
|
||||||
ifneq (,$(or $(findstring gcc,$(version)),$(findstring GCC,$(version))))
|
ifneq (,$(or $(findstring gcc,$(version)),$(findstring GCC,$(version))))
|
||||||
|
@ -60,12 +61,14 @@ ifeq (,$(filter GCC%,$(.VARIABLES)))
|
||||||
|
|
||||||
# If this version is not in the list, default to the latest supported
|
# If this version is not in the list, default to the latest supported
|
||||||
ifeq (,$(filter $(v),$(SUPPORTED_GCC_VERSIONS)))
|
ifeq (,$(filter $(v),$(SUPPORTED_GCC_VERSIONS)))
|
||||||
$(info\
|
define line =
|
||||||
Your compiler version, GCC $(version), is not supported by the Makefile.\
|
Your compiler version, GCC $(version), is not supported by the Makefile.
|
||||||
The Makefile will assume GCC $(LATEST_GCC_VERSION).)
|
The Makefile will assume GCC $(LATEST_GCC_VERSION).))
|
||||||
|
endef
|
||||||
|
$(call print,$(line))
|
||||||
GCC$(subst .,,$(LATEST_GCC_VERSION))=1
|
GCC$(subst .,,$(LATEST_GCC_VERSION))=1
|
||||||
else
|
else
|
||||||
$(info Detected GCC $(version) (GCC$(v)))
|
$(call print,Detected GCC $(version) (GCC$(v)))
|
||||||
GCC$(v)=1
|
GCC$(v)=1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -361,6 +364,7 @@ i_main_o=$(OBJDIR)/i_main.o
|
||||||
#set OBJDIR and BIN's starting place
|
#set OBJDIR and BIN's starting place
|
||||||
OBJDIR=../objs
|
OBJDIR=../objs
|
||||||
BIN=../bin
|
BIN=../bin
|
||||||
|
DEPDIR=../dep
|
||||||
#Nasm ASM and rm
|
#Nasm ASM and rm
|
||||||
ifdef YASM
|
ifdef YASM
|
||||||
NASM?=yasm
|
NASM?=yasm
|
||||||
|
@ -383,6 +387,7 @@ ifdef DUMMY
|
||||||
INTERFACE=dummy
|
INTERFACE=dummy
|
||||||
OBJDIR:=$(OBJDIR)/dummy
|
OBJDIR:=$(OBJDIR)/dummy
|
||||||
BIN:=$(BIN)/dummy
|
BIN:=$(BIN)/dummy
|
||||||
|
DEPDIR:=$(DEPDIR)/dummy
|
||||||
else
|
else
|
||||||
ifdef LINUX
|
ifdef LINUX
|
||||||
NASMFORMAT=elf -DLINUX
|
NASMFORMAT=elf -DLINUX
|
||||||
|
@ -390,9 +395,11 @@ ifdef LINUX
|
||||||
ifdef LINUX64
|
ifdef LINUX64
|
||||||
OBJDIR:=$(OBJDIR)/Linux64
|
OBJDIR:=$(OBJDIR)/Linux64
|
||||||
BIN:=$(BIN)/Linux64
|
BIN:=$(BIN)/Linux64
|
||||||
|
DEPDIR:=$(DEPDIR)/Linux64
|
||||||
else
|
else
|
||||||
OBJDIR:=$(OBJDIR)/Linux
|
OBJDIR:=$(OBJDIR)/Linux
|
||||||
BIN:=$(BIN)/Linux
|
BIN:=$(BIN)/Linux
|
||||||
|
DEPDIR:=$(DEPDIR)/Linux
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
ifdef FREEBSD
|
ifdef FREEBSD
|
||||||
|
@ -402,6 +409,7 @@ ifdef FREEBSD
|
||||||
|
|
||||||
OBJDIR:=$(OBJDIR)/FreeBSD
|
OBJDIR:=$(OBJDIR)/FreeBSD
|
||||||
BIN:=$(BIN)/FreeBSD
|
BIN:=$(BIN)/FreeBSD
|
||||||
|
DEPDIR:=$(DEPDIR)/Linux
|
||||||
else
|
else
|
||||||
ifdef SOLARIS
|
ifdef SOLARIS
|
||||||
INTERFACE=sdl
|
INTERFACE=sdl
|
||||||
|
@ -410,6 +418,7 @@ ifdef SOLARIS
|
||||||
|
|
||||||
OBJDIR:=$(OBJDIR)/Solaris
|
OBJDIR:=$(OBJDIR)/Solaris
|
||||||
BIN:=$(BIN)/Solaris
|
BIN:=$(BIN)/Solaris
|
||||||
|
DEPDIR:=$(DEPDIR)/Solaris
|
||||||
else
|
else
|
||||||
ifdef CYGWIN32
|
ifdef CYGWIN32
|
||||||
INTERFACE=sdl
|
INTERFACE=sdl
|
||||||
|
@ -418,18 +427,21 @@ ifdef CYGWIN32
|
||||||
|
|
||||||
OBJDIR:=$(OBJDIR)/cygwin
|
OBJDIR:=$(OBJDIR)/cygwin
|
||||||
BIN:=$(BIN)/Cygwin
|
BIN:=$(BIN)/Cygwin
|
||||||
|
DEPDIR:=$(DEPDIR)/Cygwin
|
||||||
else
|
else
|
||||||
ifdef MINGW64
|
ifdef MINGW64
|
||||||
#NASMFORMAT=win64
|
#NASMFORMAT=win64
|
||||||
SDL=1
|
SDL=1
|
||||||
OBJDIR:=$(OBJDIR)/Mingw64
|
OBJDIR:=$(OBJDIR)/Mingw64
|
||||||
BIN:=$(BIN)/Mingw64
|
BIN:=$(BIN)/Mingw64
|
||||||
|
DEPDIR:=$(DEPDIR)/Mingw64
|
||||||
else
|
else
|
||||||
ifdef MINGW
|
ifdef MINGW
|
||||||
NASMFORMAT=win32
|
NASMFORMAT=win32
|
||||||
SDL=1
|
SDL=1
|
||||||
OBJDIR:=$(OBJDIR)/Mingw
|
OBJDIR:=$(OBJDIR)/Mingw
|
||||||
BIN:=$(BIN)/Mingw
|
BIN:=$(BIN)/Mingw
|
||||||
|
DEPDIR:=$(DEPDIR)/Mingw
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -441,6 +453,7 @@ endif
|
||||||
ifdef ARCHNAME
|
ifdef ARCHNAME
|
||||||
OBJDIR:=$(OBJDIR)/$(ARCHNAME)
|
OBJDIR:=$(OBJDIR)/$(ARCHNAME)
|
||||||
BIN:=$(BIN)/$(ARCHNAME)
|
BIN:=$(BIN)/$(ARCHNAME)
|
||||||
|
DEPDIR:=$(DEPDIR)/$(ARCHNAME)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
OBJDUMP_OPTS?=--wide --source --line-numbers
|
OBJDUMP_OPTS?=--wide --source --line-numbers
|
||||||
|
@ -449,14 +462,17 @@ LD=$(CC)
|
||||||
ifdef SDL
|
ifdef SDL
|
||||||
INTERFACE=sdl
|
INTERFACE=sdl
|
||||||
OBJDIR:=$(OBJDIR)/SDL
|
OBJDIR:=$(OBJDIR)/SDL
|
||||||
|
DEPDIR:=$(DEPDIR)/SDL
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef DUMMY
|
ifndef DUMMY
|
||||||
ifdef DEBUGMODE
|
ifdef DEBUGMODE
|
||||||
OBJDIR:=$(OBJDIR)/Debug
|
OBJDIR:=$(OBJDIR)/Debug
|
||||||
BIN:=$(BIN)/Debug
|
BIN:=$(BIN)/Debug
|
||||||
|
DEPDIR:=$(DEPDIR)/Debug
|
||||||
else
|
else
|
||||||
OBJDIR:=$(OBJDIR)/Release
|
OBJDIR:=$(OBJDIR)/Release
|
||||||
BIN:=$(BIN)/Release
|
BIN:=$(BIN)/Release
|
||||||
|
DEPDIR:=$(DEPDIR)/Release
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
125
src/d_clisrv.c
125
src/d_clisrv.c
|
@ -3112,7 +3112,7 @@ consvar_t cv_maxplayers = CVAR_INIT ("maxplayers", "8", CV_SAVE|CV_NETVAR, maxpl
|
||||||
static CV_PossibleValue_t joindelay_cons_t[] = {{1, "MIN"}, {3600, "MAX"}, {0, "Off"}, {0, NULL}};
|
static CV_PossibleValue_t joindelay_cons_t[] = {{1, "MIN"}, {3600, "MAX"}, {0, "Off"}, {0, NULL}};
|
||||||
consvar_t cv_joindelay = CVAR_INIT ("joindelay", "10", CV_SAVE|CV_NETVAR, joindelay_cons_t, NULL);
|
consvar_t cv_joindelay = CVAR_INIT ("joindelay", "10", CV_SAVE|CV_NETVAR, joindelay_cons_t, NULL);
|
||||||
static CV_PossibleValue_t rejointimeout_cons_t[] = {{1, "MIN"}, {60 * FRACUNIT, "MAX"}, {0, "Off"}, {0, NULL}};
|
static CV_PossibleValue_t rejointimeout_cons_t[] = {{1, "MIN"}, {60 * FRACUNIT, "MAX"}, {0, "Off"}, {0, NULL}};
|
||||||
consvar_t cv_rejointimeout = CVAR_INIT ("rejointimeout", "Off", CV_SAVE|CV_NETVAR|CV_FLOAT, rejointimeout_cons_t, NULL);
|
consvar_t cv_rejointimeout = CVAR_INIT ("rejointimeout", "2", CV_SAVE|CV_NETVAR|CV_FLOAT, rejointimeout_cons_t, NULL);
|
||||||
|
|
||||||
static CV_PossibleValue_t resynchattempts_cons_t[] = {{1, "MIN"}, {20, "MAX"}, {0, "No"}, {0, NULL}};
|
static CV_PossibleValue_t resynchattempts_cons_t[] = {{1, "MIN"}, {20, "MAX"}, {0, "No"}, {0, NULL}};
|
||||||
consvar_t cv_resynchattempts = CVAR_INIT ("resynchattempts", "10", CV_SAVE|CV_NETVAR, resynchattempts_cons_t, NULL);
|
consvar_t cv_resynchattempts = CVAR_INIT ("resynchattempts", "10", CV_SAVE|CV_NETVAR, resynchattempts_cons_t, NULL);
|
||||||
|
@ -4480,70 +4480,73 @@ static INT16 Consistancy(void)
|
||||||
ret += P_GetRandSeed();
|
ret += P_GetRandSeed();
|
||||||
|
|
||||||
#ifdef MOBJCONSISTANCY
|
#ifdef MOBJCONSISTANCY
|
||||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
if (gamestate == GS_LEVEL)
|
||||||
{
|
{
|
||||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||||
continue;
|
|
||||||
|
|
||||||
mo = (mobj_t *)th;
|
|
||||||
|
|
||||||
if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_MONITOR | MF_FIRE | MF_ENEMY | MF_PAIN | MF_STICKY))
|
|
||||||
{
|
{
|
||||||
ret -= mo->type;
|
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||||
ret += mo->x;
|
continue;
|
||||||
ret -= mo->y;
|
|
||||||
ret += mo->z;
|
mo = (mobj_t *)th;
|
||||||
ret -= mo->momx;
|
|
||||||
ret += mo->momy;
|
if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_MONITOR | MF_FIRE | MF_ENEMY | MF_PAIN | MF_STICKY))
|
||||||
ret -= mo->momz;
|
|
||||||
ret += mo->angle;
|
|
||||||
ret -= mo->flags;
|
|
||||||
ret += mo->flags2;
|
|
||||||
ret -= mo->eflags;
|
|
||||||
if (mo->target)
|
|
||||||
{
|
{
|
||||||
ret += mo->target->type;
|
ret -= mo->type;
|
||||||
ret -= mo->target->x;
|
ret += mo->x;
|
||||||
ret += mo->target->y;
|
ret -= mo->y;
|
||||||
ret -= mo->target->z;
|
ret += mo->z;
|
||||||
ret += mo->target->momx;
|
ret -= mo->momx;
|
||||||
ret -= mo->target->momy;
|
ret += mo->momy;
|
||||||
ret += mo->target->momz;
|
ret -= mo->momz;
|
||||||
ret -= mo->target->angle;
|
ret += mo->angle;
|
||||||
ret += mo->target->flags;
|
ret -= mo->flags;
|
||||||
ret -= mo->target->flags2;
|
ret += mo->flags2;
|
||||||
ret += mo->target->eflags;
|
ret -= mo->eflags;
|
||||||
ret -= mo->target->state - states;
|
if (mo->target)
|
||||||
ret += mo->target->tics;
|
{
|
||||||
ret -= mo->target->sprite;
|
ret += mo->target->type;
|
||||||
ret += mo->target->frame;
|
ret -= mo->target->x;
|
||||||
|
ret += mo->target->y;
|
||||||
|
ret -= mo->target->z;
|
||||||
|
ret += mo->target->momx;
|
||||||
|
ret -= mo->target->momy;
|
||||||
|
ret += mo->target->momz;
|
||||||
|
ret -= mo->target->angle;
|
||||||
|
ret += mo->target->flags;
|
||||||
|
ret -= mo->target->flags2;
|
||||||
|
ret += mo->target->eflags;
|
||||||
|
ret -= mo->target->state - states;
|
||||||
|
ret += mo->target->tics;
|
||||||
|
ret -= mo->target->sprite;
|
||||||
|
ret += mo->target->frame;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret ^= 0x3333;
|
||||||
|
if (mo->tracer && mo->tracer->type != MT_OVERLAY)
|
||||||
|
{
|
||||||
|
ret += mo->tracer->type;
|
||||||
|
ret -= mo->tracer->x;
|
||||||
|
ret += mo->tracer->y;
|
||||||
|
ret -= mo->tracer->z;
|
||||||
|
ret += mo->tracer->momx;
|
||||||
|
ret -= mo->tracer->momy;
|
||||||
|
ret += mo->tracer->momz;
|
||||||
|
ret -= mo->tracer->angle;
|
||||||
|
ret += mo->tracer->flags;
|
||||||
|
ret -= mo->tracer->flags2;
|
||||||
|
ret += mo->tracer->eflags;
|
||||||
|
ret -= mo->tracer->state - states;
|
||||||
|
ret += mo->tracer->tics;
|
||||||
|
ret -= mo->tracer->sprite;
|
||||||
|
ret += mo->tracer->frame;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret ^= 0xAAAA;
|
||||||
|
ret -= mo->state - states;
|
||||||
|
ret += mo->tics;
|
||||||
|
ret -= mo->sprite;
|
||||||
|
ret += mo->frame;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
ret ^= 0x3333;
|
|
||||||
if (mo->tracer && mo->tracer->type != MT_OVERLAY)
|
|
||||||
{
|
|
||||||
ret += mo->tracer->type;
|
|
||||||
ret -= mo->tracer->x;
|
|
||||||
ret += mo->tracer->y;
|
|
||||||
ret -= mo->tracer->z;
|
|
||||||
ret += mo->tracer->momx;
|
|
||||||
ret -= mo->tracer->momy;
|
|
||||||
ret += mo->tracer->momz;
|
|
||||||
ret -= mo->tracer->angle;
|
|
||||||
ret += mo->tracer->flags;
|
|
||||||
ret -= mo->tracer->flags2;
|
|
||||||
ret += mo->tracer->eflags;
|
|
||||||
ret -= mo->tracer->state - states;
|
|
||||||
ret += mo->tracer->tics;
|
|
||||||
ret -= mo->tracer->sprite;
|
|
||||||
ret += mo->tracer->frame;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ret ^= 0xAAAA;
|
|
||||||
ret -= mo->state - states;
|
|
||||||
ret += mo->tics;
|
|
||||||
ret -= mo->sprite;
|
|
||||||
ret += mo->frame;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
#include "p_local.h" // chasecam
|
#include "p_local.h" // chasecam
|
||||||
#include "mserv.h" // ms_RoomId
|
#include "mserv.h" // ms_RoomId
|
||||||
#include "m_misc.h" // screenshot functionality
|
#include "m_misc.h" // screenshot functionality
|
||||||
#include "dehacked.h" // Dehacked list test
|
#include "deh_tables.h" // Dehacked list test
|
||||||
#include "m_cond.h" // condition initialization
|
#include "m_cond.h" // condition initialization
|
||||||
#include "fastcmp.h"
|
#include "fastcmp.h"
|
||||||
#include "keys.h"
|
#include "keys.h"
|
||||||
|
@ -1072,7 +1072,7 @@ void D_SRB2Main(void)
|
||||||
G_LoadGameSettings();
|
G_LoadGameSettings();
|
||||||
|
|
||||||
// Test Dehacked lists
|
// Test Dehacked lists
|
||||||
DEH_Check();
|
DEH_TableCheck();
|
||||||
|
|
||||||
// Netgame URL special case: change working dir to EXE folder.
|
// Netgame URL special case: change working dir to EXE folder.
|
||||||
ChangeDirForUrlHandler();
|
ChangeDirForUrlHandler();
|
||||||
|
|
|
@ -2130,7 +2130,7 @@ static void Command_Pause(void)
|
||||||
|
|
||||||
if (cv_pause.value || server || (IsPlayerAdmin(consoleplayer)))
|
if (cv_pause.value || server || (IsPlayerAdmin(consoleplayer)))
|
||||||
{
|
{
|
||||||
if (modeattacking || !(gamestate == GS_LEVEL || gamestate == GS_INTERMISSION))
|
if (modeattacking || !(gamestate == GS_LEVEL || gamestate == GS_INTERMISSION) || (marathonmode && gamestate == GS_INTERMISSION))
|
||||||
{
|
{
|
||||||
CONS_Printf(M_GetText("You can't pause here.\n"));
|
CONS_Printf(M_GetText("You can't pause here.\n"));
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -5457,3 +5457,27 @@ struct int_const_s const INT_CONST[] = {
|
||||||
|
|
||||||
{NULL,0}
|
{NULL,0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// For this to work compile-time without being in this file,
|
||||||
|
// this function would need to check sizes at runtime, without sizeof
|
||||||
|
void DEH_TableCheck(void)
|
||||||
|
{
|
||||||
|
#if defined(_DEBUG) || defined(PARANOIA)
|
||||||
|
const size_t dehstates = sizeof(STATE_LIST)/sizeof(const char*);
|
||||||
|
const size_t dehmobjs = sizeof(MOBJTYPE_LIST)/sizeof(const char*);
|
||||||
|
const size_t dehpowers = sizeof(POWERS_LIST)/sizeof(const char*);
|
||||||
|
const size_t dehcolors = sizeof(COLOR_ENUMS)/sizeof(const char*);
|
||||||
|
|
||||||
|
if (dehstates != S_FIRSTFREESLOT)
|
||||||
|
I_Error("You forgot to update the Dehacked states list, you dolt!\n(%d states defined, versus %s in the Dehacked list)\n", S_FIRSTFREESLOT, sizeu1(dehstates));
|
||||||
|
|
||||||
|
if (dehmobjs != MT_FIRSTFREESLOT)
|
||||||
|
I_Error("You forgot to update the Dehacked mobjtype list, you dolt!\n(%d mobj types defined, versus %s in the Dehacked list)\n", MT_FIRSTFREESLOT, sizeu1(dehmobjs));
|
||||||
|
|
||||||
|
if (dehpowers != NUMPOWERS)
|
||||||
|
I_Error("You forgot to update the Dehacked powers list, you dolt!\n(%d powers defined, versus %s in the Dehacked list)\n", NUMPOWERS, sizeu1(dehpowers));
|
||||||
|
|
||||||
|
if (dehcolors != SKINCOLOR_FIRSTFREESLOT)
|
||||||
|
I_Error("You forgot to update the Dehacked colors list, you dolt!\n(%d colors defined, versus %s in the Dehacked list)\n", SKINCOLOR_FIRSTFREESLOT, sizeu1(dehcolors));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -72,4 +72,7 @@ extern const char *const MENUTYPES_LIST[];
|
||||||
|
|
||||||
extern struct int_const_s const INT_CONST[];
|
extern struct int_const_s const INT_CONST[];
|
||||||
|
|
||||||
|
// Moved to this file because it can't work compile-time otherwise
|
||||||
|
void DEH_TableCheck(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -645,25 +645,3 @@ void DEH_LoadDehackedLump(lumpnum_t lumpnum)
|
||||||
{
|
{
|
||||||
DEH_LoadDehackedLumpPwad(WADFILENUM(lumpnum),LUMPNUM(lumpnum), false);
|
DEH_LoadDehackedLumpPwad(WADFILENUM(lumpnum),LUMPNUM(lumpnum), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DEH_Check(void)
|
|
||||||
{
|
|
||||||
#if defined(_DEBUG) || defined(PARANOIA)
|
|
||||||
const size_t dehstates = sizeof(STATE_LIST)/sizeof(const char*);
|
|
||||||
const size_t dehmobjs = sizeof(MOBJTYPE_LIST)/sizeof(const char*);
|
|
||||||
const size_t dehpowers = sizeof(POWERS_LIST)/sizeof(const char*);
|
|
||||||
const size_t dehcolors = sizeof(COLOR_ENUMS)/sizeof(const char*);
|
|
||||||
|
|
||||||
if (dehstates != S_FIRSTFREESLOT)
|
|
||||||
I_Error("You forgot to update the Dehacked states list, you dolt!\n(%d states defined, versus %s in the Dehacked list)\n", S_FIRSTFREESLOT, sizeu1(dehstates));
|
|
||||||
|
|
||||||
if (dehmobjs != MT_FIRSTFREESLOT)
|
|
||||||
I_Error("You forgot to update the Dehacked mobjtype list, you dolt!\n(%d mobj types defined, versus %s in the Dehacked list)\n", MT_FIRSTFREESLOT, sizeu1(dehmobjs));
|
|
||||||
|
|
||||||
if (dehpowers != NUMPOWERS)
|
|
||||||
I_Error("You forgot to update the Dehacked powers list, you dolt!\n(%d powers defined, versus %s in the Dehacked list)\n", NUMPOWERS, sizeu1(dehpowers));
|
|
||||||
|
|
||||||
if (dehcolors != SKINCOLOR_FIRSTFREESLOT)
|
|
||||||
I_Error("You forgot to update the Dehacked colors list, you dolt!\n(%d colors defined, versus %s in the Dehacked list)\n", SKINCOLOR_FIRSTFREESLOT, sizeu1(dehcolors));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
|
@ -30,8 +30,6 @@ typedef enum
|
||||||
void DEH_LoadDehackedLump(lumpnum_t lumpnum);
|
void DEH_LoadDehackedLump(lumpnum_t lumpnum);
|
||||||
void DEH_LoadDehackedLumpPwad(UINT16 wad, UINT16 lump, boolean mainfile);
|
void DEH_LoadDehackedLumpPwad(UINT16 wad, UINT16 lump, boolean mainfile);
|
||||||
|
|
||||||
void DEH_Check(void);
|
|
||||||
|
|
||||||
fixed_t get_number(const char *word);
|
fixed_t get_number(const char *word);
|
||||||
FUNCPRINTF void deh_warning(const char *first, ...);
|
FUNCPRINTF void deh_warning(const char *first, ...);
|
||||||
void deh_strlcpy(char *dst, const char *src, size_t size, const char *warntext);
|
void deh_strlcpy(char *dst, const char *src, size_t size, const char *warntext);
|
||||||
|
|
|
@ -2546,28 +2546,28 @@ static void F_UnloadAlacroixGraphics(SINT8 oldttscale)
|
||||||
oldttscale--; // zero-based index
|
oldttscale--; // zero-based index
|
||||||
for (i = 0; i < TTMAX_ALACROIX; i++)
|
for (i = 0; i < TTMAX_ALACROIX; i++)
|
||||||
{
|
{
|
||||||
if(ttembl[oldttscale][i]) { Z_Free(ttembl[oldttscale][i]); ttembl[oldttscale][i] = 0; }
|
if(ttembl[oldttscale][i]) { Patch_Free(ttembl[oldttscale][i]); ttembl[oldttscale][i] = 0; }
|
||||||
if(ttribb[oldttscale][i]) { Z_Free(ttribb[oldttscale][i]); ttribb[oldttscale][i] = 0; }
|
if(ttribb[oldttscale][i]) { Patch_Free(ttribb[oldttscale][i]); ttribb[oldttscale][i] = 0; }
|
||||||
if(ttsont[oldttscale][i]) { Z_Free(ttsont[oldttscale][i]); ttsont[oldttscale][i] = 0; }
|
if(ttsont[oldttscale][i]) { Patch_Free(ttsont[oldttscale][i]); ttsont[oldttscale][i] = 0; }
|
||||||
if(ttrobo[oldttscale][i]) { Z_Free(ttrobo[oldttscale][i]); ttrobo[oldttscale][i] = 0; }
|
if(ttrobo[oldttscale][i]) { Patch_Free(ttrobo[oldttscale][i]); ttrobo[oldttscale][i] = 0; }
|
||||||
if(tttwot[oldttscale][i]) { Z_Free(tttwot[oldttscale][i]); tttwot[oldttscale][i] = 0; }
|
if(tttwot[oldttscale][i]) { Patch_Free(tttwot[oldttscale][i]); tttwot[oldttscale][i] = 0; }
|
||||||
if(ttrbtx[oldttscale][i]) { Z_Free(ttrbtx[oldttscale][i]); ttrbtx[oldttscale][i] = 0; }
|
if(ttrbtx[oldttscale][i]) { Patch_Free(ttrbtx[oldttscale][i]); ttrbtx[oldttscale][i] = 0; }
|
||||||
if(ttsoib[oldttscale][i]) { Z_Free(ttsoib[oldttscale][i]); ttsoib[oldttscale][i] = 0; }
|
if(ttsoib[oldttscale][i]) { Patch_Free(ttsoib[oldttscale][i]); ttsoib[oldttscale][i] = 0; }
|
||||||
if(ttsoif[oldttscale][i]) { Z_Free(ttsoif[oldttscale][i]); ttsoif[oldttscale][i] = 0; }
|
if(ttsoif[oldttscale][i]) { Patch_Free(ttsoif[oldttscale][i]); ttsoif[oldttscale][i] = 0; }
|
||||||
if(ttsoba[oldttscale][i]) { Z_Free(ttsoba[oldttscale][i]); ttsoba[oldttscale][i] = 0; }
|
if(ttsoba[oldttscale][i]) { Patch_Free(ttsoba[oldttscale][i]); ttsoba[oldttscale][i] = 0; }
|
||||||
if(ttsobk[oldttscale][i]) { Z_Free(ttsobk[oldttscale][i]); ttsobk[oldttscale][i] = 0; }
|
if(ttsobk[oldttscale][i]) { Patch_Free(ttsobk[oldttscale][i]); ttsobk[oldttscale][i] = 0; }
|
||||||
if(ttsodh[oldttscale][i]) { Z_Free(ttsodh[oldttscale][i]); ttsodh[oldttscale][i] = 0; }
|
if(ttsodh[oldttscale][i]) { Patch_Free(ttsodh[oldttscale][i]); ttsodh[oldttscale][i] = 0; }
|
||||||
if(tttaib[oldttscale][i]) { Z_Free(tttaib[oldttscale][i]); tttaib[oldttscale][i] = 0; }
|
if(tttaib[oldttscale][i]) { Patch_Free(tttaib[oldttscale][i]); tttaib[oldttscale][i] = 0; }
|
||||||
if(tttaif[oldttscale][i]) { Z_Free(tttaif[oldttscale][i]); tttaif[oldttscale][i] = 0; }
|
if(tttaif[oldttscale][i]) { Patch_Free(tttaif[oldttscale][i]); tttaif[oldttscale][i] = 0; }
|
||||||
if(tttaba[oldttscale][i]) { Z_Free(tttaba[oldttscale][i]); tttaba[oldttscale][i] = 0; }
|
if(tttaba[oldttscale][i]) { Patch_Free(tttaba[oldttscale][i]); tttaba[oldttscale][i] = 0; }
|
||||||
if(tttabk[oldttscale][i]) { Z_Free(tttabk[oldttscale][i]); tttabk[oldttscale][i] = 0; }
|
if(tttabk[oldttscale][i]) { Patch_Free(tttabk[oldttscale][i]); tttabk[oldttscale][i] = 0; }
|
||||||
if(tttabt[oldttscale][i]) { Z_Free(tttabt[oldttscale][i]); tttabt[oldttscale][i] = 0; }
|
if(tttabt[oldttscale][i]) { Patch_Free(tttabt[oldttscale][i]); tttabt[oldttscale][i] = 0; }
|
||||||
if(tttaft[oldttscale][i]) { Z_Free(tttaft[oldttscale][i]); tttaft[oldttscale][i] = 0; }
|
if(tttaft[oldttscale][i]) { Patch_Free(tttaft[oldttscale][i]); tttaft[oldttscale][i] = 0; }
|
||||||
if(ttknib[oldttscale][i]) { Z_Free(ttknib[oldttscale][i]); ttknib[oldttscale][i] = 0; }
|
if(ttknib[oldttscale][i]) { Patch_Free(ttknib[oldttscale][i]); ttknib[oldttscale][i] = 0; }
|
||||||
if(ttknif[oldttscale][i]) { Z_Free(ttknif[oldttscale][i]); ttknif[oldttscale][i] = 0; }
|
if(ttknif[oldttscale][i]) { Patch_Free(ttknif[oldttscale][i]); ttknif[oldttscale][i] = 0; }
|
||||||
if(ttknba[oldttscale][i]) { Z_Free(ttknba[oldttscale][i]); ttknba[oldttscale][i] = 0; }
|
if(ttknba[oldttscale][i]) { Patch_Free(ttknba[oldttscale][i]); ttknba[oldttscale][i] = 0; }
|
||||||
if(ttknbk[oldttscale][i]) { Z_Free(ttknbk[oldttscale][i]); ttknbk[oldttscale][i] = 0; }
|
if(ttknbk[oldttscale][i]) { Patch_Free(ttknbk[oldttscale][i]); ttknbk[oldttscale][i] = 0; }
|
||||||
if(ttkndh[oldttscale][i]) { Z_Free(ttkndh[oldttscale][i]); ttkndh[oldttscale][i] = 0; }
|
if(ttkndh[oldttscale][i]) { Patch_Free(ttkndh[oldttscale][i]); ttkndh[oldttscale][i] = 0; }
|
||||||
}
|
}
|
||||||
ttloaded[oldttscale] = false;
|
ttloaded[oldttscale] = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1678,7 +1678,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
// At this point, cmd doesn't contain the final angle yet,
|
// At this point, cmd doesn't contain the final angle yet,
|
||||||
// So we need to temporarily transform it so Lua scripters
|
// So we need to temporarily transform it so Lua scripters
|
||||||
// don't need to handle it differently than in other hooks.
|
// don't need to handle it differently than in other hooks.
|
||||||
if (gamestate == GS_LEVEL)
|
if (addedtogame && gamestate == GS_LEVEL)
|
||||||
{
|
{
|
||||||
INT16 extra = ticcmd_oldangleturn[forplayer] - player->oldrelangleturn;
|
INT16 extra = ticcmd_oldangleturn[forplayer] - player->oldrelangleturn;
|
||||||
INT16 origangle = cmd->angleturn;
|
INT16 origangle = cmd->angleturn;
|
||||||
|
|
|
@ -866,7 +866,7 @@ static void HWR_CacheTextureAsFlat(GLMipmap_t *grMipmap, INT32 texturenum)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Download a Doom 'flat' to the hardware cache and make it ready for use
|
// Download a Doom 'flat' to the hardware cache and make it ready for use
|
||||||
void HWR_LiterallyGetFlat(lumpnum_t flatlumpnum)
|
void HWR_GetRawFlat(lumpnum_t flatlumpnum)
|
||||||
{
|
{
|
||||||
GLMipmap_t *grmip;
|
GLMipmap_t *grmip;
|
||||||
patch_t *patch;
|
patch_t *patch;
|
||||||
|
@ -895,7 +895,7 @@ void HWR_GetLevelFlat(levelflat_t *levelflat)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (levelflat->type == LEVELFLAT_FLAT)
|
if (levelflat->type == LEVELFLAT_FLAT)
|
||||||
HWR_LiterallyGetFlat(levelflat->u.flat.lumpnum);
|
HWR_GetRawFlat(levelflat->u.flat.lumpnum);
|
||||||
else if (levelflat->type == LEVELFLAT_TEXTURE)
|
else if (levelflat->type == LEVELFLAT_TEXTURE)
|
||||||
{
|
{
|
||||||
GLMapTexture_t *grtex;
|
GLMapTexture_t *grtex;
|
||||||
|
@ -934,15 +934,17 @@ void HWR_GetLevelFlat(levelflat_t *levelflat)
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
else if (levelflat->type == LEVELFLAT_PNG)
|
else if (levelflat->type == LEVELFLAT_PNG)
|
||||||
{
|
{
|
||||||
INT32 pngwidth = 0, pngheight = 0;
|
|
||||||
GLMipmap_t *mipmap = levelflat->mipmap;
|
GLMipmap_t *mipmap = levelflat->mipmap;
|
||||||
UINT8 *flat;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
// Cache the picture.
|
// Cache the picture.
|
||||||
if (!levelflat->picture)
|
if (!levelflat->mippic)
|
||||||
{
|
{
|
||||||
levelflat->picture = Picture_PNGConvert(W_CacheLumpNum(levelflat->u.flat.lumpnum, PU_CACHE), PICFMT_FLAT, &pngwidth, &pngheight, NULL, NULL, W_LumpLength(levelflat->u.flat.lumpnum), NULL, 0);
|
INT32 pngwidth = 0, pngheight = 0;
|
||||||
|
void *pic = Picture_PNGConvert(W_CacheLumpNum(levelflat->u.flat.lumpnum, PU_CACHE), PICFMT_FLAT, &pngwidth, &pngheight, NULL, NULL, W_LumpLength(levelflat->u.flat.lumpnum), NULL, 0);
|
||||||
|
|
||||||
|
Z_ChangeTag(pic, PU_LEVEL);
|
||||||
|
Z_SetUser(pic, &levelflat->mippic);
|
||||||
|
|
||||||
levelflat->width = (UINT16)pngwidth;
|
levelflat->width = (UINT16)pngwidth;
|
||||||
levelflat->height = (UINT16)pngheight;
|
levelflat->height = (UINT16)pngheight;
|
||||||
}
|
}
|
||||||
|
@ -950,7 +952,7 @@ void HWR_GetLevelFlat(levelflat_t *levelflat)
|
||||||
// Make the mipmap.
|
// Make the mipmap.
|
||||||
if (mipmap == NULL)
|
if (mipmap == NULL)
|
||||||
{
|
{
|
||||||
mipmap = Z_Calloc(sizeof(GLMipmap_t), PU_LEVEL, NULL);
|
mipmap = Z_Calloc(sizeof(GLMipmap_t), PU_STATIC, NULL);
|
||||||
mipmap->format = GL_TEXFMT_P_8;
|
mipmap->format = GL_TEXFMT_P_8;
|
||||||
mipmap->flags = TF_WRAPXY|TF_CHROMAKEYED;
|
mipmap->flags = TF_WRAPXY|TF_CHROMAKEYED;
|
||||||
levelflat->mipmap = mipmap;
|
levelflat->mipmap = mipmap;
|
||||||
|
@ -958,17 +960,22 @@ void HWR_GetLevelFlat(levelflat_t *levelflat)
|
||||||
|
|
||||||
if (!mipmap->data && !mipmap->downloaded)
|
if (!mipmap->data && !mipmap->downloaded)
|
||||||
{
|
{
|
||||||
|
UINT8 *flat;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
if (levelflat->mippic == NULL)
|
||||||
|
I_Error("HWR_GetLevelFlat: levelflat->mippic == NULL");
|
||||||
|
|
||||||
mipmap->width = levelflat->width;
|
mipmap->width = levelflat->width;
|
||||||
mipmap->height = levelflat->height;
|
mipmap->height = levelflat->height;
|
||||||
|
|
||||||
size = (mipmap->width * mipmap->height);
|
size = (mipmap->width * mipmap->height);
|
||||||
flat = Z_Malloc(size, PU_LEVEL, &mipmap->data);
|
flat = Z_Malloc(size, PU_LEVEL, &mipmap->data);
|
||||||
if (levelflat->picture == NULL)
|
M_Memcpy(flat, levelflat->mippic, size);
|
||||||
I_Error("HWR_GetLevelFlat: levelflat->picture == NULL");
|
|
||||||
M_Memcpy(flat, levelflat->picture, size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tell the hardware driver to bind the current texture to the flat's mipmap
|
// Tell the hardware driver to bind the current texture to the flat's mipmap
|
||||||
HWD.pfnSetTexture(mipmap);
|
HWR_SetCurrentTexture(mipmap);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else // set no texture
|
else // set no texture
|
||||||
|
@ -1084,7 +1091,6 @@ void HWR_UnlockCachedPatch(GLPatch_t *gpatch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Z_ChangeTag(gpatch->mipmap->data, PU_HWRCACHE_UNLOCKED);
|
Z_ChangeTag(gpatch->mipmap->data, PU_HWRCACHE_UNLOCKED);
|
||||||
Z_ChangeTag(gpatch, PU_HWRPATCHINFO_UNLOCKED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const INT32 picmode2GR[] =
|
static const INT32 picmode2GR[] =
|
||||||
|
|
|
@ -48,44 +48,43 @@ struct GLColormap_s
|
||||||
typedef struct GLColormap_s GLColormap_t;
|
typedef struct GLColormap_s GLColormap_t;
|
||||||
|
|
||||||
|
|
||||||
// data holds the address of the graphics data cached in heap memory
|
// Texture information (misleadingly named "mipmap" all over the code.)
|
||||||
// NULL if the texture is not in Doom heap cache.
|
// The *data pointer holds the address of the graphics data cached in heap memory.
|
||||||
|
// NULL if the texture is not in SRB2's heap cache.
|
||||||
struct GLMipmap_s
|
struct GLMipmap_s
|
||||||
{
|
{
|
||||||
// for TexDownloadMipMap
|
// for UpdateTexture
|
||||||
GLTextureFormat_t format;
|
GLTextureFormat_t format;
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
UINT32 flags;
|
UINT32 flags;
|
||||||
UINT16 height;
|
UINT16 height;
|
||||||
UINT16 width;
|
UINT16 width;
|
||||||
UINT32 downloaded; // The GPU has this texture.
|
UINT32 downloaded; // The GPU has this texture.
|
||||||
|
|
||||||
struct GLMipmap_s *nextcolormap;
|
struct GLMipmap_s *nextcolormap;
|
||||||
struct GLColormap_s *colormap;
|
struct GLColormap_s *colormap;
|
||||||
|
|
||||||
struct GLMipmap_s *nextmipmap; // Linked list of all textures
|
|
||||||
};
|
};
|
||||||
typedef struct GLMipmap_s GLMipmap_t;
|
typedef struct GLMipmap_s GLMipmap_t;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Doom texture info, as cached for hardware rendering
|
// Level textures, as cached for hardware rendering.
|
||||||
//
|
//
|
||||||
struct GLMapTexture_s
|
struct GLMapTexture_s
|
||||||
{
|
{
|
||||||
GLMipmap_t mipmap;
|
GLMipmap_t mipmap;
|
||||||
float scaleX; //used for scaling textures on walls
|
float scaleX; // Used for scaling textures on walls
|
||||||
float scaleY;
|
float scaleY;
|
||||||
};
|
};
|
||||||
typedef struct GLMapTexture_s GLMapTexture_t;
|
typedef struct GLMapTexture_s GLMapTexture_t;
|
||||||
|
|
||||||
|
|
||||||
// a cached patch as converted to hardware format
|
// Patch information for the hardware renderer.
|
||||||
struct GLPatch_s
|
struct GLPatch_s
|
||||||
{
|
{
|
||||||
float max_s,max_t;
|
GLMipmap_t *mipmap; // Texture data. Allocated whenever the patch is.
|
||||||
GLMipmap_t *mipmap;
|
float max_s, max_t;
|
||||||
};
|
};
|
||||||
typedef struct GLPatch_s GLPatch_t;
|
typedef struct GLPatch_s GLPatch_t;
|
||||||
|
|
||||||
|
|
|
@ -255,7 +255,16 @@ enum ETextureFlags
|
||||||
TF_TRANSPARENT = 0x00000040, // texture with some alpha == 0
|
TF_TRANSPARENT = 0x00000040, // texture with some alpha == 0
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct GLMipmap_s FTextureInfo;
|
struct FTextureInfo
|
||||||
|
{
|
||||||
|
UINT32 width, height;
|
||||||
|
UINT32 downloaded;
|
||||||
|
UINT32 format;
|
||||||
|
|
||||||
|
struct GLMipmap_s *texture;
|
||||||
|
struct FTextureInfo *prev, *next;
|
||||||
|
};
|
||||||
|
typedef struct FTextureInfo FTextureInfo;
|
||||||
|
|
||||||
// jimita 14032019
|
// jimita 14032019
|
||||||
struct FLightInfo
|
struct FLightInfo
|
||||||
|
|
|
@ -437,18 +437,9 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||||
|
|
||||||
if (!(option & V_SCALEPATCHMASK))
|
if (!(option & V_SCALEPATCHMASK))
|
||||||
{
|
{
|
||||||
// if it's meant to cover the whole screen, black out the rest (ONLY IF TOP LEFT ISN'T TRANSPARENT)
|
// if it's meant to cover the whole screen, black out the rest
|
||||||
// cx and cy are possibly *slightly* off from float maths
|
// no the patch is cropped do not do this ever
|
||||||
// This is done before here compared to software because we directly alter cx and cy to centre
|
|
||||||
if (cx >= -0.1f && cx <= 0.1f && gpatch->width == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && gpatch->height == BASEVIDHEIGHT)
|
|
||||||
{
|
|
||||||
const column_t *column = (const column_t *)((const UINT8 *)(gpatch->columns) + (gpatch->columnofs[0]));
|
|
||||||
if (!column->topdelta)
|
|
||||||
{
|
|
||||||
const UINT8 *source = (const UINT8 *)(column) + 3;
|
|
||||||
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// centre screen
|
// centre screen
|
||||||
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
|
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
|
||||||
{
|
{
|
||||||
|
@ -470,11 +461,11 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||||
fwidth = w;
|
fwidth = w;
|
||||||
fheight = h;
|
fheight = h;
|
||||||
|
|
||||||
if (fwidth > gpatch->width)
|
if (sx + w > gpatch->width)
|
||||||
fwidth = gpatch->width;
|
fwidth = gpatch->width - sx;
|
||||||
|
|
||||||
if (fheight > gpatch->height)
|
if (sy + h > gpatch->height)
|
||||||
fheight = gpatch->height;
|
fheight = gpatch->height - sy;
|
||||||
|
|
||||||
if (pscale != FRACUNIT)
|
if (pscale != FRACUNIT)
|
||||||
{
|
{
|
||||||
|
@ -506,13 +497,13 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||||
|
|
||||||
v[0].s = v[3].s = ((sx)/(float)(gpatch->width))*hwrPatch->max_s;
|
v[0].s = v[3].s = ((sx)/(float)(gpatch->width))*hwrPatch->max_s;
|
||||||
if (sx + w > gpatch->width)
|
if (sx + w > gpatch->width)
|
||||||
v[2].s = v[1].s = hwrPatch->max_s - ((sx+w)/(float)(gpatch->width))*hwrPatch->max_s;
|
v[2].s = v[1].s = hwrPatch->max_s;
|
||||||
else
|
else
|
||||||
v[2].s = v[1].s = ((sx+w)/(float)(gpatch->width))*hwrPatch->max_s;
|
v[2].s = v[1].s = ((sx+w)/(float)(gpatch->width))*hwrPatch->max_s;
|
||||||
|
|
||||||
v[0].t = v[1].t = ((sy)/(float)(gpatch->height))*hwrPatch->max_t;
|
v[0].t = v[1].t = ((sy)/(float)(gpatch->height))*hwrPatch->max_t;
|
||||||
if (sy + h > gpatch->height)
|
if (sy + h > gpatch->height)
|
||||||
v[2].t = v[3].t = hwrPatch->max_t - ((sy+h)/(float)(gpatch->height))*hwrPatch->max_t;
|
v[2].t = v[3].t = hwrPatch->max_t;
|
||||||
else
|
else
|
||||||
v[2].t = v[3].t = ((sy+h)/(float)(gpatch->height))*hwrPatch->max_t;
|
v[2].t = v[3].t = ((sy+h)/(float)(gpatch->height))*hwrPatch->max_t;
|
||||||
|
|
||||||
|
@ -639,7 +630,7 @@ void HWR_DrawFlatFill (INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum
|
||||||
v[0].t = v[1].t = (float)((y & flatflag)/dflatsize);
|
v[0].t = v[1].t = (float)((y & flatflag)/dflatsize);
|
||||||
v[2].t = v[3].t = (float)(v[0].t + h/dflatsize);
|
v[2].t = v[3].t = (float)(v[0].t + h/dflatsize);
|
||||||
|
|
||||||
HWR_LiterallyGetFlat(flatlumpnum);
|
HWR_GetRawFlat(flatlumpnum);
|
||||||
|
|
||||||
//Hurdler: Boris, the same comment as above... but maybe for pics
|
//Hurdler: Boris, the same comment as above... but maybe for pics
|
||||||
// it not a problem since they don't have any transparent pixel
|
// it not a problem since they don't have any transparent pixel
|
||||||
|
|
|
@ -40,13 +40,12 @@ EXPORT void HWRAPI(DrawIndexedTriangles) (FSurfaceInfo *pSurf, FOutVector *pOutV
|
||||||
EXPORT void HWRAPI(RenderSkyDome) (gl_sky_t *sky);
|
EXPORT void HWRAPI(RenderSkyDome) (gl_sky_t *sky);
|
||||||
EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags);
|
EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags);
|
||||||
EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask, FBOOLEAN DepthMask, FRGBAFloat *ClearColor);
|
EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask, FBOOLEAN DepthMask, FRGBAFloat *ClearColor);
|
||||||
EXPORT void HWRAPI(SetTexture) (FTextureInfo *TexInfo);
|
EXPORT void HWRAPI(SetTexture) (GLMipmap_t *TexInfo);
|
||||||
EXPORT void HWRAPI(UpdateTexture) (FTextureInfo *TexInfo);
|
EXPORT void HWRAPI(UpdateTexture) (GLMipmap_t *TexInfo);
|
||||||
EXPORT void HWRAPI(DeleteTexture) (FTextureInfo *TexInfo);
|
EXPORT void HWRAPI(DeleteTexture) (GLMipmap_t *TexInfo);
|
||||||
EXPORT void HWRAPI(ReadRect) (INT32 x, INT32 y, INT32 width, INT32 height, INT32 dst_stride, UINT16 *dst_data);
|
EXPORT void HWRAPI(ReadRect) (INT32 x, INT32 y, INT32 width, INT32 height, INT32 dst_stride, UINT16 *dst_data);
|
||||||
EXPORT void HWRAPI(GClipRect) (INT32 minx, INT32 miny, INT32 maxx, INT32 maxy, float nearclip);
|
EXPORT void HWRAPI(GClipRect) (INT32 minx, INT32 miny, INT32 maxx, INT32 maxy, float nearclip);
|
||||||
EXPORT void HWRAPI(ClearMipMapCache) (void);
|
EXPORT void HWRAPI(ClearMipMapCache) (void);
|
||||||
EXPORT void HWRAPI(ClearCacheList) (void);
|
|
||||||
|
|
||||||
//Hurdler: added for backward compatibility
|
//Hurdler: added for backward compatibility
|
||||||
EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value);
|
EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value);
|
||||||
|
@ -101,7 +100,6 @@ struct hwdriver_s
|
||||||
ReadRect pfnReadRect;
|
ReadRect pfnReadRect;
|
||||||
GClipRect pfnGClipRect;
|
GClipRect pfnGClipRect;
|
||||||
ClearMipMapCache pfnClearMipMapCache;
|
ClearMipMapCache pfnClearMipMapCache;
|
||||||
ClearCacheList pfnClearCacheList;
|
|
||||||
SetSpecialState pfnSetSpecialState;//Hurdler: added for backward compatibility
|
SetSpecialState pfnSetSpecialState;//Hurdler: added for backward compatibility
|
||||||
DrawModel pfnDrawModel;
|
DrawModel pfnDrawModel;
|
||||||
CreateModelVBOs pfnCreateModelVBOs;
|
CreateModelVBOs pfnCreateModelVBOs;
|
||||||
|
|
|
@ -118,7 +118,7 @@ patch_t *HWR_GetPic(lumpnum_t lumpnum);
|
||||||
|
|
||||||
GLMapTexture_t *HWR_GetTexture(INT32 tex);
|
GLMapTexture_t *HWR_GetTexture(INT32 tex);
|
||||||
void HWR_GetLevelFlat(levelflat_t *levelflat);
|
void HWR_GetLevelFlat(levelflat_t *levelflat);
|
||||||
void HWR_LiterallyGetFlat(lumpnum_t flatlumpnum);
|
void HWR_GetRawFlat(lumpnum_t flatlumpnum);
|
||||||
|
|
||||||
void HWR_FreeTexture(patch_t *patch);
|
void HWR_FreeTexture(patch_t *patch);
|
||||||
void HWR_FreeTextureData(patch_t *patch);
|
void HWR_FreeTextureData(patch_t *patch);
|
||||||
|
|
|
@ -3665,7 +3665,7 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale)
|
||||||
static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean precip)
|
static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean precip)
|
||||||
{
|
{
|
||||||
if (cv_glspritebillboarding.value
|
if (cv_glspritebillboarding.value
|
||||||
&& spr && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE)
|
&& spr && spr->mobj && !R_ThingIsPaperSprite(spr->mobj)
|
||||||
&& wallVerts)
|
&& wallVerts)
|
||||||
{
|
{
|
||||||
float basey = FIXED_TO_FLOAT(spr->mobj->z);
|
float basey = FIXED_TO_FLOAT(spr->mobj->z);
|
||||||
|
@ -3707,7 +3707,6 @@ static void HWR_SplitSprite(gl_vissprite_t *spr)
|
||||||
FBITFIELD blend = 0;
|
FBITFIELD blend = 0;
|
||||||
FBITFIELD occlusion;
|
FBITFIELD occlusion;
|
||||||
boolean use_linkdraw_hack = false;
|
boolean use_linkdraw_hack = false;
|
||||||
boolean splat = R_ThingIsFloorSprite(spr->mobj);
|
|
||||||
UINT8 alpha;
|
UINT8 alpha;
|
||||||
|
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
@ -3766,22 +3765,19 @@ static void HWR_SplitSprite(gl_vissprite_t *spr)
|
||||||
baseWallVerts[0].t = baseWallVerts[1].t = ((GLPatch_t *)gpatch->hardware)->max_t;
|
baseWallVerts[0].t = baseWallVerts[1].t = ((GLPatch_t *)gpatch->hardware)->max_t;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!splat)
|
// if it has a dispoffset, push it a little towards the camera
|
||||||
{
|
if (spr->dispoffset) {
|
||||||
// if it has a dispoffset, push it a little towards the camera
|
float co = -gl_viewcos*(0.05f*spr->dispoffset);
|
||||||
if (spr->dispoffset) {
|
float si = -gl_viewsin*(0.05f*spr->dispoffset);
|
||||||
float co = -gl_viewcos*(0.05f*spr->dispoffset);
|
baseWallVerts[0].z = baseWallVerts[3].z = baseWallVerts[0].z+si;
|
||||||
float si = -gl_viewsin*(0.05f*spr->dispoffset);
|
baseWallVerts[1].z = baseWallVerts[2].z = baseWallVerts[1].z+si;
|
||||||
baseWallVerts[0].z = baseWallVerts[3].z = baseWallVerts[0].z+si;
|
baseWallVerts[0].x = baseWallVerts[3].x = baseWallVerts[0].x+co;
|
||||||
baseWallVerts[1].z = baseWallVerts[2].z = baseWallVerts[1].z+si;
|
baseWallVerts[1].x = baseWallVerts[2].x = baseWallVerts[1].x+co;
|
||||||
baseWallVerts[0].x = baseWallVerts[3].x = baseWallVerts[0].x+co;
|
|
||||||
baseWallVerts[1].x = baseWallVerts[2].x = baseWallVerts[1].x+co;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Let dispoffset work first since this adjust each vertex
|
|
||||||
HWR_RotateSpritePolyToAim(spr, baseWallVerts, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Let dispoffset work first since this adjust each vertex
|
||||||
|
HWR_RotateSpritePolyToAim(spr, baseWallVerts, false);
|
||||||
|
|
||||||
realtop = top = baseWallVerts[3].y;
|
realtop = top = baseWallVerts[3].y;
|
||||||
realbot = bot = baseWallVerts[0].y;
|
realbot = bot = baseWallVerts[0].y;
|
||||||
ttop = baseWallVerts[3].t;
|
ttop = baseWallVerts[3].t;
|
||||||
|
@ -3914,7 +3910,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr)
|
||||||
|
|
||||||
// The x and y only need to be adjusted in the case that it's not a papersprite
|
// The x and y only need to be adjusted in the case that it's not a papersprite
|
||||||
if (cv_glspritebillboarding.value
|
if (cv_glspritebillboarding.value
|
||||||
&& spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE))
|
&& spr->mobj && !R_ThingIsPaperSprite(spr->mobj))
|
||||||
{
|
{
|
||||||
// Get the x and z of the vertices so billboarding draws correctly
|
// Get the x and z of the vertices so billboarding draws correctly
|
||||||
realheight = realbot - realtop;
|
realheight = realbot - realtop;
|
||||||
|
@ -3983,7 +3979,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr)
|
||||||
static void HWR_DrawSprite(gl_vissprite_t *spr)
|
static void HWR_DrawSprite(gl_vissprite_t *spr)
|
||||||
{
|
{
|
||||||
FOutVector wallVerts[4];
|
FOutVector wallVerts[4];
|
||||||
patch_t *gpatch; // sprite patch converted to hardware
|
patch_t *gpatch;
|
||||||
FSurfaceInfo Surf;
|
FSurfaceInfo Surf;
|
||||||
const boolean splat = R_ThingIsFloorSprite(spr->mobj);
|
const boolean splat = R_ThingIsFloorSprite(spr->mobj);
|
||||||
|
|
||||||
|
@ -4284,7 +4280,7 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
|
||||||
{
|
{
|
||||||
FBITFIELD blend = 0;
|
FBITFIELD blend = 0;
|
||||||
FOutVector wallVerts[4];
|
FOutVector wallVerts[4];
|
||||||
patch_t *gpatch; // sprite patch converted to hardware
|
patch_t *gpatch;
|
||||||
FSurfaceInfo Surf;
|
FSurfaceInfo Surf;
|
||||||
|
|
||||||
if (!spr->mobj)
|
if (!spr->mobj)
|
||||||
|
@ -4337,7 +4333,7 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
|
||||||
// Always use the light at the top instead of whatever I was doing before
|
// Always use the light at the top instead of whatever I was doing before
|
||||||
INT32 light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false);
|
INT32 light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false);
|
||||||
|
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!R_ThingIsFullBright(spr->mobj))
|
||||||
lightlevel = *sector->lightlist[light].lightlevel > 255 ? 255 : *sector->lightlist[light].lightlevel;
|
lightlevel = *sector->lightlist[light].lightlevel > 255 ? 255 : *sector->lightlist[light].lightlevel;
|
||||||
|
|
||||||
if (*sector->lightlist[light].extra_colormap)
|
if (*sector->lightlist[light].extra_colormap)
|
||||||
|
@ -4345,7 +4341,7 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!R_ThingIsFullBright(spr->mobj))
|
||||||
lightlevel = sector->lightlevel > 255 ? 255 : sector->lightlevel;
|
lightlevel = sector->lightlevel > 255 ? 255 : sector->lightlevel;
|
||||||
|
|
||||||
if (sector->extra_colormap)
|
if (sector->extra_colormap)
|
||||||
|
@ -4921,8 +4917,8 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||||
|
|
||||||
angle_t ang;
|
angle_t ang;
|
||||||
INT32 heightsec, phs;
|
INT32 heightsec, phs;
|
||||||
const boolean papersprite = R_ThingIsPaperSprite(thing);
|
|
||||||
const boolean splat = R_ThingIsFloorSprite(thing);
|
const boolean splat = R_ThingIsFloorSprite(thing);
|
||||||
|
const boolean papersprite = (R_ThingIsPaperSprite(thing) && !splat);
|
||||||
angle_t mobjangle = (thing->player ? thing->player->drawangle : thing->angle);
|
angle_t mobjangle = (thing->player ? thing->player->drawangle : thing->angle);
|
||||||
float z1, z2;
|
float z1, z2;
|
||||||
|
|
||||||
|
|
|
@ -158,7 +158,7 @@ static GLTextureFormat_t PNG_Load(const char *filename, int *w, int *h, GLPatch_
|
||||||
jmp_buf jmpbuf;
|
jmp_buf jmpbuf;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
png_FILE_p png_FILE;
|
volatile png_FILE_p png_FILE;
|
||||||
//Filename checking fixed ~Monster Iestyn and Golden
|
//Filename checking fixed ~Monster Iestyn and Golden
|
||||||
char *pngfilename = va("%s"PATHSEP"models"PATHSEP"%s", srb2home, filename);
|
char *pngfilename = va("%s"PATHSEP"models"PATHSEP"%s", srb2home, filename);
|
||||||
|
|
||||||
|
@ -1314,7 +1314,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
||||||
|
|
||||||
light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before
|
light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before
|
||||||
|
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!R_ThingIsFullBright(spr->mobj))
|
||||||
lightlevel = *sector->lightlist[light].lightlevel > 255 ? 255 : *sector->lightlist[light].lightlevel;
|
lightlevel = *sector->lightlist[light].lightlevel > 255 ? 255 : *sector->lightlist[light].lightlevel;
|
||||||
|
|
||||||
if (*sector->lightlist[light].extra_colormap)
|
if (*sector->lightlist[light].extra_colormap)
|
||||||
|
@ -1322,7 +1322,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!R_ThingIsFullBright(spr->mobj))
|
||||||
lightlevel = sector->lightlevel > 255 ? 255 : sector->lightlevel;
|
lightlevel = sector->lightlevel > 255 ? 255 : sector->lightlevel;
|
||||||
|
|
||||||
if (sector->extra_colormap)
|
if (sector->extra_colormap)
|
||||||
|
@ -1340,10 +1340,9 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
||||||
GLPatch_t *hwrPatch = NULL, *hwrBlendPatch = NULL;
|
GLPatch_t *hwrPatch = NULL, *hwrBlendPatch = NULL;
|
||||||
INT32 durs = spr->mobj->state->tics;
|
INT32 durs = spr->mobj->state->tics;
|
||||||
INT32 tics = spr->mobj->tics;
|
INT32 tics = spr->mobj->tics;
|
||||||
//mdlframe_t *next = NULL;
|
const boolean papersprite = (R_ThingIsPaperSprite(spr->mobj) && !R_ThingIsFloorSprite(spr->mobj));
|
||||||
const boolean papersprite = (spr->mobj->frame & FF_PAPERSPRITE);
|
const UINT8 flip = (UINT8)(!(spr->mobj->eflags & MFE_VERTICALFLIP) != !R_ThingVerticallyFlipped(spr->mobj));
|
||||||
const UINT8 flip = (UINT8)(!(spr->mobj->eflags & MFE_VERTICALFLIP) != !(spr->mobj->frame & FF_VERTICALFLIP));
|
const UINT8 hflip = (UINT8)(!(spr->mobj->mirrored) != !R_ThingHorizontallyFlipped(spr->mobj));
|
||||||
const UINT8 hflip = (UINT8)(!(spr->mobj->mirrored) != !(spr->mobj->frame & FF_HORIZONTALFLIP));
|
|
||||||
spritedef_t *sprdef;
|
spritedef_t *sprdef;
|
||||||
spriteframe_t *sprframe;
|
spriteframe_t *sprframe;
|
||||||
spriteinfo_t *sprinfo;
|
spriteinfo_t *sprinfo;
|
||||||
|
@ -1405,6 +1404,11 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
||||||
|| ((!hwrBlendPatch->mipmap->format || !hwrBlendPatch->mipmap->downloaded) && !md2->noblendfile)))
|
|| ((!hwrBlendPatch->mipmap->format || !hwrBlendPatch->mipmap->downloaded) && !md2->noblendfile)))
|
||||||
md2_loadBlendTexture(md2);
|
md2_loadBlendTexture(md2);
|
||||||
|
|
||||||
|
// Load it again, because it isn't being loaded into blendgpatch after md2_loadblendtexture...
|
||||||
|
blendgpatch = md2->blendgrpatch;
|
||||||
|
if (blendgpatch)
|
||||||
|
hwrBlendPatch = ((GLPatch_t *)blendgpatch->hardware);
|
||||||
|
|
||||||
if (md2->error)
|
if (md2->error)
|
||||||
return false; // we already failed loading this before :(
|
return false; // we already failed loading this before :(
|
||||||
if (!md2->model)
|
if (!md2->model)
|
||||||
|
|
|
@ -58,8 +58,9 @@ static GLuint tex_downloaded = 0;
|
||||||
static GLfloat fov = 90.0f;
|
static GLfloat fov = 90.0f;
|
||||||
static FBITFIELD CurrentPolyFlags;
|
static FBITFIELD CurrentPolyFlags;
|
||||||
|
|
||||||
static FTextureInfo *gl_cachetail = NULL;
|
// Linked list of all textures.
|
||||||
static FTextureInfo *gl_cachehead = NULL;
|
static FTextureInfo *TexCacheTail = NULL;
|
||||||
|
static FTextureInfo *TexCacheHead = NULL;
|
||||||
|
|
||||||
RGBA_t myPaletteData[256];
|
RGBA_t myPaletteData[256];
|
||||||
GLint screen_width = 0; // used by Draw2DLine()
|
GLint screen_width = 0; // used by Draw2DLine()
|
||||||
|
@ -961,8 +962,6 @@ EXPORT boolean HWRAPI(CompileShaders) (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetShader(SHADER_DEFAULT);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
|
@ -1287,10 +1286,30 @@ void SetStates(void)
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// DeleteTexture : Deletes a texture from the GPU and frees its data
|
// DeleteTexture : Deletes a texture from the GPU and frees its data
|
||||||
// -----------------+
|
// -----------------+
|
||||||
EXPORT void HWRAPI(DeleteTexture) (FTextureInfo *pTexInfo)
|
EXPORT void HWRAPI(DeleteTexture) (GLMipmap_t *pTexInfo)
|
||||||
{
|
{
|
||||||
if (pTexInfo->downloaded)
|
FTextureInfo *head = TexCacheHead;
|
||||||
|
|
||||||
|
if (!pTexInfo)
|
||||||
|
return;
|
||||||
|
else if (pTexInfo->downloaded)
|
||||||
pglDeleteTextures(1, (GLuint *)&pTexInfo->downloaded);
|
pglDeleteTextures(1, (GLuint *)&pTexInfo->downloaded);
|
||||||
|
|
||||||
|
while (head)
|
||||||
|
{
|
||||||
|
if (head->downloaded == pTexInfo->downloaded)
|
||||||
|
{
|
||||||
|
if (head->next)
|
||||||
|
head->next->prev = head->prev;
|
||||||
|
if (head->prev)
|
||||||
|
head->prev->next = head->next;
|
||||||
|
free(head);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
head = head->next;
|
||||||
|
}
|
||||||
|
|
||||||
pTexInfo->downloaded = 0;
|
pTexInfo->downloaded = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1303,26 +1322,29 @@ void Flush(void)
|
||||||
{
|
{
|
||||||
//GL_DBG_Printf ("HWR_Flush()\n");
|
//GL_DBG_Printf ("HWR_Flush()\n");
|
||||||
|
|
||||||
while (gl_cachehead)
|
while (TexCacheHead)
|
||||||
{
|
{
|
||||||
DeleteTexture(gl_cachehead);
|
FTextureInfo *pTexInfo = TexCacheHead;
|
||||||
gl_cachehead = gl_cachehead->nextmipmap;
|
GLMipmap_t *texture = pTexInfo->texture;
|
||||||
|
|
||||||
|
if (pTexInfo->downloaded)
|
||||||
|
{
|
||||||
|
pglDeleteTextures(1, (GLuint *)&pTexInfo->downloaded);
|
||||||
|
pTexInfo->downloaded = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (texture)
|
||||||
|
texture->downloaded = 0;
|
||||||
|
|
||||||
|
TexCacheHead = pTexInfo->next;
|
||||||
|
free(pTexInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClearCacheList(); //Hurdler: well, gl_cachehead is already NULL
|
TexCacheTail = TexCacheHead = NULL; //Hurdler: well, TexCacheHead is already NULL
|
||||||
tex_downloaded = 0;
|
tex_downloaded = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -----------------+
|
|
||||||
// ClearCacheList : Clears the texture cache tail and head
|
|
||||||
// -----------------+
|
|
||||||
EXPORT void HWRAPI(ClearCacheList) (void)
|
|
||||||
{
|
|
||||||
gl_cachetail = gl_cachehead = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// isExtAvailable : Look if an OpenGL extension is available
|
// isExtAvailable : Look if an OpenGL extension is available
|
||||||
// Returns : true if extension available
|
// Returns : true if extension available
|
||||||
|
@ -1718,7 +1740,7 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags)
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// UpdateTexture : Updates the texture data.
|
// UpdateTexture : Updates the texture data.
|
||||||
// -----------------+
|
// -----------------+
|
||||||
EXPORT void HWRAPI(UpdateTexture) (FTextureInfo *pTexInfo)
|
EXPORT void HWRAPI(UpdateTexture) (GLMipmap_t *pTexInfo)
|
||||||
{
|
{
|
||||||
// Download a mipmap
|
// Download a mipmap
|
||||||
boolean updatemipmap = true;
|
boolean updatemipmap = true;
|
||||||
|
@ -1920,7 +1942,7 @@ EXPORT void HWRAPI(UpdateTexture) (FTextureInfo *pTexInfo)
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// SetTexture : The mipmap becomes the current texture source
|
// SetTexture : The mipmap becomes the current texture source
|
||||||
// -----------------+
|
// -----------------+
|
||||||
EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo)
|
EXPORT void HWRAPI(SetTexture) (GLMipmap_t *pTexInfo)
|
||||||
{
|
{
|
||||||
if (!pTexInfo)
|
if (!pTexInfo)
|
||||||
{
|
{
|
||||||
|
@ -1937,17 +1959,25 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
FTextureInfo *newTex = calloc(1, sizeof (*newTex));
|
||||||
|
|
||||||
UpdateTexture(pTexInfo);
|
UpdateTexture(pTexInfo);
|
||||||
pTexInfo->nextmipmap = NULL;
|
|
||||||
|
newTex->texture = pTexInfo;
|
||||||
|
newTex->downloaded = (UINT32)pTexInfo->downloaded;
|
||||||
|
newTex->width = (UINT32)pTexInfo->width;
|
||||||
|
newTex->height = (UINT32)pTexInfo->height;
|
||||||
|
newTex->format = (UINT32)pTexInfo->format;
|
||||||
|
|
||||||
// insertion at the tail
|
// insertion at the tail
|
||||||
if (gl_cachetail)
|
if (TexCacheTail)
|
||||||
{
|
{
|
||||||
gl_cachetail->nextmipmap = pTexInfo;
|
newTex->prev = TexCacheTail;
|
||||||
gl_cachetail = pTexInfo;
|
TexCacheTail->next = newTex;
|
||||||
|
TexCacheTail = newTex;
|
||||||
}
|
}
|
||||||
else // initialization of the linked list
|
else // initialization of the linked list
|
||||||
gl_cachetail = gl_cachehead = pTexInfo;
|
TexCacheTail = TexCacheHead = newTex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3011,7 +3041,7 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
|
||||||
|
|
||||||
EXPORT INT32 HWRAPI(GetTextureUsed) (void)
|
EXPORT INT32 HWRAPI(GetTextureUsed) (void)
|
||||||
{
|
{
|
||||||
FTextureInfo *tmp = gl_cachehead;
|
FTextureInfo *tmp = TexCacheHead;
|
||||||
INT32 res = 0;
|
INT32 res = 0;
|
||||||
|
|
||||||
while (tmp)
|
while (tmp)
|
||||||
|
@ -3028,7 +3058,7 @@ EXPORT INT32 HWRAPI(GetTextureUsed) (void)
|
||||||
|
|
||||||
// Add it up!
|
// Add it up!
|
||||||
res += tmp->height*tmp->width*bpp;
|
res += tmp->height*tmp->width*bpp;
|
||||||
tmp = tmp->nextmipmap;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -98,6 +98,7 @@ patch_t *emeraldpics[3][8]; // 0 = normal, 1 = tiny, 2 = coinbox
|
||||||
static patch_t *emblemicon;
|
static patch_t *emblemicon;
|
||||||
patch_t *tokenicon;
|
patch_t *tokenicon;
|
||||||
static patch_t *exiticon;
|
static patch_t *exiticon;
|
||||||
|
static patch_t *nopingicon;
|
||||||
|
|
||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
// misc vars
|
// misc vars
|
||||||
|
@ -286,6 +287,7 @@ void HU_LoadGraphics(void)
|
||||||
emblemicon = W_CachePatchName("EMBLICON", PU_HUDGFX);
|
emblemicon = W_CachePatchName("EMBLICON", PU_HUDGFX);
|
||||||
tokenicon = W_CachePatchName("TOKNICON", PU_HUDGFX);
|
tokenicon = W_CachePatchName("TOKNICON", PU_HUDGFX);
|
||||||
exiticon = W_CachePatchName("EXITICON", PU_HUDGFX);
|
exiticon = W_CachePatchName("EXITICON", PU_HUDGFX);
|
||||||
|
nopingicon = W_CachePatchName("NOPINGICON", PU_HUDGFX);
|
||||||
|
|
||||||
emeraldpics[0][0] = W_CachePatchName("CHAOS1", PU_HUDGFX);
|
emeraldpics[0][0] = W_CachePatchName("CHAOS1", PU_HUDGFX);
|
||||||
emeraldpics[0][1] = W_CachePatchName("CHAOS2", PU_HUDGFX);
|
emeraldpics[0][1] = W_CachePatchName("CHAOS2", PU_HUDGFX);
|
||||||
|
@ -2246,8 +2248,8 @@ void HU_Erase(void)
|
||||||
//
|
//
|
||||||
void HU_drawPing(INT32 x, INT32 y, UINT32 ping, boolean notext, INT32 flags)
|
void HU_drawPing(INT32 x, INT32 y, UINT32 ping, boolean notext, INT32 flags)
|
||||||
{
|
{
|
||||||
UINT8 numbars = 1; // how many ping bars do we draw?
|
UINT8 numbars = 0; // how many ping bars do we draw?
|
||||||
UINT8 barcolor = 35; // color we use for the bars (green, yellow or red)
|
UINT8 barcolor = 31; // color we use for the bars (green, yellow, red or black)
|
||||||
SINT8 i = 0;
|
SINT8 i = 0;
|
||||||
SINT8 yoffset = 6;
|
SINT8 yoffset = 6;
|
||||||
INT32 dx = x+1 - (V_SmallStringWidth(va("%dms", ping),
|
INT32 dx = x+1 - (V_SmallStringWidth(va("%dms", ping),
|
||||||
|
@ -2260,11 +2262,16 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 ping, boolean notext, INT32 flags)
|
||||||
}
|
}
|
||||||
else if (ping < 256)
|
else if (ping < 256)
|
||||||
{
|
{
|
||||||
numbars = 2; // Apparently ternaries w/ multiple statements don't look good in C so I decided against it.
|
numbars = 2;
|
||||||
barcolor = 73;
|
barcolor = 73;
|
||||||
}
|
}
|
||||||
|
else if (ping < UINT32_MAX)
|
||||||
|
{
|
||||||
|
numbars = 1;
|
||||||
|
barcolor = 35;
|
||||||
|
}
|
||||||
|
|
||||||
if (!notext || vid.width >= 640) // how sad, we're using a shit resolution.
|
if (ping < UINT32_MAX && (!notext || vid.width >= 640)) // how sad, we're using a shit resolution.
|
||||||
V_DrawSmallString(dx, y+4, V_ALLOWLOWERCASE|flags, va("%dms", ping));
|
V_DrawSmallString(dx, y+4, V_ALLOWLOWERCASE|flags, va("%dms", ping));
|
||||||
|
|
||||||
for (i=0; (i<3); i++) // Draw the ping bar
|
for (i=0; (i<3); i++) // Draw the ping bar
|
||||||
|
@ -2275,6 +2282,9 @@ void HU_drawPing(INT32 x, INT32 y, UINT32 ping, boolean notext, INT32 flags)
|
||||||
|
|
||||||
yoffset -= 2;
|
yoffset -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ping == UINT32_MAX)
|
||||||
|
V_DrawSmallScaledPatch(x + 4 - nopingicon->width/2, y + 9 - nopingicon->height/2, 0, nopingicon);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -2301,16 +2311,17 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
||||||
|
|
||||||
if (!splitscreen) // don't draw it on splitscreen,
|
if (!splitscreen) // don't draw it on splitscreen,
|
||||||
{
|
{
|
||||||
if (!(tab[i].num == serverplayer || players[tab[i].num].quittime))
|
if (tab[i].num != serverplayer)
|
||||||
HU_drawPing(x+ 253, y, playerpingtable[tab[i].num], false, 0);
|
HU_drawPing(x + 253, y, players[tab[i].num].quittime ? UINT32_MAX : playerpingtable[tab[i].num], false, 0);
|
||||||
//else
|
//else
|
||||||
// V_DrawSmallString(x+ 246, y+4, V_YELLOWMAP, "SERVER");
|
// V_DrawSmallString(x+ 246, y+4, V_YELLOWMAP, "SERVER");
|
||||||
}
|
}
|
||||||
|
|
||||||
V_DrawString(x + 20, y,
|
if (!players[tab[i].num].quittime || (leveltime / (TICRATE/2) & 1))
|
||||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
V_DrawString(x + 20, y,
|
||||||
| (greycheck ? V_60TRANS : 0)
|
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||||
| V_ALLOWLOWERCASE, tab[i].name);
|
| (greycheck ? V_60TRANS : 0)
|
||||||
|
| V_ALLOWLOWERCASE, tab[i].name);
|
||||||
|
|
||||||
// Draw emeralds
|
// Draw emeralds
|
||||||
if (players[tab[i].num].powers[pw_invulnerability] && (players[tab[i].num].powers[pw_invulnerability] == players[tab[i].num].powers[pw_sneakers]) && ((leveltime/7) & 1))
|
if (players[tab[i].num].powers[pw_invulnerability] && (players[tab[i].num].powers[pw_invulnerability] == players[tab[i].num].powers[pw_sneakers]) && ((leveltime/7) & 1))
|
||||||
|
@ -2458,10 +2469,11 @@ static void HU_Draw32TeamTabRankings(playersort_t *tab, INT32 whiteplayer)
|
||||||
supercheck = supercheckdef;
|
supercheck = supercheckdef;
|
||||||
|
|
||||||
strlcpy(name, tab[i].name, 8);
|
strlcpy(name, tab[i].name, 8);
|
||||||
V_DrawString(x + 10, y,
|
if (!players[tab[i].num].quittime || (leveltime / (TICRATE/2) & 1))
|
||||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
V_DrawString(x + 10, y,
|
||||||
| (greycheck ? 0 : V_TRANSLUCENT)
|
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||||
| V_ALLOWLOWERCASE, name);
|
| (greycheck ? 0 : V_TRANSLUCENT)
|
||||||
|
| V_ALLOWLOWERCASE, name);
|
||||||
|
|
||||||
if (gametyperules & GTR_TEAMFLAGS)
|
if (gametyperules & GTR_TEAMFLAGS)
|
||||||
{
|
{
|
||||||
|
@ -2500,10 +2512,10 @@ static void HU_Draw32TeamTabRankings(playersort_t *tab, INT32 whiteplayer)
|
||||||
V_DrawRightAlignedThinString(x+128, y, ((players[tab[i].num].spectator || players[tab[i].num].playerstate == PST_DEAD) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
V_DrawRightAlignedThinString(x+128, y, ((players[tab[i].num].spectator || players[tab[i].num].playerstate == PST_DEAD) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||||
if (!splitscreen)
|
if (!splitscreen)
|
||||||
{
|
{
|
||||||
if (!(tab[i].num == serverplayer || players[tab[i].num].quittime))
|
if (tab[i].num != serverplayer)
|
||||||
HU_drawPing(x+ 135, y+1, playerpingtable[tab[i].num], true, 0);
|
HU_drawPing(x + 135, y+1, players[tab[i].num].quittime ? UINT32_MAX : playerpingtable[tab[i].num], true, 0);
|
||||||
//else
|
//else
|
||||||
//V_DrawSmallString(x+ 129, y+4, V_YELLOWMAP, "HOST");
|
//V_DrawSmallString(x+ 129, y+4, V_YELLOWMAP, "HOST");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2586,10 +2598,11 @@ void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer)
|
||||||
supercheck = supercheckdef;
|
supercheck = supercheckdef;
|
||||||
|
|
||||||
strlcpy(name, tab[i].name, 7);
|
strlcpy(name, tab[i].name, 7);
|
||||||
V_DrawString(x + 20, y,
|
if (!players[tab[i].num].quittime || (leveltime / (TICRATE/2) & 1))
|
||||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
V_DrawString(x + 20, y,
|
||||||
| (greycheck ? V_TRANSLUCENT : 0)
|
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||||
| V_ALLOWLOWERCASE, name);
|
| (greycheck ? V_TRANSLUCENT : 0)
|
||||||
|
| V_ALLOWLOWERCASE, name);
|
||||||
|
|
||||||
if (gametyperules & GTR_TEAMFLAGS)
|
if (gametyperules & GTR_TEAMFLAGS)
|
||||||
{
|
{
|
||||||
|
@ -2624,10 +2637,10 @@ void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer)
|
||||||
V_DrawRightAlignedThinString(x+100, y, (greycheck ? V_TRANSLUCENT : 0), va("%u", tab[i].count));
|
V_DrawRightAlignedThinString(x+100, y, (greycheck ? V_TRANSLUCENT : 0), va("%u", tab[i].count));
|
||||||
if (!splitscreen)
|
if (!splitscreen)
|
||||||
{
|
{
|
||||||
if (!(tab[i].num == serverplayer || players[tab[i].num].quittime))
|
if (tab[i].num != serverplayer)
|
||||||
HU_drawPing(x+ 113, y, playerpingtable[tab[i].num], false, 0);
|
HU_drawPing(x+ 113, y, players[tab[i].num].quittime ? UINT32_MAX : playerpingtable[tab[i].num], false, 0);
|
||||||
//else
|
//else
|
||||||
// V_DrawSmallString(x+ 94, y+4, V_YELLOWMAP, "SERVER");
|
// V_DrawSmallString(x+ 94, y+4, V_YELLOWMAP, "SERVER");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2655,15 +2668,16 @@ void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scoreline
|
||||||
supercheck = supercheckdef;
|
supercheck = supercheckdef;
|
||||||
|
|
||||||
strlcpy(name, tab[i].name, 7);
|
strlcpy(name, tab[i].name, 7);
|
||||||
if (!(tab[i].num == serverplayer || players[tab[i].num].quittime))
|
if (tab[i].num != serverplayer)
|
||||||
HU_drawPing(x+ 113, y, playerpingtable[tab[i].num], false, 0);
|
HU_drawPing(x+ 113, y, players[tab[i].num].quittime ? UINT32_MAX : playerpingtable[tab[i].num], false, 0);
|
||||||
//else
|
//else
|
||||||
// V_DrawSmallString(x+ 94, y+4, V_YELLOWMAP, "SERVER");
|
// V_DrawSmallString(x+ 94, y+4, V_YELLOWMAP, "SERVER");
|
||||||
|
|
||||||
V_DrawString(x + 20, y,
|
if (!players[tab[i].num].quittime || (leveltime / (TICRATE/2) & 1))
|
||||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
V_DrawString(x + 20, y,
|
||||||
| (greycheck ? V_TRANSLUCENT : 0)
|
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||||
| V_ALLOWLOWERCASE, name);
|
| (greycheck ? V_TRANSLUCENT : 0)
|
||||||
|
| V_ALLOWLOWERCASE, name);
|
||||||
|
|
||||||
if (G_GametypeUsesLives() && !(G_GametypeUsesCoopLives() && (cv_cooplives.value == 0 || cv_cooplives.value == 3)) && (players[tab[i].num].lives != INFLIVES)) //show lives
|
if (G_GametypeUsesLives() && !(G_GametypeUsesCoopLives() && (cv_cooplives.value == 0 || cv_cooplives.value == 3)) && (players[tab[i].num].lives != INFLIVES)) //show lives
|
||||||
V_DrawRightAlignedString(x, y+4, V_ALLOWLOWERCASE, va("%dx", players[tab[i].num].lives));
|
V_DrawRightAlignedString(x, y+4, V_ALLOWLOWERCASE, va("%dx", players[tab[i].num].lives));
|
||||||
|
@ -2763,16 +2777,17 @@ static void HU_Draw32TabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scor
|
||||||
strlcpy(name, tab[i].name, 7);
|
strlcpy(name, tab[i].name, 7);
|
||||||
if (!splitscreen) // don't draw it on splitscreen,
|
if (!splitscreen) // don't draw it on splitscreen,
|
||||||
{
|
{
|
||||||
if (!(tab[i].num == serverplayer || players[tab[i].num].quittime))
|
if (tab[i].num != serverplayer)
|
||||||
HU_drawPing(x+ 135, y+1, playerpingtable[tab[i].num], true, 0);
|
HU_drawPing(x+ 135, y+1, players[tab[i].num].quittime ? UINT32_MAX : playerpingtable[tab[i].num], true, 0);
|
||||||
//else
|
//else
|
||||||
// V_DrawSmallString(x+ 129, y+4, V_YELLOWMAP, "HOST");
|
// V_DrawSmallString(x+ 129, y+4, V_YELLOWMAP, "HOST");
|
||||||
}
|
}
|
||||||
|
|
||||||
V_DrawString(x + 10, y,
|
if (!players[tab[i].num].quittime || (leveltime / (TICRATE/2) & 1))
|
||||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
V_DrawString(x + 10, y,
|
||||||
| (greycheck ? 0 : V_TRANSLUCENT)
|
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||||
| V_ALLOWLOWERCASE, name);
|
| (greycheck ? 0 : V_TRANSLUCENT)
|
||||||
|
| V_ALLOWLOWERCASE, name);
|
||||||
|
|
||||||
if (G_GametypeUsesLives()) //show lives
|
if (G_GametypeUsesLives()) //show lives
|
||||||
V_DrawRightAlignedThinString(x-1, y, V_ALLOWLOWERCASE, va("%d", players[tab[i].num].lives));
|
V_DrawRightAlignedThinString(x-1, y, V_ALLOWLOWERCASE, va("%d", players[tab[i].num].lives));
|
||||||
|
|
|
@ -432,7 +432,7 @@ static int lib_pAproxDistance(lua_State *L)
|
||||||
fixed_t dx = luaL_checkfixed(L, 1);
|
fixed_t dx = luaL_checkfixed(L, 1);
|
||||||
fixed_t dy = luaL_checkfixed(L, 2);
|
fixed_t dy = luaL_checkfixed(L, 2);
|
||||||
//HUDSAFE
|
//HUDSAFE
|
||||||
lua_pushfixed(L, P_AproxDistance(dx, dy));
|
lua_pushfixed(L, R_PointToDist2(0, 0, dx, dy));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -583,7 +583,7 @@ static int sector_get(lua_State *L)
|
||||||
lua_pushinteger(L, sector->special);
|
lua_pushinteger(L, sector->special);
|
||||||
return 1;
|
return 1;
|
||||||
case sector_tag:
|
case sector_tag:
|
||||||
lua_pushinteger(L, Tag_FGet(§or->tags));
|
lua_pushinteger(L, (UINT16)Tag_FGet(§or->tags));
|
||||||
return 1;
|
return 1;
|
||||||
case sector_taglist:
|
case sector_taglist:
|
||||||
LUA_PushUserdata(L, §or->tags, META_SECTORTAGLIST);
|
LUA_PushUserdata(L, §or->tags, META_SECTORTAGLIST);
|
||||||
|
@ -828,6 +828,17 @@ static int line_get(lua_State *L)
|
||||||
lua_pushinteger(L, line->special);
|
lua_pushinteger(L, line->special);
|
||||||
return 1;
|
return 1;
|
||||||
case line_tag:
|
case line_tag:
|
||||||
|
// HELLO
|
||||||
|
// THIS IS LJ SONIC
|
||||||
|
// HOW IS YOUR DAY?
|
||||||
|
// BY THE WAY WHEN 2.3 OR 3.0 OR 4.0 OR SRB3 OR SRB4 OR WHATEVER IS OUT
|
||||||
|
// YOU SHOULD REMEMBER TO CHANGE THIS SO IT ALWAYS RETURNS A UNSIGNED VALUE
|
||||||
|
// HAVE A NICE DAY
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// you are ugly
|
||||||
lua_pushinteger(L, Tag_FGet(&line->tags));
|
lua_pushinteger(L, Tag_FGet(&line->tags));
|
||||||
return 1;
|
return 1;
|
||||||
case line_taglist:
|
case line_taglist:
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "tables.h"
|
#include "tables.h"
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
#include "doomstat.h" // for ALL7EMERALDS
|
#include "doomstat.h" // for ALL7EMERALDS
|
||||||
|
#include "r_main.h" // for R_PointToDist2
|
||||||
|
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
#include "lua_libs.h"
|
#include "lua_libs.h"
|
||||||
|
@ -129,7 +130,7 @@ static int lib_fixedsqrt(lua_State *L)
|
||||||
|
|
||||||
static int lib_fixedhypot(lua_State *L)
|
static int lib_fixedhypot(lua_State *L)
|
||||||
{
|
{
|
||||||
lua_pushfixed(L, FixedHypot(luaL_checkfixed(L, 1), luaL_checkfixed(L, 2)));
|
lua_pushfixed(L, R_PointToDist2(0, 0, luaL_checkfixed(L, 1), luaL_checkfixed(L, 2)));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -417,7 +417,7 @@ static int lib_getPolyObject(lua_State *L)
|
||||||
{
|
{
|
||||||
i = luaL_checkinteger(L, 2);
|
i = luaL_checkinteger(L, 2);
|
||||||
if (i < 0 || i >= numPolyObjects)
|
if (i < 0 || i >= numPolyObjects)
|
||||||
return luaL_error(L, "PolyObjects[] index %d out of range (0 - %d)", i, numPolyObjects-1);
|
return luaL_error(L, "polyobjects[] index %d out of range (0 - %d)", i, numPolyObjects-1);
|
||||||
LUA_PushUserdata(L, &PolyObjects[i], META_POLYOBJ);
|
LUA_PushUserdata(L, &PolyObjects[i], META_POLYOBJ);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -481,6 +481,6 @@ int LUA_PolyObjLib(lua_State *L)
|
||||||
lua_pushcfunction(L, lib_numPolyObjects);
|
lua_pushcfunction(L, lib_numPolyObjects);
|
||||||
lua_setfield(L, -2, "__len");
|
lua_setfield(L, -2, "__len");
|
||||||
lua_setmetatable(L, -2);
|
lua_setmetatable(L, -2);
|
||||||
lua_setglobal(L, "PolyObjects");
|
lua_setglobal(L, "polyobjects");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -333,7 +333,7 @@ int LUA_PushGlobals(lua_State *L, const char *word)
|
||||||
return 1;
|
return 1;
|
||||||
// local player variables, by popular request
|
// local player variables, by popular request
|
||||||
} else if (fastcmp(word,"consoleplayer")) { // player controlling console (aka local player 1)
|
} else if (fastcmp(word,"consoleplayer")) { // player controlling console (aka local player 1)
|
||||||
if (consoleplayer < 0 || !playeringame[consoleplayer])
|
if (!addedtogame || consoleplayer < 0 || !playeringame[consoleplayer])
|
||||||
return 0;
|
return 0;
|
||||||
LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER);
|
LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
69
src/m_menu.c
69
src/m_menu.c
|
@ -1612,53 +1612,54 @@ static menuitem_t OP_ServerOptionsMenu[] =
|
||||||
{IT_STRING | IT_CVAR, NULL, "Max Players", &cv_maxplayers, 21},
|
{IT_STRING | IT_CVAR, NULL, "Max Players", &cv_maxplayers, 21},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Allow Add-on Downloading", &cv_downloading, 26},
|
{IT_STRING | IT_CVAR, NULL, "Allow Add-on Downloading", &cv_downloading, 26},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Allow players to join", &cv_allownewplayer, 31},
|
{IT_STRING | IT_CVAR, NULL, "Allow players to join", &cv_allownewplayer, 31},
|
||||||
|
{IT_STRING | IT_CVAR, NULL, "Minutes for reconnecting", &cv_rejointimeout, 36},
|
||||||
#endif
|
#endif
|
||||||
{IT_STRING | IT_CVAR, NULL, "Map progression", &cv_advancemap, 36},
|
{IT_STRING | IT_CVAR, NULL, "Map progression", &cv_advancemap, 41},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Intermission Timer", &cv_inttime, 41},
|
{IT_STRING | IT_CVAR, NULL, "Intermission Timer", &cv_inttime, 46},
|
||||||
|
|
||||||
{IT_HEADER, NULL, "Characters", NULL, 50},
|
{IT_HEADER, NULL, "Characters", NULL, 55},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Force a character", &cv_forceskin, 56},
|
{IT_STRING | IT_CVAR, NULL, "Force a character", &cv_forceskin, 61},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Restrict character changes", &cv_restrictskinchange, 61},
|
{IT_STRING | IT_CVAR, NULL, "Restrict character changes", &cv_restrictskinchange, 66},
|
||||||
|
|
||||||
{IT_HEADER, NULL, "Items", NULL, 70},
|
{IT_HEADER, NULL, "Items", NULL, 75},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Item respawn delay", &cv_itemrespawntime, 76},
|
{IT_STRING | IT_CVAR, NULL, "Item respawn delay", &cv_itemrespawntime, 81},
|
||||||
{IT_STRING | IT_SUBMENU, NULL, "Mystery Item Monitor Toggles...", &OP_MonitorToggleDef, 81},
|
{IT_STRING | IT_SUBMENU, NULL, "Mystery Item Monitor Toggles...", &OP_MonitorToggleDef, 86},
|
||||||
|
|
||||||
{IT_HEADER, NULL, "Cooperative", NULL, 90},
|
{IT_HEADER, NULL, "Cooperative", NULL, 95},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Players required for exit", &cv_playersforexit, 96},
|
{IT_STRING | IT_CVAR, NULL, "Players required for exit", &cv_playersforexit, 101},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Starposts", &cv_coopstarposts, 101},
|
{IT_STRING | IT_CVAR, NULL, "Starposts", &cv_coopstarposts, 106},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Life sharing", &cv_cooplives, 106},
|
{IT_STRING | IT_CVAR, NULL, "Life sharing", &cv_cooplives, 111},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Post-goal free roaming", &cv_exitmove, 111},
|
{IT_STRING | IT_CVAR, NULL, "Post-goal free roaming", &cv_exitmove, 116},
|
||||||
|
|
||||||
{IT_HEADER, NULL, "Race, Competition", NULL, 120},
|
{IT_HEADER, NULL, "Race, Competition", NULL, 125},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Level completion countdown", &cv_countdowntime, 126},
|
{IT_STRING | IT_CVAR, NULL, "Level completion countdown", &cv_countdowntime, 131},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Item Monitors", &cv_competitionboxes, 131},
|
{IT_STRING | IT_CVAR, NULL, "Item Monitors", &cv_competitionboxes, 136},
|
||||||
|
|
||||||
{IT_HEADER, NULL, "Ringslinger (Match, CTF, Tag, H&S)", NULL, 140},
|
{IT_HEADER, NULL, "Ringslinger (Match, CTF, Tag, H&S)", NULL, 145},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Time Limit", &cv_timelimit, 146},
|
{IT_STRING | IT_CVAR, NULL, "Time Limit", &cv_timelimit, 151},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Score Limit", &cv_pointlimit, 151},
|
{IT_STRING | IT_CVAR, NULL, "Score Limit", &cv_pointlimit, 156},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Overtime on Tie", &cv_overtime, 156},
|
{IT_STRING | IT_CVAR, NULL, "Overtime on Tie", &cv_overtime, 161},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Player respawn delay", &cv_respawntime, 161},
|
{IT_STRING | IT_CVAR, NULL, "Player respawn delay", &cv_respawntime, 166},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Item Monitors", &cv_matchboxes, 171},
|
{IT_STRING | IT_CVAR, NULL, "Item Monitors", &cv_matchboxes, 176},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Weapon Rings", &cv_specialrings, 176},
|
{IT_STRING | IT_CVAR, NULL, "Weapon Rings", &cv_specialrings, 181},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Power Stones", &cv_powerstones, 181},
|
{IT_STRING | IT_CVAR, NULL, "Power Stones", &cv_powerstones, 186},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Flag respawn delay", &cv_flagtime, 191},
|
{IT_STRING | IT_CVAR, NULL, "Flag respawn delay", &cv_flagtime, 196},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Hiding time", &cv_hidetime, 196},
|
{IT_STRING | IT_CVAR, NULL, "Hiding time", &cv_hidetime, 201},
|
||||||
|
|
||||||
{IT_HEADER, NULL, "Teams", NULL, 205},
|
{IT_HEADER, NULL, "Teams", NULL, 210},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Autobalance sizes", &cv_autobalance, 211},
|
{IT_STRING | IT_CVAR, NULL, "Autobalance sizes", &cv_autobalance, 216},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Scramble on Map Change", &cv_scrambleonchange, 216},
|
{IT_STRING | IT_CVAR, NULL, "Scramble on Map Change", &cv_scrambleonchange, 221},
|
||||||
|
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
{IT_HEADER, NULL, "Advanced", NULL, 225},
|
{IT_HEADER, NULL, "Advanced", NULL, 230},
|
||||||
{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "Master server", &cv_masterserver, 231},
|
{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "Master server", &cv_masterserver, 236},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Join delay", &cv_joindelay, 246},
|
{IT_STRING | IT_CVAR, NULL, "Join delay", &cv_joindelay, 251},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Attempts to resynchronise", &cv_resynchattempts, 251},
|
{IT_STRING | IT_CVAR, NULL, "Attempts to resynchronise", &cv_resynchattempts, 256},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Show IP Address of Joiners", &cv_showjoinaddress, 256},
|
{IT_STRING | IT_CVAR, NULL, "Show IP Address of Joiners", &cv_showjoinaddress, 261},
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,9 @@ consvar_t cv_zlib_window_bitsa = CVAR_INIT ("apng_window_size", "32k", CV_SAVE,
|
||||||
consvar_t cv_apng_delay = CVAR_INIT ("apng_speed", "1x", CV_SAVE, apng_delay_t, NULL);
|
consvar_t cv_apng_delay = CVAR_INIT ("apng_speed", "1x", CV_SAVE, apng_delay_t, NULL);
|
||||||
consvar_t cv_apng_downscale = CVAR_INIT ("apng_downscale", "On", CV_SAVE, CV_OnOff, NULL);
|
consvar_t cv_apng_downscale = CVAR_INIT ("apng_downscale", "On", CV_SAVE, CV_OnOff, NULL);
|
||||||
|
|
||||||
|
#ifdef USE_APNG
|
||||||
static boolean apng_downscale = false; // So nobody can do something dumb like changing cvars mid output
|
static boolean apng_downscale = false; // So nobody can do something dumb like changing cvars mid output
|
||||||
|
#endif
|
||||||
|
|
||||||
boolean takescreenshot = false; // Take a screenshot this tic
|
boolean takescreenshot = false; // Take a screenshot this tic
|
||||||
|
|
||||||
|
|
|
@ -1834,7 +1834,7 @@ void A_SnailerThink(mobj_t *actor)
|
||||||
fixed_t dist;
|
fixed_t dist;
|
||||||
fixed_t dx, dy;
|
fixed_t dx, dy;
|
||||||
|
|
||||||
dist = R_PointToDist2(0, 0, actor->x - actor->target->x, actor->y - actor->target->y);
|
dist = P_AproxDistance(actor->x - actor->target->x, actor->y - actor->target->y);
|
||||||
|
|
||||||
if (an > ANGLE_45 && an <= ANGLE_90) // fire at 45 degrees to the left
|
if (an > ANGLE_45 && an <= ANGLE_90) // fire at 45 degrees to the left
|
||||||
{
|
{
|
||||||
|
@ -4912,7 +4912,7 @@ void A_ThrownRing(mobj_t *actor)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actor->tracer && (actor->tracer->health)
|
if (actor->tracer && (actor->tracer->health)
|
||||||
&& (actor->tracer->player->powers[pw_shield] & SH_PROTECTELECTRIC))// Already found someone to follow.
|
&& (actor->tracer->player && actor->tracer->player->powers[pw_shield] & SH_PROTECTELECTRIC))// Already found someone to follow.
|
||||||
{
|
{
|
||||||
const INT32 temp = actor->threshold;
|
const INT32 temp = actor->threshold;
|
||||||
actor->threshold = 32000;
|
actor->threshold = 32000;
|
||||||
|
@ -5920,13 +5920,18 @@ void A_DetonChase(mobj_t *actor)
|
||||||
|
|
||||||
if (actor->reactiontime == -42)
|
if (actor->reactiontime == -42)
|
||||||
{
|
{
|
||||||
fixed_t xyspeed;
|
fixed_t xyspeed, speed;
|
||||||
|
|
||||||
|
if (actor->target->player)
|
||||||
|
speed = actor->target->player->normalspeed;
|
||||||
|
else
|
||||||
|
speed = actor->target->info->speed;
|
||||||
|
|
||||||
actor->reactiontime = -42;
|
actor->reactiontime = -42;
|
||||||
|
|
||||||
exact = actor->movedir>>ANGLETOFINESHIFT;
|
exact = actor->movedir>>ANGLETOFINESHIFT;
|
||||||
xyspeed = FixedMul(FixedMul(actor->tracer->player->normalspeed,3*FRACUNIT/4), FINECOSINE(exact));
|
xyspeed = FixedMul(FixedMul(speed,3*FRACUNIT/4), FINECOSINE(exact));
|
||||||
actor->momz = FixedMul(FixedMul(actor->tracer->player->normalspeed,3*FRACUNIT/4), FINESINE(exact));
|
actor->momz = FixedMul(FixedMul(speed,3*FRACUNIT/4), FINESINE(exact));
|
||||||
|
|
||||||
exact = actor->angle>>ANGLETOFINESHIFT;
|
exact = actor->angle>>ANGLETOFINESHIFT;
|
||||||
actor->momx = FixedMul(xyspeed, FINECOSINE(exact));
|
actor->momx = FixedMul(xyspeed, FINECOSINE(exact));
|
||||||
|
@ -7521,7 +7526,7 @@ void A_Boss2PogoTarget(mobj_t *actor)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Target hit, retreat!
|
// Target hit, retreat!
|
||||||
if (actor->target->player->powers[pw_flashing] > TICRATE || actor->flags2 & MF2_FRET)
|
if ((actor->target->player && actor->target->player->powers[pw_flashing] > TICRATE) || actor->flags2 & MF2_FRET)
|
||||||
{
|
{
|
||||||
UINT8 prandom = P_RandomByte();
|
UINT8 prandom = P_RandomByte();
|
||||||
actor->z++; // unstick from the floor
|
actor->z++; // unstick from the floor
|
||||||
|
@ -7532,7 +7537,7 @@ void A_Boss2PogoTarget(mobj_t *actor)
|
||||||
// Try to land on top of the player.
|
// Try to land on top of the player.
|
||||||
else if (P_AproxDistance(actor->x-actor->target->x, actor->y-actor->target->y) < FixedMul(512*FRACUNIT, actor->scale))
|
else if (P_AproxDistance(actor->x-actor->target->x, actor->y-actor->target->y) < FixedMul(512*FRACUNIT, actor->scale))
|
||||||
{
|
{
|
||||||
fixed_t airtime, gravityadd, zoffs;
|
fixed_t airtime, gravityadd, zoffs, height;
|
||||||
|
|
||||||
// check gravity in the sector (for later math)
|
// check gravity in the sector (for later math)
|
||||||
P_CheckGravity(actor, true);
|
P_CheckGravity(actor, true);
|
||||||
|
@ -7554,7 +7559,13 @@ void A_Boss2PogoTarget(mobj_t *actor)
|
||||||
// Remember, kids!
|
// Remember, kids!
|
||||||
// Reduced down Calculus lets you avoid bad 'logic math' loops!
|
// Reduced down Calculus lets you avoid bad 'logic math' loops!
|
||||||
//airtime = FixedDiv(-actor->momz<<1, gravityadd)<<1; // going from 0 to 0 is much simpler
|
//airtime = FixedDiv(-actor->momz<<1, gravityadd)<<1; // going from 0 to 0 is much simpler
|
||||||
zoffs = (P_GetPlayerHeight(actor->target->player)>>1) + (actor->target->floorz - actor->floorz); // offset by the difference in floor height plus half the player height,
|
|
||||||
|
if (actor->target->player)
|
||||||
|
height = P_GetPlayerHeight(actor->target->player) >> 1;
|
||||||
|
else
|
||||||
|
height = actor->target->height >> 1;
|
||||||
|
|
||||||
|
zoffs = height + (actor->target->floorz - actor->floorz); // offset by the difference in floor height plus half the player height,
|
||||||
airtime = FixedDiv((-actor->momz - FixedSqrt(FixedMul(actor->momz,actor->momz)+zoffs)), gravityadd)<<1; // to try and land on their head rather than on their feet
|
airtime = FixedDiv((-actor->momz - FixedSqrt(FixedMul(actor->momz,actor->momz)+zoffs)), gravityadd)<<1; // to try and land on their head rather than on their feet
|
||||||
|
|
||||||
actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y);
|
actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y);
|
||||||
|
@ -9868,22 +9879,23 @@ void A_Custom3DRotate(mobj_t *actor)
|
||||||
if (LUA_CallAction(A_CUSTOM3DROTATE, actor))
|
if (LUA_CallAction(A_CUSTOM3DROTATE, actor))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!actor->target) // Ensure we actually have a target first.
|
||||||
|
{
|
||||||
|
CONS_Printf("Error: A_Custom3DRotate: Object has no target.\n");
|
||||||
|
P_RemoveMobj(actor);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (actor->target->health == 0)
|
if (actor->target->health == 0)
|
||||||
{
|
{
|
||||||
P_RemoveMobj(actor);
|
P_RemoveMobj(actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!actor->target) // This should NEVER happen.
|
|
||||||
{
|
|
||||||
if (cv_debug)
|
|
||||||
CONS_Printf("Error: Object has no target\n");
|
|
||||||
P_RemoveMobj(actor);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (hspeed==0 && vspeed==0)
|
if (hspeed==0 && vspeed==0)
|
||||||
{
|
{
|
||||||
CONS_Printf("Error: A_Custom3DRotate: Object has no speed.\n");
|
if (cv_debug)
|
||||||
|
CONS_Printf("Error: A_Custom3DRotate: Object has no speed.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -279,7 +279,6 @@ mobjtype_t P_GetMobjtype(UINT16 mthingtype);
|
||||||
void P_RespawnSpecials(void);
|
void P_RespawnSpecials(void);
|
||||||
|
|
||||||
mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);
|
mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);
|
||||||
void P_SetMobjSpawnDefaults(mobj_t *mobj);
|
|
||||||
|
|
||||||
void P_RecalcPrecipInSector(sector_t *sector);
|
void P_RecalcPrecipInSector(sector_t *sector);
|
||||||
void P_PrecipitationEffects(void);
|
void P_PrecipitationEffects(void);
|
||||||
|
|
|
@ -2257,6 +2257,8 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y)
|
||||||
{
|
{
|
||||||
if (!P_BlockThingsIterator(bx, by, PIT_CheckThing))
|
if (!P_BlockThingsIterator(bx, by, PIT_CheckThing))
|
||||||
blockval = false;
|
blockval = false;
|
||||||
|
else
|
||||||
|
tmhitthing = tmfloorthing;
|
||||||
if (P_MobjWasRemoved(tmthing))
|
if (P_MobjWasRemoved(tmthing))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
87
src/p_mobj.c
87
src/p_mobj.c
|
@ -10443,7 +10443,44 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
mobj->x = x;
|
mobj->x = x;
|
||||||
mobj->y = y;
|
mobj->y = y;
|
||||||
|
|
||||||
P_SetMobjSpawnDefaults(mobj);
|
mobj->radius = info->radius;
|
||||||
|
mobj->height = info->height;
|
||||||
|
mobj->flags = info->flags;
|
||||||
|
|
||||||
|
mobj->health = (info->spawnhealth ? info->spawnhealth : 1);
|
||||||
|
|
||||||
|
mobj->reactiontime = info->reactiontime;
|
||||||
|
|
||||||
|
mobj->lastlook = -1; // stuff moved in P_enemy.P_LookForPlayer
|
||||||
|
|
||||||
|
// do not set the state with P_SetMobjState,
|
||||||
|
// because action routines can not be called yet
|
||||||
|
st = &states[info->spawnstate];
|
||||||
|
|
||||||
|
mobj->state = st;
|
||||||
|
mobj->tics = st->tics;
|
||||||
|
mobj->sprite = st->sprite;
|
||||||
|
mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits..
|
||||||
|
P_SetupStateAnimation(mobj, st);
|
||||||
|
|
||||||
|
mobj->friction = ORIG_FRICTION;
|
||||||
|
|
||||||
|
mobj->movefactor = FRACUNIT;
|
||||||
|
|
||||||
|
// All mobjs are created at 100% scale.
|
||||||
|
mobj->scale = FRACUNIT;
|
||||||
|
mobj->destscale = mobj->scale;
|
||||||
|
mobj->scalespeed = FRACUNIT/12;
|
||||||
|
|
||||||
|
// TODO: Make this a special map header
|
||||||
|
if ((maptol & TOL_ERZ3) && !(mobj->type == MT_BLACKEGGMAN))
|
||||||
|
mobj->destscale = FRACUNIT/2;
|
||||||
|
|
||||||
|
// Sprite rendering
|
||||||
|
mobj->blendmode = AST_TRANSLUCENT;
|
||||||
|
mobj->spritexscale = mobj->spriteyscale = mobj->scale;
|
||||||
|
mobj->spritexoffset = mobj->spriteyoffset = 0;
|
||||||
|
mobj->floorspriteslope = NULL;
|
||||||
|
|
||||||
// set subsector and/or block links
|
// set subsector and/or block links
|
||||||
P_SetThingPosition(mobj);
|
P_SetThingPosition(mobj);
|
||||||
|
@ -10750,8 +10787,6 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
mobj->frame &= ~FF_FRAMEMASK;
|
mobj->frame &= ~FF_FRAMEMASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
st = &states[info->spawnstate];
|
|
||||||
|
|
||||||
// Call action functions when the state is set
|
// Call action functions when the state is set
|
||||||
if (st->action.acp1 && (mobj->flags & MF_RUNSPAWNFUNC))
|
if (st->action.acp1 && (mobj->flags & MF_RUNSPAWNFUNC))
|
||||||
{
|
{
|
||||||
|
@ -10782,52 +10817,6 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
return mobj;
|
return mobj;
|
||||||
}
|
}
|
||||||
|
|
||||||
void P_SetMobjSpawnDefaults(mobj_t *mobj)
|
|
||||||
{
|
|
||||||
const mobjinfo_t *info = mobj->info;
|
|
||||||
state_t *st = &states[info->spawnstate];
|
|
||||||
|
|
||||||
mobj->radius = info->radius;
|
|
||||||
mobj->height = info->height;
|
|
||||||
mobj->flags = info->flags;
|
|
||||||
|
|
||||||
mobj->health = (info->spawnhealth ? info->spawnhealth : 1);
|
|
||||||
|
|
||||||
mobj->reactiontime = info->reactiontime;
|
|
||||||
|
|
||||||
mobj->lastlook = -1; // stuff moved in P_enemy.P_LookForPlayer
|
|
||||||
|
|
||||||
// do not set the state with P_SetMobjState,
|
|
||||||
// because action routines can not be called yet
|
|
||||||
mobj->state = st;
|
|
||||||
mobj->tics = st->tics;
|
|
||||||
mobj->sprite = st->sprite;
|
|
||||||
mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits..
|
|
||||||
P_SetupStateAnimation(mobj, st);
|
|
||||||
|
|
||||||
mobj->friction = ORIG_FRICTION;
|
|
||||||
|
|
||||||
mobj->movefactor = FRACUNIT;
|
|
||||||
|
|
||||||
// All mobjs are created at 100% scale.
|
|
||||||
mobj->scale = FRACUNIT;
|
|
||||||
mobj->destscale = mobj->scale;
|
|
||||||
mobj->scalespeed = FRACUNIT/12;
|
|
||||||
|
|
||||||
// TODO: Make this a special map header
|
|
||||||
if ((maptol & TOL_ERZ3) && !(mobj->type == MT_BLACKEGGMAN))
|
|
||||||
mobj->destscale = FRACUNIT/2;
|
|
||||||
|
|
||||||
// Make sure scale matches destscale immediately when spawned
|
|
||||||
P_SetScale(mobj, mobj->destscale);
|
|
||||||
|
|
||||||
// Sprite rendering
|
|
||||||
mobj->blendmode = AST_TRANSLUCENT;
|
|
||||||
mobj->spritexscale = mobj->spriteyscale = FRACUNIT;
|
|
||||||
mobj->spritexoffset = mobj->spriteyoffset = 0;
|
|
||||||
mobj->floorspriteslope = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
{
|
{
|
||||||
state_t *st;
|
state_t *st;
|
||||||
|
|
|
@ -2692,10 +2692,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
}
|
}
|
||||||
mobj->type = i;
|
mobj->type = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
mobj->info = &mobjinfo[mobj->type];
|
mobj->info = &mobjinfo[mobj->type];
|
||||||
P_SetMobjSpawnDefaults(mobj);
|
|
||||||
|
|
||||||
if (diff & MD_POS)
|
if (diff & MD_POS)
|
||||||
{
|
{
|
||||||
mobj->x = READFIXED(save_p);
|
mobj->x = READFIXED(save_p);
|
||||||
|
@ -2721,21 +2718,35 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
|
|
||||||
if (diff & MD_RADIUS)
|
if (diff & MD_RADIUS)
|
||||||
mobj->radius = READFIXED(save_p);
|
mobj->radius = READFIXED(save_p);
|
||||||
|
else
|
||||||
|
mobj->radius = mobj->info->radius;
|
||||||
if (diff & MD_HEIGHT)
|
if (diff & MD_HEIGHT)
|
||||||
mobj->height = READFIXED(save_p);
|
mobj->height = READFIXED(save_p);
|
||||||
|
else
|
||||||
|
mobj->height = mobj->info->height;
|
||||||
if (diff & MD_FLAGS)
|
if (diff & MD_FLAGS)
|
||||||
mobj->flags = READUINT32(save_p);
|
mobj->flags = READUINT32(save_p);
|
||||||
|
else
|
||||||
|
mobj->flags = mobj->info->flags;
|
||||||
if (diff & MD_FLAGS2)
|
if (diff & MD_FLAGS2)
|
||||||
mobj->flags2 = READUINT32(save_p);
|
mobj->flags2 = READUINT32(save_p);
|
||||||
if (diff & MD_HEALTH)
|
if (diff & MD_HEALTH)
|
||||||
mobj->health = READINT32(save_p);
|
mobj->health = READINT32(save_p);
|
||||||
|
else
|
||||||
|
mobj->health = mobj->info->spawnhealth;
|
||||||
if (diff & MD_RTIME)
|
if (diff & MD_RTIME)
|
||||||
mobj->reactiontime = READINT32(save_p);
|
mobj->reactiontime = READINT32(save_p);
|
||||||
|
else
|
||||||
|
mobj->reactiontime = mobj->info->reactiontime;
|
||||||
|
|
||||||
if (diff & MD_STATE)
|
if (diff & MD_STATE)
|
||||||
mobj->state = &states[READUINT16(save_p)];
|
mobj->state = &states[READUINT16(save_p)];
|
||||||
|
else
|
||||||
|
mobj->state = &states[mobj->info->spawnstate];
|
||||||
if (diff & MD_TICS)
|
if (diff & MD_TICS)
|
||||||
mobj->tics = READINT32(save_p);
|
mobj->tics = READINT32(save_p);
|
||||||
|
else
|
||||||
|
mobj->tics = mobj->state->tics;
|
||||||
if (diff & MD_SPRITE) {
|
if (diff & MD_SPRITE) {
|
||||||
mobj->sprite = READUINT16(save_p);
|
mobj->sprite = READUINT16(save_p);
|
||||||
if (mobj->sprite == SPR_PLAY)
|
if (mobj->sprite == SPR_PLAY)
|
||||||
|
@ -2751,6 +2762,11 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
mobj->frame = READUINT32(save_p);
|
mobj->frame = READUINT32(save_p);
|
||||||
mobj->anim_duration = READUINT16(save_p);
|
mobj->anim_duration = READUINT16(save_p);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mobj->frame = mobj->state->frame;
|
||||||
|
mobj->anim_duration = (UINT16)mobj->state->var2;
|
||||||
|
}
|
||||||
if (diff & MD_EFLAGS)
|
if (diff & MD_EFLAGS)
|
||||||
mobj->eflags = READUINT16(save_p);
|
mobj->eflags = READUINT16(save_p);
|
||||||
if (diff & MD_PLAYER)
|
if (diff & MD_PLAYER)
|
||||||
|
@ -2767,14 +2783,20 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
mobj->threshold = READINT32(save_p);
|
mobj->threshold = READINT32(save_p);
|
||||||
if (diff & MD_LASTLOOK)
|
if (diff & MD_LASTLOOK)
|
||||||
mobj->lastlook = READINT32(save_p);
|
mobj->lastlook = READINT32(save_p);
|
||||||
|
else
|
||||||
|
mobj->lastlook = -1;
|
||||||
if (diff & MD_TARGET)
|
if (diff & MD_TARGET)
|
||||||
mobj->target = (mobj_t *)(size_t)READUINT32(save_p);
|
mobj->target = (mobj_t *)(size_t)READUINT32(save_p);
|
||||||
if (diff & MD_TRACER)
|
if (diff & MD_TRACER)
|
||||||
mobj->tracer = (mobj_t *)(size_t)READUINT32(save_p);
|
mobj->tracer = (mobj_t *)(size_t)READUINT32(save_p);
|
||||||
if (diff & MD_FRICTION)
|
if (diff & MD_FRICTION)
|
||||||
mobj->friction = READFIXED(save_p);
|
mobj->friction = READFIXED(save_p);
|
||||||
|
else
|
||||||
|
mobj->friction = ORIG_FRICTION;
|
||||||
if (diff & MD_MOVEFACTOR)
|
if (diff & MD_MOVEFACTOR)
|
||||||
mobj->movefactor = READFIXED(save_p);
|
mobj->movefactor = READFIXED(save_p);
|
||||||
|
else
|
||||||
|
mobj->movefactor = FRACUNIT;
|
||||||
if (diff & MD_FUSE)
|
if (diff & MD_FUSE)
|
||||||
mobj->fuse = READINT32(save_p);
|
mobj->fuse = READINT32(save_p);
|
||||||
if (diff & MD_WATERTOP)
|
if (diff & MD_WATERTOP)
|
||||||
|
@ -2783,10 +2805,16 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
mobj->waterbottom = READFIXED(save_p);
|
mobj->waterbottom = READFIXED(save_p);
|
||||||
if (diff & MD_SCALE)
|
if (diff & MD_SCALE)
|
||||||
mobj->scale = READFIXED(save_p);
|
mobj->scale = READFIXED(save_p);
|
||||||
|
else
|
||||||
|
mobj->scale = FRACUNIT;
|
||||||
if (diff & MD_DSCALE)
|
if (diff & MD_DSCALE)
|
||||||
mobj->destscale = READFIXED(save_p);
|
mobj->destscale = READFIXED(save_p);
|
||||||
|
else
|
||||||
|
mobj->destscale = mobj->scale;
|
||||||
if (diff2 & MD2_SCALESPEED)
|
if (diff2 & MD2_SCALESPEED)
|
||||||
mobj->scalespeed = READFIXED(save_p);
|
mobj->scalespeed = READFIXED(save_p);
|
||||||
|
else
|
||||||
|
mobj->scalespeed = FRACUNIT/12;
|
||||||
if (diff2 & MD2_CUSVAL)
|
if (diff2 & MD2_CUSVAL)
|
||||||
mobj->cusval = READINT32(save_p);
|
mobj->cusval = READINT32(save_p);
|
||||||
if (diff2 & MD2_CVMEM)
|
if (diff2 & MD2_CVMEM)
|
||||||
|
@ -2817,10 +2845,16 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
mobj->renderflags = READUINT32(save_p);
|
mobj->renderflags = READUINT32(save_p);
|
||||||
if (diff2 & MD2_BLENDMODE)
|
if (diff2 & MD2_BLENDMODE)
|
||||||
mobj->blendmode = READINT32(save_p);
|
mobj->blendmode = READINT32(save_p);
|
||||||
|
else
|
||||||
|
mobj->blendmode = AST_TRANSLUCENT;
|
||||||
if (diff2 & MD2_SPRITEXSCALE)
|
if (diff2 & MD2_SPRITEXSCALE)
|
||||||
mobj->spritexscale = READFIXED(save_p);
|
mobj->spritexscale = READFIXED(save_p);
|
||||||
|
else
|
||||||
|
mobj->spritexscale = FRACUNIT;
|
||||||
if (diff2 & MD2_SPRITEYSCALE)
|
if (diff2 & MD2_SPRITEYSCALE)
|
||||||
mobj->spriteyscale = READFIXED(save_p);
|
mobj->spriteyscale = READFIXED(save_p);
|
||||||
|
else
|
||||||
|
mobj->spriteyscale = FRACUNIT;
|
||||||
if (diff2 & MD2_SPRITEXOFFSET)
|
if (diff2 & MD2_SPRITEXOFFSET)
|
||||||
mobj->spritexoffset = READFIXED(save_p);
|
mobj->spritexoffset = READFIXED(save_p);
|
||||||
if (diff2 & MD2_SPRITEYOFFSET)
|
if (diff2 & MD2_SPRITEYOFFSET)
|
||||||
|
|
|
@ -80,6 +80,7 @@ typedef struct
|
||||||
UINT8 *picture;
|
UINT8 *picture;
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
void *mipmap;
|
void *mipmap;
|
||||||
|
void *mippic;
|
||||||
#endif
|
#endif
|
||||||
} levelflat_t;
|
} levelflat_t;
|
||||||
|
|
||||||
|
|
20
src/p_user.c
20
src/p_user.c
|
@ -190,7 +190,7 @@ fixed_t P_ReturnThrustY(mobj_t *mo, angle_t angle, fixed_t move)
|
||||||
boolean P_AutoPause(void)
|
boolean P_AutoPause(void)
|
||||||
{
|
{
|
||||||
// Don't pause even on menu-up or focus-lost in netgames or record attack
|
// Don't pause even on menu-up or focus-lost in netgames or record attack
|
||||||
if (netgame || modeattacking || gamestate == GS_TITLESCREEN)
|
if (netgame || modeattacking || gamestate == GS_TITLESCREEN || (marathonmode && gamestate == GS_INTERMISSION))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return (menuactive || ( window_notinfocus && cv_pauseifunfocused.value ));
|
return (menuactive || ( window_notinfocus && cv_pauseifunfocused.value ));
|
||||||
|
@ -4499,7 +4499,7 @@ void P_DoJump(player_t *player, boolean soundandstate)
|
||||||
if (twodlevel || (player->mo->flags2 & MF2_TWOD))
|
if (twodlevel || (player->mo->flags2 & MF2_TWOD))
|
||||||
factor += player->jumpfactor / 10;
|
factor += player->jumpfactor / 10;
|
||||||
|
|
||||||
if (player->charflags & SF_MULTIABILITY && player->charability == CA_DOUBLEJUMP)
|
if (player->charflags & SF_MULTIABILITY && player->charability == CA_DOUBLEJUMP && (player->actionspd >> FRACBITS) != -1)
|
||||||
factor -= max(0, player->secondjump * player->jumpfactor / ((player->actionspd >> FRACBITS) + 1)); // Reduce the jump height each time
|
factor -= max(0, player->secondjump * player->jumpfactor / ((player->actionspd >> FRACBITS) + 1)); // Reduce the jump height each time
|
||||||
|
|
||||||
//if (maptol & TOL_NIGHTS)
|
//if (maptol & TOL_NIGHTS)
|
||||||
|
@ -4880,22 +4880,28 @@ void P_DoBubbleBounce(player_t *player)
|
||||||
//
|
//
|
||||||
void P_DoAbilityBounce(player_t *player, boolean changemomz)
|
void P_DoAbilityBounce(player_t *player, boolean changemomz)
|
||||||
{
|
{
|
||||||
fixed_t prevmomz;
|
|
||||||
if (player->mo->state-states == S_PLAY_BOUNCE_LANDING)
|
if (player->mo->state-states == S_PLAY_BOUNCE_LANDING)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (changemomz)
|
if (changemomz)
|
||||||
{
|
{
|
||||||
fixed_t minmomz;
|
fixed_t prevmomz = player->mo->momz, minmomz;
|
||||||
prevmomz = player->mo->momz;
|
|
||||||
if (P_MobjFlip(player->mo)*prevmomz < 0)
|
if (P_MobjFlip(player->mo)*prevmomz < 0)
|
||||||
prevmomz = 0;
|
prevmomz = 0;
|
||||||
else if (player->mo->eflags & MFE_UNDERWATER)
|
else if (player->mo->eflags & MFE_UNDERWATER)
|
||||||
prevmomz /= 2;
|
prevmomz /= 2;
|
||||||
|
|
||||||
P_DoJump(player, false);
|
P_DoJump(player, false);
|
||||||
player->pflags &= ~(PF_STARTJUMP|PF_JUMPED);
|
player->pflags &= ~(PF_STARTJUMP|PF_JUMPED);
|
||||||
minmomz = FixedMul(player->mo->momz, 3*FRACUNIT/2);
|
minmomz = FixedMul(player->mo->momz, 3*FRACUNIT/2);
|
||||||
player->mo->momz = max(minmomz, (minmomz + prevmomz)/2);
|
|
||||||
|
if (player->mo->eflags & MFE_VERTICALFLIP) // Use "min" or "max" depending on if the player is flipped
|
||||||
|
player->mo->momz = min(minmomz, (minmomz + prevmomz)/2);
|
||||||
|
else
|
||||||
|
player->mo->momz = max(minmomz, (minmomz + prevmomz)/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
S_StartSound(player->mo, sfx_boingf);
|
S_StartSound(player->mo, sfx_boingf);
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_BOUNCE_LANDING);
|
P_SetPlayerMobjState(player->mo, S_PLAY_BOUNCE_LANDING);
|
||||||
player->pflags |= PF_BOUNCING|PF_THOKKED;
|
player->pflags |= PF_BOUNCING|PF_THOKKED;
|
||||||
|
@ -5924,7 +5930,7 @@ static void P_3dMovement(player_t *player)
|
||||||
player->rmomy = player->mo->momy - player->cmomy;
|
player->rmomy = player->mo->momy - player->cmomy;
|
||||||
|
|
||||||
// Calculates player's speed based on distance-of-a-line formula
|
// Calculates player's speed based on distance-of-a-line formula
|
||||||
player->speed = R_PointToDist2(0, 0, player->rmomx, player->rmomy);
|
player->speed = P_AproxDistance(player->rmomx, player->rmomy);
|
||||||
|
|
||||||
// Monster Iestyn - 04-11-13
|
// Monster Iestyn - 04-11-13
|
||||||
// Quadrants are stupid, excessive and broken, let's do this a much simpler way!
|
// Quadrants are stupid, excessive and broken, let's do this a much simpler way!
|
||||||
|
|
60
src/r_draw.c
60
src/r_draw.c
|
@ -134,9 +134,43 @@ UINT32 nflatxshift, nflatyshift, nflatshiftup, nflatmask;
|
||||||
#define DEFAULT_STARTTRANSCOLOR 96
|
#define DEFAULT_STARTTRANSCOLOR 96
|
||||||
#define NUM_PALETTE_ENTRIES 256
|
#define NUM_PALETTE_ENTRIES 256
|
||||||
|
|
||||||
static UINT8** translationtablecache[MAXSKINS + 7] = {NULL};
|
static UINT8 **translationtablecache[MAXSKINS + 7] = {NULL};
|
||||||
UINT8 skincolor_modified[MAXSKINCOLORS];
|
UINT8 skincolor_modified[MAXSKINCOLORS];
|
||||||
|
|
||||||
|
static INT32 SkinToCacheIndex(INT32 skinnum)
|
||||||
|
{
|
||||||
|
switch (skinnum)
|
||||||
|
{
|
||||||
|
case TC_DEFAULT: return DEFAULT_TT_CACHE_INDEX;
|
||||||
|
case TC_BOSS: return BOSS_TT_CACHE_INDEX;
|
||||||
|
case TC_METALSONIC: return METALSONIC_TT_CACHE_INDEX;
|
||||||
|
case TC_ALLWHITE: return ALLWHITE_TT_CACHE_INDEX;
|
||||||
|
case TC_RAINBOW: return RAINBOW_TT_CACHE_INDEX;
|
||||||
|
case TC_BLINK: return BLINK_TT_CACHE_INDEX;
|
||||||
|
case TC_DASHMODE: return DASHMODE_TT_CACHE_INDEX;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return skinnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INT32 CacheIndexToSkin(INT32 ttc)
|
||||||
|
{
|
||||||
|
switch (ttc)
|
||||||
|
{
|
||||||
|
case DEFAULT_TT_CACHE_INDEX: return TC_DEFAULT;
|
||||||
|
case BOSS_TT_CACHE_INDEX: return TC_BOSS;
|
||||||
|
case METALSONIC_TT_CACHE_INDEX: return TC_METALSONIC;
|
||||||
|
case ALLWHITE_TT_CACHE_INDEX: return TC_ALLWHITE;
|
||||||
|
case RAINBOW_TT_CACHE_INDEX: return TC_RAINBOW;
|
||||||
|
case BLINK_TT_CACHE_INDEX: return TC_BLINK;
|
||||||
|
case DASHMODE_TT_CACHE_INDEX: return TC_DASHMODE;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ttc;
|
||||||
|
}
|
||||||
|
|
||||||
CV_PossibleValue_t Color_cons_t[MAXSKINCOLORS+1];
|
CV_PossibleValue_t Color_cons_t[MAXSKINCOLORS+1];
|
||||||
|
|
||||||
#define TRANSTAB_AMTMUL10 (256.0f / 10.0f)
|
#define TRANSTAB_AMTMUL10 (256.0f / 10.0f)
|
||||||
|
@ -308,7 +342,7 @@ static void R_RainbowColormap(UINT8 *dest_colormap, UINT16 skincolor)
|
||||||
/** \brief Generates a translation colormap.
|
/** \brief Generates a translation colormap.
|
||||||
|
|
||||||
\param dest_colormap colormap to populate
|
\param dest_colormap colormap to populate
|
||||||
\param skinnum number of skin, TC_DEFAULT or TC_BOSS
|
\param skinnum skin number, or a translation mode
|
||||||
\param color translation color
|
\param color translation color
|
||||||
|
|
||||||
\return void
|
\return void
|
||||||
|
@ -412,6 +446,9 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
|
||||||
if (color >= numskincolors)
|
if (color >= numskincolors)
|
||||||
I_Error("Invalid skin color #%hu.", (UINT16)color);
|
I_Error("Invalid skin color #%hu.", (UINT16)color);
|
||||||
|
|
||||||
|
if (skinnum < 0 && skinnum > TC_DEFAULT)
|
||||||
|
I_Error("Invalid translation colormap index %d.", skinnum);
|
||||||
|
|
||||||
starttranscolor = (skinnum != TC_DEFAULT) ? skins[skinnum].starttranscolor : DEFAULT_STARTTRANSCOLOR;
|
starttranscolor = (skinnum != TC_DEFAULT) ? skins[skinnum].starttranscolor : DEFAULT_STARTTRANSCOLOR;
|
||||||
|
|
||||||
if (starttranscolor >= NUM_PALETTE_ENTRIES)
|
if (starttranscolor >= NUM_PALETTE_ENTRIES)
|
||||||
|
@ -448,25 +485,11 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
|
||||||
UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags)
|
UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags)
|
||||||
{
|
{
|
||||||
UINT8* ret;
|
UINT8* ret;
|
||||||
INT32 skintableindex;
|
INT32 skintableindex = SkinToCacheIndex(skinnum); // Adjust if we want the default colormap
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
// Adjust if we want the default colormap
|
|
||||||
switch (skinnum)
|
|
||||||
{
|
|
||||||
case TC_DEFAULT: skintableindex = DEFAULT_TT_CACHE_INDEX; break;
|
|
||||||
case TC_BOSS: skintableindex = BOSS_TT_CACHE_INDEX; break;
|
|
||||||
case TC_METALSONIC: skintableindex = METALSONIC_TT_CACHE_INDEX; break;
|
|
||||||
case TC_ALLWHITE: skintableindex = ALLWHITE_TT_CACHE_INDEX; break;
|
|
||||||
case TC_RAINBOW: skintableindex = RAINBOW_TT_CACHE_INDEX; break;
|
|
||||||
case TC_BLINK: skintableindex = BLINK_TT_CACHE_INDEX; break;
|
|
||||||
case TC_DASHMODE: skintableindex = DASHMODE_TT_CACHE_INDEX; break;
|
|
||||||
default: skintableindex = skinnum; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & GTC_CACHE)
|
if (flags & GTC_CACHE)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Allocate table for skin if necessary
|
// Allocate table for skin if necessary
|
||||||
if (!translationtablecache[skintableindex])
|
if (!translationtablecache[skintableindex])
|
||||||
translationtablecache[skintableindex] = Z_Calloc(MAXSKINCOLORS * sizeof(UINT8**), PU_STATIC, NULL);
|
translationtablecache[skintableindex] = Z_Calloc(MAXSKINCOLORS * sizeof(UINT8**), PU_STATIC, NULL);
|
||||||
|
@ -479,7 +502,8 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags
|
||||||
{
|
{
|
||||||
for (i = 0; i < (INT32)(sizeof(translationtablecache) / sizeof(translationtablecache[0])); i++)
|
for (i = 0; i < (INT32)(sizeof(translationtablecache) / sizeof(translationtablecache[0])); i++)
|
||||||
if (translationtablecache[i] && translationtablecache[i][color])
|
if (translationtablecache[i] && translationtablecache[i][color])
|
||||||
R_GenerateTranslationColormap(translationtablecache[i][color], i>=MAXSKINS ? MAXSKINS-i-1 : i, color);
|
R_GenerateTranslationColormap(translationtablecache[i][color], CacheIndexToSkin(i), color);
|
||||||
|
|
||||||
skincolor_modified[color] = false;
|
skincolor_modified[color] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
47
src/r_segs.c
47
src/r_segs.c
|
@ -1649,23 +1649,26 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
// left
|
// left
|
||||||
temp = xtoviewangle[start]+viewangle;
|
temp = xtoviewangle[start]+viewangle;
|
||||||
|
|
||||||
|
#define FIXED_TO_DOUBLE(x) (((double)(x)) / ((double)FRACUNIT))
|
||||||
|
#define DOUBLE_TO_FIXED(x) (fixed_t)((x) * ((double)FRACUNIT))
|
||||||
|
|
||||||
{
|
{
|
||||||
// Both lines can be written in slope-intercept form, so figure out line intersection
|
// Both lines can be written in slope-intercept form, so figure out line intersection
|
||||||
float a1, b1, c1, a2, b2, c2, det; // 1 is the seg, 2 is the view angle vector...
|
double a1, b1, c1, a2, b2, c2, det; // 1 is the seg, 2 is the view angle vector...
|
||||||
///TODO: convert to FPU
|
///TODO: convert to fixed point
|
||||||
|
|
||||||
a1 = FIXED_TO_FLOAT(curline->v2->y-curline->v1->y);
|
a1 = FIXED_TO_DOUBLE(curline->v2->y-curline->v1->y);
|
||||||
b1 = FIXED_TO_FLOAT(curline->v1->x-curline->v2->x);
|
b1 = FIXED_TO_DOUBLE(curline->v1->x-curline->v2->x);
|
||||||
c1 = a1*FIXED_TO_FLOAT(curline->v1->x) + b1*FIXED_TO_FLOAT(curline->v1->y);
|
c1 = a1*FIXED_TO_DOUBLE(curline->v1->x) + b1*FIXED_TO_DOUBLE(curline->v1->y);
|
||||||
|
|
||||||
a2 = -FIXED_TO_FLOAT(FINESINE(temp>>ANGLETOFINESHIFT));
|
a2 = -FIXED_TO_DOUBLE(FINESINE(temp>>ANGLETOFINESHIFT));
|
||||||
b2 = FIXED_TO_FLOAT(FINECOSINE(temp>>ANGLETOFINESHIFT));
|
b2 = FIXED_TO_DOUBLE(FINECOSINE(temp>>ANGLETOFINESHIFT));
|
||||||
c2 = a2*FIXED_TO_FLOAT(viewx) + b2*FIXED_TO_FLOAT(viewy);
|
c2 = a2*FIXED_TO_DOUBLE(viewx) + b2*FIXED_TO_DOUBLE(viewy);
|
||||||
|
|
||||||
det = a1*b2 - a2*b1;
|
det = a1*b2 - a2*b1;
|
||||||
|
|
||||||
ds_p->leftpos.x = segleft.x = FLOAT_TO_FIXED((b2*c1 - b1*c2)/det);
|
ds_p->leftpos.x = segleft.x = DOUBLE_TO_FIXED((b2*c1 - b1*c2)/det);
|
||||||
ds_p->leftpos.y = segleft.y = FLOAT_TO_FIXED((a1*c2 - a2*c1)/det);
|
ds_p->leftpos.y = segleft.y = DOUBLE_TO_FIXED((a1*c2 - a2*c1)/det);
|
||||||
}
|
}
|
||||||
|
|
||||||
// right
|
// right
|
||||||
|
@ -1673,22 +1676,26 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
|
|
||||||
{
|
{
|
||||||
// Both lines can be written in slope-intercept form, so figure out line intersection
|
// Both lines can be written in slope-intercept form, so figure out line intersection
|
||||||
float a1, b1, c1, a2, b2, c2, det; // 1 is the seg, 2 is the view angle vector...
|
double a1, b1, c1, a2, b2, c2, det; // 1 is the seg, 2 is the view angle vector...
|
||||||
///TODO: convert to FPU
|
///TODO: convert to fixed point
|
||||||
|
|
||||||
a1 = FIXED_TO_FLOAT(curline->v2->y-curline->v1->y);
|
a1 = FIXED_TO_DOUBLE(curline->v2->y-curline->v1->y);
|
||||||
b1 = FIXED_TO_FLOAT(curline->v1->x-curline->v2->x);
|
b1 = FIXED_TO_DOUBLE(curline->v1->x-curline->v2->x);
|
||||||
c1 = a1*FIXED_TO_FLOAT(curline->v1->x) + b1*FIXED_TO_FLOAT(curline->v1->y);
|
c1 = a1*FIXED_TO_DOUBLE(curline->v1->x) + b1*FIXED_TO_DOUBLE(curline->v1->y);
|
||||||
|
|
||||||
a2 = -FIXED_TO_FLOAT(FINESINE(temp>>ANGLETOFINESHIFT));
|
a2 = -FIXED_TO_DOUBLE(FINESINE(temp>>ANGLETOFINESHIFT));
|
||||||
b2 = FIXED_TO_FLOAT(FINECOSINE(temp>>ANGLETOFINESHIFT));
|
b2 = FIXED_TO_DOUBLE(FINECOSINE(temp>>ANGLETOFINESHIFT));
|
||||||
c2 = a2*FIXED_TO_FLOAT(viewx) + b2*FIXED_TO_FLOAT(viewy);
|
c2 = a2*FIXED_TO_DOUBLE(viewx) + b2*FIXED_TO_DOUBLE(viewy);
|
||||||
|
|
||||||
det = a1*b2 - a2*b1;
|
det = a1*b2 - a2*b1;
|
||||||
|
|
||||||
ds_p->rightpos.x = segright.x = FLOAT_TO_FIXED((b2*c1 - b1*c2)/det);
|
ds_p->rightpos.x = segright.x = DOUBLE_TO_FIXED((b2*c1 - b1*c2)/det);
|
||||||
ds_p->rightpos.y = segright.y = FLOAT_TO_FIXED((a1*c2 - a2*c1)/det);
|
ds_p->rightpos.y = segright.y = DOUBLE_TO_FIXED((a1*c2 - a2*c1)/det);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef FIXED_TO_DOUBLE
|
||||||
|
#undef DOUBLE_TO_FIXED
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -796,7 +796,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
INT32 pwidth;
|
INT32 pwidth;
|
||||||
fixed_t frac;
|
fixed_t frac;
|
||||||
patch_t *patch = vis->patch;
|
patch_t *patch = vis->patch;
|
||||||
fixed_t this_scale = vis->mobj->scale;
|
fixed_t this_scale = vis->thingscale;
|
||||||
INT32 x1, x2;
|
INT32 x1, x2;
|
||||||
INT64 overflow_test;
|
INT64 overflow_test;
|
||||||
|
|
||||||
|
@ -1332,6 +1332,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale,
|
||||||
|
|
||||||
shadow->xscale = FixedMul(xscale, shadowxscale); //SoM: 4/17/2000
|
shadow->xscale = FixedMul(xscale, shadowxscale); //SoM: 4/17/2000
|
||||||
shadow->scale = FixedMul(yscale, shadowyscale);
|
shadow->scale = FixedMul(yscale, shadowyscale);
|
||||||
|
shadow->thingscale = thing->scale;
|
||||||
shadow->sector = vis->sector;
|
shadow->sector = vis->sector;
|
||||||
shadow->szt = (INT16)((centeryfrac - FixedMul(shadow->gzt - viewz, yscale))>>FRACBITS);
|
shadow->szt = (INT16)((centeryfrac - FixedMul(shadow->gzt - viewz, yscale))>>FRACBITS);
|
||||||
shadow->sz = (INT16)((centeryfrac - FixedMul(shadow->gz - viewz, yscale))>>FRACBITS);
|
shadow->sz = (INT16)((centeryfrac - FixedMul(shadow->gz - viewz, yscale))>>FRACBITS);
|
||||||
|
@ -1423,7 +1424,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
|
|
||||||
fixed_t sheartan = 0;
|
fixed_t sheartan = 0;
|
||||||
fixed_t shadowscale = FRACUNIT;
|
fixed_t shadowscale = FRACUNIT;
|
||||||
fixed_t basetx; // drop shadows
|
fixed_t basetx, basetz; // drop shadows
|
||||||
|
|
||||||
boolean shadowdraw, shadoweffects, shadowskew;
|
boolean shadowdraw, shadoweffects, shadowskew;
|
||||||
boolean splat = R_ThingIsFloorSprite(thing);
|
boolean splat = R_ThingIsFloorSprite(thing);
|
||||||
|
@ -1453,7 +1454,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
tr_x = thing->x - viewx;
|
tr_x = thing->x - viewx;
|
||||||
tr_y = thing->y - viewy;
|
tr_y = thing->y - viewy;
|
||||||
|
|
||||||
tz = FixedMul(tr_x, viewcos) + FixedMul(tr_y, viewsin); // near/far distance
|
basetz = tz = FixedMul(tr_x, viewcos) + FixedMul(tr_y, viewsin); // near/far distance
|
||||||
|
|
||||||
// thing is behind view plane?
|
// thing is behind view plane?
|
||||||
if (!papersprite && (tz < FixedMul(MINZ, this_scale))) // papersprite clipping is handled later
|
if (!papersprite && (tz < FixedMul(MINZ, this_scale))) // papersprite clipping is handled later
|
||||||
|
@ -1975,6 +1976,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
|
|
||||||
vis->xscale = FixedMul(spritexscale, xscale); //SoM: 4/17/2000
|
vis->xscale = FixedMul(spritexscale, xscale); //SoM: 4/17/2000
|
||||||
vis->scale = FixedMul(spriteyscale, yscale); //<<detailshift;
|
vis->scale = FixedMul(spriteyscale, yscale); //<<detailshift;
|
||||||
|
vis->thingscale = oldthing->scale;
|
||||||
|
|
||||||
vis->spritexscale = spritexscale;
|
vis->spritexscale = spritexscale;
|
||||||
vis->spriteyscale = spriteyscale;
|
vis->spriteyscale = spriteyscale;
|
||||||
|
@ -2052,7 +2054,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
R_SplitSprite(vis);
|
R_SplitSprite(vis);
|
||||||
|
|
||||||
if (oldthing->shadowscale && cv_shadow.value)
|
if (oldthing->shadowscale && cv_shadow.value)
|
||||||
R_ProjectDropShadow(oldthing, vis, oldthing->shadowscale, basetx, tz);
|
R_ProjectDropShadow(oldthing, vis, oldthing->shadowscale, basetx, basetz);
|
||||||
|
|
||||||
// Debug
|
// Debug
|
||||||
++objectsdrawn;
|
++objectsdrawn;
|
||||||
|
|
|
@ -155,7 +155,8 @@ typedef struct vissprite_s
|
||||||
fixed_t pz, pzt; // physical bottom/top for sorting with 3D floors
|
fixed_t pz, pzt; // physical bottom/top for sorting with 3D floors
|
||||||
|
|
||||||
fixed_t startfrac; // horizontal position of x1
|
fixed_t startfrac; // horizontal position of x1
|
||||||
fixed_t scale;
|
fixed_t xscale, scale; // projected horizontal and vertical scales
|
||||||
|
fixed_t thingscale; // the object's scale
|
||||||
fixed_t sortscale; // sortscale only differs from scale for paper sprites, floor sprites, and MF2_LINKDRAW
|
fixed_t sortscale; // sortscale only differs from scale for paper sprites, floor sprites, and MF2_LINKDRAW
|
||||||
fixed_t sortsplat; // the sortscale from behind the floor sprite
|
fixed_t sortsplat; // the sortscale from behind the floor sprite
|
||||||
fixed_t scalestep; // only for paper sprites, 0 otherwise
|
fixed_t scalestep; // only for paper sprites, 0 otherwise
|
||||||
|
@ -183,8 +184,6 @@ typedef struct vissprite_s
|
||||||
|
|
||||||
extracolormap_t *extra_colormap; // global colormaps
|
extracolormap_t *extra_colormap; // global colormaps
|
||||||
|
|
||||||
fixed_t xscale;
|
|
||||||
|
|
||||||
// Precalculated top and bottom screen coords for the sprite.
|
// Precalculated top and bottom screen coords for the sprite.
|
||||||
fixed_t thingheight; // The actual height of the thing (for 3D floors)
|
fixed_t thingheight; // The actual height of the thing (for 3D floors)
|
||||||
sector_t *sector; // The sector containing the thing.
|
sector_t *sector; // The sector containing the thing.
|
||||||
|
|
|
@ -217,7 +217,7 @@ void SCR_SetMode(void)
|
||||||
|
|
||||||
// Set the video mode in the video interface.
|
// Set the video mode in the video interface.
|
||||||
if (setmodeneeded)
|
if (setmodeneeded)
|
||||||
VID_SetMode(--setmodeneeded);
|
VID_SetMode(setmodeneeded - 1);
|
||||||
|
|
||||||
V_SetPalette(0);
|
V_SetPalette(0);
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,6 @@ void *hwSym(const char *funcName,void *handle)
|
||||||
GETFUNC(ReadRect);
|
GETFUNC(ReadRect);
|
||||||
GETFUNC(GClipRect);
|
GETFUNC(GClipRect);
|
||||||
GETFUNC(ClearMipMapCache);
|
GETFUNC(ClearMipMapCache);
|
||||||
GETFUNC(ClearCacheList);
|
|
||||||
GETFUNC(SetSpecialState);
|
GETFUNC(SetSpecialState);
|
||||||
GETFUNC(GetTextureUsed);
|
GETFUNC(GetTextureUsed);
|
||||||
GETFUNC(DrawModel);
|
GETFUNC(DrawModel);
|
||||||
|
|
|
@ -137,6 +137,12 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T);
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
|
||||||
|
#include <execinfo.h>
|
||||||
|
#include <time.h>
|
||||||
|
#define UNIXBACKTRACE
|
||||||
|
#endif
|
||||||
|
|
||||||
// Locations for searching the srb2.pk3
|
// Locations for searching the srb2.pk3
|
||||||
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
|
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
|
||||||
#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2"
|
#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2"
|
||||||
|
@ -238,6 +244,71 @@ SDL_bool framebuffer = SDL_FALSE;
|
||||||
|
|
||||||
UINT8 keyboard_started = false;
|
UINT8 keyboard_started = false;
|
||||||
|
|
||||||
|
#ifdef UNIXBACKTRACE
|
||||||
|
#define STDERR_WRITE(string) if (fd != -1) I_OutputMsg("%s", string)
|
||||||
|
#define CRASHLOG_WRITE(string) if (fd != -1) write(fd, string, strlen(string))
|
||||||
|
#define CRASHLOG_STDERR_WRITE(string) \
|
||||||
|
if (fd != -1)\
|
||||||
|
write(fd, string, strlen(string));\
|
||||||
|
I_OutputMsg("%s", string)
|
||||||
|
|
||||||
|
static void write_backtrace(INT32 signal)
|
||||||
|
{
|
||||||
|
int fd = -1;
|
||||||
|
size_t size;
|
||||||
|
time_t rawtime;
|
||||||
|
struct tm timeinfo;
|
||||||
|
|
||||||
|
enum { BT_SIZE = 1024, STR_SIZE = 32 };
|
||||||
|
void *array[BT_SIZE];
|
||||||
|
char timestr[STR_SIZE];
|
||||||
|
|
||||||
|
const char *error = "An error occurred within SRB2! Send this stack trace to someone who can help!\n";
|
||||||
|
const char *error2 = "(Or find crash-log.txt in your SRB2 directory.)\n"; // Shown only to stderr.
|
||||||
|
|
||||||
|
fd = open(va("%s" PATHSEP "%s", srb2home, "crash-log.txt"), O_CREAT|O_APPEND|O_RDWR, S_IRUSR|S_IWUSR);
|
||||||
|
|
||||||
|
if (fd == -1)
|
||||||
|
I_OutputMsg("\nWARNING: Couldn't open crash log for writing! Make sure your permissions are correct. Please save the below report!\n");
|
||||||
|
|
||||||
|
// Get the current time as a string.
|
||||||
|
time(&rawtime);
|
||||||
|
localtime_r(&rawtime, &timeinfo);
|
||||||
|
strftime(timestr, STR_SIZE, "%a, %d %b %Y %T %z", &timeinfo);
|
||||||
|
|
||||||
|
CRASHLOG_WRITE("------------------------\n"); // Nice looking seperator
|
||||||
|
|
||||||
|
CRASHLOG_STDERR_WRITE("\n"); // Newline to look nice for both outputs.
|
||||||
|
CRASHLOG_STDERR_WRITE(error); // "Oops, SRB2 crashed" message
|
||||||
|
STDERR_WRITE(error2); // Tell the user where the crash log is.
|
||||||
|
|
||||||
|
// Tell the log when we crashed.
|
||||||
|
CRASHLOG_WRITE("Time of crash: ");
|
||||||
|
CRASHLOG_WRITE(timestr);
|
||||||
|
CRASHLOG_WRITE("\n");
|
||||||
|
|
||||||
|
// Give the crash log the cause and a nice 'Backtrace:' thing
|
||||||
|
// The signal is given to the user when the parent process sees we crashed.
|
||||||
|
CRASHLOG_WRITE("Cause: ");
|
||||||
|
CRASHLOG_WRITE(strsignal(signal));
|
||||||
|
CRASHLOG_WRITE("\n"); // Newline for the signal name
|
||||||
|
|
||||||
|
CRASHLOG_STDERR_WRITE("\nBacktrace:\n");
|
||||||
|
|
||||||
|
// Flood the output and log with the backtrace
|
||||||
|
size = backtrace(array, BT_SIZE);
|
||||||
|
backtrace_symbols_fd(array, size, fd);
|
||||||
|
backtrace_symbols_fd(array, size, STDERR_FILENO);
|
||||||
|
|
||||||
|
CRASHLOG_WRITE("\n"); // Write another newline to the log so it looks nice :)
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
#undef STDERR_WRITE
|
||||||
|
#undef CRASHLOG_WRITE
|
||||||
|
#undef CRASHLOG_STDERR_WRITE
|
||||||
|
#endif // UNIXBACKTRACE
|
||||||
|
|
||||||
static void I_ReportSignal(int num, int coredumped)
|
static void I_ReportSignal(int num, int coredumped)
|
||||||
{
|
{
|
||||||
//static char msg[] = "oh no! back to reality!\r\n";
|
//static char msg[] = "oh no! back to reality!\r\n";
|
||||||
|
@ -297,6 +368,9 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
|
||||||
{
|
{
|
||||||
D_QuitNetGame(); // Fix server freezes
|
D_QuitNetGame(); // Fix server freezes
|
||||||
CL_AbortDownloadResume();
|
CL_AbortDownloadResume();
|
||||||
|
#ifdef UNIXBACKTRACE
|
||||||
|
write_backtrace(num);
|
||||||
|
#endif
|
||||||
I_ReportSignal(num, 0);
|
I_ReportSignal(num, 0);
|
||||||
I_ShutdownSystem();
|
I_ShutdownSystem();
|
||||||
signal(num, SIG_DFL); //default signal action
|
signal(num, SIG_DFL); //default signal action
|
||||||
|
@ -687,6 +761,28 @@ static void I_RegisterSignals (void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef NEWSIGNALHANDLER
|
||||||
|
static void signal_handler_child(INT32 num)
|
||||||
|
{
|
||||||
|
#ifdef UNIXBACKTRACE
|
||||||
|
write_backtrace(num);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
signal(num, SIG_DFL); //default signal action
|
||||||
|
raise(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void I_RegisterChildSignals(void)
|
||||||
|
{
|
||||||
|
// If these defines don't exist,
|
||||||
|
// then compilation would have failed above us...
|
||||||
|
signal(SIGILL , signal_handler_child);
|
||||||
|
signal(SIGSEGV , signal_handler_child);
|
||||||
|
signal(SIGABRT , signal_handler_child);
|
||||||
|
signal(SIGFPE , signal_handler_child);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
//I_OutputMsg
|
//I_OutputMsg
|
||||||
//
|
//
|
||||||
|
@ -2123,6 +2219,7 @@ static void I_Fork(void)
|
||||||
newsignalhandler_Warn("fork()");
|
newsignalhandler_Warn("fork()");
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
|
I_RegisterChildSignals();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (logstream)
|
if (logstream)
|
||||||
|
|
|
@ -1862,7 +1862,6 @@ void VID_StartupOpenGL(void)
|
||||||
HWD.pfnReadRect = hwSym("ReadRect",NULL);
|
HWD.pfnReadRect = hwSym("ReadRect",NULL);
|
||||||
HWD.pfnGClipRect = hwSym("GClipRect",NULL);
|
HWD.pfnGClipRect = hwSym("GClipRect",NULL);
|
||||||
HWD.pfnClearMipMapCache = hwSym("ClearMipMapCache",NULL);
|
HWD.pfnClearMipMapCache = hwSym("ClearMipMapCache",NULL);
|
||||||
HWD.pfnClearCacheList = hwSym("ClearCacheList",NULL);
|
|
||||||
HWD.pfnSetSpecialState = hwSym("SetSpecialState",NULL);
|
HWD.pfnSetSpecialState = hwSym("SetSpecialState",NULL);
|
||||||
HWD.pfnSetPalette = hwSym("SetPalette",NULL);
|
HWD.pfnSetPalette = hwSym("SetPalette",NULL);
|
||||||
HWD.pfnGetTextureUsed = hwSym("GetTextureUsed",NULL);
|
HWD.pfnGetTextureUsed = hwSym("GetTextureUsed",NULL);
|
||||||
|
|
|
@ -1298,7 +1298,7 @@ boolean I_PlaySong(boolean looping)
|
||||||
if (gme)
|
if (gme)
|
||||||
{
|
{
|
||||||
gme_equalizer_t eq = {GME_TREBLE, GME_BASS, 0,0,0,0,0,0,0,0};
|
gme_equalizer_t eq = {GME_TREBLE, GME_BASS, 0,0,0,0,0,0,0,0};
|
||||||
#if GME_VERSION >= 0x000603
|
#if defined (GME_VERSION) && GME_VERSION >= 0x000603
|
||||||
if (looping)
|
if (looping)
|
||||||
gme_set_autoload_playback_limit(gme, 0);
|
gme_set_autoload_playback_limit(gme, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
21
src/w_wad.c
21
src/w_wad.c
|
@ -821,7 +821,8 @@ UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (important && !mainfile)
|
if (important && !mainfile)
|
||||||
G_SetGameModified(true);
|
//G_SetGameModified(true);
|
||||||
|
modifiedgame = true; // avoid savemoddata being set to false
|
||||||
|
|
||||||
//
|
//
|
||||||
// link wad file to search files
|
// link wad file to search files
|
||||||
|
@ -1682,26 +1683,12 @@ void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
||||||
|
|
||||||
// read the lump in full
|
// read the lump in full
|
||||||
W_ReadLumpHeaderPwad(wad, lump, lumpdata, 0, 0);
|
W_ReadLumpHeaderPwad(wad, lump, lumpdata, 0, 0);
|
||||||
|
ptr = lumpdata;
|
||||||
|
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
// lump is a png so convert it
|
|
||||||
if (Picture_IsLumpPNG((UINT8 *)lumpdata, len))
|
if (Picture_IsLumpPNG((UINT8 *)lumpdata, len))
|
||||||
{
|
ptr = Picture_PNGConvert((UINT8 *)lumpdata, PICFMT_DOOMPATCH, NULL, NULL, NULL, NULL, len, &len, 0);
|
||||||
size_t newlen;
|
|
||||||
void *converted = Picture_PNGConvert((UINT8 *)lumpdata, PICFMT_DOOMPATCH, NULL, NULL, NULL, NULL, len, &newlen, 0);
|
|
||||||
ptr = Z_Malloc(newlen, PU_STATIC, NULL);
|
|
||||||
M_Memcpy(ptr, converted, newlen);
|
|
||||||
Z_Free(converted);
|
|
||||||
len = newlen;
|
|
||||||
}
|
|
||||||
else // just copy it into the patch cache
|
|
||||||
#endif
|
#endif
|
||||||
{
|
|
||||||
ptr = Z_Malloc(len, PU_STATIC, NULL);
|
|
||||||
M_Memcpy(ptr, lumpdata, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
Z_Free(lumpdata);
|
|
||||||
|
|
||||||
dest = Z_Calloc(sizeof(patch_t), tag, &lumpcache[lump]);
|
dest = Z_Calloc(sizeof(patch_t), tag, &lumpcache[lump]);
|
||||||
Patch_Create(ptr, len, dest);
|
Patch_Create(ptr, len, dest);
|
||||||
|
|
|
@ -111,7 +111,6 @@ static loadfunc_t hwdFuncTable[] = {
|
||||||
{"ReadRect@24", &hwdriver.pfnReadRect},
|
{"ReadRect@24", &hwdriver.pfnReadRect},
|
||||||
{"GClipRect@20", &hwdriver.pfnGClipRect},
|
{"GClipRect@20", &hwdriver.pfnGClipRect},
|
||||||
{"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache},
|
{"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache},
|
||||||
{"ClearCacheList@0", &hwdriver.pfnClearCacheList},
|
|
||||||
{"SetSpecialState@8", &hwdriver.pfnSetSpecialState},
|
{"SetSpecialState@8", &hwdriver.pfnSetSpecialState},
|
||||||
{"DrawModel@16", &hwdriver.pfnDrawModel},
|
{"DrawModel@16", &hwdriver.pfnDrawModel},
|
||||||
{"SetTransform@4", &hwdriver.pfnSetTransform},
|
{"SetTransform@4", &hwdriver.pfnSetTransform},
|
||||||
|
@ -145,7 +144,6 @@ static loadfunc_t hwdFuncTable[] = {
|
||||||
{"ReadRect", &hwdriver.pfnReadRect},
|
{"ReadRect", &hwdriver.pfnReadRect},
|
||||||
{"GClipRect", &hwdriver.pfnGClipRect},
|
{"GClipRect", &hwdriver.pfnGClipRect},
|
||||||
{"ClearMipMapCache", &hwdriver.pfnClearMipMapCache},
|
{"ClearMipMapCache", &hwdriver.pfnClearMipMapCache},
|
||||||
{"ClearCacheList", &hwdriver.pfnClearCacheList},
|
|
||||||
{"SetSpecialState", &hwdriver.pfnSetSpecialState},
|
{"SetSpecialState", &hwdriver.pfnSetSpecialState},
|
||||||
{"DrawModel", &hwdriver.pfnDrawModel},
|
{"DrawModel", &hwdriver.pfnDrawModel},
|
||||||
{"SetTransform", &hwdriver.pfnSetTransform},
|
{"SetTransform", &hwdriver.pfnSetTransform},
|
||||||
|
|
|
@ -68,8 +68,7 @@ enum
|
||||||
PU_HWRCACHE_UNLOCKED = 102, // 'unlocked' PU_HWRCACHE memory:
|
PU_HWRCACHE_UNLOCKED = 102, // 'unlocked' PU_HWRCACHE memory:
|
||||||
// 'second-level' cache for graphics
|
// 'second-level' cache for graphics
|
||||||
// stored in hardware format and downloaded as needed
|
// stored in hardware format and downloaded as needed
|
||||||
PU_HWRPATCHINFO_UNLOCKED = 103, // 'unlocked' PU_HWRPATCHINFO memory
|
PU_HWRMODELTEXTURE_UNLOCKED = 103, // 'unlocked' PU_HWRMODELTEXTURE memory
|
||||||
PU_HWRMODELTEXTURE_UNLOCKED = 104, // 'unlocked' PU_HWRMODELTEXTURE memory
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in a new issue