Merge remote-tracking branch 'stjr/next' into patch-refactor

This commit is contained in:
Lactozilla 2023-11-07 00:56:28 -03:00
commit 376022f3d7
66 changed files with 1779 additions and 1429 deletions

4
.gitattributes vendored
View file

@ -1,15 +1,17 @@
#Source code #Source code
/Makefile text=auto
/src/*.c text=auto /src/*.c text=auto
/src/*.h text=auto /src/*.h text=auto
/src/*.s text=auto /src/*.s text=auto
/src/*.m text=auto /src/*.m text=auto
/src/*.xpm text=auto /src/*.xpm text=auto
/src/Makefile text=auto /src/Makefile text=auto
/tools/Makefile text=auto
/src/Make*.cfg text=auto /src/Make*.cfg text=auto
/src/CMakeLists.txt text=auto /src/CMakeLists.txt text=auto
*.mk -whitespace text=auto
# Windows EOL # Windows EOL
*.cs -crlf -whitespace *.cs -crlf -whitespace
*.mk -crlf -whitespace
*.bat -crlf -whitespace *.bat -crlf -whitespace
*.dev -crlf -whitespace *.dev -crlf -whitespace
*.dsp -crlf -whitespace *.dsp -crlf -whitespace

505
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,505 @@
variables:
GIT_STRATEGY: clone
GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_CONCURRENT_ID/$CI_PROJECT_PATH
default:
image: debian:stable-slim
cache:
- key: ccache-$CI_PROJECT_PATH_SLUG-$CI_JOB_NAME_SLUG
fallback_keys:
- cache-$CI_PROJECT_PATH_SLUG-$CI_DEFAULT_BRANCH
- cache-$CI_PROJECT_PATH_SLUG-default
paths:
- ccache
- ccache_statslog
- key: apt-$CI_JOB_IMAGE
paths:
- apt-cache
unprotect: true
before_script:
- - |
# debconf
echo -e "\e[0Ksection_start:`date +%s`:debconf[collapsed=true]\r\e[0KSetup debconf's environment"
- export DEBIAN_FRONTEND="noninteractive"
- export DEBIAN_PRIORITY="low"
- export DEBCONF_NONINTERACTIVE_SEEN="true"
- |
# debconf
echo -e "\e[0Ksection_end:`date +%s`:debconf\r\e[0K"
- - |
# dpkg_aa
echo -e "\e[0Ksection_start:`date +%s`:dpkg_aa[collapsed=true]\r\e[0KAdding architectures to dpkg"
- dpkg --add-architecture i386
- dpkg --add-architecture amd64
- dpkg --add-architecture arm64
- |
# dpkg_aa
echo -e "\e[0Ksection_end:`date +%s`:dpkg_aa\r\e[0K"
- - |
# apt_conf
echo -e "\e[0Ksection_start:`date +%s`:apt_conf[collapsed=true]\r\e[0KSetting up APT conf"
- export APT_CACHE_DIR=`pwd`/apt-cache
- mkdir --parents --verbose $APT_CACHE_DIR/partial/
- touch /etc/apt/apt.conf.d/99build
- |
# apt.conf
echo Adding options to apt.conf':'
- |
# APT::Install-Recommends
echo APT::Install-Recommends "false"\; | tee --append /etc/apt/apt.conf.d/99build
- |
# quit
echo quiet "1"\; | tee --append /etc/apt/apt.conf.d/99build
- |
# APT::Get::Assume-Yes
echo APT::Get::Assume-Yes "true"\; | tee --append /etc/apt/apt.conf.d/99build
- |
# Dir::Cache::Archives
echo Dir::Cache::Archives "$APT_CACHE_DIR"\; | tee --append /etc/apt/apt.conf.d/99build
- |
# apt_conf
echo -e "\e[0Ksection_end:`date +%s`:apt_conf\r\e[0K"
- - |
# apt_update
echo -e "\e[0Ksection_start:`date +%s`:apt_update[collapsed=true]\r\e[0KUpdating APT listing"
- apt-get update
- |
# apt_update
echo -e "\e[0Ksection_end:`date +%s`:apt_update\r\e[0K"
- - |
# apt_pre
echo -e "\e[0Ksection_start:`date +%s`:apt_pre[collapsed=true]\r\e[0KInstalling pre packages"
- apt-get install apt-utils
- |
# apt_pre
echo -e "\e[0Ksection_end:`date +%s`:apt_pre\r\e[0K"
- - |
# apt_upgrade
echo -e "\e[0Ksection_start:`date +%s`:apt_upgrade[collapsed=true]\r\e[0KUpdating existing packages"
- apt-get upgrade
- |
# apt_update
echo -e "\e[0Ksection_end:`date +%s`:apt_upgrade\r\e[0K"
- - |
# apt_common
echo -e "\e[0Ksection_start:`date +%s`:apt_common[collapsed=true]\r\e[0KInstalling common packages"
- apt-get install make git ccache nasm
- |
# apt_common
echo -e "\e[0Ksection_end:`date +%s`:apt_common\r\e[0K"
- - |
# ccache_config
echo -e "\e[0Ksection_start:`date +%s`:ccache_config[collapsed=true]\r\e[0KSetting up ccache config"
- mkdir --parents --verbose ~/.ccache/
- touch ~/.ccache/ccache.conf
- |
# cache.conf
echo Adding ccache configution option
- |
# base_dir
echo base_dir = $PWD | tee --append ~/.ccache/ccache.conf
- |
# cache_dir
echo cache_dir = $PWD/ccache | tee --append ~/.ccache/ccache.conf
- |
# compiler_check
echo compiler_check = content | tee --append ~/.ccache/ccache.conf
- |
# stats_log
echo stats_log = $PWD/ccache_statslog | tee --append ~/.ccache/ccache.conf
- |
# max_size
echo max_size = 50M | tee --append ~/.ccache/ccache.conf
- |
# ccache_config
echo -e "\e[0Ksection_end:`date +%s`:ccache_config\r\e[0K"
- - |
# cache_reset
echo -e "\e[0Ksection_start:`date +%s`:ccache_reset[collapsed=true]\r\e[0KResetting ccache statistics"
- ccache --zero-stats
- ccache --show-stats
- |
# ccache_reset
echo -e "\e[0Ksection_end:`date +%s`:ccache_reset\r\e[0K"
artifacts:
paths:
- "bin/"
- "src/comptime.h"
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-$CI_JOB_NAME_SLUG"
after_script:
- - |
# apt_clean
echo -e "\e[0Ksection_start:`date +%s`:apt_clean[collapsed=true]\r\e[0KCleaning of unneeded APT packages"
- apt-get autoclean
- |
# apt_clean
echo -e "\e[0Ksection_end:`date +%s`:apt_clean\r\e[0K"
- - |
# ccache_stats
echo -e "\e[0Ksection_start:`date +%s`:ccache_stats[collapsed=true]\r\e[0Kccache statistics:"
- ccache --show-stats --verbose
- ccache --show-log-stats --verbose
- |
# ccahe_stats
echo -e "\e[0Ksection_end:`date +%s`:ccache_stats\r\e[0K"
stages:
- build
Debian testing GCC:
stage: build
when: manual
image: debian:testing-slim
allow_failure: true
artifacts:
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-testing-gcc"
variables:
CC: gcc
LDFLAGS: -Wl,-fuse-ld=gold
script:
- - |
# apt_toolchain
echo -e "\e[0Ksection_start:`date +%s`:apt_toolchain[collapsed=true]\r\e[0KInstalling toolchain packages"
- apt-get install gcc
- |
# apt_toolchain
echo -e "\e[0Ksection_end:`date +%s`:apt_toolchain\r\e[0K"
- - |
# apt_development
echo -e "\e[0Ksection_start:`date +%s`:apt_development[collapsed=true]\r\e[0KInstalling development packages"
- apt-get install libsdl2-mixer-dev libpng-dev libcurl4-openssl-dev libgme-dev libopenmpt-dev
- |
# apt_development
echo -e "\e[0Ksection_end:`date +%s`:apt_development\r\e[0K"
- - |
# make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1
- |
# make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Windows x86:
stage: build
when: on_success
artifacts:
paths:
- "bin/"
- "src/comptime.h"
expose_as: "Win32"
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-Win32"
variables:
PREFIX: i686-w64-mingw32
script:
- - |
# apt_toolchain
echo -e "\e[0Ksection_start:`date +%s`:apt_toolchain[collapsed=true]\r\e[0KInstalling toolchain packages"
- apt-get install gcc-mingw-w64-i686-win32
- |
# apt_toolchain
echo -e "\e[0Ksection_end:`date +%s`:apt_toolchain\r\e[0K"
- - |
# make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 MINGW=1 SDL=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 MINGW=1 SDL=1
- |
# make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Debian stable:amd64:
stage: build
when: on_success
artifacts:
paths:
- "bin/"
- "src/comptime.h"
expose_as: "Debian amd64"
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-x86-64"
variables:
CC: x86_64-linux-gnu-gcc
LDFLAGS: -Wl,-fuse-ld=gold
OBJCOPY: x86_64-linux-gnu-objcopy
OBJDUMP: x86_64-linux-gnu-objdump
PKG_CONFIG_PATH: /usr/lib/x86_64-linux-gnu/pkgconfig
script:
- - |
# apt_toolchain
echo -e "\e[0Ksection_start:`date +%s`:apt_toolchain[collapsed=true]\r\e[0KInstalling toolchain packages"
- apt-get install gcc-x86-64-linux-gnu || apt-get install gcc
- |
# apt_toolchain
echo -e "\e[0Ksection_end:`date +%s`:apt_toolchain\r\e[0K"
- - |
# apt_development
echo -e "\e[0Ksection_start:`date +%s`:apt_development[collapsed=true]\r\e[0KInstalling development packages"
- apt-get install libsdl2-mixer-dev:amd64 libpng-dev:amd64 libcurl4-openssl-dev:amd64 libgme-dev:amd64 libopenmpt-dev:amd64
- |
# apt_development
echo -e "\e[0Ksection_end:`date +%s`:apt_development\r\e[0K"
- - |
# make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX64=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX64=1
- |
# make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Debian stable:i386:
stage: build
when: manual
artifacts:
paths:
- "bin/"
- "src/comptime.h"
expose_as: "Debian i386"
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-i686"
variables:
CC: i686-linux-gnu-gcc
OBJCOPY: i686-linux-gnu-objcopy
OBJDUMP: i686-linux-gnu-objdump
PKG_CONFIG_PATH: /usr/lib/i386-linux-gnu/pkgconfig
script:
- - |
# apt_toolchain
echo -e "\e[0Ksection_start:`date +%s`:apt_toolchain[collapsed=true]\r\e[0KInstalling toolchain packages"
- apt-get install gcc-i686-linux-gnu || apt-get install gcc
- |
# apt_toolchain
echo -e "\e[0Ksection_end:`date +%s`:apt_toolchain\r\e[0K"
- - |
# apt_development
echo -e "\e[0Ksection_start:`date +%s`:apt_development[collapsed=true]\r\e[0KInstalling development packages"
- apt-get install libsdl2-mixer-dev:i386 libpng-dev:i386 libcurl4-openssl-dev:i386 libgme-dev:i386 libopenmpt-dev:i386
- |
# apt_development
echo -e "\e[0Ksection_end:`date +%s`:apt_development\r\e[0K"
- - |
# make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX=1
- |
# make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Debian stable:arm64:
stage: build
when: manual
artifacts:
paths:
- "bin/"
- "src/comptime.h"
expose_as: "Debian arm64"
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-aarch64"
variables:
CC: aarch64-linux-gnu-gcc
LDFLAGS: -Wl,-fuse-ld=gold
OBJCOPY: aarch64-linux-gnu-objcopy
OBJDUMP: aarch64-linux-gnu-objdump
PKG_CONFIG_PATH: /usr/lib/aarch64-linux-gnu/pkgconfig
script:
- - |
# apt_toolchain
echo -e "\e[0Ksection_start:`date +%s`:apt_toolchain[collapsed=true]\r\e[0KInstalling toolchain packages"
- apt-get install gcc-aarch64-linux-gnu || apt-get install gcc
- |
# apt_toolchain
echo -e "\e[0Ksection_end:`date +%s`:apt_toolchain\r\e[0K"
- - |
# apt_development
echo -e "\e[0Ksection_start:`date +%s`:apt_development[collapsed=true]\r\e[0KInstalling development packages"
- apt-get install libsdl2-mixer-dev:arm64 libpng-dev:arm64 libcurl4-openssl-dev:arm64 libgme-dev:arm64 libopenmpt-dev:arm64
- |
# apt_development
echo -e "\e[0Ksection_end:`date +%s`:apt_development\r\e[0K"
- - |
# make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX64=1 ERRORMODE=1 NONX86=1C || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX64=1 NONX86=1 ARM64=1
- |
# make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Windows x64:
stage: build
when: manual
artifacts:
paths:
- "bin/"
- "src/comptime.h"
expose_as: "Win64"
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-Win64"
variables:
PREFIX: x86_64-w64-mingw32
script:
- - |
# apt_toolchain
echo -e "\e[0Ksection_start:`date +%s`:apt_toolchain[collapsed=true]\r\e[0KInstalling toolchain packages"
- apt-get install gcc-mingw-w64-x86-64-win32
- |
# apt_toolchain
echo -e "\e[0Ksection_end:`date +%s`:apt_toolchain\r\e[0K"
- - |
# make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 MINGW64=1 SDL=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 MINGW64=1 SDL=1
- |
# make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Debian stable Clang:
stage: build
when: manual
allow_failure: true
artifacts:
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-clang"
variables:
CC: clang
WFLAGS: -Wno-cast-align
CFLAGS: -Wno-cast-align
LDFLAGS: -Wl,-fuse-ld=gold
script:
- - |
# apt_toolchain
echo -e "\e[0Ksection_start:`date +%s`:apt_toolchain[collapsed=true]\r\e[0KInstalling toolchain packages"
- apt-get install clang
- |
# apt_toolchain
echo -e "\e[0Ksection_end:`date +%s`:apt_toolchain\r\e[0K"
- - |
# apt_development
echo -e "\e[0Ksection_start:`date +%s`:apt_development[collapsed=true]\r\e[0KInstalling development packages"
- apt-get install libsdl2-mixer-dev libpng-dev libcurl4-openssl-dev libgme-dev libopenmpt-dev
- |
# apt_development
echo -e "\e[0Ksection_end:`date +%s`:apt_development\r\e[0K"
- - |
# make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1
- |
# make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Debian stable musl:
stage: build
when: manual
allow_failure: true
artifacts:
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-musl"
variables:
CC: musl-gcc
LDD: musl-ldd
script:
- - |
# apt_toolchain
echo -e "\e[0Ksection_start:`date +%s`:apt_toolchain[collapsed=true]\r\e[0KInstalling toolchain packages"
- apt-get install gcc
- |
# apt_toolchain
echo -e "\e[0Ksection_end:`date +%s`:apt_toolchain\r\e[0K"
- - |
# apt_development
echo -e "\e[0Ksection_start:`date +%s`:apt_development[collapsed=true]\r\e[0KInstalling development packages"
- apt-get install musl-tools
- |
# apt_development
echo -e "\e[0Ksection_end:`date +%s`:apt_development\r\e[0K"
- - |
# make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 SDL=0 NOHW=1 NOZLIB=1 NOCURL=1 NOGME=1 NOOPENMPT=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 SDL=0 NOHW=1 NOZLIB=1 NOCURL=1 NOGME=1 NOOPENMPT=1
- |
# make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Debian testing Clang:
extends: Debian stable Clang
when: manual
image: debian:testing-slim
artifacts:
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-testing-clang"
variables:
CC: clang
WFLAGS: -Wno-cast-align -Wno-deprecated-non-prototype
CFLAGS: -Wno-cast-align -Wno-deprecated-non-prototype
LDFLAGS: -Wl,-fuse-ld=gold
Debian testing musl:
extends: Debian stable musl
when: manual
image: debian:testing-slim
artifacts:
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-testing-musl"
variables:
CC: musl-gcc
LDD: musl-ldd
LDFLAGS: -Wl,-fuse-ld=gold

View file

@ -3,12 +3,12 @@ ifdef ComSpec
COMSPEC=$(ComSpec) COMSPEC=$(ComSpec)
endif endif
ifdef COMSPEC ifdef COMSPEC
OBJCOPY=objcopy.exe OBJCOPY?=objcopy.exe
OBJDUMP=objdump.exe OBJDUMP?=objdump.exe
GZIP?=gzip.exe GZIP?=gzip.exe
else else
OBJCOPY=objcopy OBJCOPY?=objcopy
OBJDUMP=objdump OBJDUMP?=objdump
GZIP?=gzip GZIP?=gzip
endif endif
DBGNAME=$(BIN).debug DBGNAME=$(BIN).debug

View file

@ -140,9 +140,9 @@ endif
OBJDUMP_OPTS?=--wide --source --line-numbers OBJDUMP_OPTS?=--wide --source --line-numbers
OBJCOPY:=$(call Prefix,objcopy) OBJCOPY?=$(call Prefix,objcopy)
OBJDUMP:=$(call Prefix,objdump) OBJDUMP?=$(call Prefix,objdump)
WINDRES:=$(call Prefix,windres) WINDRES?=$(call Prefix,windres)
GZIP?=gzip GZIP?=gzip
GZIP_OPTS?=-9 -f -n GZIP_OPTS?=-9 -f -n

View file

@ -56,15 +56,18 @@ endif
# This must have high to low order. # This must have high to low order.
gcc_versions:=\ gcc_versions:=\
102 101\ 132 131 130\
93 92 91\ 123 122 121 120\
84 83 82 81\ 114 113 112 111 110\
75 74 73 72 71\ 105 104 103 102 101 100\
64 63 62 61\ 95 94 93 92 91 90\
55 54 53 52 51\ 85 84 83 82 81 80\
75 74 73 72 71 70\
64 63 62 61 60\
55 54 53 52 51 50\
49 48 47 46 45 44 43 42 41 40 49 48 47 46 45 44 43 42 41 40
latest_gcc_version:=10.2 latest_gcc_version:=13.2
# Automatically set version flag, but not if one was # Automatically set version flag, but not if one was
# manually set. And don't bother if this is a clean only # manually set. And don't bother if this is a clean only
@ -74,13 +77,18 @@ ifeq (,$(call Wildvar,GCC% destructive))
# can't use $(CC) --version here since that uses argv[0] to display the name # can't use $(CC) --version here since that uses argv[0] to display the name
# also gcc outputs the information to stderr, so I had to do 2>&1 # also gcc outputs the information to stderr, so I had to do 2>&1
# this program really doesn't like identifying itself # this program really doesn't like identifying itself
version:=$(shell $(CC) -v 2>&1) shellversion:=$(shell $(CC) -v 2>&1)
# Try to remove "-win32"
version:=$(subst -win32,.0,$(shellversion))
# check if this is in fact GCC # check if this is in fact GCC
ifneq (,$(findstring gcc version,$(version))) ifneq (,$(findstring gcc version,$(version)))
# in stark contrast to the name, gcc will give me a nicely formatted version number for free # in stark contrast to the name, gcc will give me a nicely formatted version number for free
version:=$(shell $(CC) -dumpfullversion) shellversion:=$(shell $(CC) -dumpfullversion)
# Try to remove "-win32"
version:=$(subst -win32,.0,$(shellversion))
# Turn version into words of major, minor # Turn version into words of major, minor
v:=$(subst ., ,$(version)) v:=$(subst ., ,$(version))

View file

@ -1,66 +1,66 @@
# #
# Makefile for feature flags. # Makefile for feature flags.
# #
passthru_opts+=\ passthru_opts+=\
NO_IPV6 NOHW NOMD5 NOPOSTPROCESSING\ NO_IPV6 NOHW NOMD5 NOPOSTPROCESSING\
MOBJCONSISTANCY PACKETDROP ZDEBUG\ MOBJCONSISTANCY PACKETDROP ZDEBUG\
HAVE_MINIUPNPC\ HAVE_MINIUPNPC\
# build with debugging information # build with debugging information
ifdef DEBUGMODE ifdef DEBUGMODE
PACKETDROP=1 PACKETDROP=1
opts+=-DPARANOIA -DRANGECHECK opts+=-DPARANOIA -DRANGECHECK
endif endif
ifndef NOHW ifndef NOHW
opts+=-DHWRENDER opts+=-DHWRENDER
sources+=$(call List,hardware/Sourcefile) sources+=$(call List,hardware/Sourcefile)
endif endif
ifndef NOMD5 ifndef NOMD5
sources+=md5.c sources+=md5.c
endif endif
ifndef NOZLIB ifndef NOZLIB
ifndef NOPNG ifndef NOPNG
ifdef PNG_PKGCONFIG ifdef PNG_PKGCONFIG
$(eval $(call Use_pkg_config,PNG_PKGCONFIG)) $(eval $(call Use_pkg_config,PNG_PKGCONFIG))
else else
PNG_CONFIG?=$(call Prefix,libpng-config) PNG_CONFIG?=$(call Prefix,libpng-config)
$(eval $(call Configure,PNG,$(PNG_CONFIG) \ $(eval $(call Configure,PNG,$(PNG_CONFIG) \
$(if $(PNG_STATIC),--static),,--ldflags)) $(if $(PNG_STATIC),--static),,--ldflags))
endif endif
ifdef LINUX ifdef LINUX
opts+=-D_LARGEFILE64_SOURCE opts+=-D_LARGEFILE64_SOURCE
endif endif
opts+=-DHAVE_PNG opts+=-DHAVE_PNG
sources+=apng.c sources+=apng.c
endif endif
endif endif
ifndef NOCURL ifndef NOCURL
CURLCONFIG?=curl-config CURLCONFIG?=curl-config
$(eval $(call Configure,CURL,$(CURLCONFIG))) $(eval $(call Configure,CURL,$(CURLCONFIG)))
opts+=-DHAVE_CURL opts+=-DHAVE_CURL
endif endif
ifdef HAVE_MINIUPNPC ifdef HAVE_MINIUPNPC
libs+=-lminiupnpc libs+=-lminiupnpc
endif endif
# (Valgrind is a memory debugger.) # (Valgrind is a memory debugger.)
ifdef VALGRIND ifdef VALGRIND
VALGRIND_PKGCONFIG?=valgrind VALGRIND_PKGCONFIG?=valgrind
$(eval $(call Use_pkg_config,VALGRIND)) $(eval $(call Use_pkg_config,VALGRIND))
ZDEBUG=1 ZDEBUG=1
opts+=-DHAVE_VALGRIND opts+=-DHAVE_VALGRIND
endif endif
default_packages:=\ default_packages:=\
GME/libgme/LIBGME\ GME/libgme/LIBGME\
OPENMPT/libopenmpt/LIBOPENMPT\ OPENMPT/libopenmpt/LIBOPENMPT\
ZLIB/zlib\ ZLIB/zlib\
$(foreach p,$(default_packages),\ $(foreach p,$(default_packages),\
$(eval $(call Check_pkg_config,$(p)))) $(eval $(call Check_pkg_config,$(p))))

View file

@ -543,13 +543,13 @@ static void CON_RecalcSize(void)
con_scalefactor = 1; con_scalefactor = 1;
break; break;
case V_SMALLSCALEPATCH: case V_SMALLSCALEPATCH:
con_scalefactor = vid.smalldupx; con_scalefactor = vid.smalldup;
break; break;
case V_MEDSCALEPATCH: case V_MEDSCALEPATCH:
con_scalefactor = vid.meddupx; con_scalefactor = vid.meddup;
break; break;
default: // Full scaling default: // Full scaling
con_scalefactor = vid.dupx; con_scalefactor = vid.dup;
break; break;
} }
@ -667,7 +667,7 @@ static void CON_MoveConsole(void)
} }
// Not instant - Increment fracmovement fractionally // Not instant - Increment fracmovement fractionally
fracmovement += FixedMul(cons_speed.value*vid.fdupy, renderdeltatics); fracmovement += FixedMul(cons_speed.value*vid.fdup, renderdeltatics);
if (con_curlines < con_destlines) // Move the console downwards if (con_curlines < con_destlines) // Move the console downwards
{ {
@ -1764,9 +1764,9 @@ static void CON_DrawBackpic(void)
con_backpic = W_CachePatchNum(piclump, PU_PATCH); con_backpic = W_CachePatchNum(piclump, PU_PATCH);
// Center the backpic, and draw a vertically cropped patch. // Center the backpic, and draw a vertically cropped patch.
w = (con_backpic->width * vid.dupx); w = con_backpic->width * vid.dup;
x = (vid.width / 2) - (w / 2); x = (vid.width / 2) - (w / 2);
h = con_curlines/vid.dupy; h = con_curlines/vid.dup;
// If the patch doesn't fill the entire screen, // If the patch doesn't fill the entire screen,
// then fill the sides with a solid color. // then fill the sides with a solid color.

View file

@ -1614,6 +1614,9 @@ void D_SRB2Main(void)
if (D_CheckNetGame()) if (D_CheckNetGame())
autostart = true; autostart = true;
if (!dedicated)
pickedchar = R_SkinAvailable(cv_defaultskin.string);
// check for a driver that wants intermission stats // check for a driver that wants intermission stats
// start the apropriate game based on parms // start the apropriate game based on parms
if (M_CheckParm("-metal")) if (M_CheckParm("-metal"))
@ -1627,8 +1630,6 @@ void D_SRB2Main(void)
autostart = true; autostart = true;
} }
pickedchar = R_SkinAvailable(cv_defaultskin.string);
// user settings come before "+" parameters. // user settings come before "+" parameters.
if (dedicated) if (dedicated)
COM_ImmedExecute(va("exec \"%s"PATHSEP"adedserv.cfg\"\n", srb2home)); COM_ImmedExecute(va("exec \"%s"PATHSEP"adedserv.cfg\"\n", srb2home));

View file

@ -607,6 +607,7 @@ typedef struct player_s
tic_t jointime; // Timer when player joins game to change skin/color tic_t jointime; // Timer when player joins game to change skin/color
tic_t quittime; // Time elapsed since user disconnected, zero if connected tic_t quittime; // Time elapsed since user disconnected, zero if connected
tic_t lastinputtime; // the last tic the player has made any input
#ifdef HWRENDER #ifdef HWRENDER
fixed_t fovadd; // adjust FOV for hw rendering fixed_t fovadd; // adjust FOV for hw rendering
#endif #endif

View file

@ -297,7 +297,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
CacheAndPushConstant(L, word, (lua_Integer)PF_FULLSTASIS); CacheAndPushConstant(L, word, (lua_Integer)PF_FULLSTASIS);
return 1; return 1;
} }
else if (fastcmp(p, "USEDOWN")) // Remove case when 2.3 nears release... // TODO: 2.3: Delete this alias
else if (fastcmp(p, "USEDOWN"))
{ {
CacheAndPushConstant(L, word, (lua_Integer)PF_SPINDOWN); CacheAndPushConstant(L, word, (lua_Integer)PF_SPINDOWN);
return 1; return 1;
@ -583,7 +584,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
return 0; return 0;
} }
if (fastcmp(word, "BT_USE")) // Remove case when 2.3 nears release... // TODO: 2.3: Delete this alias
if (fastcmp(word, "BT_USE"))
{ {
CacheAndPushConstant(L, word, (lua_Integer)BT_SPIN); CacheAndPushConstant(L, word, (lua_Integer)BT_SPIN);
return 1; return 1;
@ -771,8 +773,7 @@ int LUA_SOCLib(lua_State *L)
lua_register(L,"getActionName",lib_getActionName); lua_register(L,"getActionName",lib_getActionName);
luaL_newmetatable(L, META_ACTION); luaL_newmetatable(L, META_ACTION);
lua_pushcfunction(L, action_call); LUA_SetCFunctionField(L, "__call", action_call);
lua_setfield(L, -2, "__call");
lua_pop(L, 1); lua_pop(L, 1);
return 0; return 0;

View file

@ -911,6 +911,7 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame)
sprinfo->pivot[frame].x = value; sprinfo->pivot[frame].x = value;
else if (fastcmp(word, "YPIVOT")) else if (fastcmp(word, "YPIVOT"))
sprinfo->pivot[frame].y = value; sprinfo->pivot[frame].y = value;
// TODO: 2.3: Delete
else if (fastcmp(word, "ROTAXIS")) else if (fastcmp(word, "ROTAXIS"))
deh_warning("SpriteInfo: ROTAXIS is deprecated and will be removed."); deh_warning("SpriteInfo: ROTAXIS is deprecated and will be removed.");
else else
@ -1617,6 +1618,7 @@ void readlevelheader(MYFILE *f, INT32 num)
sizeof(mapheaderinfo[num-1]->musname), va("Level header %d: music", num)); sizeof(mapheaderinfo[num-1]->musname), va("Level header %d: music", num));
} }
} }
// TODO: 2.3: Delete
else if (fastcmp(word, "MUSICSLOT")) else if (fastcmp(word, "MUSICSLOT"))
deh_warning("Level header %d: MusicSlot parameter is deprecated and will be removed.\nUse \"Music\" instead.", num); deh_warning("Level header %d: MusicSlot parameter is deprecated and will be removed.\nUse \"Music\" instead.", num);
else if (fastcmp(word, "MUSICTRACK")) else if (fastcmp(word, "MUSICTRACK"))

View file

@ -1933,6 +1933,13 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_SMALLGRABCHAIN", "S_SMALLGRABCHAIN",
"S_BIGGRABCHAIN", "S_BIGGRABCHAIN",
// Blue spring on a ball
"S_BLUESPRINGBALL",
"S_BLUESPRINGBALL2",
"S_BLUESPRINGBALL3",
"S_BLUESPRINGBALL4",
"S_BLUESPRINGBALL5",
// Yellow spring on a ball // Yellow spring on a ball
"S_YELLOWSPRINGBALL", "S_YELLOWSPRINGBALL",
"S_YELLOWSPRINGBALL2", "S_YELLOWSPRINGBALL2",
@ -3891,6 +3898,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_BIGMACE", // Big Mace "MT_BIGMACE", // Big Mace
"MT_SMALLGRABCHAIN", // Small Grab Chain "MT_SMALLGRABCHAIN", // Small Grab Chain
"MT_BIGGRABCHAIN", // Big Grab Chain "MT_BIGGRABCHAIN", // Big Grab Chain
"MT_BLUESPRINGBALL", // Blue spring on a ball
"MT_YELLOWSPRINGBALL", // Yellow spring on a ball "MT_YELLOWSPRINGBALL", // Yellow spring on a ball
"MT_REDSPRINGBALL", // Red spring on a ball "MT_REDSPRINGBALL", // Red spring on a ball
"MT_SMALLFIREBAR", // Small Firebar "MT_SMALLFIREBAR", // Small Firebar

View file

@ -14,13 +14,18 @@ size_t I_GetFreeMem(size_t *total)
return 0; return 0;
} }
void I_Sleep(UINT32 ms){} void I_Sleep(UINT32 ms)
{
(void)ms;
}
precise_t I_GetPreciseTime(void) { precise_t I_GetPreciseTime(void)
{
return 0; return 0;
} }
UINT64 I_GetPrecisePrecision(void) { UINT64 I_GetPrecisePrecision(void)
{
return 1000000; return 1000000;
} }
@ -182,10 +187,12 @@ const char *I_ClipboardPaste(void)
size_t I_GetRandomBytes(char *destination, size_t amount) size_t I_GetRandomBytes(char *destination, size_t amount)
{ {
(void)destination;
(void)amount;
return 0; return 0;
} }
void I_RegisterSysCommands(void) {} void I_RegisterSysCommands(void){}
void I_GetCursorPosition(INT32 *x, INT32 *y) void I_GetCursorPosition(INT32 *x, INT32 *y)
{ {

View file

@ -1327,7 +1327,7 @@ void F_CreditDrawer(void)
y += 12<<FRACBITS; y += 12<<FRACBITS;
break; break;
} }
if (FixedMul(y,vid.dupy) > vid.height) if (FixedMul(y,vid.dup) > vid.height)
break; break;
} }
} }
@ -1362,7 +1362,7 @@ void F_CreditTicker(void)
case 1: y += 30<<FRACBITS; break; case 1: y += 30<<FRACBITS; break;
default: y += 12<<FRACBITS; break; default: y += 12<<FRACBITS; break;
} }
if (FixedMul(y,vid.dupy) > vid.height) if (FixedMul(y,vid.dup) > vid.height)
break; break;
} }
@ -2082,7 +2082,7 @@ void F_EndingDrawer(void)
if (goodending && finalecount >= TICRATE && finalecount < INFLECTIONPOINT) if (goodending && finalecount >= TICRATE && finalecount < INFLECTIONPOINT)
{ {
INT32 workingtime = finalecount - TICRATE; INT32 workingtime = finalecount - TICRATE;
fixed_t radius = ((vid.width/vid.dupx)*(INFLECTIONPOINT - TICRATE - workingtime))/(INFLECTIONPOINT - TICRATE); fixed_t radius = ((vid.width/vid.dup)*(INFLECTIONPOINT - TICRATE - workingtime))/(INFLECTIONPOINT - TICRATE);
angle_t fa; angle_t fa;
INT32 eemeralds_cur[4]; INT32 eemeralds_cur[4];
char patchname[7] = "CEMGx0"; char patchname[7] = "CEMGx0";
@ -2287,7 +2287,6 @@ void F_InitMenuPresValues(void)
void F_SkyScroll(const char *patchname) void F_SkyScroll(const char *patchname)
{ {
INT32 x, basey = 0; INT32 x, basey = 0;
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy);
patch_t *pat; patch_t *pat;
if (rendermode == render_none) if (rendermode == render_none)
@ -2315,17 +2314,17 @@ void F_SkyScroll(const char *patchname)
curbgy %= pat->height * 16; curbgy %= pat->height * 16;
// Ooh, fancy frame interpolation // Ooh, fancy frame interpolation
x = ((curbgx*dupz) + FixedInt((rendertimefrac-FRACUNIT) * curbgxspeed*dupz)) / 16; x = ((curbgx*vid.dup) + FixedInt((rendertimefrac-FRACUNIT) * curbgxspeed*vid.dup)) / 16;
basey = ((curbgy*dupz) + FixedInt((rendertimefrac-FRACUNIT) * curbgyspeed*dupz)) / 16; basey = ((curbgy*vid.dup) + FixedInt((rendertimefrac-FRACUNIT) * curbgyspeed*vid.dup)) / 16;
if (x > 0) // Make sure that we don't leave the left or top sides empty if (x > 0) // Make sure that we don't leave the left or top sides empty
x -= pat->width * dupz; x -= pat->width * vid.dup;
if (basey > 0) if (basey > 0)
basey -= pat->height * dupz; basey -= pat->height * vid.dup;
for (; x < vid.width; x += pat->width * dupz) for (; x < vid.width; x += pat->width * vid.dup)
{ {
for (INT32 y = basey; y < vid.height; y += pat->height * dupz) for (INT32 y = basey; y < vid.height; y += pat->height * vid.dup)
V_DrawScaledPatch(x, y, V_NOSCALESTART, pat); V_DrawScaledPatch(x, y, V_NOSCALESTART, pat);
} }
@ -2603,7 +2602,7 @@ static void F_LoadAlacroixGraphics(SINT8 newttscale)
static void F_FigureActiveTtScale(void) static void F_FigureActiveTtScale(void)
{ {
SINT8 newttscale = max(1, min(6, vid.dupx)); SINT8 newttscale = max(1, min(6, vid.dup));
SINT8 oldttscale = activettscale; SINT8 oldttscale = activettscale;
if (newttscale == testttscale) if (newttscale == testttscale)
@ -4095,7 +4094,7 @@ static fixed_t F_GetPromptHideHudBound(void)
F_GetPageTextGeometry(&pagelines, &rightside, &boxh, &texth, &texty, &namey, &chevrony, &textx, &textr); F_GetPageTextGeometry(&pagelines, &rightside, &boxh, &texth, &texty, &namey, &chevrony, &textx, &textr);
// calc boxheight (see V_DrawPromptBack) // calc boxheight (see V_DrawPromptBack)
boxh *= vid.dupy; boxh *= vid.dup;
boxh = (boxh * 4) + (boxh/2)*5; // 4 lines of space plus gaps between and some leeway boxh = (boxh * 4) + (boxh/2)*5; // 4 lines of space plus gaps between and some leeway
// return a coordinate to check // return a coordinate to check

View file

@ -1492,8 +1492,9 @@ void G_BeginRecording(void)
demo_p += 16; demo_p += 16;
// Skin // Skin
for (i = 0; i < 16 && cv_skin.string[i]; i++) const char *skinname = skins[players[0].skin].name;
name[i] = cv_skin.string[i]; for (i = 0; i < 16 && skinname[i]; i++)
name[i] = skinname[i];
for (; i < 16; i++) for (; i < 16; i++)
name[i] = '\0'; name[i] = '\0';
M_Memcpy(demo_p,name,16); M_Memcpy(demo_p,name,16);
@ -1891,16 +1892,9 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname)
p++; // VERSION p++; // VERSION
p++; // SUBVERSION p++; // SUBVERSION
oldversion = READUINT16(p); oldversion = READUINT16(p);
switch(oldversion) // demoversion if (oldversion < 0x000c || oldversion > DEMOVERSION)
{ {
case DEMOVERSION: // latest always supported // too old (or new), cannot support
case 0x000f: // The previous demoversions also supported
case 0x000e:
case 0x000d: // all that changed between then and now was longer color name
case 0x000c:
break;
// too old, cannot support.
default:
CONS_Alert(CONS_NOTICE, M_GetText("File '%s' invalid format. It will be overwritten.\n"), oldname); CONS_Alert(CONS_NOTICE, M_GetText("File '%s' invalid format. It will be overwritten.\n"), oldname);
Z_Free(buffer); Z_Free(buffer);
return UINT8_MAX; return UINT8_MAX;
@ -1973,14 +1967,11 @@ void G_DoPlayDemo(char *defdemoname)
UINT8 i; UINT8 i;
lumpnum_t l; lumpnum_t l;
char skin[17],color[MAXCOLORNAME+1],*n,*pdemoname; char skin[17],color[MAXCOLORNAME+1],*n,*pdemoname;
UINT8 version,subversion,charability,charability2,thrustfactor,accelstart,acceleration,cnamelen; UINT8 version,subversion,charability,charability2,thrustfactor,accelstart,acceleration;
pflags_t pflags; pflags_t pflags;
UINT32 randseed, followitem; UINT32 randseed, followitem;
fixed_t camerascale,shieldscale,actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor,height,spinheight; fixed_t camerascale,shieldscale,actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor,height,spinheight;
char msg[1024]; char msg[1024];
#ifdef OLD22DEMOCOMPAT
boolean use_old_demo_vars = false;
#endif
skin[16] = '\0'; skin[16] = '\0';
color[MAXCOLORNAME] = '\0'; color[MAXCOLORNAME] = '\0';
@ -2039,23 +2030,13 @@ void G_DoPlayDemo(char *defdemoname)
subversion = READUINT8(demo_p); subversion = READUINT8(demo_p);
demoversion = READUINT16(demo_p); demoversion = READUINT16(demo_p);
demo_forwardmove_rng = (demoversion < 0x0010); demo_forwardmove_rng = (demoversion < 0x0010);
switch(demoversion)
{
case 0x000f:
case 0x000d:
case 0x000e:
case DEMOVERSION: // latest always supported
cnamelen = MAXCOLORNAME;
break;
#ifdef OLD22DEMOCOMPAT #ifdef OLD22DEMOCOMPAT
// all that changed between then and now was longer color name if (demoversion < 0x000c || demoversion > DEMOVERSION)
case 0x000c: #else
cnamelen = 16; if (demoversion < 0x000d || demoversion > DEMOVERSION)
use_old_demo_vars = true;
break;
#endif #endif
// too old, cannot support. {
default: // too old (or new), cannot support
snprintf(msg, 1024, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemoname); snprintf(msg, 1024, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemoname);
CONS_Alert(CONS_ERROR, "%s", msg); CONS_Alert(CONS_ERROR, "%s", msg);
M_StartMessage(msg, NULL, MM_NOTHING); M_StartMessage(msg, NULL, MM_NOTHING);
@ -2182,8 +2163,8 @@ void G_DoPlayDemo(char *defdemoname)
demo_p += 16; demo_p += 16;
// Color // Color
M_Memcpy(color,demo_p,cnamelen); M_Memcpy(color, demo_p, (demoversion < 0x000d) ? 16 : MAXCOLORNAME);
demo_p += cnamelen; demo_p += (demoversion < 0x000d) ? 16 : MAXCOLORNAME;
charability = READUINT8(demo_p); charability = READUINT8(demo_p);
charability2 = READUINT8(demo_p); charability2 = READUINT8(demo_p);
@ -2219,7 +2200,7 @@ void G_DoPlayDemo(char *defdemoname)
// net var data // net var data
#ifdef OLD22DEMOCOMPAT #ifdef OLD22DEMOCOMPAT
if (use_old_demo_vars) if (demoversion < 0x000d)
CV_LoadOldDemoVars(&demo_p); CV_LoadOldDemoVars(&demo_p);
else else
#endif #endif
@ -2352,19 +2333,13 @@ UINT8 G_CheckDemoForError(char *defdemoname)
demo_p++; // version demo_p++; // version
demo_p++; // subversion demo_p++; // subversion
our_demo_version = READUINT16(demo_p); our_demo_version = READUINT16(demo_p);
switch(our_demo_version)
{
case 0x000d:
case 0x000e:
case 0x000f:
case DEMOVERSION: // latest always supported
break;
#ifdef OLD22DEMOCOMPAT #ifdef OLD22DEMOCOMPAT
case 0x000c: if (our_demo_version < 0x000c || our_demo_version > DEMOVERSION)
break; #else
if (our_demo_version < 0x000d || our_demo_version > DEMOVERSION)
#endif #endif
// too old, cannot support. {
default: // too old (or new), cannot support
return DFILE_ERROR_NOTDEMO; return DFILE_ERROR_NOTDEMO;
} }
demo_p += 16; // demo checksum demo_p += 16; // demo checksum
@ -2386,7 +2361,6 @@ void G_AddGhost(char *defdemoname)
INT32 i; INT32 i;
lumpnum_t l; lumpnum_t l;
char name[17],skin[17],color[MAXCOLORNAME+1],*n,*pdemoname,md5[16]; char name[17],skin[17],color[MAXCOLORNAME+1],*n,*pdemoname,md5[16];
UINT8 cnamelen;
demoghost *gh; demoghost *gh;
UINT8 flags, subversion; UINT8 flags, subversion;
UINT8 *buffer,*p; UINT8 *buffer,*p;
@ -2438,20 +2412,9 @@ void G_AddGhost(char *defdemoname)
p++; // VERSION p++; // VERSION
subversion = READUINT8(p); // SUBVERSION subversion = READUINT8(p); // SUBVERSION
ghostversion = READUINT16(p); ghostversion = READUINT16(p);
switch(ghostversion) if (ghostversion < 0x000c || ghostversion > DEMOVERSION)
{ {
case 0x000f: // too old (or new), cannot support
case 0x000d:
case 0x000e:
case DEMOVERSION: // latest always supported
cnamelen = MAXCOLORNAME;
break;
// all that changed between then and now was longer color name
case 0x000c:
cnamelen = 16;
break;
// too old, cannot support.
default:
CONS_Alert(CONS_NOTICE, M_GetText("Ghost %s: Demo version incompatible.\n"), pdemoname); CONS_Alert(CONS_NOTICE, M_GetText("Ghost %s: Demo version incompatible.\n"), pdemoname);
Z_Free(pdemoname); Z_Free(pdemoname);
Z_Free(buffer); Z_Free(buffer);
@ -2514,8 +2477,8 @@ void G_AddGhost(char *defdemoname)
p += 16; p += 16;
// Color // Color
M_Memcpy(color, p,cnamelen); M_Memcpy(color, p, (ghostversion < 0x000d) ? 16 : MAXCOLORNAME);
p += cnamelen; p += (ghostversion < 0x000d) ? 16 : MAXCOLORNAME;
// Ghosts do not have a player structure to put this in. // Ghosts do not have a player structure to put this in.
p++; // charability p++; // charability
@ -2698,16 +2661,9 @@ void G_DoPlayMetal(void)
metal_p++; // VERSION metal_p++; // VERSION
metal_p++; // SUBVERSION metal_p++; // SUBVERSION
metalversion = READUINT16(metal_p); metalversion = READUINT16(metal_p);
switch(metalversion) if (metalversion < 0x000c || metalversion > DEMOVERSION)
{ {
case DEMOVERSION: // latest always supported // too old (or new), cannot support
case 0x000f:
case 0x000e: // There are checks wheter the momentum is from older demo versions or not
case 0x000d: // all that changed between then and now was longer color name
case 0x000c:
break;
// too old, cannot support.
default:
CONS_Alert(CONS_WARNING, M_GetText("Failed to load bot recording for this map, format version incompatible.\n")); CONS_Alert(CONS_WARNING, M_GetText("Failed to load bot recording for this map, format version incompatible.\n"));
Z_Free(metalbuffer); Z_Free(metalbuffer);
return; return;

View file

@ -51,6 +51,7 @@
#include "r_fps.h" // frame interpolation/uncapped #include "r_fps.h" // frame interpolation/uncapped
#include "lua_hud.h" #include "lua_hud.h"
#include "lua_libs.h"
gameaction_t gameaction; gameaction_t gameaction;
gamestate_t gamestate = GS_NULL; gamestate_t gamestate = GS_NULL;
@ -1170,7 +1171,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
// why build a ticcmd if we're paused? // why build a ticcmd if we're paused?
// Or, for that matter, if we're being reborn. // Or, for that matter, if we're being reborn.
// ...OR if we're blindfolded. No looking into the floor. // ...OR if we're blindfolded. No looking into the floor.
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && (player->playerstate == PST_REBORN || ((gametyperules & GTR_TAG) if (ignoregameinputs || paused || P_AutoPause() || (gamestate == GS_LEVEL && (player->playerstate == PST_REBORN || ((gametyperules & GTR_TAG)
&& (leveltime < hidetime * TICRATE) && (player->pflags & PF_TAGIT))))) && (leveltime < hidetime * TICRATE) && (player->pflags & PF_TAGIT)))))
{//@TODO splitscreen player {//@TODO splitscreen player
cmd->angleturn = ticcmd_oldangleturn[forplayer]; cmd->angleturn = ticcmd_oldangleturn[forplayer];
@ -4346,7 +4347,7 @@ void G_LoadGameSettings(void)
} }
#define GAMEDATA_ID 0x86E4A27C // Change every major version, as usual #define GAMEDATA_ID 0x86E4A27C // Change every major version, as usual
#define COMPAT_GAMEDATA_ID 0xFCAFE211 // Can be removed entirely for 2.3 #define COMPAT_GAMEDATA_ID 0xFCAFE211 // TODO: 2.3: Delete
// G_LoadGameData // G_LoadGameData
// Loads the main data file, which stores information such as emblems found, etc. // Loads the main data file, which stores information such as emblems found, etc.

View file

@ -18,6 +18,8 @@
#include "hu_stuff.h" // need HUFONT start & end #include "hu_stuff.h" // need HUFONT start & end
#include "netcode/d_net.h" #include "netcode/d_net.h"
#include "console.h" #include "console.h"
#include "lua_script.h"
#include "lua_libs.h"
#define MAXMOUSESENSITIVITY 100 // sensitivity steps #define MAXMOUSESENSITIVITY 100 // sensitivity steps
@ -116,7 +118,10 @@ void G_MapEventsToControls(event_t *ev)
{ {
case ev_keydown: case ev_keydown:
if (ev->key < NUMINPUTS) if (ev->key < NUMINPUTS)
gamekeydown[ev->key] = 1; {
if (!ignoregameinputs)
gamekeydown[ev->key] = 1;
}
#ifdef PARANOIA #ifdef PARANOIA
else else
{ {
@ -144,7 +149,7 @@ void G_MapEventsToControls(event_t *ev)
case ev_joystick: // buttons are virtual keys case ev_joystick: // buttons are virtual keys
i = ev->key; i = ev->key;
if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on) if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on || ignoregameinputs)
break; break;
if (ev->x != INT32_MAX) joyxmove[i] = ev->x; if (ev->x != INT32_MAX) joyxmove[i] = ev->x;
if (ev->y != INT32_MAX) joyymove[i] = ev->y; if (ev->y != INT32_MAX) joyymove[i] = ev->y;
@ -152,7 +157,7 @@ void G_MapEventsToControls(event_t *ev)
case ev_joystick2: // buttons are virtual keys case ev_joystick2: // buttons are virtual keys
i = ev->key; i = ev->key;
if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on) if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on || ignoregameinputs)
break; break;
if (ev->x != INT32_MAX) joy2xmove[i] = ev->x; if (ev->x != INT32_MAX) joy2xmove[i] = ev->x;
if (ev->y != INT32_MAX) joy2ymove[i] = ev->y; if (ev->y != INT32_MAX) joy2ymove[i] = ev->y;
@ -997,7 +1002,7 @@ static void setcontrol(INT32 (*gc)[2])
INT32 player = ((void*)gc == (void*)&gamecontrolbis ? 1 : 0); INT32 player = ((void*)gc == (void*)&gamecontrolbis ? 1 : 0);
boolean nestedoverride = false; boolean nestedoverride = false;
// Update me for 2.3 // TODO: 2.3: Delete the "use" alias
namectrl = (stricmp(COM_Argv(1), "use")) ? COM_Argv(1) : "spin"; namectrl = (stricmp(COM_Argv(1), "use")) ? COM_Argv(1) : "spin";
for (numctrl = 0; numctrl < NUM_GAMECONTROLS && stricmp(namectrl, gamecontrolname[numctrl]); for (numctrl = 0; numctrl < NUM_GAMECONTROLS && stricmp(namectrl, gamecontrolname[numctrl]);

View file

@ -42,10 +42,10 @@ int unsortedVertexArrayAllocSize = 65536;
// Call HWR_RenderBatches to render all the collected geometry. // Call HWR_RenderBatches to render all the collected geometry.
void HWR_StartBatching(void) void HWR_StartBatching(void)
{ {
if (currently_batching) if (currently_batching)
I_Error("Repeat call to HWR_StartBatching without HWR_RenderBatches"); I_Error("Repeat call to HWR_StartBatching without HWR_RenderBatches");
// init arrays if that has not been done yet // init arrays if that has not been done yet
if (!finalVertexArray) if (!finalVertexArray)
{ {
finalVertexArray = malloc(finalVertexArrayAllocSize * sizeof(FOutVector)); finalVertexArray = malloc(finalVertexArrayAllocSize * sizeof(FOutVector));
@ -55,7 +55,7 @@ void HWR_StartBatching(void)
unsortedVertexArray = malloc(unsortedVertexArrayAllocSize * sizeof(FOutVector)); unsortedVertexArray = malloc(unsortedVertexArrayAllocSize * sizeof(FOutVector));
} }
currently_batching = true; currently_batching = true;
} }
// This replaces the direct calls to pfnSetTexture in cases where batching is available. // This replaces the direct calls to pfnSetTexture in cases where batching is available.

View file

@ -78,10 +78,8 @@ void HWR_DrawPatch(patch_t *gpatch, INT32 x, INT32 y, INT32 option)
// | /| // | /|
// |/ | // |/ |
// 0--1 // 0--1
float sdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f; float sdup = FIXED_TO_FLOAT(vid.fdup)*2.0f;
float sdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f; float pdup = FIXED_TO_FLOAT(vid.fdup)*2.0f;
float pdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f;
float pdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f;
// make patch ready in hardware cache // make patch ready in hardware cache
HWR_GetPatch(gpatch); HWR_GetPatch(gpatch);
@ -90,25 +88,23 @@ void HWR_DrawPatch(patch_t *gpatch, INT32 x, INT32 y, INT32 option)
switch (option & V_SCALEPATCHMASK) switch (option & V_SCALEPATCHMASK)
{ {
case V_NOSCALEPATCH: case V_NOSCALEPATCH:
pdupx = pdupy = 2.0f; pdup = 2.0f;
break; break;
case V_SMALLSCALEPATCH: case V_SMALLSCALEPATCH:
pdupx = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupx); pdup = 2.0f * FIXED_TO_FLOAT(vid.fsmalldup);
pdupy = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupy);
break; break;
case V_MEDSCALEPATCH: case V_MEDSCALEPATCH:
pdupx = 2.0f * FIXED_TO_FLOAT(vid.fmeddupx); pdup = 2.0f * FIXED_TO_FLOAT(vid.fmeddup);
pdupy = 2.0f * FIXED_TO_FLOAT(vid.fmeddupy);
break; break;
} }
if (option & V_NOSCALESTART) if (option & V_NOSCALESTART)
sdupx = sdupy = 2.0f; sdup = 2.0f;
v[0].x = v[3].x = (x*sdupx-(gpatch->leftoffset)*pdupx)/vid.width - 1; v[0].x = v[3].x = (x*sdup-(gpatch->leftoffset)*pdup)/vid.width - 1;
v[2].x = v[1].x = (x*sdupx+(gpatch->width-gpatch->leftoffset)*pdupx)/vid.width - 1; v[2].x = v[1].x = (x*sdup+(gpatch->width-gpatch->leftoffset)*pdup)/vid.width - 1;
v[0].y = v[1].y = 1-(y*sdupy-(gpatch->topoffset)*pdupy)/vid.height; v[0].y = v[1].y = 1-(y*sdup-(gpatch->topoffset)*pdup)/vid.height;
v[2].y = v[3].y = 1-(y*sdupy+(gpatch->height-gpatch->topoffset)*pdupy)/vid.height; v[2].y = v[3].y = 1-(y*sdup+(gpatch->height-gpatch->topoffset)*pdup)/vid.height;
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
@ -138,7 +134,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
// | /| // | /|
// |/ | // |/ |
// 0--1 // 0--1
float dupx, dupy, fscalew, fscaleh, fwidth, fheight; float dup, fscalew, fscaleh, fwidth, fheight;
UINT8 perplayershuffle = 0; UINT8 perplayershuffle = 0;
@ -158,25 +154,21 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
else opacity = softwaretranstogl[10-alphalevel]; else opacity = softwaretranstogl[10-alphalevel];
} }
dupx = (float)vid.dupx; dup = (float)vid.dup;
dupy = (float)vid.dupy;
switch (option & V_SCALEPATCHMASK) switch (option & V_SCALEPATCHMASK)
{ {
case V_NOSCALEPATCH: case V_NOSCALEPATCH:
dupx = dupy = 1.0f; dup = 1.0f;
break; break;
case V_SMALLSCALEPATCH: case V_SMALLSCALEPATCH:
dupx = (float)vid.smalldupx; dup = (float)vid.smalldup;
dupy = (float)vid.smalldupy;
break; break;
case V_MEDSCALEPATCH: case V_MEDSCALEPATCH:
dupx = (float)vid.meddupx; dup = (float)vid.meddup;
dupy = (float)vid.meddupy;
break; break;
} }
dupx = dupy = (dupx < dupy ? dupx : dupy);
fscalew = fscaleh = FIXED_TO_FLOAT(pscale); fscalew = fscaleh = FIXED_TO_FLOAT(pscale);
if (vscale != pscale) if (vscale != pscale)
fscaleh = FIXED_TO_FLOAT(vscale); fscaleh = FIXED_TO_FLOAT(vscale);
@ -270,8 +262,8 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
if (!(option & V_NOSCALESTART)) if (!(option & V_NOSCALESTART))
{ {
cx = cx * dupx; cx = cx * dup;
cy = cy * dupy; cy = cy * dup;
if (!(option & V_SCALEPATCHMASK)) if (!(option & V_SCALEPATCHMASK))
{ {
@ -288,40 +280,40 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
} }
} }
// centre screen // centre screen
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dup) > 1.0E-36f)
{ {
if (option & V_SNAPTORIGHT) if (option & V_SNAPTORIGHT)
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup));
else if (!(option & V_SNAPTOLEFT)) else if (!(option & V_SNAPTOLEFT))
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup))/2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
cx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/4; cx -= ((float)vid.width - ((float)BASEVIDWIDTH * dup))/4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/4; cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup))/4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dup) > 1.0E-36f)
{ {
if (option & V_SNAPTOBOTTOM) if (option & V_SNAPTOBOTTOM)
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup));
else if (!(option & V_SNAPTOTOP)) else if (!(option & V_SNAPTOTOP))
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
cy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/4; cy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/4; cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/4;
} }
} }
} }
if (pscale != FRACUNIT || vscale != FRACUNIT || (splitscreen && option & V_PERPLAYER)) if (pscale != FRACUNIT || vscale != FRACUNIT || (splitscreen && option & V_PERPLAYER))
{ {
fwidth = (float)(gpatch->width) * fscalew * dupx; fwidth = (float)(gpatch->width) * fscalew * dup;
fheight = (float)(gpatch->height) * fscaleh * dupy; fheight = (float)(gpatch->height) * fscaleh * dup;
} }
else else
{ {
fwidth = (float)(gpatch->width) * dupx; fwidth = (float)(gpatch->width) * dup;
fheight = (float)(gpatch->height) * dupy; fheight = (float)(gpatch->height) * dup;
} }
// positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1
@ -384,7 +376,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
// | /| // | /|
// |/ | // |/ |
// 0--1 // 0--1
float dupx, dupy, fscalew, fscaleh, fwidth, fheight; float dup, fscalew, fscaleh, fwidth, fheight;
UINT8 perplayershuffle = 0; UINT8 perplayershuffle = 0;
@ -396,25 +388,21 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
hwrPatch = ((GLPatch_t *)gpatch->hardware); hwrPatch = ((GLPatch_t *)gpatch->hardware);
dupx = (float)vid.dupx; dup = (float)vid.dup;
dupy = (float)vid.dupy;
switch (option & V_SCALEPATCHMASK) switch (option & V_SCALEPATCHMASK)
{ {
case V_NOSCALEPATCH: case V_NOSCALEPATCH:
dupx = dupy = 1.0f; dup = 1.0f;
break; break;
case V_SMALLSCALEPATCH: case V_SMALLSCALEPATCH:
dupx = (float)vid.smalldupx; dup = (float)vid.smalldup;
dupy = (float)vid.smalldupy;
break; break;
case V_MEDSCALEPATCH: case V_MEDSCALEPATCH:
dupx = (float)vid.meddupx; dup = (float)vid.meddup;
dupy = (float)vid.meddupy;
break; break;
} }
dupx = dupy = (dupx < dupy ? dupx : dupy);
fscalew = fscaleh = FIXED_TO_FLOAT(pscale); fscalew = fscaleh = FIXED_TO_FLOAT(pscale);
if (vscale != pscale) if (vscale != pscale)
fscaleh = FIXED_TO_FLOAT(vscale); fscaleh = FIXED_TO_FLOAT(vscale);
@ -492,8 +480,8 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
if (!(option & V_NOSCALESTART)) if (!(option & V_NOSCALESTART))
{ {
cx = cx * dupx; cx = cx * dup;
cy = cy * dupy; cy = cy * dup;
if (!(option & V_SCALEPATCHMASK)) if (!(option & V_SCALEPATCHMASK))
{ {
@ -501,27 +489,27 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
// no the patch is cropped do not do this ever // no the patch is cropped do not do this ever
// centre screen // centre screen
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dup) > 1.0E-36f)
{ {
if (option & V_SNAPTORIGHT) if (option & V_SNAPTORIGHT)
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup));
else if (!(option & V_SNAPTOLEFT)) else if (!(option & V_SNAPTOLEFT))
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup))/2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
cx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/4; cx -= ((float)vid.width - ((float)BASEVIDWIDTH * dup))/4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/4; cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup))/4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dup) > 1.0E-36f)
{ {
if (option & V_SNAPTOBOTTOM) if (option & V_SNAPTOBOTTOM)
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup));
else if (!(option & V_SNAPTOTOP)) else if (!(option & V_SNAPTOTOP))
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
cy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/4; cy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/4; cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/4;
} }
} }
} }
@ -537,13 +525,13 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
if (pscale != FRACUNIT || vscale != FRACUNIT || (splitscreen && option & V_PERPLAYER)) if (pscale != FRACUNIT || vscale != FRACUNIT || (splitscreen && option & V_PERPLAYER))
{ {
fwidth *= fscalew * dupx; fwidth *= fscalew * dup;
fheight *= fscaleh * dupy; fheight *= fscaleh * dup;
} }
else else
{ {
fwidth *= dupx; fwidth *= dup;
fheight *= dupy; fheight *= dup;
} }
// positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1
@ -679,9 +667,9 @@ void HWR_DrawPic(INT32 x, INT32 y, lumpnum_t lumpnum)
// 0--1 // 0--1
v[0].x = v[3].x = 2.0f * (float)x/vid.width - 1; v[0].x = v[3].x = 2.0f * (float)x/vid.width - 1;
v[2].x = v[1].x = 2.0f * (float)(x + patch->width*FIXED_TO_FLOAT(vid.fdupx))/vid.width - 1; v[2].x = v[1].x = 2.0f * (float)(x + patch->width*FIXED_TO_FLOAT(vid.fdup))/vid.width - 1;
v[0].y = v[1].y = 1.0f - 2.0f * (float)y/vid.height; v[0].y = v[1].y = 1.0f - 2.0f * (float)y/vid.height;
v[2].y = v[3].y = 1.0f - 2.0f * (float)(y + patch->height*FIXED_TO_FLOAT(vid.fdupy))/vid.height; v[2].y = v[3].y = 1.0f - 2.0f * (float)(y + patch->height*FIXED_TO_FLOAT(vid.fdup))/vid.height;
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
@ -871,35 +859,33 @@ void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 ac
if (!(color & V_NOSCALESTART)) if (!(color & V_NOSCALESTART))
{ {
float dupx = (float)vid.dupx, dupy = (float)vid.dupy; fx *= vid.dup;
fy *= vid.dup;
fw *= vid.dup;
fh *= vid.dup;
fx *= dupx; if (fabsf((float)vid.width - (float)BASEVIDWIDTH * vid.dup) > 1.0E-36f)
fy *= dupy;
fw *= dupx;
fh *= dupy;
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
{ {
if (color & V_SNAPTORIGHT) if (color & V_SNAPTORIGHT)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup));
else if (!(color & V_SNAPTOLEFT)) else if (!(color & V_SNAPTOLEFT))
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
fx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx -= ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * vid.dup) > 1.0E-36f)
{ {
// same thing here // same thing here
if (color & V_SNAPTOBOTTOM) if (color & V_SNAPTOBOTTOM)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup));
else if (!(color & V_SNAPTOTOP)) else if (!(color & V_SNAPTOTOP))
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
} }
} }
@ -1037,10 +1023,10 @@ void HWR_DrawViewBorder(INT32 clearlines)
clearlines = BASEVIDHEIGHT; // refresh all clearlines = BASEVIDHEIGHT; // refresh all
// calc view size based on original game resolution // calc view size based on original game resolution
baseviewwidth = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewwidth), vid.fdupx)); //(cv_viewsize.value * BASEVIDWIDTH/10)&~7; baseviewwidth = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewwidth), vid.fdup)); //(cv_viewsize.value * BASEVIDWIDTH/10)&~7;
baseviewheight = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewheight), vid.fdupy)); baseviewheight = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewheight), vid.fdup));
top = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_baseviewwindowy), vid.fdupy)); top = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_baseviewwindowy), vid.fdup));
side = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewwindowx), vid.fdupx)); side = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewwindowx), vid.fdup));
// top // top
HWR_DrawFlatFill(0, 0, HWR_DrawFlatFill(0, 0,
@ -1255,35 +1241,35 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32
if (!(color & V_NOSCALESTART)) if (!(color & V_NOSCALESTART))
{ {
float dupx = (float)vid.dupx, dupy = (float)vid.dupy; float dup = (float)vid.dup;
fx *= dupx; fx *= dup;
fy *= dupy; fy *= dup;
fw *= dupx; fw *= dup;
fh *= dupy; fh *= dup;
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dup) > 1.0E-36f)
{ {
if (color & V_SNAPTORIGHT) if (color & V_SNAPTORIGHT)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); fx += ((float)vid.width - ((float)BASEVIDWIDTH * dup));
else if (!(color & V_SNAPTOLEFT)) else if (!(color & V_SNAPTOLEFT))
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; fx += ((float)vid.width - ((float)BASEVIDWIDTH * dup)) / 2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
fx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx -= ((float)vid.width - ((float)BASEVIDWIDTH * dup)) / 4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx += ((float)vid.width - ((float)BASEVIDWIDTH * dup)) / 4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dup) > 1.0E-36f)
{ {
// same thing here // same thing here
if (color & V_SNAPTOBOTTOM) if (color & V_SNAPTOBOTTOM)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup));
else if (!(color & V_SNAPTOTOP)) else if (!(color & V_SNAPTOTOP))
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup)) / 2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dup)) / 4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup)) / 4;
} }
} }
@ -1421,8 +1407,6 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
if (!(color & V_NOSCALESTART)) if (!(color & V_NOSCALESTART))
{ {
float dupx = (float)vid.dupx, dupy = (float)vid.dupy;
if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT) if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT)
{ {
RGBA_t rgbaColour = V_GetColor(color); RGBA_t rgbaColour = V_GetColor(color);
@ -1435,33 +1419,33 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
return; return;
} }
fx *= dupx; fx *= vid.dup;
fy *= dupy; fy *= vid.dup;
fw *= dupx; fw *= vid.dup;
fh *= dupy; fh *= vid.dup;
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) if (fabsf((float)vid.width - (float)BASEVIDWIDTH * vid.dup) > 1.0E-36f)
{ {
if (color & V_SNAPTORIGHT) if (color & V_SNAPTORIGHT)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup));
else if (!(color & V_SNAPTOLEFT)) else if (!(color & V_SNAPTOLEFT))
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
fx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx -= ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * vid.dup) > 1.0E-36f)
{ {
// same thing here // same thing here
if (color & V_SNAPTOBOTTOM) if (color & V_SNAPTOBOTTOM)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup));
else if (!(color & V_SNAPTOTOP)) else if (!(color & V_SNAPTOTOP))
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
} }
} }

View file

@ -341,6 +341,7 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_BMCH &lspr[NOLIGHT], // SPR_BMCH
&lspr[NOLIGHT], // SPR_SMCE &lspr[NOLIGHT], // SPR_SMCE
&lspr[NOLIGHT], // SPR_BMCE &lspr[NOLIGHT], // SPR_BMCE
&lspr[NOLIGHT], // SPR_BSPB
&lspr[NOLIGHT], // SPR_YSPB &lspr[NOLIGHT], // SPR_YSPB
&lspr[NOLIGHT], // SPR_RSPB &lspr[NOLIGHT], // SPR_RSPB
&lspr[REDBALL_L], // SPR_SFBR &lspr[REDBALL_L], // SPR_SFBR

View file

@ -229,6 +229,8 @@ void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *col
// Clamp the light level, since it can sometimes go out of the 0-255 range from animations // Clamp the light level, since it can sometimes go out of the 0-255 range from animations
light_level = min(max(light_level, 0), 255); light_level = min(max(light_level, 0), 255);
V_CubeApply(&tint_color.s.red, &tint_color.s.green, &tint_color.s.blue);
V_CubeApply(&fade_color.s.red, &fade_color.s.green, &fade_color.s.blue);
Surface->PolyColor.rgba = poly_color.rgba; Surface->PolyColor.rgba = poly_color.rgba;
Surface->TintColor.rgba = tint_color.rgba; Surface->TintColor.rgba = tint_color.rgba;
Surface->FadeColor.rgba = fade_color.rgba; Surface->FadeColor.rgba = fade_color.rgba;
@ -4064,14 +4066,11 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
float xscale, yscale; float xscale, yscale;
float xoffset, yoffset; float xoffset, yoffset;
float leftoffset, topoffset; float leftoffset, topoffset;
float scale = spr->scale;
float zoffset = (P_MobjFlip(spr->mobj) * 0.05f); float zoffset = (P_MobjFlip(spr->mobj) * 0.05f);
pslope_t *splatslope = NULL; pslope_t *splatslope = NULL;
INT32 i; INT32 i;
renderflags_t renderflags = spr->renderflags; renderflags_t renderflags = spr->renderflags;
if (renderflags & RF_SHADOWEFFECTS)
scale *= spr->shadowscale;
if (spr->rotateflags & SRF_3D || renderflags & RF_NOSPLATBILLBOARD) if (spr->rotateflags & SRF_3D || renderflags & RF_NOSPLATBILLBOARD)
angle = spr->mobj->angle; angle = spr->mobj->angle;

View file

@ -486,7 +486,7 @@ void HWR_InitModels(void)
size_t i; size_t i;
INT32 s; INT32 s;
FILE *f; FILE *f;
char name[24], filename[32]; char name[26], filename[32];
float scale, offset; float scale, offset;
size_t prefixlen; size_t prefixlen;
@ -585,7 +585,7 @@ modelfound:
void HWR_AddPlayerModel(int skin) // For skins that were added after startup void HWR_AddPlayerModel(int skin) // For skins that were added after startup
{ {
FILE *f; FILE *f;
char name[24], filename[32]; char name[26], filename[32];
float scale, offset; float scale, offset;
size_t prefixlen; size_t prefixlen;
@ -644,7 +644,7 @@ void HWR_AddSpriteModel(size_t spritenum) // For sprites that were added after s
// name[24] is used to check for names in the models.dat file that match with sprites or player skins // name[24] is used to check for names in the models.dat file that match with sprites or player skins
// sprite names are always 4 characters long, and names is for player skins can be up to 19 characters long // sprite names are always 4 characters long, and names is for player skins can be up to 19 characters long
// PLAYERMODELPREFIX is 6 characters long // PLAYERMODELPREFIX is 6 characters long
char name[24], filename[32]; char name[26], filename[32];
float scale, offset; float scale, offset;
if (nomd2s) if (nomd2s)

View file

@ -672,6 +672,9 @@ void GeneratePolygonNormals(model_t *model, int ztag)
for (k = 0; k < mesh->numTriangles; k++) for (k = 0; k < mesh->numTriangles; k++)
{ {
/// TODO: normalize vectors
(void)vertices;
(void)polyNormals;
// Vector::Normal(vertices, polyNormals); // Vector::Normal(vertices, polyNormals);
vertices += 3 * 3; vertices += 3 * 3;
polyNormals++; polyNormals++;

View file

@ -250,6 +250,7 @@ char sprnames[NUMSPRITES + 1][5] =
"BMCH", // Big Mace Chain "BMCH", // Big Mace Chain
"SMCE", // Small Mace "SMCE", // Small Mace
"BMCE", // Big Mace "BMCE", // Big Mace
"BSPB", // Blue spring on a ball
"YSPB", // Yellow spring on a ball "YSPB", // Yellow spring on a ball
"RSPB", // Red spring on a ball "RSPB", // Red spring on a ball
"SFBR", // Small Firebar "SFBR", // Small Firebar
@ -2297,6 +2298,13 @@ state_t states[NUMSTATES] =
{SPR_SMCH, 1, -1, {NULL}, 0, 0, S_NULL}, // S_SMALLGRABCHAIN {SPR_SMCH, 1, -1, {NULL}, 0, 0, S_NULL}, // S_SMALLGRABCHAIN
{SPR_BMCH, 1, -1, {NULL}, 0, 0, S_NULL}, // S_BIGGRABCHAIN {SPR_BMCH, 1, -1, {NULL}, 0, 0, S_NULL}, // S_BIGGRABCHAIN
// Blue spring on a ball
{SPR_BSPB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BLUESPRINGBALL
{SPR_BSPB, 4, 4, {A_Pain}, 0, 0, S_BLUESPRINGBALL3}, // S_BLUESPRINGBALL2
{SPR_BSPB, 3, 1, {NULL}, 0, 0, S_BLUESPRINGBALL4}, // S_BLUESPRINGBALL3
{SPR_BSPB, 2, 1, {NULL}, 0, 0, S_BLUESPRINGBALL5}, // S_BLUESPRINGBALL4
{SPR_BSPB, 1, 1, {NULL}, 0, 0, S_BLUESPRINGBALL}, // S_BLUESPRINGBALL5
// Yellow spring on a ball // Yellow spring on a ball
{SPR_YSPB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_YELLOWSPRINGBALL {SPR_YSPB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_YELLOWSPRINGBALL
{SPR_YSPB, 4, 4, {A_Pain}, 0, 0, S_YELLOWSPRINGBALL3}, // S_YELLOWSPRINGBALL2 {SPR_YSPB, 4, 4, {A_Pain}, 0, 0, S_YELLOWSPRINGBALL3}, // S_YELLOWSPRINGBALL2
@ -11679,6 +11687,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_BLUESPRINGBALL
1133, // doomednum
S_BLUESPRINGBALL, // spawnstate
1000, // spawnhealth
S_BLUESPRINGBALL2, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_spring, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
24*FRACUNIT, // speed
17*FRACUNIT, // radius
34*FRACUNIT, // height
1, // display offset
11*FRACUNIT, // mass
0, // damage
sfx_mswing, // activesound
MF_SCENERY|MF_SPRING|MF_NOGRAVITY, // flags
S_BLUESPRINGBALL2 // raisestate
},
{ // MT_YELLOWSPRINGBALL { // MT_YELLOWSPRINGBALL
1134, // doomednum 1134, // doomednum
S_YELLOWSPRINGBALL, // spawnstate S_YELLOWSPRINGBALL, // spawnstate

View file

@ -797,6 +797,7 @@ typedef enum sprite
SPR_BMCH, // Big Mace Chain SPR_BMCH, // Big Mace Chain
SPR_SMCE, // Small Mace SPR_SMCE, // Small Mace
SPR_BMCE, // Big Mace SPR_BMCE, // Big Mace
SPR_BSPB, // Blue spring on a ball
SPR_YSPB, // Yellow spring on a ball SPR_YSPB, // Yellow spring on a ball
SPR_RSPB, // Red spring on a ball SPR_RSPB, // Red spring on a ball
SPR_SFBR, // Small Firebar SPR_SFBR, // Small Firebar
@ -2744,6 +2745,13 @@ typedef enum state
S_SMALLGRABCHAIN, S_SMALLGRABCHAIN,
S_BIGGRABCHAIN, S_BIGGRABCHAIN,
// Blue spring on a ball
S_BLUESPRINGBALL,
S_BLUESPRINGBALL2,
S_BLUESPRINGBALL3,
S_BLUESPRINGBALL4,
S_BLUESPRINGBALL5,
// Yellow spring on a ball // Yellow spring on a ball
S_YELLOWSPRINGBALL, S_YELLOWSPRINGBALL,
S_YELLOWSPRINGBALL2, S_YELLOWSPRINGBALL2,
@ -4722,6 +4730,7 @@ typedef enum mobj_type
MT_BIGMACE, // Big Mace MT_BIGMACE, // Big Mace
MT_SMALLGRABCHAIN, // Small Grab Chain MT_SMALLGRABCHAIN, // Small Grab Chain
MT_BIGGRABCHAIN, // Big Grab Chain MT_BIGGRABCHAIN, // Big Grab Chain
MT_BLUESPRINGBALL, // Blue spring on a ball
MT_YELLOWSPRINGBALL, // Yellow spring on a ball MT_YELLOWSPRINGBALL, // Yellow spring on a ball
MT_REDSPRINGBALL, // Red spring on a ball MT_REDSPRINGBALL, // Red spring on a ball
MT_SMALLFIREBAR, // Small Firebar MT_SMALLFIREBAR, // Small Firebar

View file

@ -1031,6 +1031,20 @@ static int lib_pRailThinker(lua_State *L)
return 1; return 1;
} }
static int lib_pCheckSkyHit(lua_State *L)
{
mobj_t *mobj = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
line_t *line = *((line_t **)luaL_checkudata(L, 2, META_LINE));
//HUDSAFE
INLEVEL
if (!mobj)
return LUA_ErrInvalid(L, "mobj_t");
if (!line)
return LUA_ErrInvalid(L, "line_t");
lua_pushboolean(L, P_CheckSkyHit(mobj, line));
return 1;
}
static int lib_pXYMovement(lua_State *L) static int lib_pXYMovement(lua_State *L)
{ {
mobj_t *actor = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); mobj_t *actor = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
@ -1425,6 +1439,18 @@ static int lib_pGivePlayerRings(lua_State *L)
return 0; return 0;
} }
static int lib_pGivePlayerSpheres(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
INT32 num_spheres = (INT32)luaL_checkinteger(L, 2);
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
P_GivePlayerSpheres(player, num_spheres);
return 0;
}
static int lib_pGivePlayerLives(lua_State *L) static int lib_pGivePlayerLives(lua_State *L)
{ {
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -1567,6 +1593,19 @@ static int lib_pInstaThrust(lua_State *L)
return 0; return 0;
} }
static int lib_pInstaThrustEvenIn2D(lua_State *L)
{
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
angle_t angle = luaL_checkangle(L, 2);
fixed_t move = luaL_checkfixed(L, 3);
NOHUD
INLEVEL
if (!mo)
return LUA_ErrInvalid(L, "mobj_t");
P_InstaThrustEvenIn2D(mo, angle, move);
return 0;
}
static int lib_pReturnThrustX(lua_State *L) static int lib_pReturnThrustX(lua_State *L)
{ {
angle_t angle; angle_t angle;
@ -1667,6 +1706,17 @@ static int lib_pDoJump(lua_State *L)
return 0; return 0;
} }
static int lib_pDoSpinDashDust(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
P_DoSpinDashDust(player);
return 0;
}
static int lib_pSpawnThokMobj(lua_State *L) static int lib_pSpawnThokMobj(lua_State *L)
{ {
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -1717,6 +1767,48 @@ static int lib_pSwitchShield(lua_State *L)
return 0; return 0;
} }
static int lib_pDoTailsOverlay(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
mobj_t *tails = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
if (!tails)
return LUA_ErrInvalid(L, "mobj_t");
P_DoTailsOverlay(player, tails);
return 0;
}
static int lib_pDoMetalJetFume(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
mobj_t *fume = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
if (!fume)
return LUA_ErrInvalid(L, "mobj_t");
P_DoMetalJetFume(player, fume);
return 0;
}
static int lib_pDoFollowMobj(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
mobj_t *followmobj = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
if (!followmobj)
return LUA_ErrInvalid(L, "mobj_t");
P_DoFollowMobj(player, followmobj);
return 0;
}
static int lib_pPlayerCanEnterSpinGaps(lua_State *L) static int lib_pPlayerCanEnterSpinGaps(lua_State *L)
{ {
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -1788,6 +1880,7 @@ static int lib_pMove(lua_State *L)
return 2; return 2;
} }
// TODO: 2.3: Delete
static int lib_pTeleportMove(lua_State *L) static int lib_pTeleportMove(lua_State *L)
{ {
mobj_t *ptmthing = tmthing; mobj_t *ptmthing = tmthing;
@ -2198,6 +2291,21 @@ static int lib_pDoMatchSuper(lua_State *L)
return 0; return 0;
} }
static int lib_pTouchSpecialThing(lua_State *L)
{
mobj_t *special = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
mobj_t *toucher = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
boolean heightcheck = lua_optboolean(L, 3);
NOHUD
INLEVEL
if (!special || !toucher)
return LUA_ErrInvalid(L, "mobj_t");
if (!toucher->player)
return luaL_error(L, "P_TouchSpecialThing requires a valid toucher.player.");
P_TouchSpecialThing(special, toucher, heightcheck);
return 0;
}
// P_SPEC // P_SPEC
//////////// ////////////
@ -2214,6 +2322,40 @@ static int lib_pThrust(lua_State *L)
return 0; return 0;
} }
static int lib_pThrustEvenIn2D(lua_State *L)
{
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
angle_t angle = luaL_checkangle(L, 2);
fixed_t move = luaL_checkfixed(L, 3);
NOHUD
INLEVEL
if (!mo)
return LUA_ErrInvalid(L, "mobj_t");
P_ThrustEvenIn2D(mo, angle, move);
return 0;
}
static int lib_pVectorInstaThrust(lua_State *L)
{
fixed_t xa = luaL_checkfixed(L, 1);
fixed_t xb = luaL_checkfixed(L, 2);
fixed_t xc = luaL_checkfixed(L, 3);
fixed_t ya = luaL_checkfixed(L, 4);
fixed_t yb = luaL_checkfixed(L, 5);
fixed_t yc = luaL_checkfixed(L, 6);
fixed_t za = luaL_checkfixed(L, 7);
fixed_t zb = luaL_checkfixed(L, 8);
fixed_t zc = luaL_checkfixed(L, 9);
fixed_t momentum = luaL_checkfixed(L, 10);
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 11, META_MOBJ));
NOHUD
INLEVEL
if (!mo)
return LUA_ErrInvalid(L, "mobj_t");
P_VectorInstaThrust(xa, xb, xc, ya, yb, yc, za, zb, zc, momentum, mo);
return 0;
}
static int lib_pSetMobjStateNF(lua_State *L) static int lib_pSetMobjStateNF(lua_State *L)
{ {
mobj_t *mobj = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); mobj_t *mobj = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
@ -2266,6 +2408,7 @@ static int lib_pMobjTouchingSectorSpecial(lua_State *L)
return 1; return 1;
} }
// TODO: 2.3: Delete
static int lib_pThingOnSpecial3DFloor(lua_State *L) static int lib_pThingOnSpecial3DFloor(lua_State *L)
{ {
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
@ -3544,7 +3687,7 @@ static int lib_gAddGametype(lua_State *L)
// Partly lifted from Got_AddPlayer // Partly lifted from Got_AddPlayer
static int lib_gAddPlayer(lua_State *L) static int lib_gAddPlayer(lua_State *L)
{ {
INT16 i, newplayernum, botcount = 1; INT16 i, newplayernum;
player_t *newplayer; player_t *newplayer;
SINT8 skinnum = 0, bot; SINT8 skinnum = 0, bot;
@ -3552,10 +3695,8 @@ static int lib_gAddPlayer(lua_State *L)
{ {
if (!playeringame[i]) if (!playeringame[i])
break; break;
if (players[i].bot)
botcount++; // How many of us are there already?
} }
if (i >= MAXPLAYERS) if (i >= MAXPLAYERS)
{ {
lua_pushnil(L); lua_pushnil(L);
@ -3572,6 +3713,7 @@ static int lib_gAddPlayer(lua_State *L)
newplayer->jointime = 0; newplayer->jointime = 0;
newplayer->quittime = 0; newplayer->quittime = 0;
newplayer->lastinputtime = 0;
// Read the skin argument (defaults to Sonic) // Read the skin argument (defaults to Sonic)
if (!lua_isnoneornil(L, 1)) if (!lua_isnoneornil(L, 1))
@ -4081,6 +4223,7 @@ static luaL_Reg lib[] = {
{"P_CreateFloorSpriteSlope",lib_pCreateFloorSpriteSlope}, {"P_CreateFloorSpriteSlope",lib_pCreateFloorSpriteSlope},
{"P_RemoveFloorSpriteSlope",lib_pRemoveFloorSpriteSlope}, {"P_RemoveFloorSpriteSlope",lib_pRemoveFloorSpriteSlope},
{"P_RailThinker",lib_pRailThinker}, {"P_RailThinker",lib_pRailThinker},
{"P_CheckSkyHit",lib_pCheckSkyHit},
{"P_XYMovement",lib_pXYMovement}, {"P_XYMovement",lib_pXYMovement},
{"P_RingXYMovement",lib_pRingXYMovement}, {"P_RingXYMovement",lib_pRingXYMovement},
{"P_SceneryXYMovement",lib_pSceneryXYMovement}, {"P_SceneryXYMovement",lib_pSceneryXYMovement},
@ -4113,6 +4256,7 @@ static luaL_Reg lib[] = {
{"P_SpawnShieldOrb",lib_pSpawnShieldOrb}, {"P_SpawnShieldOrb",lib_pSpawnShieldOrb},
{"P_SpawnGhostMobj",lib_pSpawnGhostMobj}, {"P_SpawnGhostMobj",lib_pSpawnGhostMobj},
{"P_GivePlayerRings",lib_pGivePlayerRings}, {"P_GivePlayerRings",lib_pGivePlayerRings},
{"P_GivePlayerSpheres",lib_pGivePlayerSpheres},
{"P_GivePlayerLives",lib_pGivePlayerLives}, {"P_GivePlayerLives",lib_pGivePlayerLives},
{"P_GiveCoopLives",lib_pGiveCoopLives}, {"P_GiveCoopLives",lib_pGiveCoopLives},
{"P_ResetScore",lib_pResetScore}, {"P_ResetScore",lib_pResetScore},
@ -4125,6 +4269,7 @@ static luaL_Reg lib[] = {
{"P_DoPlayerFinish",lib_pDoPlayerFinish}, {"P_DoPlayerFinish",lib_pDoPlayerFinish},
{"P_DoPlayerExit",lib_pDoPlayerExit}, {"P_DoPlayerExit",lib_pDoPlayerExit},
{"P_InstaThrust",lib_pInstaThrust}, {"P_InstaThrust",lib_pInstaThrust},
{"P_InstaThrustEvenIn2D",lib_pInstaThrustEvenIn2D},
{"P_ReturnThrustX",lib_pReturnThrustX}, {"P_ReturnThrustX",lib_pReturnThrustX},
{"P_ReturnThrustY",lib_pReturnThrustY}, {"P_ReturnThrustY",lib_pReturnThrustY},
{"P_LookForEnemies",lib_pLookForEnemies}, {"P_LookForEnemies",lib_pLookForEnemies},
@ -4133,10 +4278,14 @@ static luaL_Reg lib[] = {
{"P_HomingAttack",lib_pHomingAttack}, {"P_HomingAttack",lib_pHomingAttack},
{"P_SuperReady",lib_pSuperReady}, {"P_SuperReady",lib_pSuperReady},
{"P_DoJump",lib_pDoJump}, {"P_DoJump",lib_pDoJump},
{"P_DoSpinDashDust",lib_pDoSpinDashDust},
{"P_SpawnThokMobj",lib_pSpawnThokMobj}, {"P_SpawnThokMobj",lib_pSpawnThokMobj},
{"P_SpawnSpinMobj",lib_pSpawnSpinMobj}, {"P_SpawnSpinMobj",lib_pSpawnSpinMobj},
{"P_Telekinesis",lib_pTelekinesis}, {"P_Telekinesis",lib_pTelekinesis},
{"P_SwitchShield",lib_pSwitchShield}, {"P_SwitchShield",lib_pSwitchShield},
{"P_DoTailsOverlay",lib_pDoTailsOverlay},
{"P_DoMetalJetFume",lib_pDoMetalJetFume},
{"P_DoFollowMobj",lib_pDoFollowMobj},
{"P_PlayerCanEnterSpinGaps",lib_pPlayerCanEnterSpinGaps}, {"P_PlayerCanEnterSpinGaps",lib_pPlayerCanEnterSpinGaps},
{"P_PlayerShouldUseSpinHeight",lib_pPlayerShouldUseSpinHeight}, {"P_PlayerShouldUseSpinHeight",lib_pPlayerShouldUseSpinHeight},
@ -4155,6 +4304,7 @@ static luaL_Reg lib[] = {
{"P_FloorzAtPos",lib_pFloorzAtPos}, {"P_FloorzAtPos",lib_pFloorzAtPos},
{"P_CeilingzAtPos",lib_pCeilingzAtPos}, {"P_CeilingzAtPos",lib_pCeilingzAtPos},
{"P_DoSpring",lib_pDoSpring}, {"P_DoSpring",lib_pDoSpring},
{"P_TouchSpecialThing",lib_pTouchSpecialThing},
{"P_TryCameraMove", lib_pTryCameraMove}, {"P_TryCameraMove", lib_pTryCameraMove},
{"P_TeleportCameraMove", lib_pTeleportCameraMove}, {"P_TeleportCameraMove", lib_pTeleportCameraMove},
@ -4178,6 +4328,8 @@ static luaL_Reg lib[] = {
// p_spec // p_spec
{"P_Thrust",lib_pThrust}, {"P_Thrust",lib_pThrust},
{"P_ThrustEvenIn2D",lib_pThrustEvenIn2D},
{"P_VectorInstaThrust",lib_pVectorInstaThrust},
{"P_SetMobjStateNF",lib_pSetMobjStateNF}, {"P_SetMobjStateNF",lib_pSetMobjStateNF},
{"P_DoSuperTransformation",lib_pDoSuperTransformation}, {"P_DoSuperTransformation",lib_pDoSuperTransformation},
{"P_ExplodeMissile",lib_pExplodeMissile}, {"P_ExplodeMissile",lib_pExplodeMissile},
@ -4302,8 +4454,7 @@ int LUA_BaseLib(lua_State *L)
// Set metatable for string // Set metatable for string
lua_pushliteral(L, ""); // dummy string lua_pushliteral(L, ""); // dummy string
lua_getmetatable(L, -1); // get string metatable lua_getmetatable(L, -1); // get string metatable
lua_pushcfunction(L,lib_concat); // push concatination function LUA_SetCFunctionField(L, "__add", lib_concat);
lua_setfield(L,-2,"__add"); // ... store it as mathematical addition
lua_pop(L, 2); // pop metatable and dummy string lua_pop(L, 2); // pop metatable and dummy string
lua_newtable(L); lua_newtable(L);

View file

@ -194,6 +194,7 @@ static int lib_comAddCommand(lua_State *L)
if (lua_gettop(L) >= 3) if (lua_gettop(L) >= 3)
{ // For the third argument, only take a boolean or a number. { // For the third argument, only take a boolean or a number.
lua_settop(L, 3); lua_settop(L, 3);
// TODO: 2.3: Remove boolean option
if (lua_type(L, 3) == LUA_TBOOLEAN) if (lua_type(L, 3) == LUA_TBOOLEAN)
{ {
CONS_Alert(CONS_WARNING, CONS_Alert(CONS_WARNING,
@ -374,6 +375,9 @@ static int lib_cvRegisterVar(lua_State *L)
size_t count = 0; size_t count = 0;
CV_PossibleValue_t *cvpv; CV_PossibleValue_t *cvpv;
const char * const MINMAX[2] = {"MIN", "MAX"};
int minmax_unset = 3;
lua_pushnil(L); lua_pushnil(L);
while (lua_next(L, 4)) while (lua_next(L, 4))
{ {
@ -392,16 +396,45 @@ static int lib_cvRegisterVar(lua_State *L)
lua_pushnil(L); lua_pushnil(L);
while (lua_next(L, 4)) while (lua_next(L, 4))
{ {
INT32 n;
const char * strval;
// stack: [...] PossibleValue table, index, value // stack: [...] PossibleValue table, index, value
// 4 5 6 // 4 5 6
if (lua_type(L, 5) != LUA_TSTRING if (lua_type(L, 5) != LUA_TSTRING
|| lua_type(L, 6) != LUA_TNUMBER) || lua_type(L, 6) != LUA_TNUMBER)
FIELDERROR("PossibleValue", "custom PossibleValue table requires a format of string=integer, i.e. {MIN=0, MAX=9999}"); FIELDERROR("PossibleValue", "custom PossibleValue table requires a format of string=integer, i.e. {MIN=0, MAX=9999}");
cvpv[i].strvalue = Z_StrDup(lua_tostring(L, 5));
cvpv[i].value = (INT32)lua_tonumber(L, 6); strval = lua_tostring(L, 5);
i++;
if (
stricmp(strval, MINMAX[n=0]) == 0 ||
stricmp(strval, MINMAX[n=1]) == 0
){
/* need to shift forward */
if (minmax_unset == 3)
{
memmove(&cvpv[2], &cvpv[0],
i * sizeof *cvpv);
i += 2;
}
cvpv[n].strvalue = MINMAX[n];
minmax_unset &= ~(1 << n);
}
else
{
n = i++;
cvpv[n].strvalue = Z_StrDup(strval);
}
cvpv[n].value = (INT32)lua_tonumber(L, 6);
lua_pop(L, 1); lua_pop(L, 1);
} }
if (minmax_unset && minmax_unset != 3)
FIELDERROR("PossibleValue", "custom PossibleValue table requires requires both MIN and MAX keys if one is present");
cvpv[i].value = 0; cvpv[i].value = 0;
cvpv[i].strvalue = NULL; cvpv[i].strvalue = NULL;
cvar->PossibleValue = cvpv; cvar->PossibleValue = cvpv;
@ -626,10 +659,7 @@ static int cvar_get(lua_State *L)
int LUA_ConsoleLib(lua_State *L) int LUA_ConsoleLib(lua_State *L)
{ {
// Metatable for consvar_t // Metatable for consvar_t
luaL_newmetatable(L, META_CVAR); LUA_RegisterUserdataMetatable(L, META_CVAR, cvar_get, NULL, NULL);
lua_pushcfunction(L, cvar_get);
lua_setfield(L, -2, "__index");
lua_pop(L,1);
cvar_fields_ref = Lua_CreateFieldTable(L, cvar_opt); cvar_fields_ref = Lua_CreateFieldTable(L, cvar_opt);

View file

@ -1206,19 +1206,11 @@ static int libd_height(lua_State *L)
return 1; return 1;
} }
static int libd_dupx(lua_State *L) static int libd_dup(lua_State *L)
{ {
HUDONLY HUDONLY
lua_pushinteger(L, vid.dupx); // push integral scale (patch scale) lua_pushinteger(L, vid.dup); // push integral scale (patch scale)
lua_pushfixed(L, vid.fdupx); // push fixed point scale (position scale) lua_pushfixed(L, vid.fdup); // push fixed point scale (position scale)
return 2;
}
static int libd_dupy(lua_State *L)
{
HUDONLY
lua_pushinteger(L, vid.dupy); // push integral scale (patch scale)
lua_pushfixed(L, vid.fdupy); // push fixed point scale (position scale)
return 2; return 2;
} }
@ -1338,8 +1330,8 @@ static luaL_Reg lib_draw[] = {
// properties // properties
{"width", libd_width}, {"width", libd_width},
{"height", libd_height}, {"height", libd_height},
{"dupx", libd_dupx}, {"dupx", libd_dup},
{"dupy", libd_dupy}, {"dupy", libd_dup},
{"renderer", libd_renderer}, {"renderer", libd_renderer},
{"localTransFlag", libd_getlocaltransflag}, {"localTransFlag", libd_getlocaltransflag},
{"userTransFlag", libd_getusertransflag}, {"userTransFlag", libd_getusertransflag},
@ -1404,52 +1396,16 @@ int LUA_HudLib(lua_State *L)
luaL_register(L, NULL, lib_draw); luaL_register(L, NULL, lib_draw);
lib_draw_ref = luaL_ref(L, LUA_REGISTRYINDEX); lib_draw_ref = luaL_ref(L, LUA_REGISTRYINDEX);
luaL_newmetatable(L, META_HUDINFO); LUA_RegisterUserdataMetatable(L, META_HUDINFO, hudinfo_get, hudinfo_set, hudinfo_num);
lua_pushcfunction(L, hudinfo_get); LUA_RegisterUserdataMetatable(L, META_COLORMAP, colormap_get, NULL, NULL);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_PATCH, patch_get, patch_set, NULL);
LUA_RegisterUserdataMetatable(L, META_CAMERA, camera_get, camera_set, NULL);
lua_pushcfunction(L, hudinfo_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, hudinfo_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getHudInfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_hudinfolen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "hudinfo");
luaL_newmetatable(L, META_COLORMAP);
lua_pushcfunction(L, colormap_get);
lua_setfield(L, -2, "__index");
lua_pop(L,1);
luaL_newmetatable(L, META_PATCH);
lua_pushcfunction(L, patch_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, patch_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L,1);
patch_fields_ref = Lua_CreateFieldTable(L, patch_opt); patch_fields_ref = Lua_CreateFieldTable(L, patch_opt);
luaL_newmetatable(L, META_CAMERA);
lua_pushcfunction(L, camera_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, camera_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L,1);
camera_fields_ref = Lua_CreateFieldTable(L, camera_opt); camera_fields_ref = Lua_CreateFieldTable(L, camera_opt);
LUA_RegisterGlobalUserdata(L, "hudinfo", lib_getHudInfo, NULL, lib_hudinfolen);
luaL_register(L, "hud", lib_hud); luaL_register(L, "hud", lib_hud);
return 0; return 0;
} }

View file

@ -318,6 +318,7 @@ static int PopPivotSubTable(spriteframepivot_t *pivot, lua_State *L, int stk, in
pivot[idx].x = (INT32)value; pivot[idx].x = (INT32)value;
else if (ikey == 2 || (key && fastcmp(key, "y"))) else if (ikey == 2 || (key && fastcmp(key, "y")))
pivot[idx].y = (INT32)value; pivot[idx].y = (INT32)value;
// TODO: 2.3: Delete
else if (ikey == 3 || (key && fastcmp(key, "rotaxis"))) else if (ikey == 3 || (key && fastcmp(key, "rotaxis")))
LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.") LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.")
else if (ikey == -1 && (key != NULL)) else if (ikey == -1 && (key != NULL))
@ -571,6 +572,7 @@ static int framepivot_get(lua_State *L)
lua_pushinteger(L, framepivot->x); lua_pushinteger(L, framepivot->x);
else if (fastcmp("y", field)) else if (fastcmp("y", field))
lua_pushinteger(L, framepivot->y); lua_pushinteger(L, framepivot->y);
// TODO: 2.3: Delete
else if (fastcmp("rotaxis", field)) else if (fastcmp("rotaxis", field))
{ {
LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed."); LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.");
@ -600,6 +602,7 @@ static int framepivot_set(lua_State *L)
framepivot->x = luaL_checkinteger(L, 3); framepivot->x = luaL_checkinteger(L, 3);
else if (fastcmp("y", field)) else if (fastcmp("y", field))
framepivot->y = luaL_checkinteger(L, 3); framepivot->y = luaL_checkinteger(L, 3);
// TODO: 2.3: delete
else if (fastcmp("rotaxis", field)) else if (fastcmp("rotaxis", field))
LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.") LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.")
else else
@ -1914,206 +1917,28 @@ int LUA_InfoLib(lua_State *L)
lua_newtable(L); lua_newtable(L);
lua_setfield(L, LUA_REGISTRYINDEX, LREG_ACTIONS); lua_setfield(L, LUA_REGISTRYINDEX, LREG_ACTIONS);
luaL_newmetatable(L, META_STATE); LUA_RegisterUserdataMetatable(L, META_STATE, state_get, state_set, state_num);
lua_pushcfunction(L, state_get); LUA_RegisterUserdataMetatable(L, META_MOBJINFO, mobjinfo_get, mobjinfo_set, mobjinfo_num);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_SKINCOLOR, skincolor_get, skincolor_set, skincolor_num);
LUA_RegisterUserdataMetatable(L, META_COLORRAMP, colorramp_get, colorramp_set, colorramp_len);
lua_pushcfunction(L, state_set); LUA_RegisterUserdataMetatable(L, META_SFXINFO, sfxinfo_get, sfxinfo_set, sfxinfo_num);
lua_setfield(L, -2, "__newindex"); LUA_RegisterUserdataMetatable(L, META_SPRITEINFO, spriteinfo_get, spriteinfo_set, spriteinfo_num);
LUA_RegisterUserdataMetatable(L, META_PIVOTLIST, pivotlist_get, pivotlist_set, pivotlist_num);
lua_pushcfunction(L, state_num); LUA_RegisterUserdataMetatable(L, META_FRAMEPIVOT, framepivot_get, framepivot_set, framepivot_num);
lua_setfield(L, -2, "__len"); LUA_RegisterUserdataMetatable(L, META_LUABANKS, lib_getluabanks, lib_setluabanks, lib_luabankslen);
lua_pop(L, 1);
luaL_newmetatable(L, META_MOBJINFO);
lua_pushcfunction(L, mobjinfo_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, mobjinfo_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, mobjinfo_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
mobjinfo_fields_ref = Lua_CreateFieldTable(L, mobjinfo_opt); mobjinfo_fields_ref = Lua_CreateFieldTable(L, mobjinfo_opt);
luaL_newmetatable(L, META_SKINCOLOR); LUA_RegisterGlobalUserdata(L, "sprnames", lib_getSprname, NULL, lib_sprnamelen);
lua_pushcfunction(L, skincolor_get); LUA_RegisterGlobalUserdata(L, "spr2names", lib_getSpr2name, NULL, lib_spr2namelen);
lua_setfield(L, -2, "__index"); LUA_RegisterGlobalUserdata(L, "spr2defaults", lib_getSpr2default, lib_setSpr2default, lib_spr2namelen);
LUA_RegisterGlobalUserdata(L, "states", lib_getState, lib_setState, lib_statelen);
lua_pushcfunction(L, skincolor_set); LUA_RegisterGlobalUserdata(L, "mobjinfo", lib_getMobjInfo, lib_setMobjInfo, lib_mobjinfolen);
lua_setfield(L, -2, "__newindex"); LUA_RegisterGlobalUserdata(L, "skincolors", lib_getSkinColor, lib_setSkinColor, lib_skincolorslen);
LUA_RegisterGlobalUserdata(L, "spriteinfo", lib_getSpriteInfo, lib_setSpriteInfo, lib_spriteinfolen);
lua_pushcfunction(L, skincolor_num); LUA_RegisterGlobalUserdata(L, "sfxinfo", lib_getSfxInfo, lib_setSfxInfo, lib_sfxlen);
lua_setfield(L, -2, "__len"); // TODO: 2.3: Delete this alias
lua_pop(L, 1); LUA_RegisterGlobalUserdata(L, "S_sfx", lib_getSfxInfo, lib_setSfxInfo, lib_sfxlen);
luaL_newmetatable(L, META_COLORRAMP);
lua_pushcfunction(L, colorramp_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, colorramp_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, colorramp_len);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
luaL_newmetatable(L, META_SFXINFO);
lua_pushcfunction(L, sfxinfo_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, sfxinfo_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, sfxinfo_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_SPRITEINFO);
lua_pushcfunction(L, spriteinfo_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, spriteinfo_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, spriteinfo_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_PIVOTLIST);
lua_pushcfunction(L, pivotlist_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, pivotlist_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, pivotlist_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_FRAMEPIVOT);
lua_pushcfunction(L, framepivot_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, framepivot_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, framepivot_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSprname);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_sprnamelen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "sprnames");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSpr2name);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_spr2namelen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "spr2names");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSpr2default);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setSpr2default);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_spr2namelen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "spr2defaults");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getState);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setState);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_statelen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "states");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getMobjInfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setMobjInfo);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_mobjinfolen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "mobjinfo");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSkinColor);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setSkinColor);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_skincolorslen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "skincolors");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSfxInfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setSfxInfo);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_sfxlen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_pushvalue(L, -1);
lua_setglobal(L, "S_sfx");
lua_setglobal(L, "sfxinfo");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSpriteInfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setSpriteInfo);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_spriteinfolen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "spriteinfo");
luaL_newmetatable(L, META_LUABANKS);
lua_pushcfunction(L, lib_getluabanks);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setluabanks);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_luabankslen);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
return 0; return 0;
} }

View file

@ -20,6 +20,7 @@
#include "lua_libs.h" #include "lua_libs.h"
boolean mousegrabbedbylua = true; boolean mousegrabbedbylua = true;
boolean ignoregameinputs = false;
/////////////// ///////////////
// FUNCTIONS // // FUNCTIONS //
@ -145,6 +146,51 @@ static luaL_Reg lib[] = {
{NULL, NULL} {NULL, NULL}
}; };
///////////////
// VARIABLES //
///////////////
static int lib_get(lua_State *L)
{
const char *field = luaL_checkstring(L, 2);
if (fastcmp(field, "mouse"))
{
LUA_PushUserdata(L, &mouse, META_MOUSE);
return 1;
}
else if (fastcmp(field, "mouse2"))
{
LUA_PushUserdata(L, &mouse2, META_MOUSE);
return 1;
}
else if (fastcmp(field, "ignoregameinputs"))
{
lua_pushboolean(L, ignoregameinputs);
return 1;
}
else
{
return 0;
}
}
static int lib_set(lua_State *L)
{
const char *field = luaL_checkstring(L, 2);
if (fastcmp(field, "ignoregameinputs"))
{
ignoregameinputs = luaL_checkboolean(L, 3);
}
else
{
lua_rawset(L, 1);
}
return 0;
}
/////////////////// ///////////////////
// gamekeydown[] // // gamekeydown[] //
/////////////////// ///////////////////
@ -239,32 +285,18 @@ static int mouse_num(lua_State *L)
int LUA_InputLib(lua_State *L) int LUA_InputLib(lua_State *L)
{ {
lua_newuserdata(L, 0); LUA_RegisterUserdataMetatable(L, META_KEYEVENT, keyevent_get, NULL, NULL);
lua_createtable(L, 0, 2); LUA_RegisterUserdataMetatable(L, META_MOUSE, mouse_get, NULL, mouse_num);
lua_pushcfunction(L, lib_getGameKeyDown);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setGameKeyDown);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_lenGameKeyDown);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "gamekeydown");
luaL_newmetatable(L, META_KEYEVENT);
lua_pushcfunction(L, keyevent_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_MOUSE);
lua_pushcfunction(L, mouse_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, mouse_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
// Register the library, then add __index and __newindex
// metamethods to it to allow global variables
luaL_register(L, "input", lib); luaL_register(L, "input", lib);
LUA_CreateAndSetMetatable(L, lib_get, lib_set, NULL, false);
LUA_CreateAndSetUserdataField(L, -1, "gamekeydown", lib_getGameKeyDown, lib_setGameKeyDown, lib_lenGameKeyDown, false);
// TODO: 2.3: Delete this alias (moved to input library)
LUA_RegisterGlobalUserdata(L, "gamekeydown", lib_getGameKeyDown, lib_setGameKeyDown, lib_lenGameKeyDown);
lua_pop(L, 1);
return 0; return 0;
} }

View file

@ -13,6 +13,7 @@
extern lua_State *gL; extern lua_State *gL;
extern boolean mousegrabbedbylua; extern boolean mousegrabbedbylua;
extern boolean ignoregameinputs;
#define MUTABLE_TAGS #define MUTABLE_TAGS

View file

@ -35,7 +35,7 @@ enum sector_e {
sector_floorpic, sector_floorpic,
sector_floorxoffset, sector_floorxoffset,
sector_flooryoffset, sector_flooryoffset,
sector_floorangle, sector_floorangle,
sector_ceilingpic, sector_ceilingpic,
sector_ceilingxoffset, sector_ceilingxoffset,
sector_ceilingyoffset, sector_ceilingyoffset,
@ -43,7 +43,7 @@ enum sector_e {
sector_lightlevel, sector_lightlevel,
sector_floorlightlevel, sector_floorlightlevel,
sector_floorlightabsolute, sector_floorlightabsolute,
sector_floorlightsec, sector_floorlightsec,
sector_ceilinglightlevel, sector_ceilinglightlevel,
sector_ceilinglightabsolute, sector_ceilinglightabsolute,
sector_ceilinglightsec, sector_ceilinglightsec,
@ -77,14 +77,14 @@ static const char *const sector_opt[] = {
"ceilingpic", "ceilingpic",
"ceilingxoffset", "ceilingxoffset",
"ceilingyoffset", "ceilingyoffset",
"ceilingangle", "ceilingangle",
"lightlevel", "lightlevel",
"floorlightlevel", "floorlightlevel",
"floorlightabsolute", "floorlightabsolute",
"floorlightsec", "floorlightsec",
"ceilinglightlevel", "ceilinglightlevel",
"ceilinglightabsolute", "ceilinglightabsolute",
"ceilinglightsec", "ceilinglightsec",
"special", "special",
"tag", "tag",
"taglist", "taglist",
@ -663,11 +663,11 @@ static int sector_get(lua_State *L)
lua_pushfixed(L, sector->flooryoffset); lua_pushfixed(L, sector->flooryoffset);
return 1; return 1;
} }
case sector_floorangle: case sector_floorangle:
{ {
lua_pushangle(L, sector->floorangle); lua_pushangle(L, sector->floorangle);
return 1; return 1;
} }
case sector_ceilingpic: // ceilingpic case sector_ceilingpic: // ceilingpic
{ {
levelflat_t *levelflat = &levelflats[sector->ceilingpic]; levelflat_t *levelflat = &levelflats[sector->ceilingpic];
@ -691,7 +691,7 @@ static int sector_get(lua_State *L)
{ {
lua_pushangle(L, sector->ceilingangle); lua_pushangle(L, sector->ceilingangle);
return 1; return 1;
} }
case sector_lightlevel: case sector_lightlevel:
lua_pushinteger(L, sector->lightlevel); lua_pushinteger(L, sector->lightlevel);
return 1; return 1;
@ -703,7 +703,7 @@ static int sector_get(lua_State *L)
return 1; return 1;
case sector_floorlightsec: case sector_floorlightsec:
lua_pushinteger(L, sector->floorlightsec); lua_pushinteger(L, sector->floorlightsec);
return 1; return 1;
case sector_ceilinglightlevel: case sector_ceilinglightlevel:
lua_pushinteger(L, sector->ceilinglightlevel); lua_pushinteger(L, sector->ceilinglightlevel);
return 1; return 1;
@ -712,7 +712,7 @@ static int sector_get(lua_State *L)
return 1; return 1;
case sector_ceilinglightsec: case sector_ceilinglightsec:
lua_pushinteger(L, sector->ceilinglightsec); lua_pushinteger(L, sector->ceilinglightsec);
return 1; return 1;
case sector_special: case sector_special:
lua_pushinteger(L, sector->special); lua_pushinteger(L, sector->special);
return 1; return 1;
@ -842,7 +842,7 @@ static int sector_set(lua_State *L)
break; break;
case sector_floorangle: case sector_floorangle:
sector->floorangle = luaL_checkangle(L, 3); sector->floorangle = luaL_checkangle(L, 3);
break; break;
case sector_ceilingpic: case sector_ceilingpic:
sector->ceilingpic = P_AddLevelFlatRuntime(luaL_checkstring(L, 3)); sector->ceilingpic = P_AddLevelFlatRuntime(luaL_checkstring(L, 3));
break; break;
@ -866,7 +866,7 @@ static int sector_set(lua_State *L)
break; break;
case sector_floorlightsec: case sector_floorlightsec:
sector->floorlightsec = (INT32)luaL_checkinteger(L, 3); sector->floorlightsec = (INT32)luaL_checkinteger(L, 3);
break; break;
case sector_ceilinglightlevel: case sector_ceilinglightlevel:
sector->ceilinglightlevel = (INT16)luaL_checkinteger(L, 3); sector->ceilinglightlevel = (INT16)luaL_checkinteger(L, 3);
break; break;
@ -875,7 +875,7 @@ static int sector_set(lua_State *L)
break; break;
case sector_ceilinglightsec: case sector_ceilinglightsec:
sector->ceilinglightsec = (INT32)luaL_checkinteger(L, 3); sector->ceilinglightsec = (INT32)luaL_checkinteger(L, 3);
break; break;
case sector_special: case sector_special:
sector->special = (INT16)luaL_checkinteger(L, 3); sector->special = (INT16)luaL_checkinteger(L, 3);
break; break;
@ -1043,17 +1043,7 @@ 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 // TODO: 2.3: Always return a unsigned value
// 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:
@ -1108,6 +1098,7 @@ static int line_get(lua_State *L)
case line_polyobj: case line_polyobj:
LUA_PushUserdata(L, line->polyobj, META_POLYOBJ); LUA_PushUserdata(L, line->polyobj, META_POLYOBJ);
return 1; return 1;
// TODO: 2.3: Delete
case line_text: case line_text:
{ {
if (udmf) if (udmf)
@ -1241,6 +1232,7 @@ static int side_get(lua_State *L)
case side_repeatcnt: case side_repeatcnt:
lua_pushinteger(L, side->repeatcnt); lua_pushinteger(L, side->repeatcnt);
return 1; return 1;
// TODO: 2.3: Delete
case side_text: case side_text:
{ {
if (udmf) if (udmf)
@ -2843,170 +2835,36 @@ static int mapheaderinfo_get(lua_State *L)
int LUA_MapLib(lua_State *L) int LUA_MapLib(lua_State *L)
{ {
luaL_newmetatable(L, META_SECTORLINES); LUA_RegisterUserdataMetatable(L, META_SECTORLINES, sectorlines_get, NULL, sectorlines_num);
lua_pushcfunction(L, sectorlines_get); LUA_RegisterUserdataMetatable(L, META_SECTOR, sector_get, sector_set, sector_num);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_SUBSECTOR, subsector_get, NULL, subsector_num);
LUA_RegisterUserdataMetatable(L, META_LINE, line_get, NULL, line_num);
lua_pushcfunction(L, sectorlines_num); LUA_RegisterUserdataMetatable(L, META_LINEARGS, lineargs_get, NULL, lineargs_len);
lua_setfield(L, -2, "__len"); LUA_RegisterUserdataMetatable(L, META_LINESTRINGARGS, linestringargs_get, NULL, linestringargs_len);
lua_pop(L, 1); LUA_RegisterUserdataMetatable(L, META_SIDENUM, sidenum_get, NULL, NULL);
LUA_RegisterUserdataMetatable(L, META_SIDE, side_get, side_set, side_num);
luaL_newmetatable(L, META_SECTOR); LUA_RegisterUserdataMetatable(L, META_VERTEX, vertex_get, NULL, vertex_num);
lua_pushcfunction(L, sector_get); LUA_RegisterUserdataMetatable(L, META_FFLOOR, ffloor_get, ffloor_set, NULL);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_BBOX, bbox_get, NULL, NULL);
LUA_RegisterUserdataMetatable(L, META_SLOPE, slope_get, slope_set, NULL);
lua_pushcfunction(L, sector_set); LUA_RegisterUserdataMetatable(L, META_VECTOR2, vector2_get, NULL, NULL);
lua_setfield(L, -2, "__newindex"); LUA_RegisterUserdataMetatable(L, META_VECTOR3, vector3_get, NULL, NULL);
LUA_RegisterUserdataMetatable(L, META_MAPHEADER, mapheaderinfo_get, NULL, NULL);
lua_pushcfunction(L, sector_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
sector_fields_ref = Lua_CreateFieldTable(L, sector_opt); sector_fields_ref = Lua_CreateFieldTable(L, sector_opt);
luaL_newmetatable(L, META_SUBSECTOR);
lua_pushcfunction(L, subsector_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, subsector_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
subsector_fields_ref = Lua_CreateFieldTable(L, subsector_opt); subsector_fields_ref = Lua_CreateFieldTable(L, subsector_opt);
luaL_newmetatable(L, META_LINE);
lua_pushcfunction(L, line_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, line_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
line_fields_ref = Lua_CreateFieldTable(L, line_opt); line_fields_ref = Lua_CreateFieldTable(L, line_opt);
luaL_newmetatable(L, META_LINEARGS);
lua_pushcfunction(L, lineargs_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lineargs_len);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_LINESTRINGARGS);
lua_pushcfunction(L, linestringargs_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, linestringargs_len);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_SIDENUM);
lua_pushcfunction(L, sidenum_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_SIDE);
lua_pushcfunction(L, side_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, side_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, side_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
side_fields_ref = Lua_CreateFieldTable(L, side_opt); side_fields_ref = Lua_CreateFieldTable(L, side_opt);
luaL_newmetatable(L, META_VERTEX);
lua_pushcfunction(L, vertex_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, vertex_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
vertex_fields_ref = Lua_CreateFieldTable(L, vertex_opt); vertex_fields_ref = Lua_CreateFieldTable(L, vertex_opt);
luaL_newmetatable(L, META_FFLOOR);
lua_pushcfunction(L, ffloor_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, ffloor_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L, 1);
ffloor_fields_ref = Lua_CreateFieldTable(L, ffloor_opt); ffloor_fields_ref = Lua_CreateFieldTable(L, ffloor_opt);
#ifdef HAVE_LUA_SEGS
luaL_newmetatable(L, META_SEG);
lua_pushcfunction(L, seg_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, seg_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
seg_fields_ref = Lua_CreateFieldTable(L, seg_opt);
luaL_newmetatable(L, META_NODE);
lua_pushcfunction(L, node_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, node_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
node_fields_ref = Lua_CreateFieldTable(L, node_opt);
luaL_newmetatable(L, META_NODEBBOX);
//lua_pushcfunction(L, nodebbox_get);
//lua_setfield(L, -2, "__index");
lua_pushcfunction(L, nodebbox_call);
lua_setfield(L, -2, "__call");
lua_pop(L, 1);
luaL_newmetatable(L, META_NODECHILDREN);
lua_pushcfunction(L, nodechildren_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
#endif
luaL_newmetatable(L, META_BBOX);
lua_pushcfunction(L, bbox_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_SLOPE);
lua_pushcfunction(L, slope_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, slope_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L, 1);
slope_fields_ref = Lua_CreateFieldTable(L, slope_opt); slope_fields_ref = Lua_CreateFieldTable(L, slope_opt);
luaL_newmetatable(L, META_VECTOR2);
lua_pushcfunction(L, vector2_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_VECTOR3);
lua_pushcfunction(L, vector3_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_MAPHEADER);
lua_pushcfunction(L, mapheaderinfo_get);
lua_setfield(L, -2, "__index");
//lua_pushcfunction(L, mapheaderinfo_num);
//lua_setfield(L, -2, "__len");
lua_pop(L, 1);
mapheaderinfo_fields_ref = Lua_CreateFieldTable(L, mapheaderinfo_opt); mapheaderinfo_fields_ref = Lua_CreateFieldTable(L, mapheaderinfo_opt);
LUA_RegisterGlobalUserdata(L, "subsectors", lib_getSubsector, NULL, lib_numsubsectors);
LUA_RegisterGlobalUserdata(L, "sides", lib_getSide, NULL, lib_numsides);
LUA_RegisterGlobalUserdata(L, "vertexes", lib_getVertex, NULL, lib_numvertexes);
LUA_RegisterGlobalUserdata(L, "mapheaderinfo", lib_getMapheaderinfo, NULL, lib_nummapheaders);
LUA_PushTaggableObjectArray(L, "sectors", LUA_PushTaggableObjectArray(L, "sectors",
lib_iterateSectors, lib_iterateSectors,
lib_getSector, lib_getSector,
@ -3015,16 +2873,6 @@ int LUA_MapLib(lua_State *L)
&numsectors, &sectors, &numsectors, &sectors,
sizeof (sector_t), META_SECTOR); sizeof (sector_t), META_SECTOR);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSubsector);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numsubsectors);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "subsectors");
LUA_PushTaggableObjectArray(L, "lines", LUA_PushTaggableObjectArray(L, "lines",
lib_iterateLines, lib_iterateLines,
lib_getLine, lib_getLine,
@ -3033,56 +2881,22 @@ int LUA_MapLib(lua_State *L)
&numlines, &lines, &numlines, &lines,
sizeof (line_t), META_LINE); sizeof (line_t), META_LINE);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSide);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numsides);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "sides");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getVertex);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numvertexes);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "vertexes");
#ifdef HAVE_LUA_SEGS #ifdef HAVE_LUA_SEGS
lua_newuserdata(L, 0); LUA_RegisterUserdataMetatable(L, META_SEG, seg_get, NULL, seg_num);
lua_createtable(L, 0, 2); LUA_RegisterUserdataMetatable(L, META_NODE, node_get, NULL, node_num);
lua_pushcfunction(L, lib_getSeg); LUA_RegisterUserdataMetatable(L, META_NODECHILDREN, nodechildren_get, NULL, NULL);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numsegs); seg_fields_ref = Lua_CreateFieldTable(L, seg_opt);
lua_setfield(L, -2, "__len"); node_fields_ref = Lua_CreateFieldTable(L, node_opt);
lua_setmetatable(L, -2);
lua_setglobal(L, "segs");
lua_newuserdata(L, 0); luaL_newmetatable(L, META_NODEBBOX);
lua_createtable(L, 0, 2); //LUA_SetCFunctionField(L, "__index", nodebbox_get);
lua_pushcfunction(L, lib_getNode); LUA_SetCFunctionField(L, "__call", nodebbox_call);
lua_setfield(L, -2, "__index"); lua_pop(L, 1);
lua_pushcfunction(L, lib_numnodes); LUA_RegisterGlobalUserdata(L, "segs", lib_getSeg, NULL, lib_numsegs);
lua_setfield(L, -2, "__len"); LUA_RegisterGlobalUserdata(L, "nodes", lib_getNode, NULL, lib_numnodes);
lua_setmetatable(L, -2);
lua_setglobal(L, "nodes");
#endif #endif
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getMapheaderinfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_nummapheaders);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "mapheaderinfo");
return 0; return 0;
} }

View file

@ -125,6 +125,7 @@ static int lib_fixeddiv(lua_State *L)
return 1; return 1;
} }
// TODO: 2.3: Delete
static int lib_fixedrem(lua_State *L) static int lib_fixedrem(lua_State *L)
{ {
LUA_Deprecated(L, "FixedRem(a, b)", "a % b"); LUA_Deprecated(L, "FixedRem(a, b)", "a % b");

View file

@ -1163,43 +1163,12 @@ static int lib_nummapthings(lua_State *L)
int LUA_MobjLib(lua_State *L) int LUA_MobjLib(lua_State *L)
{ {
luaL_newmetatable(L, META_MOBJ); LUA_RegisterUserdataMetatable(L, META_MOBJ, mobj_get, mobj_set, NULL);
lua_pushcfunction(L, mobj_get); LUA_RegisterUserdataMetatable(L, META_THINGARGS, thingargs_get, NULL, thingargs_len);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_THINGSTRINGARGS, thingstringargs_get, NULL, thingstringargs_len);
LUA_RegisterUserdataMetatable(L, META_MAPTHING, mapthing_get, mapthing_set, mapthing_num);
lua_pushcfunction(L, mobj_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L,1);
mobj_fields_ref = Lua_CreateFieldTable(L, mobj_opt); mobj_fields_ref = Lua_CreateFieldTable(L, mobj_opt);
luaL_newmetatable(L, META_THINGARGS);
lua_pushcfunction(L, thingargs_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, thingargs_len);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_THINGSTRINGARGS);
lua_pushcfunction(L, thingstringargs_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, thingstringargs_len);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_MAPTHING);
lua_pushcfunction(L, mapthing_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, mapthing_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, mapthing_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
mapthing_fields_ref = Lua_CreateFieldTable(L, mapthing_opt); mapthing_fields_ref = Lua_CreateFieldTable(L, mapthing_opt);
LUA_PushTaggableObjectArray(L, "mapthings", LUA_PushTaggableObjectArray(L, "mapthings",

View file

@ -223,6 +223,7 @@ enum player_e
player_blocked, player_blocked,
player_jointime, player_jointime,
player_quittime, player_quittime,
player_lastinputtime,
player_ping, player_ping,
#ifdef HWRENDER #ifdef HWRENDER
player_fovadd, player_fovadd,
@ -371,6 +372,7 @@ static const char *const player_opt[] = {
"blocked", "blocked",
"jointime", "jointime",
"quittime", "quittime",
"lastinputtime",
"ping", "ping",
#ifdef HWRENDER #ifdef HWRENDER
"fovadd", "fovadd",
@ -407,7 +409,7 @@ static int player_get(lua_State *L)
case player_realmo: case player_realmo:
LUA_PushUserdata(L, plr->mo, META_MOBJ); LUA_PushUserdata(L, plr->mo, META_MOBJ);
break; break;
// Kept for backward-compatibility // TODO: 2.3: Kept for backward-compatibility
// Should be fixed to work like "realmo" later // Should be fixed to work like "realmo" later
case player_mo: case player_mo:
if (plr->spectator) if (plr->spectator)
@ -826,6 +828,9 @@ static int player_get(lua_State *L)
case player_quittime: case player_quittime:
lua_pushinteger(L, plr->quittime); lua_pushinteger(L, plr->quittime);
break; break;
case player_lastinputtime:
lua_pushinteger(L, plr->lastinputtime);
break;
case player_ping: case player_ping:
lua_pushinteger(L, playerpingtable[plr - players]); lua_pushinteger(L, playerpingtable[plr - players]);
break; break;
@ -1349,6 +1354,9 @@ static int player_set(lua_State *L)
case player_quittime: case player_quittime:
plr->quittime = (tic_t)luaL_checkinteger(L, 3); plr->quittime = (tic_t)luaL_checkinteger(L, 3);
break; break;
case player_lastinputtime:
plr->lastinputtime = (tic_t)luaL_checkinteger(L, 3);
break;
#ifdef HWRENDER #ifdef HWRENDER
case player_fovadd: case player_fovadd:
plr->fovadd = luaL_checkfixed(L, 3); plr->fovadd = luaL_checkfixed(L, 3);
@ -1523,48 +1531,13 @@ static int ticcmd_set(lua_State *L)
int LUA_PlayerLib(lua_State *L) int LUA_PlayerLib(lua_State *L)
{ {
luaL_newmetatable(L, META_PLAYER); LUA_RegisterUserdataMetatable(L, META_PLAYER, player_get, player_set, player_num);
lua_pushcfunction(L, player_get); LUA_RegisterUserdataMetatable(L, META_POWERS, power_get, power_set, power_len);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_TICCMD, ticcmd_get, ticcmd_set, NULL);
lua_pushcfunction(L, player_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, player_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
player_fields_ref = Lua_CreateFieldTable(L, player_opt); player_fields_ref = Lua_CreateFieldTable(L, player_opt);
luaL_newmetatable(L, META_POWERS);
lua_pushcfunction(L, power_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, power_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, power_len);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
luaL_newmetatable(L, META_TICCMD);
lua_pushcfunction(L, ticcmd_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, ticcmd_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L,1);
ticcmd_fields_ref = Lua_CreateFieldTable(L, ticcmd_opt); ticcmd_fields_ref = Lua_CreateFieldTable(L, ticcmd_opt);
lua_newuserdata(L, 0); LUA_RegisterGlobalUserdata(L, "players", lib_getPlayer, NULL, lib_lenPlayer);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getPlayer);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_lenPlayer);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "players");
return 0; return 0;
} }

View file

@ -447,41 +447,10 @@ static int lib_numPolyObjects(lua_State *L)
int LUA_PolyObjLib(lua_State *L) int LUA_PolyObjLib(lua_State *L)
{ {
luaL_newmetatable(L, META_POLYOBJVERTICES); LUA_RegisterUserdataMetatable(L, META_POLYOBJVERTICES, polyobjvertices_get, NULL, polyobjvertices_num);
lua_pushcfunction(L, polyobjvertices_get); LUA_RegisterUserdataMetatable(L, META_POLYOBJLINES, polyobjlines_get, NULL, polyobjlines_num);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_POLYOBJ, polyobj_get, polyobj_set, polyobj_num);
lua_pushcfunction(L, polyobjvertices_num); LUA_RegisterGlobalUserdata(L, "polyobjects", lib_getPolyObject, NULL, lib_numPolyObjects);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_POLYOBJLINES);
lua_pushcfunction(L, polyobjlines_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, polyobjlines_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_POLYOBJ);
lua_pushcfunction(L, polyobj_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, polyobj_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, polyobj_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getPolyObject);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numPolyObjects);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "polyobjects");
return 0; return 0;
} }

View file

@ -415,9 +415,11 @@ int LUA_PushGlobals(lua_State *L, const char *word)
} else if (fastcmp(word, "stagefailed")) { } else if (fastcmp(word, "stagefailed")) {
lua_pushboolean(L, stagefailed); lua_pushboolean(L, stagefailed);
return 1; return 1;
// TODO: 2.3: Deprecated (moved to the input library)
} else if (fastcmp(word, "mouse")) { } else if (fastcmp(word, "mouse")) {
LUA_PushUserdata(L, &mouse, META_MOUSE); LUA_PushUserdata(L, &mouse, META_MOUSE);
return 1; return 1;
// TODO: 2.3: Deprecated (moved to the input library)
} else if (fastcmp(word, "mouse2")) { } else if (fastcmp(word, "mouse2")) {
LUA_PushUserdata(L, &mouse2, META_MOUSE); LUA_PushUserdata(L, &mouse2, META_MOUSE);
return 1; return 1;
@ -576,8 +578,7 @@ static void LUA_ClearState(void)
// lock the global namespace // lock the global namespace
lua_getmetatable(L, LUA_GLOBALSINDEX); lua_getmetatable(L, LUA_GLOBALSINDEX);
lua_pushcfunction(L, setglobals); LUA_SetCFunctionField(L, "__newindex", setglobals);
lua_setfield(L, -2, "__newindex");
lua_newtable(L); lua_newtable(L);
lua_setfield(L, -2, "__metatable"); lua_setfield(L, -2, "__metatable");
lua_pop(L, 1); lua_pop(L, 1);
@ -1813,20 +1814,107 @@ void LUA_PushTaggableObjectArray
lua_newuserdata(L, 0); lua_newuserdata(L, 0);
lua_createtable(L, 0, 2); lua_createtable(L, 0, 2);
lua_createtable(L, 0, 2); lua_createtable(L, 0, 2);
lua_pushcfunction(L, iterator); LUA_SetCFunctionField(L, "iterate", iterator);
lua_setfield(L, -2, "iterate");
LUA_InsertTaggroupIterator(L, garray, LUA_InsertTaggroupIterator(L, garray,
max_elements, element_array, sizeof_element, meta); max_elements, element_array, sizeof_element, meta);
lua_createtable(L, 0, 1); lua_createtable(L, 0, 1);
lua_pushcfunction(L, indexer); LUA_SetCFunctionField(L, "__index", indexer);
lua_setfield(L, -2, "__index");
lua_setmetatable(L, -2); lua_setmetatable(L, -2);
lua_setfield(L, -2, "__index"); lua_setfield(L, -2, "__index");
lua_pushcfunction(L, counter); LUA_SetCFunctionField(L, "__len", counter);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2); lua_setmetatable(L, -2);
lua_setglobal(L, field); lua_setglobal(L, field);
} }
static void SetBasicMetamethods(
lua_State *L,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
)
{
if (get)
LUA_SetCFunctionField(L, "__index", get);
if (set)
LUA_SetCFunctionField(L, "__newindex", set);
if (len)
LUA_SetCFunctionField(L, "__len", len);
}
void LUA_SetCFunctionField(lua_State *L, const char *name, lua_CFunction value)
{
lua_pushcfunction(L, value);
lua_setfield(L, -2, name);
}
void LUA_RegisterUserdataMetatable(
lua_State *L,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
)
{
luaL_newmetatable(L, name);
SetBasicMetamethods(L, get, set, len);
lua_pop(L, 1);
}
// If keep is true, leaves the metatable on the stack.
// Otherwise, the stack size remains unchanged.
void LUA_CreateAndSetMetatable(
lua_State *L,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len,
boolean keep
)
{
lua_newtable(L);
SetBasicMetamethods(L, get, set, len);
lua_pushvalue(L, -1);
lua_setmetatable(L, -3);
if (!keep)
lua_pop(L, 1);
}
// If keep is true, leaves the userdata and metatable on the stack.
// Otherwise, the stack size remains unchanged.
void LUA_CreateAndSetUserdataField(
lua_State *L,
int index,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len,
boolean keep
)
{
if (index < 0 && index > LUA_REGISTRYINDEX)
index -= 3;
lua_newuserdata(L, 0);
LUA_CreateAndSetMetatable(L, get, set, len, true);
lua_pushvalue(L, -2);
lua_setfield(L, index, name);
if (!keep)
lua_pop(L, 2);
}
void LUA_RegisterGlobalUserdata(
lua_State *L,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
)
{
LUA_CreateAndSetUserdataField(L, LUA_GLOBALSINDEX, name, get, set, len, false);
}

View file

@ -73,6 +73,42 @@ void LUA_PushTaggableObjectArray
size_t sizeof_element, size_t sizeof_element,
const char *meta); const char *meta);
void LUA_SetCFunctionField(lua_State *L, const char *name, lua_CFunction value);
void LUA_RegisterUserdataMetatable(
lua_State *L,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
);
void LUA_CreateAndSetMetatable(
lua_State *L,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len,
boolean keep
);
void LUA_CreateAndSetUserdataField(
lua_State *L,
int index,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len,
boolean keep
);
void LUA_RegisterGlobalUserdata(
lua_State *L,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
);
void LUA_InsertTaggroupIterator void LUA_InsertTaggroupIterator
( lua_State *L, ( lua_State *L,
taggroup_t *garray[], taggroup_t *garray[],

View file

@ -373,49 +373,14 @@ static int sprite_get(lua_State *L)
int LUA_SkinLib(lua_State *L) int LUA_SkinLib(lua_State *L)
{ {
luaL_newmetatable(L, META_SKIN); LUA_RegisterUserdataMetatable(L, META_SKIN, skin_get, skin_set, skin_num);
lua_pushcfunction(L, skin_get); LUA_RegisterUserdataMetatable(L, META_SOUNDSID, soundsid_get, NULL, soundsid_num);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_SKINSPRITES, lib_getSkinSprite, NULL, lib_numSkinsSprites);
LUA_RegisterUserdataMetatable(L, META_SKINSPRITESLIST, sprite_get, NULL, NULL);
lua_pushcfunction(L, skin_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, skin_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
skin_fields_ref = Lua_CreateFieldTable(L, skin_opt); skin_fields_ref = Lua_CreateFieldTable(L, skin_opt);
luaL_newmetatable(L, META_SOUNDSID); LUA_RegisterGlobalUserdata(L, "skins", lib_getSkin, NULL, lib_numSkins);
lua_pushcfunction(L, soundsid_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, soundsid_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
luaL_newmetatable(L, META_SKINSPRITES);
lua_pushcfunction(L, lib_getSkinSprite);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numSkinsSprites);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
luaL_newmetatable(L, META_SKINSPRITESLIST);
lua_pushcfunction(L, sprite_get);
lua_setfield(L, -2, "__index");
lua_pop(L,1);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSkin);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numSkins);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "skins");
return 0; return 0;
} }

View file

@ -372,8 +372,7 @@ void LUA_InsertTaggroupIterator
lua_pushcclosure(L, lib_numTaggroupElements, 2); lua_pushcclosure(L, lib_numTaggroupElements, 2);
lua_setfield(L, -2, "__len"); lua_setfield(L, -2, "__len");
lua_pushcfunction(L, element_iterator); LUA_SetCFunctionField(L, "__call", element_iterator);
lua_setfield(L, -2, "__call");
lua_pushcclosure(L, lib_getTaggroup, 1); lua_pushcclosure(L, lib_getTaggroup, 1);
lua_setfield(L, -2, "tagged"); lua_setfield(L, -2, "tagged");
} }
@ -414,11 +413,9 @@ set_taglist_metatable(lua_State *L, const char *meta)
lua_setfenv(L, -2); lua_setfenv(L, -2);
lua_setfield(L, -2, "__index"); lua_setfield(L, -2, "__index");
lua_pushcfunction(L, taglist_len); LUA_SetCFunctionField(L, "__len", taglist_len);
lua_setfield(L, -2, "__len");
lua_pushcfunction(L, taglist_equal); LUA_SetCFunctionField(L, "__eq", taglist_equal);
lua_setfield(L, -2, "__eq");
#ifdef MUTABLE_TAGS #ifdef MUTABLE_TAGS
return luaL_ref(L, LUA_REGISTRYINDEX); return luaL_ref(L, LUA_REGISTRYINDEX);
#endif #endif
@ -426,17 +423,11 @@ set_taglist_metatable(lua_State *L, const char *meta)
int LUA_TagLib(lua_State *L) int LUA_TagLib(lua_State *L)
{ {
lua_newuserdata(L, 0); LUA_CreateAndSetUserdataField(L, LUA_GLOBALSINDEX, "tags", NULL, NULL, lib_numTags, true);
lua_createtable(L, 0, 2); lua_createtable(L, 0, 1);
lua_createtable(L, 0, 1); LUA_SetCFunctionField(L, "iterate", lib_iterateTags);
lua_pushcfunction(L, lib_iterateTags); lua_setfield(L, -2, "__index");
lua_setfield(L, -2, "iterate"); lua_pop(L, 2);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numTags);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "tags");
open_taglist(L); open_taglist(L);

View file

@ -127,8 +127,7 @@ static int lib_startIterate(lua_State *L)
int LUA_ThinkerLib(lua_State *L) int LUA_ThinkerLib(lua_State *L)
{ {
luaL_newmetatable(L, META_ITERATIONSTATE); luaL_newmetatable(L, META_ITERATIONSTATE);
lua_pushcfunction(L, iterationState_gc); LUA_SetCFunctionField(L, "__gc", iterationState_gc);
lua_setfield(L, -2, "__gc");
lua_pop(L, 1); lua_pop(L, 1);
lua_createtable(L, 0, 1); lua_createtable(L, 0, 1);

View file

@ -462,7 +462,7 @@ static void GIF_headwrite(void)
// Image width/height // Image width/height
if (gif_downscale) if (gif_downscale)
{ {
scrbuf_downscaleamt = vid.dupx; scrbuf_downscaleamt = vid.dup;
rwidth = (vid.width / scrbuf_downscaleamt); rwidth = (vid.width / scrbuf_downscaleamt);
rheight = (vid.height / scrbuf_downscaleamt); rheight = (vid.height / scrbuf_downscaleamt);
} }

View file

@ -214,7 +214,7 @@ static fixed_t lsoffs[2];
#define lshli levelselectselect[2] #define lshli levelselectselect[2]
#define lshseperation 101 #define lshseperation 101
#define lsbasevseperation ((62*vid.height)/(BASEVIDHEIGHT*vid.dupy)) //62 #define lsbasevseperation ((62*vid.height)/(BASEVIDHEIGHT*vid.dup)) //62
#define lsheadingheight 16 #define lsheadingheight 16
#define getheadingoffset(row) (levelselect.rows[row].header[0] ? lsheadingheight : 0) #define getheadingoffset(row) (levelselect.rows[row].header[0] ? lsheadingheight : 0)
#define lsvseperation(row) (lsbasevseperation + getheadingoffset(row)) #define lsvseperation(row) (lsbasevseperation + getheadingoffset(row))
@ -3574,16 +3574,16 @@ void M_Drawer(void)
{ {
if (customversionstring[0] != '\0') if (customversionstring[0] != '\0')
{ {
V_DrawThinString(vid.dupx, vid.height - 17*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT, "Mod version:"); V_DrawThinString(vid.dup, vid.height - 17*vid.dup, V_NOSCALESTART|V_TRANSLUCENT, "Mod version:");
V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, customversionstring); V_DrawThinString(vid.dup, vid.height - 9*vid.dup, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, customversionstring);
} }
else else
{ {
#ifdef DEVELOP // Development -- show revision / branch info #ifdef DEVELOP // Development -- show revision / branch info
V_DrawThinString(vid.dupx, vid.height - 17*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, compbranch); V_DrawThinString(vid.dup, vid.height - 17*vid.dup, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, compbranch);
V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, comprevision); V_DrawThinString(vid.dup, vid.height - 9*vid.dup, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, comprevision);
#else // Regular build #else // Regular build
V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s", VERSIONSTRING)); V_DrawThinString(vid.dup, vid.height - 9*vid.dup, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s", VERSIONSTRING));
#endif #endif
} }
} }
@ -5757,16 +5757,15 @@ static void M_DrawRecordAttackForeground(void)
INT32 i; INT32 i;
INT32 height = (fg->height / 2); INT32 height = (fg->height / 2);
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy);
for (i = -12; i < (BASEVIDHEIGHT/height) + 12; i++) for (i = -12; i < (BASEVIDHEIGHT/height) + 12; i++)
{ {
INT32 y = ((i*height) - (height - ((FixedInt(recatkdrawtimer*2))%height))); INT32 y = ((i*height) - (height - ((FixedInt(recatkdrawtimer*2))%height)));
// don't draw above the screen // don't draw above the screen
{ {
INT32 sy = FixedMul(y, dupz<<FRACBITS) >> FRACBITS; INT32 sy = FixedMul(y, vid.dup<<FRACBITS) >> FRACBITS;
if (vid.height != BASEVIDHEIGHT * dupz) if (vid.height != BASEVIDHEIGHT * vid.dup)
sy += (vid.height - (BASEVIDHEIGHT * dupz)) / 2; sy += (vid.height - (BASEVIDHEIGHT * vid.dup)) / 2;
if ((sy+height) < 0) if ((sy+height) < 0)
continue; continue;
} }
@ -5790,13 +5789,12 @@ static void M_DrawRecordAttackForeground(void)
static void M_DrawNightsAttackMountains(void) static void M_DrawNightsAttackMountains(void)
{ {
static fixed_t bgscrollx; static fixed_t bgscrollx;
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy);
patch_t *background = W_CachePatchName(curbgname, PU_PATCH); patch_t *background = W_CachePatchName(curbgname, PU_PATCH);
INT16 w = background->width; INT16 w = background->width;
INT32 x = FixedInt(-bgscrollx) % w; INT32 x = FixedInt(-bgscrollx) % w;
INT32 y = BASEVIDHEIGHT - (background->height * 2); INT32 y = BASEVIDHEIGHT - (background->height * 2);
if (vid.height != BASEVIDHEIGHT * dupz) if (vid.height != BASEVIDHEIGHT * vid.dup)
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 158); V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 158);
V_DrawFill(0, y+50, vid.width, BASEVIDHEIGHT, V_SNAPTOLEFT|31); V_DrawFill(0, y+50, vid.width, BASEVIDHEIGHT, V_SNAPTOLEFT|31);
@ -5952,7 +5950,7 @@ static void M_DrawLevelPlatterMenu(void)
} }
// draw from top to bottom // draw from top to bottom
while (y < (vid.height/vid.dupy)) while (y < (vid.height/vid.dup))
{ {
M_DrawLevelPlatterRow(iter, y); M_DrawLevelPlatterRow(iter, y);
y += lsvseperation(iter); y += lsvseperation(iter);
@ -7799,9 +7797,9 @@ static void M_DrawSoundTest(void)
} }
} }
y = (BASEVIDWIDTH-(vid.width/vid.dupx))/2; y = (BASEVIDWIDTH-(vid.width/vid.dup))/2;
V_DrawFill(y, 20, vid.width/vid.dupx, 24, 159); V_DrawFill(y, 20, vid.width/vid.dup, 24, 159);
{ {
static fixed_t st_scroll = -FRACUNIT; static fixed_t st_scroll = -FRACUNIT;
const char* titl; const char* titl;
@ -8371,8 +8369,8 @@ static void M_DrawLoadGameData(void)
INT32 i, prev_i = 1, savetodraw, x, y, hsep = 90; INT32 i, prev_i = 1, savetodraw, x, y, hsep = 90;
skin_t *charskin = NULL; skin_t *charskin = NULL;
if (vid.width != BASEVIDWIDTH*vid.dupx) if (vid.width != BASEVIDWIDTH*vid.dup)
hsep = (hsep*vid.width)/(BASEVIDWIDTH*vid.dupx); hsep = (hsep*vid.width)/(BASEVIDWIDTH*vid.dup);
for (i = 2; prev_i; i = -(i + ((UINT32)i >> 31))) // draws from outwards in; 2, -2, 1, -1, 0 for (i = 2; prev_i; i = -(i + ((UINT32)i >> 31))) // draws from outwards in; 2, -2, 1, -1, 0
{ {
@ -9357,7 +9355,7 @@ static void M_DrawSetupChoosePlayerMenu(void)
INT16 bgwidth = charbg->width; INT16 bgwidth = charbg->width;
INT16 fgwidth = charfg->width; INT16 fgwidth = charfg->width;
INT32 x, y; INT32 x, y;
INT32 w = (vid.width/vid.dupx); INT32 w = (vid.width/vid.dup);
if (abs(char_scroll) > FRACUNIT/4) if (abs(char_scroll) > FRACUNIT/4)
char_scroll -= FixedMul((char_scroll>>2), renderdeltatics); char_scroll -= FixedMul((char_scroll>>2), renderdeltatics);
@ -9393,7 +9391,7 @@ static void M_DrawSetupChoosePlayerMenu(void)
// Background and borders // Background and borders
V_DrawFill(0, 0, bgwidth, vid.height, V_SNAPTOTOP|colormap[101]); V_DrawFill(0, 0, bgwidth, vid.height, V_SNAPTOTOP|colormap[101]);
{ {
INT32 sw = (BASEVIDWIDTH * vid.dupx); INT32 sw = (BASEVIDWIDTH * vid.dup);
INT32 bw = (vid.width - sw) / 2; INT32 bw = (vid.width - sw) / 2;
col = colormap[106]; col = colormap[106];
if (bw) if (bw)
@ -10815,7 +10813,7 @@ void M_DrawMarathon(void)
const char *cvstring; const char *cvstring;
char *work; char *work;
angle_t fa; angle_t fa;
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy), xspan = (vid.width/dupz), yspan = (vid.height/dupz), diffx = (xspan - BASEVIDWIDTH)/2, diffy = (yspan - BASEVIDHEIGHT)/2, maxy = BASEVIDHEIGHT + diffy; INT32 xspan = (vid.width/vid.dup), yspan = (vid.height/vid.dup), diffx = (xspan - BASEVIDWIDTH)/2, diffy = (yspan - BASEVIDHEIGHT)/2, maxy = BASEVIDHEIGHT + diffy;
curbgxspeed = 0; curbgxspeed = 0;
curbgyspeed = 18; curbgyspeed = 18;
@ -10888,16 +10886,17 @@ void M_DrawMarathon(void)
INT32 trans = V_60TRANS+((cnt&~3)<<(V_ALPHASHIFT-2)); INT32 trans = V_60TRANS+((cnt&~3)<<(V_ALPHASHIFT-2));
INT32 height = fg->height / 2; INT32 height = fg->height / 2;
char patchname[7] = "CEMGx0"; char patchname[7] = "CEMGx0";
INT32 dup;
dupz = (w*7)/6; //(w*42*120)/(360*6); -- I don't know why this works but I'm not going to complain. dup = (w*7)/6; //(w*42*120)/(360*6); -- I don't know why this works but I'm not going to complain.
dupz = ((dupz>>FRACBITS) % height); dup = ((dup>>FRACBITS) % height);
y = height/2; y = height/2;
while (y+dupz >= -diffy) while (y+dup >= -diffy)
y -= height; y -= height;
while (y-2-dupz < maxy) while (y-2-dup < maxy)
{ {
V_DrawFixedPatch(((BASEVIDWIDTH-190)<<(FRACBITS-1)), (y-2-dupz)<<FRACBITS, FRACUNIT/2, trans, fg, NULL); V_DrawFixedPatch(((BASEVIDWIDTH-190)<<(FRACBITS-1)), (y-2-dup)<<FRACBITS, FRACUNIT/2, trans, fg, NULL);
V_DrawFixedPatch(((BASEVIDWIDTH+190)<<(FRACBITS-1)), (y+dupz)<<FRACBITS, FRACUNIT/2, trans|V_FLIP, fg, NULL); V_DrawFixedPatch(((BASEVIDWIDTH+190)<<(FRACBITS-1)), (y+dup)<<FRACBITS, FRACUNIT/2, trans|V_FLIP, fg, NULL);
y += height; y += height;
} }
@ -10915,16 +10914,16 @@ void M_DrawMarathon(void)
} }
height = 18; // prevents the need for the next line height = 18; // prevents the need for the next line
//dupz = (w*height)/18; //dup = (w*height)/18;
dupz = ((w>>FRACBITS) % height); dup = ((w>>FRACBITS) % height);
y = dupz+(height/4); y = dup+(height/4);
x = 105+dupz; x = 105+dup;
while (y >= -diffy) while (y >= -diffy)
{ {
x -= height; x -= height;
y -= height; y -= height;
} }
while (y-dupz < maxy && x < (xspan/2)) while (y-dup < maxy && x < (xspan/2))
{ {
V_DrawFill((BASEVIDWIDTH/2)-x-height, -diffy, height, diffy+y+height, 153); V_DrawFill((BASEVIDWIDTH/2)-x-height, -diffy, height, diffy+y+height, 153);
V_DrawFill((BASEVIDWIDTH/2)+x, (maxy-y)-height, height, height+y, 153); V_DrawFill((BASEVIDWIDTH/2)+x, (maxy-y)-height, height, height+y, 153);

View file

@ -989,7 +989,7 @@ static inline boolean M_PNGLib(void)
static void M_PNGFrame(png_structp png_ptr, png_infop png_info_ptr, png_bytep png_buf) static void M_PNGFrame(png_structp png_ptr, png_infop png_info_ptr, png_bytep png_buf)
{ {
png_uint_16 downscale = apng_downscale ? vid.dupx : 1; png_uint_16 downscale = apng_downscale ? vid.dup : 1;
png_uint_32 pitch = png_get_rowbytes(png_ptr, png_info_ptr); png_uint_32 pitch = png_get_rowbytes(png_ptr, png_info_ptr);
PNG_CONST png_uint_32 width = vid.width / downscale; PNG_CONST png_uint_32 width = vid.width / downscale;
@ -1055,7 +1055,7 @@ static boolean M_SetupaPNG(png_const_charp filename, png_bytep pal)
apng_downscale = (!!cv_apng_downscale.value); apng_downscale = (!!cv_apng_downscale.value);
downscale = apng_downscale ? vid.dupx : 1; downscale = apng_downscale ? vid.dup : 1;
apng_FILE = fopen(filename,"wb+"); // + mode for reading apng_FILE = fopen(filename,"wb+"); // + mode for reading
if (!apng_FILE) if (!apng_FILE)

View file

@ -96,7 +96,7 @@ void Ban_Load_File(boolean warning)
Ban_Clear(); Ban_Clear();
for (size_t i=0; fgets(buffer, (int)sizeof(buffer), f); i++) for (; fgets(buffer, (int)sizeof(buffer), f);)
{ {
address = strtok(buffer, " \t\r\n"); address = strtok(buffer, " \t\r\n");
mask = strtok(NULL, " \t\r\n"); mask = strtok(NULL, " \t\r\n");

View file

@ -113,6 +113,7 @@ consvar_t cv_blamecfail = CVAR_INIT ("blamecfail", "Off", CV_SAVE|CV_NETVAR, CV_
static CV_PossibleValue_t playbackspeed_cons_t[] = {{1, "MIN"}, {10, "MAX"}, {0, NULL}}; static CV_PossibleValue_t playbackspeed_cons_t[] = {{1, "MIN"}, {10, "MAX"}, {0, NULL}};
consvar_t cv_playbackspeed = CVAR_INIT ("playbackspeed", "1", 0, playbackspeed_cons_t, NULL); consvar_t cv_playbackspeed = CVAR_INIT ("playbackspeed", "1", 0, playbackspeed_cons_t, NULL);
consvar_t cv_idletime = CVAR_INIT ("idletime", "0", CV_SAVE, CV_Unsigned, NULL);
consvar_t cv_dedicatedidletime = CVAR_INIT ("dedicatedidletime", "10", CV_SAVE, CV_Unsigned, NULL); consvar_t cv_dedicatedidletime = CVAR_INIT ("dedicatedidletime", "10", CV_SAVE, CV_Unsigned, NULL);
void ResetNode(INT32 node) void ResetNode(INT32 node)
@ -226,6 +227,7 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
newplayer->jointime = 0; newplayer->jointime = 0;
newplayer->quittime = 0; newplayer->quittime = 0;
newplayer->lastinputtime = 0;
READSTRINGN(*p, player_names[newplayernum], MAXPLAYERNAME); READSTRINGN(*p, player_names[newplayernum], MAXPLAYERNAME);
@ -492,6 +494,10 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
HU_AddChatText(va("\x82*%s has been banned (%s)", player_names[pnum], reason), false); HU_AddChatText(va("\x82*%s has been banned (%s)", player_names[pnum], reason), false);
kickreason = KR_BAN; kickreason = KR_BAN;
break; break;
case KICK_MSG_IDLE:
HU_AddChatText(va("\x82*%s has left the game (Inactive for too long)", player_names[pnum]), false);
kickreason = KR_TIMEOUT;
break;
} }
if (pnum == consoleplayer) if (pnum == consoleplayer)
@ -507,6 +513,8 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
M_StartMessage(M_GetText("Server closed connection\n(synch failure)\nPress ESC\n"), NULL, MM_NOTHING); M_StartMessage(M_GetText("Server closed connection\n(synch failure)\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_PING_HIGH) else if (msg == KICK_MSG_PING_HIGH)
M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING); M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_IDLE)
M_StartMessage(M_GetText("Server closed connection\n(Inactive for too long)\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_BANNED) else if (msg == KICK_MSG_BANNED)
M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING); M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_CUSTOM_KICK) else if (msg == KICK_MSG_CUSTOM_KICK)
@ -1267,6 +1275,32 @@ static void UpdatePingTable(void)
} }
} }
static void IdleUpdate(void)
{
INT32 i;
if (!server || !netgame)
return;
for (i = 1; i < MAXPLAYERS; i++)
{
if (cv_idletime.value && playeringame[i] && playernode[i] != UINT8_MAX && !players[i].quittime && !players[i].spectator && !players[i].bot && !IsPlayerAdmin(i) && i != serverplayer)
{
if (players[i].cmd.forwardmove || players[i].cmd.sidemove || players[i].cmd.buttons)
players[i].lastinputtime = 0;
else
players[i].lastinputtime++;
if (players[i].lastinputtime > (tic_t)cv_idletime.value * TICRATE * 60)
{
players[i].lastinputtime = 0;
SendKick(i, KICK_MSG_IDLE | KICK_MSG_KEEP_BODY);
}
}
else
players[i].lastinputtime = 0;
}
}
// Handle timeouts to prevent definitive freezes from happenning // Handle timeouts to prevent definitive freezes from happenning
static void HandleNodeTimeouts(void) static void HandleNodeTimeouts(void)
{ {
@ -1299,6 +1333,8 @@ void NetKeepAlive(void)
GetPackets(); GetPackets();
IdleUpdate();
#ifdef MASTERSERVER #ifdef MASTERSERVER
MasterClient_Ticker(); MasterClient_Ticker();
#endif #endif
@ -1419,6 +1455,8 @@ void NetUpdate(void)
GetPackets(); // get packet from client or from server GetPackets(); // get packet from client or from server
IdleUpdate();
// The client sends the command after receiving from the server // The client sends the command after receiving from the server
// The server sends it before because this is better in single player // The server sends it before because this is better in single player

View file

@ -48,7 +48,7 @@ typedef enum
KR_TIMEOUT = 4, //Connection Timeout KR_TIMEOUT = 4, //Connection Timeout
KR_BAN = 5, //Banned by server KR_BAN = 5, //Banned by server
KR_LEAVE = 6, //Quit the game KR_LEAVE = 6, //Quit the game
KR_IDLE = 7, //Remained still for too long
} kickreason_t; } kickreason_t;
/* the max number of name changes in some time period */ /* the max number of name changes in some time period */
@ -73,7 +73,7 @@ extern UINT32 realpingtable[MAXPLAYERS];
extern UINT32 playerpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS];
extern tic_t servermaxping; extern tic_t servermaxping;
extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_dedicatedidletime; extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_idletime, cv_dedicatedidletime;
// Used in d_net, the only dependence // Used in d_net, the only dependence
void D_ClientServerInit(void); void D_ClientServerInit(void);

View file

@ -601,6 +601,7 @@ void D_RegisterServerCommands(void)
CV_RegisterVar(&cv_showjoinaddress); CV_RegisterVar(&cv_showjoinaddress);
CV_RegisterVar(&cv_blamecfail); CV_RegisterVar(&cv_blamecfail);
CV_RegisterVar(&cv_dedicatedidletime); CV_RegisterVar(&cv_dedicatedidletime);
CV_RegisterVar(&cv_idletime);
COM_AddCommand("ping", Command_Ping_f, COM_LUA); COM_AddCommand("ping", Command_Ping_f, COM_LUA);
CV_RegisterVar(&cv_nettimeout); CV_RegisterVar(&cv_nettimeout);
@ -1241,7 +1242,7 @@ static void SetColorLocal(INT32 playernum, UINT16 color)
// //
static void SendNameAndColor(void) static void SendNameAndColor(void)
{ {
char buf[MAXPLAYERNAME+6]; char buf[MAXPLAYERNAME+7];
char *p; char *p;
p = buf; p = buf;

View file

@ -331,6 +331,7 @@ typedef struct
#define KICK_MSG_PING_HIGH 6 #define KICK_MSG_PING_HIGH 6
#define KICK_MSG_CUSTOM_KICK 7 #define KICK_MSG_CUSTOM_KICK 7
#define KICK_MSG_CUSTOM_BAN 8 #define KICK_MSG_CUSTOM_BAN 8
#define KICK_MSG_IDLE 9
#define KICK_MSG_KEEP_BODY 0x80 #define KICK_MSG_KEEP_BODY 0x80
#endif #endif

View file

@ -204,6 +204,7 @@ void P_Earthquake(mobj_t *inflictor, mobj_t *source, fixed_t radius);
boolean P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user boolean P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user
boolean P_SuperReady(player_t *player); boolean P_SuperReady(player_t *player);
void P_DoJump(player_t *player, boolean soundandstate); void P_DoJump(player_t *player, boolean soundandstate);
void P_DoSpinDashDust(player_t *player);
#define P_AnalogMove(player) (P_ControlStyle(player) == CS_LMAOGALOG) #define P_AnalogMove(player) (P_ControlStyle(player) == CS_LMAOGALOG)
boolean P_TransferToNextMare(player_t *player); boolean P_TransferToNextMare(player_t *player);
UINT8 P_FindLowestMare(void); UINT8 P_FindLowestMare(void);
@ -214,6 +215,10 @@ void P_SpawnThokMobj(player_t *player);
void P_SpawnSpinMobj(player_t *player, mobjtype_t type); void P_SpawnSpinMobj(player_t *player, mobjtype_t type);
void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range); void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range);
void P_DoTailsOverlay(player_t *player, mobj_t *tails);
void P_DoMetalJetFume(player_t *player, mobj_t *fume);
void P_DoFollowMobj(player_t *player, mobj_t *followmobj);
void P_PlayLivesJingle(player_t *player); void P_PlayLivesJingle(player_t *player);
#define P_PlayRinglossSound(s) S_StartSound(s, (mariomode) ? sfx_mario8 : sfx_altow1 + P_RandomKey(4)); #define P_PlayRinglossSound(s) S_StartSound(s, (mariomode) ? sfx_mario8 : sfx_altow1 + P_RandomKey(4));
#define P_PlayDeathSound(s) S_StartSound(s, sfx_altdi1 + P_RandomKey(4)); #define P_PlayDeathSound(s) S_StartSound(s, sfx_altdi1 + P_RandomKey(4));
@ -298,6 +303,7 @@ void P_RunOverlays(void);
void P_HandleMinecartSegments(mobj_t *mobj); void P_HandleMinecartSegments(mobj_t *mobj);
void P_MobjThinker(mobj_t *mobj); void P_MobjThinker(mobj_t *mobj);
boolean P_RailThinker(mobj_t *mobj); boolean P_RailThinker(mobj_t *mobj);
boolean P_CheckSkyHit(mobj_t *mo, line_t *line);
void P_PushableThinker(mobj_t *mobj); void P_PushableThinker(mobj_t *mobj);
void P_SceneryThinker(mobj_t *mobj); void P_SceneryThinker(mobj_t *mobj);
@ -535,6 +541,9 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle
boolean P_SetMobjStateNF(mobj_t *mobj, statenum_t state); boolean P_SetMobjStateNF(mobj_t *mobj, statenum_t state);
boolean P_CheckMissileSpawn(mobj_t *th); boolean P_CheckMissileSpawn(mobj_t *th);
void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move); void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move);
void P_ThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move);
void P_VectorInstaThrust(fixed_t xa, fixed_t xb, fixed_t xc, fixed_t ya, fixed_t yb, fixed_t yc,
fixed_t za, fixed_t zb, fixed_t zc, fixed_t momentum, mobj_t *mo);
void P_DoSuperTransformation(player_t *player, boolean giverings); void P_DoSuperTransformation(player_t *player, boolean giverings);
void P_ExplodeMissile(mobj_t *mo); void P_ExplodeMissile(mobj_t *mo);
void P_CheckGravity(mobj_t *mo, boolean affect); void P_CheckGravity(mobj_t *mo, boolean affect);

View file

@ -3730,7 +3730,9 @@ void P_SlideMove(mobj_t *mo)
boolean papercol = false; boolean papercol = false;
vertex_t v1, v2; // fake vertexes vertex_t v1, v2; // fake vertexes
line_t junk; // fake linedef static line_t junk; // fake linedef
memset(&junk, 0x00, sizeof(junk));
if (tmhitthing && mo->z + mo->height > tmhitthing->z && mo->z < tmhitthing->z + tmhitthing->height) if (tmhitthing && mo->z + mo->height > tmhitthing->z && mo->z < tmhitthing->z + tmhitthing->height)
{ {

View file

@ -1779,14 +1779,15 @@ bustupdone:
// //
// P_CheckSkyHit // P_CheckSkyHit
// //
static boolean P_CheckSkyHit(mobj_t *mo) boolean P_CheckSkyHit(mobj_t *mo, line_t *line)
{ {
if (ceilingline && ceilingline->backsector if (line && (line->special == 41 ||
&& ceilingline->backsector->ceilingpic == skyflatnum (line->backsector
&& ceilingline->frontsector && line->backsector->ceilingpic == skyflatnum
&& ceilingline->frontsector->ceilingpic == skyflatnum && line->frontsector
&& (mo->z >= ceilingline->frontsector->ceilingheight && line->frontsector->ceilingpic == skyflatnum
|| mo->z >= ceilingline->backsector->ceilingheight)) && (mo->z >= line->frontsector->ceilingheight
|| mo->z >= line->backsector->ceilingheight))))
return true; return true;
return false; return false;
} }
@ -1893,7 +1894,7 @@ void P_XYMovement(mobj_t *mo)
mo->fuse += ((5 - mo->threshold) * TICRATE); mo->fuse += ((5 - mo->threshold) * TICRATE);
// Check for hit against sky here // Check for hit against sky here
if (P_CheckSkyHit(mo)) if (P_CheckSkyHit(mo, ceilingline))
{ {
// Hack to prevent missiles exploding // Hack to prevent missiles exploding
// against the sky. // against the sky.
@ -1913,7 +1914,7 @@ void P_XYMovement(mobj_t *mo)
mo->flags &= ~MF_STICKY; //Don't check again! mo->flags &= ~MF_STICKY; //Don't check again!
// Check for hit against sky here // Check for hit against sky here
if (P_CheckSkyHit(mo)) if (P_CheckSkyHit(mo, ceilingline))
{ {
// Hack to prevent missiles exploding // Hack to prevent missiles exploding
// against the sky. // against the sky.
@ -1972,7 +1973,7 @@ void P_XYMovement(mobj_t *mo)
else if (mo->flags & MF_MISSILE) else if (mo->flags & MF_MISSILE)
{ {
// explode a missile // explode a missile
if (P_CheckSkyHit(mo)) if (P_CheckSkyHit(mo, ceilingline))
{ {
// Hack to prevent missiles exploding // Hack to prevent missiles exploding
// against the sky. // against the sky.
@ -10544,6 +10545,7 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing)
case MT_SMALLGRABCHAIN: case MT_SMALLGRABCHAIN:
case MT_BIGGRABCHAIN: case MT_BIGGRABCHAIN:
case MT_BLUESPRINGBALL:
case MT_YELLOWSPRINGBALL: case MT_YELLOWSPRINGBALL:
case MT_REDSPRINGBALL: case MT_REDSPRINGBALL:
@ -10571,14 +10573,14 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing)
case MT_EXPLOSIONRING: case MT_EXPLOSIONRING:
case MT_SCATTERRING: case MT_SCATTERRING:
case MT_GRENADERING: case MT_GRENADERING:
case MT_BOUNCEPICKUP: case MT_BOUNCEPICKUP:
case MT_RAILPICKUP: case MT_RAILPICKUP:
case MT_AUTOPICKUP: case MT_AUTOPICKUP:
case MT_EXPLODEPICKUP: case MT_EXPLODEPICKUP:
case MT_SCATTERPICKUP: case MT_SCATTERPICKUP:
case MT_GRENADEPICKUP: case MT_GRENADEPICKUP:
case MT_REDRING: case MT_REDRING:
case MT_THROWNBOUNCE: case MT_THROWNBOUNCE:
case MT_THROWNINFINITY: case MT_THROWNINFINITY:
@ -13319,7 +13321,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
return true; return true;
} }
// Pre-UDMF backwards compatibility stuff. Remove for 2.3 // TODO: 2.3: Delete (Pre-UDMF backwards compatibility stuff)
static void P_SetAmbush(mapthing_t *mthing, mobj_t *mobj) static void P_SetAmbush(mapthing_t *mthing, mobj_t *mobj)
{ {
if (mobj->type == MT_NIGHTSBUMPER if (mobj->type == MT_NIGHTSBUMPER

View file

@ -175,7 +175,7 @@ static void P_NetArchivePlayers(void)
WRITEUINT16(save_p, players[i].flashpal); WRITEUINT16(save_p, players[i].flashpal);
WRITEUINT16(save_p, players[i].flashcount); WRITEUINT16(save_p, players[i].flashcount);
WRITEUINT8(save_p, players[i].skincolor); WRITEUINT16(save_p, players[i].skincolor);
WRITEINT32(save_p, players[i].skin); WRITEINT32(save_p, players[i].skin);
WRITEUINT32(save_p, players[i].availabilities); WRITEUINT32(save_p, players[i].availabilities);
WRITEUINT32(save_p, players[i].score); WRITEUINT32(save_p, players[i].score);
@ -404,7 +404,7 @@ static void P_NetUnArchivePlayers(void)
players[i].flashpal = READUINT16(save_p); players[i].flashpal = READUINT16(save_p);
players[i].flashcount = READUINT16(save_p); players[i].flashcount = READUINT16(save_p);
players[i].skincolor = READUINT8(save_p); players[i].skincolor = READUINT16(save_p);
players[i].skin = READINT32(save_p); players[i].skin = READINT32(save_p);
players[i].availabilities = READUINT32(save_p); players[i].availabilities = READUINT32(save_p);
players[i].score = READUINT32(save_p); players[i].score = READUINT32(save_p);

View file

@ -18,7 +18,7 @@
#pragma interface #pragma interface
#endif #endif
#define NEWSKINSAVES (INT16_MAX) // Purely for backwards compatibility, remove this for 2.3 #define NEWSKINSAVES (INT16_MAX) // TODO: 2.3: Delete (Purely for backwards compatibility)
// Persistent storage/archiving. // Persistent storage/archiving.
// These are the load / save game routines. // These are the load / save game routines.

View file

@ -1633,7 +1633,7 @@ static void ParseTextmapSectorParameter(UINT32 i, const char *param, const char
if ((id = strchr(id, ' '))) if ((id = strchr(id, ' ')))
id++; id++;
} }
} }
else if (fastcmp(param, "xpanningfloor")) else if (fastcmp(param, "xpanningfloor"))
sectors[i].floorxoffset = FLOAT_TO_FIXED(atof(val)); sectors[i].floorxoffset = FLOAT_TO_FIXED(atof(val));
else if (fastcmp(param, "ypanningfloor")) else if (fastcmp(param, "ypanningfloor"))
@ -6083,6 +6083,7 @@ static void P_ConvertBinarySectorTypes(void)
case 14: //Non-ramp sector case 14: //Non-ramp sector
sectors[i].specialflags |= SSF_NOSTEPDOWN; sectors[i].specialflags |= SSF_NOSTEPDOWN;
break; break;
// TODO: 2.3: Delete
case 15: //Bouncy FOF case 15: //Bouncy FOF
CONS_Alert(CONS_WARNING, M_GetText("Deprecated bouncy FOF sector type detected. Please use linedef type 76 instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated bouncy FOF sector type detected. Please use linedef type 76 instead.\n"));
break; break;
@ -6117,12 +6118,14 @@ static void P_ConvertBinarySectorTypes(void)
sectors[i].flags |= MSF_TRIGGERLINE_PLANE; sectors[i].flags |= MSF_TRIGGERLINE_PLANE;
sectors[i].triggerer = TO_PLAYER; sectors[i].triggerer = TO_PLAYER;
break; break;
// TODO: 2.3: Delete
case 6: //Trigger linedef executor (Emerald check) case 6: //Trigger linedef executor (Emerald check)
CONS_Alert(CONS_WARNING, M_GetText("Deprecated emerald check sector type detected. Please use linedef types 337-339 instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated emerald check sector type detected. Please use linedef types 337-339 instead.\n"));
sectors[i].triggertag = tag; sectors[i].triggertag = tag;
sectors[i].flags &= ~MSF_TRIGGERLINE_PLANE; sectors[i].flags &= ~MSF_TRIGGERLINE_PLANE;
sectors[i].triggerer = TO_PLAYEREMERALDS; sectors[i].triggerer = TO_PLAYEREMERALDS;
break; break;
// TODO: 2.3: Delete
case 7: //Trigger linedef executor (NiGHTS mare) case 7: //Trigger linedef executor (NiGHTS mare)
CONS_Alert(CONS_WARNING, M_GetText("Deprecated NiGHTS mare sector type detected. Please use linedef types 340-342 instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated NiGHTS mare sector type detected. Please use linedef types 340-342 instead.\n"));
sectors[i].triggertag = tag; sectors[i].triggertag = tag;
@ -6132,9 +6135,11 @@ static void P_ConvertBinarySectorTypes(void)
case 8: //Check for linedef executor on FOFs case 8: //Check for linedef executor on FOFs
sectors[i].flags |= MSF_TRIGGERLINE_MOBJ; sectors[i].flags |= MSF_TRIGGERLINE_MOBJ;
break; break;
// TODO: 2.3: Delete
case 10: //Special stage time/spheres requirements case 10: //Special stage time/spheres requirements
CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for special stage requirements detected. Please use the SpecialStageTime and SpecialStageSpheres level header options instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for special stage requirements detected. Please use the SpecialStageTime and SpecialStageSpheres level header options instead.\n"));
break; break;
// TODO: 2.3: Delete
case 11: //Custom global gravity case 11: //Custom global gravity
CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for global gravity detected. Please use the Gravity level header option instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for global gravity detected. Please use the Gravity level header option instead.\n"));
break; break;
@ -6773,7 +6778,7 @@ static void P_ConvertBinaryThingTypes(void)
default: default:
break; break;
} }
// Clear binary thing height hacks, to prevent interfering with UDMF-only flags // Clear binary thing height hacks, to prevent interfering with UDMF-only flags
mapthings[i].options &= 0xF; mapthings[i].options &= 0xF;
} }

View file

@ -2591,7 +2591,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
titlemapcameraref = altview; titlemapcameraref = altview;
else if (!mo->player->awayviewtics || mo->player->awayviewmobj != altview) { else if (!mo->player->awayviewtics || mo->player->awayviewmobj != altview) {
P_SetTarget(&mo->player->awayviewmobj, altview); P_SetTarget(&mo->player->awayviewmobj, altview);
if (mo->player == &players[displayplayer]) if (mo->player == &players[displayplayer])
P_ResetCamera(mo->player, &camera); // reset p1 camera on p1 getting an awayviewmobj P_ResetCamera(mo->player, &camera); // reset p1 camera on p1 getting an awayviewmobj
else if (splitscreen && mo->player == &players[secondarydisplayplayer]) else if (splitscreen && mo->player == &players[secondarydisplayplayer])
@ -4108,6 +4108,7 @@ sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number)
return NULL; return NULL;
} }
// TODO: 2.3: Delete
// Deprecated in favor of P_MobjTouchingSectorSpecial // Deprecated in favor of P_MobjTouchingSectorSpecial
// Kept for Lua backwards compatibility only // Kept for Lua backwards compatibility only
sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo) sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo)
@ -6134,6 +6135,7 @@ void P_SpawnSpecials(boolean fromnetsave)
sector->flags |= MSF_TRIGGERSPECIAL_TOUCH; sector->flags |= MSF_TRIGGERSPECIAL_TOUCH;
} }
// TODO: 2.3: Delete everything below
// Process deprecated binary sector specials // Process deprecated binary sector specials
if (udmf || !sector->special) if (udmf || !sector->special)
continue; continue;

View file

@ -106,8 +106,7 @@ void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move)
mo->momy += FixedMul(move, FINESINE(angle)); mo->momy += FixedMul(move, FINESINE(angle));
} }
#if 0 void P_ThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move)
static inline void P_ThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move)
{ {
angle >>= ANGLETOFINESHIFT; angle >>= ANGLETOFINESHIFT;
@ -115,7 +114,7 @@ static inline void P_ThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move)
mo->momy += FixedMul(move, FINESINE(angle)); mo->momy += FixedMul(move, FINESINE(angle));
} }
static inline void P_VectorInstaThrust(fixed_t xa, fixed_t xb, fixed_t xc, fixed_t ya, fixed_t yb, fixed_t yc, void P_VectorInstaThrust(fixed_t xa, fixed_t xb, fixed_t xc, fixed_t ya, fixed_t yb, fixed_t yc,
fixed_t za, fixed_t zb, fixed_t zc, fixed_t momentum, mobj_t *mo) fixed_t za, fixed_t zb, fixed_t zc, fixed_t momentum, mobj_t *mo)
{ {
fixed_t a1, b1, c1, a2, b2, c2, i, j, k; fixed_t a1, b1, c1, a2, b2, c2, i, j, k;
@ -145,7 +144,6 @@ static inline void P_VectorInstaThrust(fixed_t xa, fixed_t xb, fixed_t xc, fixed
mo->momy = j; mo->momy = j;
mo->momz = k; mo->momz = k;
} }
#endif
// //
// P_InstaThrust // P_InstaThrust
@ -2775,6 +2773,7 @@ static void P_CheckBouncySectors(player_t *player)
if (!(rover->fofflags & FOF_EXISTS)) if (!(rover->fofflags & FOF_EXISTS))
continue; // FOFs should not be bouncy if they don't even "exist" continue; // FOFs should not be bouncy if they don't even "exist"
// TODO: 2.3: Delete
// Handle deprecated bouncy FOF sector type // Handle deprecated bouncy FOF sector type
if (!udmf && GETSECSPECIAL(rover->master->frontsector->special, 1) == 15) if (!udmf && GETSECSPECIAL(rover->master->frontsector->special, 1) == 15)
{ {
@ -4603,7 +4602,7 @@ void P_DoJump(player_t *player, boolean soundandstate)
} }
} }
static void P_DoSpinDashDust(player_t *player) void P_DoSpinDashDust(player_t *player)
{ {
UINT32 i; UINT32 i;
mobj_t *particle; mobj_t *particle;
@ -11193,7 +11192,7 @@ static void P_MinecartThink(player_t *player)
} }
// Handle Tails' fluff // Handle Tails' fluff
static void P_DoTailsOverlay(player_t *player, mobj_t *tails) void P_DoTailsOverlay(player_t *player, mobj_t *tails)
{ {
// init... // init...
boolean smilesonground = P_IsObjectOnGround(player->mo); boolean smilesonground = P_IsObjectOnGround(player->mo);
@ -11390,7 +11389,7 @@ static void P_DoTailsOverlay(player_t *player, mobj_t *tails)
tails->y = player->mo->y + P_ReturnThrustY(tails, tails->angle, FixedMul(backwards, tails->scale)); tails->y = player->mo->y + P_ReturnThrustY(tails, tails->angle, FixedMul(backwards, tails->scale));
tails->z = player->mo->z + zoffs; tails->z = player->mo->z + zoffs;
P_SetThingPosition(tails); P_SetThingPosition(tails);
if (player->mo->flags2 & MF2_SHADOW) if (player->mo->flags2 & MF2_SHADOW)
tails->flags2 |= MF2_SHADOW; tails->flags2 |= MF2_SHADOW;
else else
@ -11398,7 +11397,7 @@ static void P_DoTailsOverlay(player_t *player, mobj_t *tails)
} }
// Metal Sonic's jet fume // Metal Sonic's jet fume
static void P_DoMetalJetFume(player_t *player, mobj_t *fume) void P_DoMetalJetFume(player_t *player, mobj_t *fume)
{ {
static const UINT8 FUME_SKINCOLORS[] = static const UINT8 FUME_SKINCOLORS[] =
{ {
@ -11536,6 +11535,30 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume)
} }
} }
// Handle Followmobj behavior
void P_DoFollowMobj(player_t *player, mobj_t *followmobj)
{
if (LUA_HookFollowMobj(player, followmobj) || P_MobjWasRemoved(followmobj))
{;}
else
{
switch (followmobj->type)
{
case MT_TAILSOVERLAY: // c:
P_DoTailsOverlay(player, followmobj);
break;
case MT_METALJETFUME:
P_DoMetalJetFume(player, followmobj);
break;
default:
var1 = 1;
var2 = 0;
A_CapeChase(followmobj);
break;
}
}
}
// //
// P_PlayerThink // P_PlayerThink
// //
@ -11606,7 +11629,7 @@ void P_PlayerThink(player_t *player)
P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid
player->awayviewtics = 1; // reset to one, the below code will immediately set it to zero player->awayviewtics = 1; // reset to one, the below code will immediately set it to zero
} }
if (player->awayviewtics && player->awayviewtics != -1) if (player->awayviewtics && player->awayviewtics != -1)
{ {
player->awayviewtics--; player->awayviewtics--;
@ -12278,11 +12301,11 @@ void P_PlayerThink(player_t *player)
if (!(player->stronganim)) if (!(player->stronganim))
player->stronganim = player->panim; player->stronganim = player->panim;
else if (player->panim != player->stronganim) else if (player->panim != player->stronganim)
player->powers[pw_strong] = STR_NONE; player->powers[pw_strong] = STR_NONE;
} }
else if (player->stronganim) else if (player->stronganim)
player->stronganim = 0; player->stronganim = 0;
//pw_super acts as a timer now //pw_super acts as a timer now
if (player->powers[pw_super] if (player->powers[pw_super]
&& (player->mo->state < &states[S_PLAY_SUPER_TRANS1] && (player->mo->state < &states[S_PLAY_SUPER_TRANS1]
@ -12389,7 +12412,7 @@ void P_PlayerThink(player_t *player)
if (player->jumpfactor < FixedMul(skins[player->skin].jumpfactor, 5*FRACUNIT/4)) // Boost jump height. if (player->jumpfactor < FixedMul(skins[player->skin].jumpfactor, 5*FRACUNIT/4)) // Boost jump height.
player->jumpfactor += FRACUNIT/300; player->jumpfactor += FRACUNIT/300;
if ((player->charflags & SF_MACHINE) && (!(player->powers[pw_strong] == STR_METAL))) if ((player->charflags & SF_MACHINE) && (!(player->powers[pw_strong] == STR_METAL)))
player->powers[pw_strong] = STR_METAL; player->powers[pw_strong] = STR_METAL;
} }
@ -13012,27 +13035,7 @@ void P_PlayerAfterThink(player_t *player)
} }
if (player->followmobj) if (player->followmobj)
{ P_DoFollowMobj(player, player->followmobj);
if (LUA_HookFollowMobj(player, player->followmobj) || P_MobjWasRemoved(player->followmobj))
{;}
else
{
switch (player->followmobj->type)
{
case MT_TAILSOVERLAY: // c:
P_DoTailsOverlay(player, player->followmobj);
break;
case MT_METALJETFUME:
P_DoMetalJetFume(player, player->followmobj);
break;
default:
var1 = 1;
var2 = 0;
A_CapeChase(player->followmobj);
break;
}
}
}
} }
P_DoPlayerHeadSigns(player); // Spawn Tag/CTF signs over player's head P_DoPlayerHeadSigns(player); // Spawn Tag/CTF signs over player's head

View file

@ -249,7 +249,7 @@ static void FlipCam2_OnChange(void)
// //
// killough 5/2/98: reformatted // killough 5/2/98: reformatted
// //
INT32 R_PointOnSide(fixed_t x, fixed_t y, node_t *node) INT32 R_PointOnSide(fixed_t x, fixed_t y, node_t *restrict node)
{ {
if (!node->dx) if (!node->dx)
return x <= node->x ? node->dy > 0 : node->dy < 0; return x <= node->x ? node->dy > 0 : node->dy < 0;
@ -261,9 +261,10 @@ INT32 R_PointOnSide(fixed_t x, fixed_t y, node_t *node)
fixed_t dy = (y >> 1) - (node->y >> 1); fixed_t dy = (y >> 1) - (node->y >> 1);
// Try to quickly decide by looking at sign bits. // Try to quickly decide by looking at sign bits.
if ((node->dy ^ node->dx ^ dx ^ dy) < 0) // also use a mask to avoid branch prediction
return (node->dy ^ dx) < 0; // (left is negative) INT32 mask = (node->dy ^ node->dx ^ dx ^ dy) >> 31;
return FixedMul(dy, node->dx>>FRACBITS) >= FixedMul(node->dy>>FRACBITS, dx); return (mask & ((node->dy ^ dx) < 0)) | // (left is negative)
(~mask & (FixedMul(dy, node->dx>>FRACBITS) >= FixedMul(node->dy>>FRACBITS, dx)));
} }
// killough 5/2/98: reformatted // killough 5/2/98: reformatted

View file

@ -75,6 +75,6 @@ void R_SetupSkyDraw(void)
*/ */
void R_SetSkyScale(void) void R_SetSkyScale(void)
{ {
fixed_t difference = vid.fdupx-(vid.dupx<<FRACBITS); fixed_t difference = vid.fdup-(vid.dup<<FRACBITS);
skyscale = FixedDiv(fovtan, vid.fdupx+difference); skyscale = FixedDiv(fovtan, vid.fdup+difference);
} }

View file

@ -494,7 +494,7 @@ void SCR_CalculateFPS(void)
void SCR_DisplayTicRate(void) void SCR_DisplayTicRate(void)
{ {
INT32 ticcntcolor = 0; INT32 ticcntcolor = 0;
const INT32 h = vid.height-(8*vid.dupy); const INT32 h = vid.height-(8*vid.dup);
UINT32 cap = R_GetFramerateCap(); UINT32 cap = R_GetFramerateCap();
double fps = round(averageFPS); double fps = round(averageFPS);
@ -530,7 +530,7 @@ void SCR_DisplayTicRate(void)
width = V_StringWidth(drawnstr, V_NOSCALESTART); width = V_StringWidth(drawnstr, V_NOSCALESTART);
V_DrawString(vid.width - ((7 * 8 * vid.dupx) + V_StringWidth("FPS: ", V_NOSCALESTART)), h, V_DrawString(vid.width - ((7 * 8 * vid.dup) + V_StringWidth("FPS: ", V_NOSCALESTART)), h,
V_YELLOWMAP|V_NOSCALESTART|V_USERHUDTRANS, "FPS:"); V_YELLOWMAP|V_NOSCALESTART|V_USERHUDTRANS, "FPS:");
V_DrawString(vid.width - width, h, V_DrawString(vid.width - width, h,
ticcntcolor|V_NOSCALESTART|V_USERHUDTRANS, drawnstr); ticcntcolor|V_NOSCALESTART|V_USERHUDTRANS, drawnstr);
@ -589,7 +589,7 @@ void SCR_ClosedCaptions(void)
if (closedcaptions[i].b) if (closedcaptions[i].b)
{ {
y -= closedcaptions[i].b * vid.dupy; y -= closedcaptions[i].b * vid.dup;
if (renderisnewtic) if (renderisnewtic)
{ {
closedcaptions[i].b--; closedcaptions[i].b--;
@ -639,9 +639,9 @@ void SCR_DisplayMarathonInfo(void)
#define PRIMEV1 13 #define PRIMEV1 13
#define PRIMEV2 17 // I can't believe it! I'm on TV! #define PRIMEV2 17 // I can't believe it! I'm on TV!
antisplice[0] += (entertic - oldentertics)*PRIMEV2; antisplice[0] += (entertic - oldentertics)*PRIMEV2;
antisplice[0] %= PRIMEV1*((vid.width/vid.dupx)+1); antisplice[0] %= PRIMEV1*((vid.width/vid.dup)+1);
antisplice[1] += (entertic - oldentertics)*PRIMEV1; antisplice[1] += (entertic - oldentertics)*PRIMEV1;
antisplice[1] %= PRIMEV1*((vid.width/vid.dupx)+1); antisplice[1] %= PRIMEV1*((vid.width/vid.dup)+1);
str = va("%i:%02i:%02i.%02i", str = va("%i:%02i:%02i.%02i",
G_TicsToHours(marathontime), G_TicsToHours(marathontime),
G_TicsToMinutes(marathontime, false), G_TicsToMinutes(marathontime, false),

View file

@ -59,19 +59,19 @@ typedef struct viddef_s
} u; } u;
INT32 recalc; // if true, recalc vid-based stuff INT32 recalc; // if true, recalc vid-based stuff
UINT8 *direct; // linear frame buffer, or vga base mem. UINT8 *direct; // linear frame buffer, or vga base mem.
INT32 dupx, dupy; // scale 1, 2, 3 value for menus & overlays INT32 dup; // scale 1, 2, 3 value for menus & overlays
INT32/*fixed_t*/ fdupx, fdupy; // same as dupx, dupy, but exact value when aspect ratio isn't 320/200 INT32/*fixed_t*/ fdup; // same as dup, but exact value when aspect ratio isn't 320/200
INT32 bpp; // BYTES per pixel: 1 = 256color, 2 = highcolor INT32 bpp; // BYTES per pixel: 1 = 256color, 2 = highcolor
INT32 baseratio; // Used to get the correct value for lighting walls INT32 baseratio; // Used to get the correct value for lighting walls
// for Win32 version // for Win32 version
DNWH WndParent; // handle of the application's window DNWH WndParent; // handle of the application's window
UINT8 smalldupx, smalldupy; // factor for a little bit of scaling UINT8 smalldup; // factor for a little bit of scaling
UINT8 meddupx, meddupy; // factor for moderate, but not full, scaling UINT8 meddup; // factor for moderate, but not full, scaling
#ifdef HWRENDER #ifdef HWRENDER
INT32/*fixed_t*/ fsmalldupx, fsmalldupy; INT32/*fixed_t*/ fsmalldup;
INT32/*fixed_t*/ fmeddupx, fmeddupy; INT32/*fixed_t*/ fmeddup;
INT32 glstate; INT32 glstate;
#endif #endif
} viddef_t; } viddef_t;

View file

@ -2266,7 +2266,7 @@ void I_Sleep(UINT32 ms)
} }
#ifdef NEWSIGNALHANDLER #ifdef NEWSIGNALHANDLER
static void newsignalhandler_Warn(const char *pr) ATTRNORETURN static FUNCNORETURN void newsignalhandler_Warn(const char *pr)
{ {
char text[128]; char text[128];
@ -3035,11 +3035,11 @@ size_t I_GetFreeMem(size_t *total)
#ifdef FREEBSD #ifdef FREEBSD
u_int v_free_count, v_page_size, v_page_count; u_int v_free_count, v_page_size, v_page_count;
size_t size = sizeof(v_free_count); size_t size = sizeof(v_free_count);
sysctlbyname("vm.stat.vm.v_free_count", &v_free_count, &size, NULL, 0); sysctlbyname("vm.stats.vm.v_free_count", &v_free_count, &size, NULL, 0);
size_t size = sizeof(v_page_size); size = sizeof(v_page_size);
sysctlbyname("vm.stat.vm.v_page_size", &v_page_size, &size, NULL, 0); sysctlbyname("vm.stats.vm.v_page_size", &v_page_size, &size, NULL, 0);
size_t size = sizeof(v_page_count); size = sizeof(v_page_count);
sysctlbyname("vm.stat.vm.v_page_count", &v_page_count, &size, NULL, 0); sysctlbyname("vm.stats.vm.v_page_count", &v_page_count, &size, NULL, 0);
if (total) if (total)
*total = v_page_count * v_page_size; *total = v_page_count * v_page_size;

View file

@ -513,10 +513,10 @@ static void ST_drawDebugInfo(void)
#define VFLAGS V_MONOSPACE|V_SNAPTOTOP|V_SNAPTORIGHT #define VFLAGS V_MONOSPACE|V_SNAPTOTOP|V_SNAPTORIGHT
if ((moviemode == MM_GIF && cv_gif_downscale.value) || vid.dupx == 1) if ((moviemode == MM_GIF && cv_gif_downscale.value) || vid.dup == 1)
{ {
textfunc = V_DrawRightAlignedString; textfunc = V_DrawRightAlignedString;
lowh = ((vid.height/vid.dupy) - 16); lowh = ((vid.height/vid.dup) - 16);
} }
else else
{ {

File diff suppressed because it is too large Load diff

View file

@ -36,7 +36,7 @@ cv_rsaturation, cv_ysaturation, cv_gsaturation, cv_csaturation, cv_bsaturation,
// Allocates buffer screens, call before R_Init. // Allocates buffer screens, call before R_Init.
void V_Init(void); void V_Init(void);
// Recalculates the viddef (dupx, dupy, etc.) according to the current screen resolution. // Recalculates the viddef (dup, fdup, etc.) according to the current screen resolution.
void V_Recalc(void); void V_Recalc(void);
// Color look-up table // Color look-up table

View file

@ -536,7 +536,7 @@ void Y_IntermissionDrawer(void)
if (animatetic && (tic_t)intertic >= animatetic) if (animatetic && (tic_t)intertic >= animatetic)
{ {
const INT32 scradjust = (vid.width/vid.dupx)>>3; // 40 for BASEVIDWIDTH const INT32 scradjust = (vid.width/vid.dup)>>3; // 40 for BASEVIDWIDTH
INT32 animatetimer = (intertic - animatetic); INT32 animatetimer = (intertic - animatetic);
if (animatetimer <= 16) if (animatetimer <= 16)
{ {
@ -687,7 +687,7 @@ void Y_IntermissionDrawer(void)
if (intertic > 1) if (intertic > 1)
{ {
if (stagefailed && data.spec.emeraldy < (vid.height/vid.dupy)+16) if (stagefailed && data.spec.emeraldy < (vid.height/vid.dup)+16)
{ {
emeraldx += intertic - 6; emeraldx += intertic - 6;
} }
@ -1163,7 +1163,7 @@ void Y_Ticker(void)
} }
else else
{ {
if (data.spec.emeraldy < (vid.height/vid.dupy)+16) if (data.spec.emeraldy < (vid.height/vid.dup)+16)
{ {
data.spec.emeraldy += (++data.spec.emeraldmomy); data.spec.emeraldy += (++data.spec.emeraldmomy);
} }