Merge branch 'next' of https://git.magicalgirl.moe/STJr/SRB2/ into udmf-next
This commit is contained in:
commit
68f60f3c29
|
@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0)
|
||||||
# DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
|
# DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
|
||||||
# Version change is fine.
|
# Version change is fine.
|
||||||
project(SRB2
|
project(SRB2
|
||||||
VERSION 2.2.1
|
VERSION 2.2.2
|
||||||
LANGUAGES C)
|
LANGUAGES C)
|
||||||
|
|
||||||
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
|
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
version: 2.2.1.{branch}-{build}
|
version: 2.2.2.{branch}-{build}
|
||||||
os: MinGW
|
os: MinGW
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
|
|
|
@ -19,7 +19,8 @@ set(SRB2_ASSET_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/installer"
|
||||||
set(SRB2_ASSET_HASHED
|
set(SRB2_ASSET_HASHED
|
||||||
"srb2.pk3;\
|
"srb2.pk3;\
|
||||||
player.dta;\
|
player.dta;\
|
||||||
zones.pk3"
|
zones.pk3;\
|
||||||
|
patch.pk3"
|
||||||
CACHE STRING "Asset filenames to apply MD5 checks. No spaces between entries!"
|
CACHE STRING "Asset filenames to apply MD5 checks. No spaces between entries!"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -279,6 +279,7 @@ if(${SRB2_CONFIG_HAVE_BLUA})
|
||||||
blua/lfunc.c
|
blua/lfunc.c
|
||||||
blua/lgc.c
|
blua/lgc.c
|
||||||
blua/linit.c
|
blua/linit.c
|
||||||
|
blua/liolib.c
|
||||||
blua/llex.c
|
blua/llex.c
|
||||||
blua/lmem.c
|
blua/lmem.c
|
||||||
blua/lobject.c
|
blua/lobject.c
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# GNU Make makefile for SRB2
|
# GNU Make makefile for SRB2
|
||||||
#############################################################################
|
#############################################################################
|
||||||
# Copyright (C) 1998-2000 by DooM Legacy Team.
|
# Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
# Copyright (C) 2003-2019 by Sonic Team Junior.
|
# Copyright (C) 2003-2020 by Sonic Team Junior.
|
||||||
#
|
#
|
||||||
# This program is free software distributed under the
|
# This program is free software distributed under the
|
||||||
# terms of the GNU General Public License, version 2.
|
# terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2019, James R.
|
Copyright 2019-2020, James R.
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2019, James R.
|
Copyright 2019-2020, James R.
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2007-2016 by John "JTE" Muniz.
|
// Copyright (C) 2007-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2011-2019 by Sonic Team Junior.
|
// Copyright (C) 2011-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2007-2016 by John "JTE" Muniz.
|
// Copyright (C) 2007-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -18,6 +18,7 @@ OBJS:=$(OBJS) \
|
||||||
$(OBJDIR)/ldo.o \
|
$(OBJDIR)/ldo.o \
|
||||||
$(OBJDIR)/lfunc.o \
|
$(OBJDIR)/lfunc.o \
|
||||||
$(OBJDIR)/linit.o \
|
$(OBJDIR)/linit.o \
|
||||||
|
$(OBJDIR)/liolib.o \
|
||||||
$(OBJDIR)/llex.o \
|
$(OBJDIR)/llex.o \
|
||||||
$(OBJDIR)/lmem.o \
|
$(OBJDIR)/lmem.o \
|
||||||
$(OBJDIR)/lobject.o \
|
$(OBJDIR)/lobject.o \
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
static const luaL_Reg lualibs[] = {
|
static const luaL_Reg lualibs[] = {
|
||||||
{"", luaopen_base},
|
{"", luaopen_base},
|
||||||
{LUA_TABLIBNAME, luaopen_table},
|
{LUA_TABLIBNAME, luaopen_table},
|
||||||
|
{LUA_IOLIBNAME, luaopen_io},
|
||||||
{LUA_STRLIBNAME, luaopen_string},
|
{LUA_STRLIBNAME, luaopen_string},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,635 @@
|
||||||
|
/*
|
||||||
|
** $Id: liolib.c,v 2.73.1.3 2008/01/18 17:47:43 roberto Exp $
|
||||||
|
** Standard I/O (and system) library
|
||||||
|
** See Copyright Notice in lua.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define liolib_c
|
||||||
|
#define LUA_LIB
|
||||||
|
|
||||||
|
#include "lua.h"
|
||||||
|
|
||||||
|
#include "lauxlib.h"
|
||||||
|
#include "lualib.h"
|
||||||
|
#include "../i_system.h"
|
||||||
|
#include "../g_game.h"
|
||||||
|
#include "../d_netfil.h"
|
||||||
|
#include "../lua_libs.h"
|
||||||
|
#include "../byteptr.h"
|
||||||
|
#include "../lua_script.h"
|
||||||
|
#include "../m_misc.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define IO_INPUT 1
|
||||||
|
#define IO_OUTPUT 2
|
||||||
|
|
||||||
|
#define FILELIMIT (1024 * 1024) // Size limit for reading/writing files
|
||||||
|
|
||||||
|
#define FMT_FILECALLBACKID "file_callback_%d"
|
||||||
|
|
||||||
|
|
||||||
|
// Allow scripters to write files of these types to SRB2's folder
|
||||||
|
static const char *whitelist[] = {
|
||||||
|
".bmp",
|
||||||
|
".cfg",
|
||||||
|
".csv",
|
||||||
|
".dat",
|
||||||
|
".png",
|
||||||
|
".sav2",
|
||||||
|
".txt",
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int pushresult (lua_State *L, int i, const char *filename) {
|
||||||
|
int en = errno; /* calls to Lua API may change this value */
|
||||||
|
if (i) {
|
||||||
|
lua_pushboolean(L, 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lua_pushnil(L);
|
||||||
|
if (filename)
|
||||||
|
lua_pushfstring(L, "%s: %s", filename, strerror(en));
|
||||||
|
else
|
||||||
|
lua_pushfstring(L, "%s", strerror(en));
|
||||||
|
lua_pushinteger(L, en);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE))
|
||||||
|
|
||||||
|
|
||||||
|
static int io_type (lua_State *L) {
|
||||||
|
void *ud;
|
||||||
|
luaL_checkany(L, 1);
|
||||||
|
ud = lua_touserdata(L, 1);
|
||||||
|
lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE);
|
||||||
|
if (ud == NULL || !lua_getmetatable(L, 1) || !lua_rawequal(L, -2, -1))
|
||||||
|
lua_pushnil(L); /* not a file */
|
||||||
|
else if (*((FILE **)ud) == NULL)
|
||||||
|
lua_pushliteral(L, "closed file");
|
||||||
|
else
|
||||||
|
lua_pushliteral(L, "file");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static FILE *tofile (lua_State *L) {
|
||||||
|
FILE **f = tofilep(L);
|
||||||
|
if (*f == NULL)
|
||||||
|
luaL_error(L, "attempt to use a closed file");
|
||||||
|
return *f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** When creating file handles, always creates a `closed' file handle
|
||||||
|
** before opening the actual file; so, if there is a memory error, the
|
||||||
|
** file is not left opened.
|
||||||
|
*/
|
||||||
|
static FILE **newfile (lua_State *L) {
|
||||||
|
FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *));
|
||||||
|
*pf = NULL; /* file handle is currently `closed' */
|
||||||
|
luaL_getmetatable(L, LUA_FILEHANDLE);
|
||||||
|
lua_setmetatable(L, -2);
|
||||||
|
return pf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** function to (not) close the standard files stdin, stdout, and stderr
|
||||||
|
*/
|
||||||
|
static int io_noclose (lua_State *L) {
|
||||||
|
lua_pushnil(L);
|
||||||
|
lua_pushliteral(L, "cannot close standard file");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** function to close regular files
|
||||||
|
*/
|
||||||
|
static int io_fclose (lua_State *L) {
|
||||||
|
FILE **p = tofilep(L);
|
||||||
|
int ok = (fclose(*p) == 0);
|
||||||
|
*p = NULL;
|
||||||
|
return pushresult(L, ok, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int aux_close (lua_State *L) {
|
||||||
|
lua_getfenv(L, 1);
|
||||||
|
lua_getfield(L, -1, "__close");
|
||||||
|
return (lua_tocfunction(L, -1))(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int io_close (lua_State *L) {
|
||||||
|
if (lua_isnone(L, 1))
|
||||||
|
lua_rawgeti(L, LUA_ENVIRONINDEX, IO_OUTPUT);
|
||||||
|
tofile(L); /* make sure argument is a file */
|
||||||
|
return aux_close(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int io_gc (lua_State *L) {
|
||||||
|
FILE *f = *tofilep(L);
|
||||||
|
/* ignore closed files */
|
||||||
|
if (f != NULL)
|
||||||
|
aux_close(L);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int io_tostring (lua_State *L) {
|
||||||
|
FILE *f = *tofilep(L);
|
||||||
|
if (f == NULL)
|
||||||
|
lua_pushliteral(L, "file (closed)");
|
||||||
|
else
|
||||||
|
lua_pushfstring(L, "file (%p)", f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Create directories in the path
|
||||||
|
void MakePathDirs(char *path)
|
||||||
|
{
|
||||||
|
char *c;
|
||||||
|
|
||||||
|
for (c = path; *c; c++)
|
||||||
|
if (*c == '/' || *c == '\\')
|
||||||
|
{
|
||||||
|
char sep = *c;
|
||||||
|
*c = '\0';
|
||||||
|
I_mkdir(path, 0755);
|
||||||
|
*c = sep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int CheckFileName(lua_State *L, const char *filename)
|
||||||
|
{
|
||||||
|
int length = strlen(filename);
|
||||||
|
boolean pass = false;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (strchr(filename, '\\'))
|
||||||
|
{
|
||||||
|
luaL_error(L, "access denied to %s: \\ is not allowed, use / instead", filename);
|
||||||
|
return pushresult(L,0,filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < (sizeof (whitelist) / sizeof(const char *)); i++)
|
||||||
|
if (!stricmp(&filename[length - strlen(whitelist[i])], whitelist[i]))
|
||||||
|
{
|
||||||
|
pass = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (strstr(filename, "./")
|
||||||
|
|| strstr(filename, "..") || strchr(filename, ':')
|
||||||
|
|| filename[0] == '/'
|
||||||
|
|| !pass)
|
||||||
|
{
|
||||||
|
luaL_error(L, "access denied to %s", filename);
|
||||||
|
return pushresult(L,0,filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int io_open (lua_State *L) {
|
||||||
|
const char *filename = luaL_checkstring(L, 1);
|
||||||
|
const char *mode = luaL_optstring(L, 2, "r");
|
||||||
|
int checkresult;
|
||||||
|
|
||||||
|
checkresult = CheckFileName(L, filename);
|
||||||
|
if (checkresult)
|
||||||
|
return checkresult;
|
||||||
|
|
||||||
|
luaL_checktype(L, 3, LUA_TFUNCTION);
|
||||||
|
|
||||||
|
if (!(strchr(mode, 'r') || strchr(mode, '+')))
|
||||||
|
luaL_error(L, "open() is only for reading, use openlocal() for writing");
|
||||||
|
|
||||||
|
AddLuaFileTransfer(filename, mode);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int io_openlocal (lua_State *L) {
|
||||||
|
FILE **pf;
|
||||||
|
const char *filename = luaL_checkstring(L, 1);
|
||||||
|
const char *mode = luaL_optstring(L, 2, "r");
|
||||||
|
char *realfilename;
|
||||||
|
luafiletransfer_t *filetransfer;
|
||||||
|
int checkresult;
|
||||||
|
|
||||||
|
checkresult = CheckFileName(L, filename);
|
||||||
|
if (checkresult)
|
||||||
|
return checkresult;
|
||||||
|
|
||||||
|
realfilename = va("%s" PATHSEP "%s", luafiledir, filename);
|
||||||
|
|
||||||
|
if (client && strnicmp(filename, "client/", strlen("client/")))
|
||||||
|
I_Error("Access denied to %s\n"
|
||||||
|
"Clients can only access files stored in luafiles/client/\n",
|
||||||
|
filename);
|
||||||
|
|
||||||
|
// Prevent access if the file is being downloaded
|
||||||
|
for (filetransfer = luafiletransfers; filetransfer; filetransfer = filetransfer->next)
|
||||||
|
if (!stricmp(filetransfer->filename, filename))
|
||||||
|
I_Error("Access denied to %s\n"
|
||||||
|
"Files can't be opened while being downloaded\n",
|
||||||
|
filename);
|
||||||
|
|
||||||
|
MakePathDirs(realfilename);
|
||||||
|
|
||||||
|
// Open and return the file
|
||||||
|
pf = newfile(L);
|
||||||
|
*pf = fopen(realfilename, mode);
|
||||||
|
return (*pf == NULL) ? pushresult(L, 0, filename) : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Got_LuaFile(UINT8 **cp, INT32 playernum)
|
||||||
|
{
|
||||||
|
FILE **pf = NULL;
|
||||||
|
UINT8 success = READUINT8(*cp); // The first (and only) byte indicates whether the file could be opened
|
||||||
|
|
||||||
|
if (playernum != serverplayer)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_WARNING, M_GetText("Illegal luafile command received from %s\n"), player_names[playernum]);
|
||||||
|
if (server)
|
||||||
|
SendKick(playernum, KICK_MSG_CON_FAIL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!luafiletransfers)
|
||||||
|
I_Error("No Lua file transfer\n");
|
||||||
|
|
||||||
|
// Retrieve the callback and push it on the stack
|
||||||
|
lua_pushfstring(gL, FMT_FILECALLBACKID, luafiletransfers->id);
|
||||||
|
lua_gettable(gL, LUA_REGISTRYINDEX);
|
||||||
|
|
||||||
|
// Push the first argument (file handle or nil) on the stack
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
pf = newfile(gL); // Create and push the file handle
|
||||||
|
*pf = fopen(luafiletransfers->realfilename, luafiletransfers->mode); // Open the file
|
||||||
|
if (!*pf)
|
||||||
|
I_Error("Can't open file \"%s\"\n", luafiletransfers->realfilename); // The file SHOULD exist
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lua_pushnil(gL);
|
||||||
|
|
||||||
|
// Push the second argument (file name) on the stack
|
||||||
|
lua_pushstring(gL, luafiletransfers->filename);
|
||||||
|
|
||||||
|
// Call the callback
|
||||||
|
LUA_Call(gL, 2);
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
// Close the file
|
||||||
|
if (*pf)
|
||||||
|
{
|
||||||
|
fclose(*pf);
|
||||||
|
*pf = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (client)
|
||||||
|
remove(luafiletransfers->realfilename);
|
||||||
|
}
|
||||||
|
|
||||||
|
RemoveLuaFileTransfer();
|
||||||
|
|
||||||
|
if (server && luafiletransfers)
|
||||||
|
{
|
||||||
|
if (FIL_FileOK(luafiletransfers->realfilename))
|
||||||
|
SV_PrepareSendLuaFileToNextNode();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Send a net command with 0 as its first byte to indicate the file couldn't be opened
|
||||||
|
success = 0;
|
||||||
|
SendNetXCmd(XD_LUAFILE, &success, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void StoreLuaFileCallback(INT32 id)
|
||||||
|
{
|
||||||
|
lua_pushfstring(gL, FMT_FILECALLBACKID, id);
|
||||||
|
lua_pushvalue(gL, 3); // Parameter 3 is the callback
|
||||||
|
lua_settable(gL, LUA_REGISTRYINDEX); // registry[callbackid] = callback
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RemoveLuaFileCallback(INT32 id)
|
||||||
|
{
|
||||||
|
lua_pushfstring(gL, FMT_FILECALLBACKID, id);
|
||||||
|
lua_pushnil(gL);
|
||||||
|
lua_settable(gL, LUA_REGISTRYINDEX); // registry[callbackid] = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int io_tmpfile (lua_State *L) {
|
||||||
|
FILE **pf = newfile(L);
|
||||||
|
*pf = tmpfile();
|
||||||
|
return (*pf == NULL) ? pushresult(L, 0, NULL) : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int io_readline (lua_State *L);
|
||||||
|
|
||||||
|
|
||||||
|
static void aux_lines (lua_State *L, int idx, int toclose) {
|
||||||
|
lua_pushvalue(L, idx);
|
||||||
|
lua_pushboolean(L, toclose); /* close/not close file when finished */
|
||||||
|
lua_pushcclosure(L, io_readline, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int f_lines (lua_State *L) {
|
||||||
|
tofile(L); /* check that it's a valid file handle */
|
||||||
|
aux_lines(L, 1, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** {======================================================
|
||||||
|
** READ
|
||||||
|
** =======================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static int read_number (lua_State *L, FILE *f) {
|
||||||
|
lua_Number d;
|
||||||
|
if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) {
|
||||||
|
lua_pushnumber(L, d);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else return 0; /* read fails */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int test_eof (lua_State *L, FILE *f) {
|
||||||
|
int c = getc(f);
|
||||||
|
ungetc(c, f);
|
||||||
|
lua_pushlstring(L, NULL, 0);
|
||||||
|
return (c != EOF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int read_line (lua_State *L, FILE *f) {
|
||||||
|
luaL_Buffer b;
|
||||||
|
luaL_buffinit(L, &b);
|
||||||
|
for (;;) {
|
||||||
|
size_t l;
|
||||||
|
char *p = luaL_prepbuffer(&b);
|
||||||
|
if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */
|
||||||
|
luaL_pushresult(&b); /* close buffer */
|
||||||
|
return (lua_objlen(L, -1) > 0); /* check whether read something */
|
||||||
|
}
|
||||||
|
l = strlen(p);
|
||||||
|
if (l == 0 || p[l-1] != '\n')
|
||||||
|
luaL_addsize(&b, l);
|
||||||
|
else {
|
||||||
|
luaL_addsize(&b, l - 1); /* do not include `eol' */
|
||||||
|
luaL_pushresult(&b); /* close buffer */
|
||||||
|
return 1; /* read at least an `eol' */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int read_chars (lua_State *L, FILE *f, size_t n) {
|
||||||
|
size_t rlen; /* how much to read */
|
||||||
|
size_t nr; /* number of chars actually read */
|
||||||
|
luaL_Buffer b;
|
||||||
|
luaL_buffinit(L, &b);
|
||||||
|
rlen = LUAL_BUFFERSIZE; /* try to read that much each time */
|
||||||
|
do {
|
||||||
|
char *p = luaL_prepbuffer(&b);
|
||||||
|
if (rlen > n) rlen = n; /* cannot read more than asked */
|
||||||
|
nr = fread(p, sizeof(char), rlen, f);
|
||||||
|
luaL_addsize(&b, nr);
|
||||||
|
n -= nr; /* still have to read `n' chars */
|
||||||
|
} while (n > 0 && nr == rlen); /* until end of count or eof */
|
||||||
|
luaL_pushresult(&b); /* close buffer */
|
||||||
|
return (n == 0 || lua_objlen(L, -1) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int g_read (lua_State *L, FILE *f, int first) {
|
||||||
|
int nargs = lua_gettop(L) - 1;
|
||||||
|
int success;
|
||||||
|
int n;
|
||||||
|
clearerr(f);
|
||||||
|
if (nargs == 0) { /* no arguments? */
|
||||||
|
success = read_line(L, f);
|
||||||
|
n = first+1; /* to return 1 result */
|
||||||
|
}
|
||||||
|
else { /* ensure stack space for all results and for auxlib's buffer */
|
||||||
|
luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments");
|
||||||
|
success = 1;
|
||||||
|
for (n = first; nargs-- && success; n++) {
|
||||||
|
if (lua_type(L, n) == LUA_TNUMBER) {
|
||||||
|
size_t l = (size_t)lua_tointeger(L, n);
|
||||||
|
success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const char *p = lua_tostring(L, n);
|
||||||
|
luaL_argcheck(L, p && p[0] == '*', n, "invalid option");
|
||||||
|
switch (p[1]) {
|
||||||
|
case 'n': /* number */
|
||||||
|
success = read_number(L, f);
|
||||||
|
break;
|
||||||
|
case 'l': /* line */
|
||||||
|
success = read_line(L, f);
|
||||||
|
break;
|
||||||
|
case 'a': /* file */
|
||||||
|
read_chars(L, f, ~((size_t)0)); /* read MAX_SIZE_T chars */
|
||||||
|
success = 1; /* always success */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return luaL_argerror(L, n, "invalid format");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ferror(f))
|
||||||
|
return pushresult(L, 0, NULL);
|
||||||
|
if (!success) {
|
||||||
|
lua_pop(L, 1); /* remove last result */
|
||||||
|
lua_pushnil(L); /* push nil instead */
|
||||||
|
}
|
||||||
|
return n - first;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int f_read (lua_State *L) {
|
||||||
|
return g_read(L, tofile(L), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int io_readline (lua_State *L) {
|
||||||
|
FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1));
|
||||||
|
int sucess;
|
||||||
|
if (f == NULL) /* file is already closed? */
|
||||||
|
luaL_error(L, "file is already closed");
|
||||||
|
sucess = read_line(L, f);
|
||||||
|
if (ferror(f))
|
||||||
|
return luaL_error(L, "%s", strerror(errno));
|
||||||
|
if (sucess) return 1;
|
||||||
|
else { /* EOF */
|
||||||
|
if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */
|
||||||
|
lua_settop(L, 0);
|
||||||
|
lua_pushvalue(L, lua_upvalueindex(1));
|
||||||
|
aux_close(L); /* close it */
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* }====================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
static int g_write (lua_State *L, FILE *f, int arg) {
|
||||||
|
int nargs = lua_gettop(L) - 1;
|
||||||
|
int status = 1;
|
||||||
|
for (; nargs--; arg++) {
|
||||||
|
if (lua_type(L, arg) == LUA_TNUMBER) {
|
||||||
|
/* optimization: could be done exactly as for strings */
|
||||||
|
status = status &&
|
||||||
|
fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
size_t l;
|
||||||
|
const char *s = luaL_checklstring(L, arg, &l);
|
||||||
|
if (ftell(f) + l > FILELIMIT) {
|
||||||
|
luaL_error(L,"write limit bypassed in file. Changes have been discarded.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
status = status && (fwrite(s, sizeof(char), l, f) == l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pushresult(L, status, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int f_write (lua_State *L) {
|
||||||
|
return g_write(L, tofile(L), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int f_seek (lua_State *L) {
|
||||||
|
static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END};
|
||||||
|
static const char *const modenames[] = {"set", "cur", "end", NULL};
|
||||||
|
FILE *f = tofile(L);
|
||||||
|
int op = luaL_checkoption(L, 2, "cur", modenames);
|
||||||
|
long offset = luaL_optlong(L, 3, 0);
|
||||||
|
op = fseek(f, offset, mode[op]);
|
||||||
|
if (op)
|
||||||
|
return pushresult(L, 0, NULL); /* error */
|
||||||
|
else {
|
||||||
|
lua_pushinteger(L, ftell(f));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int f_setvbuf (lua_State *L) {
|
||||||
|
static const int mode[] = {_IONBF, _IOFBF, _IOLBF};
|
||||||
|
static const char *const modenames[] = {"no", "full", "line", NULL};
|
||||||
|
FILE *f = tofile(L);
|
||||||
|
int op = luaL_checkoption(L, 2, NULL, modenames);
|
||||||
|
lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE);
|
||||||
|
int res = setvbuf(f, NULL, mode[op], sz);
|
||||||
|
return pushresult(L, res == 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int f_flush (lua_State *L) {
|
||||||
|
return pushresult(L, fflush(tofile(L)) == 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const luaL_Reg iolib[] = {
|
||||||
|
{"close", io_close},
|
||||||
|
{"open", io_open},
|
||||||
|
{"openlocal", io_openlocal},
|
||||||
|
{"tmpfile", io_tmpfile},
|
||||||
|
{"type", io_type},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const luaL_Reg flib[] = {
|
||||||
|
{"close", io_close},
|
||||||
|
{"flush", f_flush},
|
||||||
|
{"lines", f_lines},
|
||||||
|
{"read", f_read},
|
||||||
|
{"seek", f_seek},
|
||||||
|
{"setvbuf", f_setvbuf},
|
||||||
|
{"write", f_write},
|
||||||
|
{"__gc", io_gc},
|
||||||
|
{"__tostring", io_tostring},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void createmeta (lua_State *L) {
|
||||||
|
luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */
|
||||||
|
lua_pushvalue(L, -1); /* push metatable */
|
||||||
|
lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */
|
||||||
|
luaL_register(L, NULL, flib); /* file methods */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) {
|
||||||
|
*newfile(L) = f;
|
||||||
|
if (k > 0) {
|
||||||
|
lua_pushvalue(L, -1);
|
||||||
|
lua_rawseti(L, LUA_ENVIRONINDEX, k);
|
||||||
|
}
|
||||||
|
lua_pushvalue(L, -2); /* copy environment */
|
||||||
|
lua_setfenv(L, -2); /* set it */
|
||||||
|
lua_setfield(L, -3, fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void newfenv (lua_State *L, lua_CFunction cls) {
|
||||||
|
lua_createtable(L, 0, 1);
|
||||||
|
lua_pushcfunction(L, cls);
|
||||||
|
lua_setfield(L, -2, "__close");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LUALIB_API int luaopen_io (lua_State *L) {
|
||||||
|
createmeta(L);
|
||||||
|
/* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */
|
||||||
|
newfenv(L, io_fclose);
|
||||||
|
lua_replace(L, LUA_ENVIRONINDEX);
|
||||||
|
/* open library */
|
||||||
|
luaL_register(L, LUA_IOLIBNAME, iolib);
|
||||||
|
/* create (and set) default files */
|
||||||
|
newfenv(L, io_noclose); /* close function for default files */
|
||||||
|
createstdfile(L, stdin, IO_INPUT, "stdin");
|
||||||
|
createstdfile(L, stdout, IO_OUTPUT, "stdout");
|
||||||
|
createstdfile(L, stderr, 0, "stderr");
|
||||||
|
lua_pop(L, 1); /* pop environment for default files */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,9 @@ LUALIB_API int (luaopen_base) (lua_State *L);
|
||||||
#define LUA_TABLIBNAME "table"
|
#define LUA_TABLIBNAME "table"
|
||||||
LUALIB_API int (luaopen_table) (lua_State *L);
|
LUALIB_API int (luaopen_table) (lua_State *L);
|
||||||
|
|
||||||
|
#define LUA_IOLIBNAME "io"
|
||||||
|
LUALIB_API int (luaopen_io) (lua_State *L);
|
||||||
|
|
||||||
#define LUA_STRLIBNAME "string"
|
#define LUA_STRLIBNAME "string"
|
||||||
LUALIB_API int (luaopen_string) (lua_State *L);
|
LUALIB_API int (luaopen_string) (lua_State *L);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -823,8 +823,13 @@ static void COM_Help_f(void)
|
||||||
if (!stricmp(cvar->PossibleValue[MINVAL].strvalue, "MIN"))
|
if (!stricmp(cvar->PossibleValue[MINVAL].strvalue, "MIN"))
|
||||||
{
|
{
|
||||||
if (floatmode)
|
if (floatmode)
|
||||||
CONS_Printf(" range from %f to %f\n", FIXED_TO_FLOAT(cvar->PossibleValue[MINVAL].value),
|
{
|
||||||
FIXED_TO_FLOAT(cvar->PossibleValue[MAXVAL].value));
|
float fu = FIXED_TO_FLOAT(cvar->PossibleValue[MINVAL].value);
|
||||||
|
float ck = FIXED_TO_FLOAT(cvar->PossibleValue[MAXVAL].value);
|
||||||
|
CONS_Printf(" range from %ld%s to %ld%s\n",
|
||||||
|
(long)fu, M_Ftrim(fu),
|
||||||
|
(long)ck, M_Ftrim(ck));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
CONS_Printf(" range from %d to %d\n", cvar->PossibleValue[MINVAL].value,
|
CONS_Printf(" range from %d to %d\n", cvar->PossibleValue[MINVAL].value,
|
||||||
cvar->PossibleValue[MAXVAL].value);
|
cvar->PossibleValue[MAXVAL].value);
|
||||||
|
@ -973,7 +978,10 @@ static void COM_Add_f(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (( cvar->flags & CV_FLOAT ))
|
if (( cvar->flags & CV_FLOAT ))
|
||||||
CV_Set(cvar, va("%f", FIXED_TO_FLOAT (cvar->value) + atof(COM_Argv(2))));
|
{
|
||||||
|
float n =FIXED_TO_FLOAT (cvar->value) + atof(COM_Argv(2));
|
||||||
|
CV_Set(cvar, va("%ld%s", (long)n, M_Ftrim(n)));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
CV_AddValue(cvar, atoi(COM_Argv(2)));
|
CV_AddValue(cvar, atoi(COM_Argv(2)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -27,13 +27,13 @@
|
||||||
|
|
||||||
/* Manually defined asset hashes for non-CMake builds
|
/* Manually defined asset hashes for non-CMake builds
|
||||||
* Last updated 2020 / 02 / 15 - v2.2.1 - main assets
|
* Last updated 2020 / 02 / 15 - v2.2.1 - main assets
|
||||||
* Last updated 20?? / ?? / ?? - v2.2.? - patch.pk3
|
* Last updated 2020 / 02 / 22 - v2.2.2 - patch.pk3
|
||||||
*/
|
*/
|
||||||
#define ASSET_HASH_SRB2_PK3 "0277c9416756627004e83cbb5b2e3e28"
|
#define ASSET_HASH_SRB2_PK3 "0277c9416756627004e83cbb5b2e3e28"
|
||||||
#define ASSET_HASH_ZONES_PK3 "f7e88afb6af7996a834c7d663144bead"
|
#define ASSET_HASH_ZONES_PK3 "f7e88afb6af7996a834c7d663144bead"
|
||||||
#define ASSET_HASH_PLAYER_DTA "ad49e07b17cc662f1ad70c454910b4ae"
|
#define ASSET_HASH_PLAYER_DTA "ad49e07b17cc662f1ad70c454910b4ae"
|
||||||
#ifdef USE_PATCH_DTA
|
#ifdef USE_PATCH_DTA
|
||||||
#define ASSET_HASH_PATCH_PK3 "there is no patch.pk3, only zuul"
|
#define ASSET_HASH_PATCH_PK3 "ee54330ecb743314c5f962af4db731ff"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -613,15 +613,6 @@ void CON_Ticker(void)
|
||||||
con_tick++;
|
con_tick++;
|
||||||
con_tick &= 7;
|
con_tick &= 7;
|
||||||
|
|
||||||
// if the menu is open then close the console.
|
|
||||||
if (menuactive && con_destlines)
|
|
||||||
{
|
|
||||||
consoletoggle = false;
|
|
||||||
con_destlines = 0;
|
|
||||||
CON_ClearHUD();
|
|
||||||
I_UpdateMouseGrab();
|
|
||||||
}
|
|
||||||
|
|
||||||
// console key was pushed
|
// console key was pushed
|
||||||
if (consoletoggle)
|
if (consoletoggle)
|
||||||
{
|
{
|
||||||
|
@ -793,7 +784,7 @@ boolean CON_Responder(event_t *ev)
|
||||||
// check other keys only if console prompt is active
|
// check other keys only if console prompt is active
|
||||||
if (!consoleready && key < NUMINPUTS) // metzgermeister: boundary check!!
|
if (!consoleready && key < NUMINPUTS) // metzgermeister: boundary check!!
|
||||||
{
|
{
|
||||||
if (bindtable[key])
|
if (! menuactive && bindtable[key])
|
||||||
{
|
{
|
||||||
COM_BufAddText(bindtable[key]);
|
COM_BufAddText(bindtable[key]);
|
||||||
COM_BufAddText("\n");
|
COM_BufAddText("\n");
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -3197,6 +3197,10 @@ void D_QuitNetGame(void)
|
||||||
|
|
||||||
// abort send/receive of files
|
// abort send/receive of files
|
||||||
CloseNetFile();
|
CloseNetFile();
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
RemoveAllLuaFileTransfers();
|
||||||
|
waitingforluafiletransfer = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (server)
|
if (server)
|
||||||
{
|
{
|
||||||
|
@ -3609,6 +3613,10 @@ static void HandleConnect(SINT8 node)
|
||||||
SV_SendRefuse(node, M_GetText("Too many players from\nthis node."));
|
SV_SendRefuse(node, M_GetText("Too many players from\nthis node."));
|
||||||
else if (netgame && !netbuffer->u.clientcfg.localplayers) // Stealth join?
|
else if (netgame && !netbuffer->u.clientcfg.localplayers) // Stealth join?
|
||||||
SV_SendRefuse(node, M_GetText("No players from\nthis node."));
|
SV_SendRefuse(node, M_GetText("No players from\nthis node."));
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
else if (luafiletransfers)
|
||||||
|
SV_SendRefuse(node, M_GetText("The server is broadcasting a file\nrequested by a Lua script.\nPlease wait a bit and then\ntry rejoining."));
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
|
@ -3945,7 +3953,9 @@ static void HandlePacketFromPlayer(SINT8 node)
|
||||||
INT32 netconsole;
|
INT32 netconsole;
|
||||||
tic_t realend, realstart;
|
tic_t realend, realstart;
|
||||||
UINT8 *pak, *txtpak, numtxtpak;
|
UINT8 *pak, *txtpak, numtxtpak;
|
||||||
|
#ifndef NOMD5
|
||||||
UINT8 finalmd5[16];/* Well, it's the cool thing to do? */
|
UINT8 finalmd5[16];/* Well, it's the cool thing to do? */
|
||||||
|
#endif
|
||||||
|
|
||||||
txtpak = NULL;
|
txtpak = NULL;
|
||||||
|
|
||||||
|
@ -3964,7 +3974,7 @@ static void HandlePacketFromPlayer(SINT8 node)
|
||||||
case PT_RESYNCHGET:
|
case PT_RESYNCHGET:
|
||||||
if (client)
|
if (client)
|
||||||
break;
|
break;
|
||||||
SV_AcknowledgeResynchAck(netconsole, netbuffer->u.resynchgot);
|
SV_AcknowledgeResynchAck(node, netbuffer->u.resynchgot);
|
||||||
break;
|
break;
|
||||||
case PT_CLIENTCMD:
|
case PT_CLIENTCMD:
|
||||||
case PT_CLIENT2CMD:
|
case PT_CLIENT2CMD:
|
||||||
|
@ -4193,6 +4203,20 @@ static void HandlePacketFromPlayer(SINT8 node)
|
||||||
Net_CloseConnection(node);
|
Net_CloseConnection(node);
|
||||||
nodeingame[node] = false;
|
nodeingame[node] = false;
|
||||||
break;
|
break;
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
case PT_ASKLUAFILE:
|
||||||
|
if (server && luafiletransfers && luafiletransfers->nodestatus[node] == LFTNS_ASKED)
|
||||||
|
{
|
||||||
|
char *name = va("%s" PATHSEP "%s", luafiledir, luafiletransfers->filename);
|
||||||
|
boolean textmode = !strchr(luafiletransfers->mode, 'b');
|
||||||
|
SV_SendLuaFile(node, name, textmode);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PT_HASLUAFILE:
|
||||||
|
if (server && luafiletransfers && luafiletransfers->nodestatus[node] == LFTNS_SENDING)
|
||||||
|
SV_HandleLuaFileSent(node);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
// -------------------------------------------- CLIENT RECEIVE ----------
|
// -------------------------------------------- CLIENT RECEIVE ----------
|
||||||
case PT_RESYNCHEND:
|
case PT_RESYNCHEND:
|
||||||
// Only accept PT_RESYNCHEND from the server.
|
// Only accept PT_RESYNCHEND from the server.
|
||||||
|
@ -4320,6 +4344,12 @@ static void HandlePacketFromPlayer(SINT8 node)
|
||||||
if (client)
|
if (client)
|
||||||
Got_Filetxpak();
|
Got_Filetxpak();
|
||||||
break;
|
break;
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
case PT_SENDINGLUAFILE:
|
||||||
|
if (client)
|
||||||
|
CL_PrepareDownloadLuaFile();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
DEBFILE(va("UNKNOWN PACKET TYPE RECEIVED %d from host %d\n",
|
DEBFILE(va("UNKNOWN PACKET TYPE RECEIVED %d from host %d\n",
|
||||||
netbuffer->packettype, node));
|
netbuffer->packettype, node));
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -67,6 +67,12 @@ typedef enum
|
||||||
PT_RESYNCHEND, // Player is now resynched and is being requested to remake the gametic
|
PT_RESYNCHEND, // Player is now resynched and is being requested to remake the gametic
|
||||||
PT_RESYNCHGET, // Player got resynch packet
|
PT_RESYNCHGET, // Player got resynch packet
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
PT_SENDINGLUAFILE, // Server telling a client Lua needs to open a file
|
||||||
|
PT_ASKLUAFILE, // Client telling the server they don't have the file
|
||||||
|
PT_HASLUAFILE, // Client telling the server they have the file
|
||||||
|
#endif
|
||||||
|
|
||||||
// Add non-PT_CANFAIL packet types here to avoid breaking MS compatibility.
|
// Add non-PT_CANFAIL packet types here to avoid breaking MS compatibility.
|
||||||
|
|
||||||
PT_CANFAIL, // This is kind of a priority. Anything bigger than CANFAIL
|
PT_CANFAIL, // This is kind of a priority. Anything bigger than CANFAIL
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
72
src/d_main.c
72
src/d_main.c
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -508,13 +508,11 @@ static void D_Display(void)
|
||||||
// vid size change is now finished if it was on...
|
// vid size change is now finished if it was on...
|
||||||
vid.recalc = 0;
|
vid.recalc = 0;
|
||||||
|
|
||||||
// FIXME: draw either console or menu, not the two
|
|
||||||
if (gamestate != GS_TIMEATTACK)
|
|
||||||
CON_Drawer();
|
|
||||||
|
|
||||||
M_Drawer(); // menu is drawn even on top of everything
|
M_Drawer(); // menu is drawn even on top of everything
|
||||||
// focus lost moved to M_Drawer
|
// focus lost moved to M_Drawer
|
||||||
|
|
||||||
|
CON_Drawer();
|
||||||
|
|
||||||
//
|
//
|
||||||
// wipe update
|
// wipe update
|
||||||
//
|
//
|
||||||
|
@ -1041,7 +1039,7 @@ void D_SRB2Main(void)
|
||||||
// Print GPL notice for our console users (Linux)
|
// Print GPL notice for our console users (Linux)
|
||||||
CONS_Printf(
|
CONS_Printf(
|
||||||
"\n\nSonic Robo Blast 2\n"
|
"\n\nSonic Robo Blast 2\n"
|
||||||
"Copyright (C) 1998-2019 by Sonic Team Junior\n\n"
|
"Copyright (C) 1998-2020 by Sonic Team Junior\n\n"
|
||||||
"This program comes with ABSOLUTELY NO WARRANTY.\n\n"
|
"This program comes with ABSOLUTELY NO WARRANTY.\n\n"
|
||||||
"This is free software, and you are welcome to redistribute it\n"
|
"This is free software, and you are welcome to redistribute it\n"
|
||||||
"and/or modify it under the terms of the GNU General Public License\n"
|
"and/or modify it under the terms of the GNU General Public License\n"
|
||||||
|
@ -1126,7 +1124,10 @@ void D_SRB2Main(void)
|
||||||
// can't use sprintf since there is %u in savegamename
|
// can't use sprintf since there is %u in savegamename
|
||||||
strcatbf(savegamename, srb2home, PATHSEP);
|
strcatbf(savegamename, srb2home, PATHSEP);
|
||||||
|
|
||||||
#else
|
#ifdef HAVE_BLUA
|
||||||
|
snprintf(luafiledir, sizeof luafiledir, "%s" PATHSEP "luafiles", srb2home);
|
||||||
|
#endif
|
||||||
|
#else // DEFAULTDIR
|
||||||
snprintf(srb2home, sizeof srb2home, "%s", userhome);
|
snprintf(srb2home, sizeof srb2home, "%s", userhome);
|
||||||
snprintf(downloaddir, sizeof downloaddir, "%s", userhome);
|
snprintf(downloaddir, sizeof downloaddir, "%s", userhome);
|
||||||
if (dedicated)
|
if (dedicated)
|
||||||
|
@ -1136,7 +1137,11 @@ void D_SRB2Main(void)
|
||||||
|
|
||||||
// can't use sprintf since there is %u in savegamename
|
// can't use sprintf since there is %u in savegamename
|
||||||
strcatbf(savegamename, userhome, PATHSEP);
|
strcatbf(savegamename, userhome, PATHSEP);
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
snprintf(luafiledir, sizeof luafiledir, "%s" PATHSEP "luafiles", userhome);
|
||||||
#endif
|
#endif
|
||||||
|
#endif // DEFAULTDIR
|
||||||
}
|
}
|
||||||
|
|
||||||
configfile[sizeof configfile - 1] = '\0';
|
configfile[sizeof configfile - 1] = '\0';
|
||||||
|
@ -1212,22 +1217,17 @@ void D_SRB2Main(void)
|
||||||
|
|
||||||
// load wad, including the main wad file
|
// load wad, including the main wad file
|
||||||
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
|
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
|
||||||
if (!W_InitMultipleFiles(startupwadfiles, mainwads))
|
W_InitMultipleFiles(startupwadfiles, mainwads);
|
||||||
#ifdef _DEBUG
|
|
||||||
CONS_Error("A WAD file was not found or not valid.\nCheck the log to see which ones.\n");
|
|
||||||
#else
|
|
||||||
I_Error("A WAD file was not found or not valid.\nCheck the log to see which ones.\n");
|
|
||||||
#endif
|
|
||||||
D_CleanFile();
|
D_CleanFile();
|
||||||
|
|
||||||
#ifndef DEVELOP // md5s last updated 16/02/20 (ddmmyy)
|
#ifndef DEVELOP // md5s last updated 22/02/20 (ddmmyy)
|
||||||
|
|
||||||
// Check MD5s of autoloaded files
|
// Check MD5s of autoloaded files
|
||||||
W_VerifyFileMD5(0, ASSET_HASH_SRB2_PK3); // srb2.pk3
|
W_VerifyFileMD5(0, ASSET_HASH_SRB2_PK3); // srb2.pk3
|
||||||
W_VerifyFileMD5(1, ASSET_HASH_ZONES_PK3); // zones.pk3
|
W_VerifyFileMD5(1, ASSET_HASH_ZONES_PK3); // zones.pk3
|
||||||
W_VerifyFileMD5(2, ASSET_HASH_PLAYER_DTA); // player.dta
|
W_VerifyFileMD5(2, ASSET_HASH_PLAYER_DTA); // player.dta
|
||||||
#ifdef USE_PATCH_DTA
|
#ifdef USE_PATCH_DTA
|
||||||
W_VerifyFileMD5(3, ASSET_HASH_PATCH_DTA); // patch.pk3
|
W_VerifyFileMD5(3, ASSET_HASH_PATCH_PK3); // patch.pk3
|
||||||
#endif
|
#endif
|
||||||
// don't check music.dta because people like to modify it, and it doesn't matter if they do
|
// don't check music.dta because people like to modify it, and it doesn't matter if they do
|
||||||
// ...except it does if they slip maps in there, and that's what W_VerifyNMUSlumps is for.
|
// ...except it does if they slip maps in there, and that's what W_VerifyNMUSlumps is for.
|
||||||
|
@ -1235,20 +1235,6 @@ void D_SRB2Main(void)
|
||||||
|
|
||||||
mainwadstally = packetsizetally; // technically not accurate atm, remember to port the two-stage -file process from kart in 2.2.x
|
mainwadstally = packetsizetally; // technically not accurate atm, remember to port the two-stage -file process from kart in 2.2.x
|
||||||
|
|
||||||
if (M_CheckParm("-warp") && M_IsNextParm())
|
|
||||||
{
|
|
||||||
const char *word = M_GetNextParm();
|
|
||||||
pstartmap = G_FindMapByNameOrCode(word, 0);
|
|
||||||
if (! pstartmap)
|
|
||||||
I_Error("Cannot find a map remotely named '%s'\n", word);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!M_CheckParm("-server"))
|
|
||||||
G_SetGameModified(true);
|
|
||||||
autostart = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cht_Init();
|
cht_Init();
|
||||||
|
|
||||||
//---------------------------------------------------- READY SCREEN
|
//---------------------------------------------------- READY SCREEN
|
||||||
|
@ -1297,12 +1283,21 @@ void D_SRB2Main(void)
|
||||||
// Lactozilla: Does the render mode need to change?
|
// Lactozilla: Does the render mode need to change?
|
||||||
if ((setrenderneeded != 0) && (setrenderneeded != rendermode))
|
if ((setrenderneeded != 0) && (setrenderneeded != rendermode))
|
||||||
{
|
{
|
||||||
|
CONS_Printf(M_GetText("Switching the renderer...\n"));
|
||||||
|
Z_PreparePatchFlush();
|
||||||
|
|
||||||
|
// set needpatchflush / needpatchrecache true for D_CheckRendererState
|
||||||
needpatchflush = true;
|
needpatchflush = true;
|
||||||
needpatchrecache = true;
|
needpatchrecache = true;
|
||||||
|
|
||||||
|
// Set cv_renderer to the new render mode
|
||||||
VID_CheckRenderer();
|
VID_CheckRenderer();
|
||||||
SCR_ChangeRendererCVars(setrenderneeded);
|
SCR_ChangeRendererCVars(setrenderneeded);
|
||||||
}
|
|
||||||
|
// check the renderer's state, and then clear setrenderneeded
|
||||||
D_CheckRendererState();
|
D_CheckRendererState();
|
||||||
|
setrenderneeded = 0;
|
||||||
|
}
|
||||||
|
|
||||||
wipegamestate = gamestate;
|
wipegamestate = gamestate;
|
||||||
|
|
||||||
|
@ -1310,6 +1305,23 @@ void D_SRB2Main(void)
|
||||||
|
|
||||||
//------------------------------------------------ COMMAND LINE PARAMS
|
//------------------------------------------------ COMMAND LINE PARAMS
|
||||||
|
|
||||||
|
// this must be done after loading gamedata,
|
||||||
|
// to avoid setting off the corrupted gamedata code in G_LoadGameData if a SOC with custom gamedata is added
|
||||||
|
// -- Monster Iestyn 20/02/20
|
||||||
|
if (M_CheckParm("-warp") && M_IsNextParm())
|
||||||
|
{
|
||||||
|
const char *word = M_GetNextParm();
|
||||||
|
pstartmap = G_FindMapByNameOrCode(word, 0);
|
||||||
|
if (! pstartmap)
|
||||||
|
I_Error("Cannot find a map remotely named '%s'\n", word);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!M_CheckParm("-server"))
|
||||||
|
G_SetGameModified(true);
|
||||||
|
autostart = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize CD-Audio
|
// Initialize CD-Audio
|
||||||
if (M_CheckParm("-usecd") && !dedicated)
|
if (M_CheckParm("-usecd") && !dedicated)
|
||||||
I_InitCD();
|
I_InitCD();
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
12
src/d_net.c
12
src/d_net.c
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -715,6 +715,10 @@ void Net_CloseConnection(INT32 node)
|
||||||
|
|
||||||
InitNode(&nodes[node]);
|
InitNode(&nodes[node]);
|
||||||
SV_AbortSendFiles(node);
|
SV_AbortSendFiles(node);
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
if (server)
|
||||||
|
SV_AbortLuaFileTransfer(node);
|
||||||
|
#endif
|
||||||
I_NetFreeNodenum(node);
|
I_NetFreeNodenum(node);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -799,6 +803,12 @@ static const char *packettypename[NUMPACKETTYPE] =
|
||||||
"RESYNCHEND",
|
"RESYNCHEND",
|
||||||
"RESYNCHGET",
|
"RESYNCHGET",
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
"SENDINGLUAFILE",
|
||||||
|
"ASKLUAFILE",
|
||||||
|
"HASLUAFILE",
|
||||||
|
#endif
|
||||||
|
|
||||||
"FILEFRAGMENT",
|
"FILEFRAGMENT",
|
||||||
"TEXTCMD",
|
"TEXTCMD",
|
||||||
"TEXTCMD2",
|
"TEXTCMD2",
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -370,7 +370,7 @@ consvar_t cv_advancemap = {"advancemap", "Next", CV_NETVAR, advancemap_cons_t, N
|
||||||
static CV_PossibleValue_t playersforexit_cons_t[] = {{0, "One"}, {1, "1/4"}, {2, "Half"}, {3, "3/4"}, {4, "All"}, {0, NULL}};
|
static CV_PossibleValue_t playersforexit_cons_t[] = {{0, "One"}, {1, "1/4"}, {2, "Half"}, {3, "3/4"}, {4, "All"}, {0, NULL}};
|
||||||
consvar_t cv_playersforexit = {"playersforexit", "All", CV_NETVAR, playersforexit_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_playersforexit = {"playersforexit", "All", CV_NETVAR, playersforexit_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_exitmove = {"exitmove", "Off", CV_NETVAR|CV_CALL, CV_OnOff, ExitMove_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_exitmove = {"exitmove", "On", CV_NETVAR|CV_CALL, CV_OnOff, ExitMove_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_runscripts = {"runscripts", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_runscripts = {"runscripts", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
@ -417,7 +417,8 @@ const char *netxcmdnames[MAXNETXCMD - 1] =
|
||||||
"SUICIDE",
|
"SUICIDE",
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
"LUACMD",
|
"LUACMD",
|
||||||
"LUAVAR"
|
"LUAVAR",
|
||||||
|
"LUAFILE"
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -453,6 +454,7 @@ void D_RegisterServerCommands(void)
|
||||||
RegisterNetXCmd(XD_RUNSOC, Got_RunSOCcmd);
|
RegisterNetXCmd(XD_RUNSOC, Got_RunSOCcmd);
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
RegisterNetXCmd(XD_LUACMD, Got_Luacmd);
|
RegisterNetXCmd(XD_LUACMD, Got_Luacmd);
|
||||||
|
RegisterNetXCmd(XD_LUAFILE, Got_LuaFile);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Remote Administration
|
// Remote Administration
|
||||||
|
@ -677,6 +679,7 @@ void D_RegisterClientCommands(void)
|
||||||
// GIF variables
|
// GIF variables
|
||||||
CV_RegisterVar(&cv_gif_optimize);
|
CV_RegisterVar(&cv_gif_optimize);
|
||||||
CV_RegisterVar(&cv_gif_downscale);
|
CV_RegisterVar(&cv_gif_downscale);
|
||||||
|
CV_RegisterVar(&cv_gif_localcolortable);
|
||||||
|
|
||||||
#ifdef WALLSPLATS
|
#ifdef WALLSPLATS
|
||||||
CV_RegisterVar(&cv_splats);
|
CV_RegisterVar(&cv_splats);
|
||||||
|
@ -3748,9 +3751,15 @@ static void ExitMove_OnChange(void)
|
||||||
if (cv_exitmove.value)
|
if (cv_exitmove.value)
|
||||||
{
|
{
|
||||||
for (i = 0; i < MAXPLAYERS; ++i)
|
for (i = 0; i < MAXPLAYERS; ++i)
|
||||||
if (playeringame[i] && players[i].mo
|
if (playeringame[i] && players[i].mo)
|
||||||
&& players[i].mo->target && players[i].mo->target->type == MT_SIGN)
|
{
|
||||||
|
if (players[i].mo->target && players[i].mo->target->type == MT_SIGN)
|
||||||
P_SetTarget(&players[i].mo->target, NULL);
|
P_SetTarget(&players[i].mo->target, NULL);
|
||||||
|
|
||||||
|
if (players[i].pflags & PF_FINISHED)
|
||||||
|
P_GiveFinishFlags(&players[i]);
|
||||||
|
}
|
||||||
|
|
||||||
CONS_Printf(M_GetText("Players can now move after completing the level.\n"));
|
CONS_Printf(M_GetText("Players can now move after completing the level.\n"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -145,6 +145,7 @@ typedef enum
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
XD_LUACMD, // 22
|
XD_LUACMD, // 22
|
||||||
XD_LUAVAR, // 23
|
XD_LUAVAR, // 23
|
||||||
|
XD_LUAFILE, // 24
|
||||||
#endif
|
#endif
|
||||||
MAXNETXCMD
|
MAXNETXCMD
|
||||||
} netxcmd_t;
|
} netxcmd_t;
|
||||||
|
|
250
src/d_netfil.c
250
src/d_netfil.c
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -69,6 +69,7 @@ typedef struct filetx_s
|
||||||
UINT32 size; // Size of the file
|
UINT32 size; // Size of the file
|
||||||
UINT8 fileid;
|
UINT8 fileid;
|
||||||
INT32 node; // Destination
|
INT32 node; // Destination
|
||||||
|
boolean textmode; // For files requested by Lua without the "b" option
|
||||||
struct filetx_s *next; // Next file in the list
|
struct filetx_s *next; // Next file in the list
|
||||||
} filetx_t;
|
} filetx_t;
|
||||||
|
|
||||||
|
@ -94,6 +95,13 @@ char downloaddir[512] = "DOWNLOAD";
|
||||||
INT32 lastfilenum = -1;
|
INT32 lastfilenum = -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
luafiletransfer_t *luafiletransfers = NULL;
|
||||||
|
boolean waitingforluafiletransfer = false;
|
||||||
|
char luafiledir[256 + 16] = "luafiles";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/** Fills a serverinfo packet with information about wad files loaded.
|
/** Fills a serverinfo packet with information about wad files loaded.
|
||||||
*
|
*
|
||||||
* \todo Give this function a better name since it is in global scope.
|
* \todo Give this function a better name since it is in global scope.
|
||||||
|
@ -159,6 +167,7 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr)
|
||||||
fileneeded[i].file = NULL; // The file isn't open yet
|
fileneeded[i].file = NULL; // The file isn't open yet
|
||||||
READSTRINGN(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
|
READSTRINGN(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
|
||||||
READMEM(p, fileneeded[i].md5sum, 16); // The last 16 bytes are the file checksum
|
READMEM(p, fileneeded[i].md5sum, 16); // The last 16 bytes are the file checksum
|
||||||
|
fileneeded[i].textmode = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,6 +179,7 @@ void CL_PrepareDownloadSaveGame(const char *tmpsave)
|
||||||
fileneeded[0].file = NULL;
|
fileneeded[0].file = NULL;
|
||||||
memset(fileneeded[0].md5sum, 0, 16);
|
memset(fileneeded[0].md5sum, 0, 16);
|
||||||
strcpy(fileneeded[0].filename, tmpsave);
|
strcpy(fileneeded[0].filename, tmpsave);
|
||||||
|
fileneeded[0].textmode = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Checks the server to see if we CAN download all the files,
|
/** Checks the server to see if we CAN download all the files,
|
||||||
|
@ -448,6 +458,164 @@ void CL_LoadServerFiles(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
void AddLuaFileTransfer(const char *filename, const char *mode)
|
||||||
|
{
|
||||||
|
luafiletransfer_t **prevnext; // A pointer to the "next" field of the last transfer in the list
|
||||||
|
luafiletransfer_t *filetransfer;
|
||||||
|
static INT32 id;
|
||||||
|
|
||||||
|
//CONS_Printf("AddLuaFileTransfer \"%s\"\n", filename);
|
||||||
|
|
||||||
|
// Find the last transfer in the list and set a pointer to its "next" field
|
||||||
|
prevnext = &luafiletransfers;
|
||||||
|
while (*prevnext)
|
||||||
|
prevnext = &((*prevnext)->next);
|
||||||
|
|
||||||
|
// Allocate file transfer information and append it to the transfer list
|
||||||
|
filetransfer = malloc(sizeof(luafiletransfer_t));
|
||||||
|
if (!filetransfer)
|
||||||
|
I_Error("AddLuaFileTransfer: Out of memory\n");
|
||||||
|
*prevnext = filetransfer;
|
||||||
|
filetransfer->next = NULL;
|
||||||
|
|
||||||
|
// Allocate the file name
|
||||||
|
filetransfer->filename = strdup(filename);
|
||||||
|
if (!filetransfer->filename)
|
||||||
|
I_Error("AddLuaFileTransfer: Out of memory\n");
|
||||||
|
|
||||||
|
// Create and allocate the real file name
|
||||||
|
if (server)
|
||||||
|
filetransfer->realfilename = strdup(va("%s" PATHSEP "%s",
|
||||||
|
luafiledir, filename));
|
||||||
|
else
|
||||||
|
filetransfer->realfilename = strdup(va("%s" PATHSEP "client" PATHSEP "$$$%d%d.tmp",
|
||||||
|
luafiledir, rand(), rand()));
|
||||||
|
if (!filetransfer->realfilename)
|
||||||
|
I_Error("AddLuaFileTransfer: Out of memory\n");
|
||||||
|
|
||||||
|
strlcpy(filetransfer->mode, mode, sizeof(filetransfer->mode));
|
||||||
|
|
||||||
|
if (server)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
|
||||||
|
// Set status to "waiting" for everyone
|
||||||
|
for (i = 0; i < MAXNETNODES; i++)
|
||||||
|
filetransfer->nodestatus[i] = LFTNS_WAITING;
|
||||||
|
|
||||||
|
if (!luafiletransfers->next) // Only if there is no transfer already going on
|
||||||
|
{
|
||||||
|
if (FIL_ReadFileOK(filetransfer->realfilename))
|
||||||
|
SV_PrepareSendLuaFileToNextNode();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Send a net command with 0 as its first byte to indicate the file couldn't be opened
|
||||||
|
UINT8 success = 0;
|
||||||
|
SendNetXCmd(XD_LUAFILE, &success, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the callback so it can be called once everyone has the file
|
||||||
|
filetransfer->id = id;
|
||||||
|
StoreLuaFileCallback(id);
|
||||||
|
id++;
|
||||||
|
|
||||||
|
if (waitingforluafiletransfer)
|
||||||
|
{
|
||||||
|
waitingforluafiletransfer = false;
|
||||||
|
CL_PrepareDownloadLuaFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SV_PrepareSendLuaFileToNextNode(void)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
UINT8 success = 1;
|
||||||
|
|
||||||
|
// Find a client to send the file to
|
||||||
|
for (i = 1; i < MAXNETNODES; i++)
|
||||||
|
if (nodeingame[i] && luafiletransfers->nodestatus[i] == LFTNS_WAITING) // Node waiting
|
||||||
|
{
|
||||||
|
// Tell the client we're about to send them the file
|
||||||
|
netbuffer->packettype = PT_SENDINGLUAFILE;
|
||||||
|
if (!HSendPacket(i, true, 0, 0))
|
||||||
|
I_Error("Failed to send a PT_SENDINGLUAFILE packet\n"); // !!! Todo: Handle failure a bit better lol
|
||||||
|
|
||||||
|
luafiletransfers->nodestatus[i] = LFTNS_ASKED;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No client found, everyone has the file
|
||||||
|
// Send a net command with 1 as its first byte to indicate the file could be opened
|
||||||
|
SendNetXCmd(XD_LUAFILE, &success, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SV_HandleLuaFileSent(UINT8 node)
|
||||||
|
{
|
||||||
|
luafiletransfers->nodestatus[node] = LFTNS_SENT;
|
||||||
|
SV_PrepareSendLuaFileToNextNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveLuaFileTransfer(void)
|
||||||
|
{
|
||||||
|
luafiletransfer_t *filetransfer = luafiletransfers;
|
||||||
|
|
||||||
|
RemoveLuaFileCallback(filetransfer->id);
|
||||||
|
|
||||||
|
luafiletransfers = filetransfer->next;
|
||||||
|
|
||||||
|
free(filetransfer->filename);
|
||||||
|
free(filetransfer->realfilename);
|
||||||
|
free(filetransfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveAllLuaFileTransfers(void)
|
||||||
|
{
|
||||||
|
while (luafiletransfers)
|
||||||
|
RemoveLuaFileTransfer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SV_AbortLuaFileTransfer(INT32 node)
|
||||||
|
{
|
||||||
|
if (luafiletransfers
|
||||||
|
&& (luafiletransfers->nodestatus[node] == LFTNS_ASKED
|
||||||
|
|| luafiletransfers->nodestatus[node] == LFTNS_SENDING))
|
||||||
|
{
|
||||||
|
luafiletransfers->nodestatus[node] = LFTNS_WAITING;
|
||||||
|
SV_PrepareSendLuaFileToNextNode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CL_PrepareDownloadLuaFile(void)
|
||||||
|
{
|
||||||
|
// If there is no transfer in the list, this normally means the server
|
||||||
|
// called io.open before us, so we have to wait until we call it too
|
||||||
|
if (!luafiletransfers)
|
||||||
|
{
|
||||||
|
waitingforluafiletransfer = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tell the server we are ready to receive the file
|
||||||
|
netbuffer->packettype = PT_ASKLUAFILE;
|
||||||
|
HSendPacket(servernode, true, 0, 0);
|
||||||
|
|
||||||
|
fileneedednum = 1;
|
||||||
|
fileneeded[0].status = FS_REQUESTED;
|
||||||
|
fileneeded[0].totalsize = UINT32_MAX;
|
||||||
|
fileneeded[0].file = NULL;
|
||||||
|
memset(fileneeded[0].md5sum, 0, 16);
|
||||||
|
strcpy(fileneeded[0].filename, luafiletransfers->realfilename);
|
||||||
|
fileneeded[0].textmode = !strchr(luafiletransfers->mode, 'b');
|
||||||
|
|
||||||
|
// Make sure all directories in the file path exist
|
||||||
|
MakePathDirs(fileneeded[0].filename);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Number of files to send
|
// Number of files to send
|
||||||
// Little optimization to quickly test if there is a file in the queue
|
// Little optimization to quickly test if there is a file in the queue
|
||||||
static INT32 filestosend = 0;
|
static INT32 filestosend = 0;
|
||||||
|
@ -458,6 +626,7 @@ static INT32 filestosend = 0;
|
||||||
* \param filename The file to send
|
* \param filename The file to send
|
||||||
* \param fileid ???
|
* \param fileid ???
|
||||||
* \sa SV_SendRam
|
* \sa SV_SendRam
|
||||||
|
* \sa SV_SendLuaFile
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
||||||
|
@ -548,6 +717,7 @@ static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
||||||
* \param freemethod How to free the block after it has been sent
|
* \param freemethod How to free the block after it has been sent
|
||||||
* \param fileid ???
|
* \param fileid ???
|
||||||
* \sa SV_SendFile
|
* \sa SV_SendFile
|
||||||
|
* \sa SV_SendLuaFile
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod, UINT8 fileid)
|
void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod, UINT8 fileid)
|
||||||
|
@ -579,6 +749,57 @@ void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod, UI
|
||||||
filestosend++;
|
filestosend++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
/** Adds a file requested by Lua to the file list for a node
|
||||||
|
*
|
||||||
|
* \param node The node to send the file to
|
||||||
|
* \param filename The file to send
|
||||||
|
* \sa SV_SendFile
|
||||||
|
* \sa SV_SendRam
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
boolean SV_SendLuaFile(INT32 node, const char *filename, boolean textmode)
|
||||||
|
{
|
||||||
|
filetx_t **q; // A pointer to the "next" field of the last file in the list
|
||||||
|
filetx_t *p; // The new file request
|
||||||
|
//INT32 i;
|
||||||
|
//char wadfilename[MAX_WADPATH];
|
||||||
|
|
||||||
|
luafiletransfers->nodestatus[node] = LFTNS_SENDING;
|
||||||
|
|
||||||
|
// Find the last file in the list and set a pointer to its "next" field
|
||||||
|
q = &transfer[node].txlist;
|
||||||
|
while (*q)
|
||||||
|
q = &((*q)->next);
|
||||||
|
|
||||||
|
// Allocate a file request and append it to the file list
|
||||||
|
p = *q = (filetx_t *)malloc(sizeof (filetx_t));
|
||||||
|
if (!p)
|
||||||
|
I_Error("SV_SendLuaFile: No more memory\n");
|
||||||
|
|
||||||
|
// Initialise with zeros
|
||||||
|
memset(p, 0, sizeof (filetx_t));
|
||||||
|
|
||||||
|
// Allocate the file name
|
||||||
|
p->id.filename = (char *)malloc(MAX_WADPATH); // !!!
|
||||||
|
if (!p->id.filename)
|
||||||
|
I_Error("SV_SendLuaFile: No more memory\n");
|
||||||
|
|
||||||
|
// Set the file name and get rid of the path
|
||||||
|
strlcpy(p->id.filename, filename, MAX_WADPATH); // !!!
|
||||||
|
//nameonly(p->id.filename);
|
||||||
|
|
||||||
|
// Open in text mode if required by the Lua script
|
||||||
|
p->textmode = textmode;
|
||||||
|
|
||||||
|
DEBFILE(va("Sending Lua file %s to %d\n", filename, node));
|
||||||
|
p->ram = SF_FILE; // It's a file, we need to close it and free its name once we're done sending it
|
||||||
|
p->next = NULL; // End of list
|
||||||
|
filestosend++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Stops sending a file for a node, and removes the file request from the list,
|
/** Stops sending a file for a node, and removes the file request from the list,
|
||||||
* either because the file has been fully sent or because the node was disconnected
|
* either because the file has been fully sent or because the node was disconnected
|
||||||
*
|
*
|
||||||
|
@ -684,7 +905,7 @@ void SV_FileSendTicker(void)
|
||||||
long filesize;
|
long filesize;
|
||||||
|
|
||||||
transfer[i].currentfile =
|
transfer[i].currentfile =
|
||||||
fopen(f->id.filename, "rb");
|
fopen(f->id.filename, f->textmode ? "r" : "rb");
|
||||||
|
|
||||||
if (!transfer[i].currentfile)
|
if (!transfer[i].currentfile)
|
||||||
I_Error("File %s does not exist",
|
I_Error("File %s does not exist",
|
||||||
|
@ -715,11 +936,20 @@ void SV_FileSendTicker(void)
|
||||||
size = f->size-transfer[i].position;
|
size = f->size-transfer[i].position;
|
||||||
if (ram)
|
if (ram)
|
||||||
M_Memcpy(p->data, &f->id.ram[transfer[i].position], size);
|
M_Memcpy(p->data, &f->id.ram[transfer[i].position], size);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t n = fread(p->data, 1, size, transfer[i].currentfile);
|
||||||
|
if (n != size) // Either an error or Windows turning CR-LF into LF
|
||||||
|
{
|
||||||
|
if (f->textmode && feof(transfer[i].currentfile))
|
||||||
|
size = n;
|
||||||
else if (fread(p->data, 1, size, transfer[i].currentfile) != size)
|
else if (fread(p->data, 1, size, transfer[i].currentfile) != size)
|
||||||
I_Error("SV_FileSendTicker: can't read %s byte on %s at %d because %s", sizeu1(size), f->id.filename, transfer[i].position, M_FileError(transfer[i].currentfile));
|
I_Error("SV_FileSendTicker: can't read %s byte on %s at %d because %s", sizeu1(size), f->id.filename, transfer[i].position, M_FileError(transfer[i].currentfile));
|
||||||
|
}
|
||||||
|
}
|
||||||
p->position = LONG(transfer[i].position);
|
p->position = LONG(transfer[i].position);
|
||||||
// Put flag so receiver knows the total size
|
// Put flag so receiver knows the total size
|
||||||
if (transfer[i].position + size == f->size)
|
if (transfer[i].position + size == f->size || (f->textmode && feof(transfer[i].currentfile)))
|
||||||
p->position |= LONG(0x80000000);
|
p->position |= LONG(0x80000000);
|
||||||
p->fileid = f->fileid;
|
p->fileid = f->fileid;
|
||||||
p->size = SHORT((UINT16)size);
|
p->size = SHORT((UINT16)size);
|
||||||
|
@ -728,7 +958,7 @@ void SV_FileSendTicker(void)
|
||||||
if (HSendPacket(i, true, 0, FILETXHEADER + size)) // Reliable SEND
|
if (HSendPacket(i, true, 0, FILETXHEADER + size)) // Reliable SEND
|
||||||
{ // Success
|
{ // Success
|
||||||
transfer[i].position = (UINT32)(transfer[i].position + size);
|
transfer[i].position = (UINT32)(transfer[i].position + size);
|
||||||
if (transfer[i].position == f->size) // Finish?
|
if (transfer[i].position == f->size || (f->textmode && feof(transfer[i].currentfile))) // Finish?
|
||||||
SV_EndFileSend(i);
|
SV_EndFileSend(i);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -772,7 +1002,7 @@ void Got_Filetxpak(void)
|
||||||
{
|
{
|
||||||
if (file->file)
|
if (file->file)
|
||||||
I_Error("Got_Filetxpak: already open file\n");
|
I_Error("Got_Filetxpak: already open file\n");
|
||||||
file->file = fopen(filename, "wb");
|
file->file = fopen(filename, file->textmode ? "w" : "wb");
|
||||||
if (!file->file)
|
if (!file->file)
|
||||||
I_Error("Can't create file %s: %s", filename, strerror(errno));
|
I_Error("Can't create file %s: %s", filename, strerror(errno));
|
||||||
CONS_Printf("\r%s...\n",filename);
|
CONS_Printf("\r%s...\n",filename);
|
||||||
|
@ -793,7 +1023,7 @@ void Got_Filetxpak(void)
|
||||||
}
|
}
|
||||||
// We can receive packet in the wrong order, anyway all os support gaped file
|
// We can receive packet in the wrong order, anyway all os support gaped file
|
||||||
fseek(file->file, pos, SEEK_SET);
|
fseek(file->file, pos, SEEK_SET);
|
||||||
if (fwrite(netbuffer->u.filetxpak.data,size,1,file->file) != 1)
|
if (size && fwrite(netbuffer->u.filetxpak.data,size,1,file->file) != 1)
|
||||||
I_Error("Can't write to %s: %s\n",filename, M_FileError(file->file));
|
I_Error("Can't write to %s: %s\n",filename, M_FileError(file->file));
|
||||||
file->currentsize += size;
|
file->currentsize += size;
|
||||||
|
|
||||||
|
@ -805,6 +1035,14 @@ void Got_Filetxpak(void)
|
||||||
file->status = FS_FOUND;
|
file->status = FS_FOUND;
|
||||||
CONS_Printf(M_GetText("Downloading %s...(done)\n"),
|
CONS_Printf(M_GetText("Downloading %s...(done)\n"),
|
||||||
filename);
|
filename);
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
if (luafiletransfers)
|
||||||
|
{
|
||||||
|
// Tell the server we have received the file
|
||||||
|
netbuffer->packettype = PT_HASLUAFILE;
|
||||||
|
HSendPacket(servernode, true, 0, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -13,6 +13,7 @@
|
||||||
#ifndef __D_NETFIL__
|
#ifndef __D_NETFIL__
|
||||||
#define __D_NETFIL__
|
#define __D_NETFIL__
|
||||||
|
|
||||||
|
#include "d_net.h"
|
||||||
#include "w_wad.h"
|
#include "w_wad.h"
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
@ -43,6 +44,7 @@ typedef struct
|
||||||
UINT32 currentsize;
|
UINT32 currentsize;
|
||||||
UINT32 totalsize;
|
UINT32 totalsize;
|
||||||
filestatus_t status; // The value returned by recsearch
|
filestatus_t status; // The value returned by recsearch
|
||||||
|
boolean textmode; // For files requested by Lua without the "b" option
|
||||||
} fileneeded_t;
|
} fileneeded_t;
|
||||||
|
|
||||||
extern INT32 fileneedednum;
|
extern INT32 fileneedednum;
|
||||||
|
@ -70,6 +72,44 @@ boolean CL_CheckDownloadable(void);
|
||||||
boolean CL_SendRequestFile(void);
|
boolean CL_SendRequestFile(void);
|
||||||
boolean Got_RequestFilePak(INT32 node);
|
boolean Got_RequestFilePak(INT32 node);
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
LFTNS_WAITING, // This node is waiting for the server to send the file
|
||||||
|
LFTNS_ASKED, // The server has told the node they're ready to send the file
|
||||||
|
LFTNS_SENDING, // The server is sending the file to this node
|
||||||
|
LFTNS_SENT // The node already has the file
|
||||||
|
} luafiletransfernodestatus_t;
|
||||||
|
|
||||||
|
typedef struct luafiletransfer_s
|
||||||
|
{
|
||||||
|
char *filename;
|
||||||
|
char *realfilename;
|
||||||
|
char mode[4]; // rb+/wb+/ab+ + null character
|
||||||
|
INT32 id; // Callback ID
|
||||||
|
luafiletransfernodestatus_t nodestatus[MAXNETNODES];
|
||||||
|
struct luafiletransfer_s *next;
|
||||||
|
} luafiletransfer_t;
|
||||||
|
|
||||||
|
extern luafiletransfer_t *luafiletransfers;
|
||||||
|
extern boolean waitingforluafiletransfer;
|
||||||
|
extern char luafiledir[256 + 16];
|
||||||
|
|
||||||
|
void AddLuaFileTransfer(const char *filename, const char *mode);
|
||||||
|
void SV_PrepareSendLuaFileToNextNode(void);
|
||||||
|
boolean SV_SendLuaFile(INT32 node, const char *filename, boolean textmode);
|
||||||
|
void SV_PrepareSendLuaFile(const char *filename);
|
||||||
|
void SV_HandleLuaFileSent(UINT8 node);
|
||||||
|
void RemoveLuaFileTransfer(void);
|
||||||
|
void RemoveAllLuaFileTransfers(void);
|
||||||
|
void SV_AbortLuaFileTransfer(INT32 node);
|
||||||
|
void CL_PrepareDownloadLuaFile(void);
|
||||||
|
void Got_LuaFile(UINT8 **cp, INT32 playernum);
|
||||||
|
void StoreLuaFileCallback(INT32 id);
|
||||||
|
void RemoveLuaFileCallback(INT32 id);
|
||||||
|
void MakePathDirs(char *path);
|
||||||
|
#endif
|
||||||
|
|
||||||
void SV_AbortSendFiles(INT32 node);
|
void SV_AbortSendFiles(INT32 node);
|
||||||
void CloseNetFile(void);
|
void CloseNetFile(void);
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -278,6 +278,7 @@ typedef enum
|
||||||
pw_nights_linkfreeze,
|
pw_nights_linkfreeze,
|
||||||
|
|
||||||
pw_nocontrol, //for linedef exec 427
|
pw_nocontrol, //for linedef exec 427
|
||||||
|
pw_justlaunched, // Launched off a slope this tic (0=none, 1=standard launch, 2=half-pipe launch)
|
||||||
|
|
||||||
NUMPOWERS
|
NUMPOWERS
|
||||||
} powertype_t;
|
} powertype_t;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
117
src/dehacked.c
117
src/dehacked.c
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -585,21 +585,30 @@ static void readfreeslots(MYFILE *f)
|
||||||
continue;
|
continue;
|
||||||
// Copy in the spr2 name and increment free_spr2.
|
// Copy in the spr2 name and increment free_spr2.
|
||||||
if (free_spr2 < NUMPLAYERSPRITES) {
|
if (free_spr2 < NUMPLAYERSPRITES) {
|
||||||
CONS_Printf("Sprite SPR2_%s allocated.\n",word);
|
|
||||||
strncpy(spr2names[free_spr2],word,4);
|
strncpy(spr2names[free_spr2],word,4);
|
||||||
spr2defaults[free_spr2] = 0;
|
spr2defaults[free_spr2] = 0;
|
||||||
spr2names[free_spr2++][4] = 0;
|
spr2names[free_spr2++][4] = 0;
|
||||||
} else
|
} else
|
||||||
CONS_Alert(CONS_WARNING, "Ran out of free SPR2 slots!\n");
|
deh_warning("Ran out of free SPR2 slots!\n");
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "TOL"))
|
else if (fastcmp(type, "TOL"))
|
||||||
{
|
{
|
||||||
if (lastcustomtol > 31)
|
// Search if we already have a typeoflevel by that name...
|
||||||
CONS_Alert(CONS_WARNING, "Ran out of free typeoflevel slots!\n");
|
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||||
|
if (fastcmp(word, TYPEOFLEVEL[i].name))
|
||||||
|
break;
|
||||||
|
|
||||||
|
// We found it? Then don't allocate another one.
|
||||||
|
if (TYPEOFLEVEL[i].name)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// We don't, so freeslot it.
|
||||||
|
if (lastcustomtol == (UINT32)MAXTOL) // Unless you have way too many, since they're flags.
|
||||||
|
deh_warning("Ran out of free typeoflevel slots!\n");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
G_AddTOL((1<<lastcustomtol), word);
|
G_AddTOL(lastcustomtol, word);
|
||||||
lastcustomtol++;
|
lastcustomtol <<= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1105,38 +1114,7 @@ static void readsprite2(MYFILE *f, INT32 num)
|
||||||
Z_Free(s);
|
Z_Free(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
INT32 numtolinfo = NUMBASETOL;
|
// copypasted from readPlayer :]
|
||||||
UINT32 lastcustomtol = 13;
|
|
||||||
|
|
||||||
tolinfo_t TYPEOFLEVEL[NUMMAXTOL] = {
|
|
||||||
{"SOLO",TOL_SP},
|
|
||||||
{"SP",TOL_SP},
|
|
||||||
{"SINGLEPLAYER",TOL_SP},
|
|
||||||
{"SINGLE",TOL_SP},
|
|
||||||
|
|
||||||
{"COOP",TOL_COOP},
|
|
||||||
{"CO-OP",TOL_COOP},
|
|
||||||
|
|
||||||
{"COMPETITION",TOL_COMPETITION},
|
|
||||||
{"RACE",TOL_RACE},
|
|
||||||
|
|
||||||
{"MATCH",TOL_MATCH},
|
|
||||||
{"TAG",TOL_TAG},
|
|
||||||
{"CTF",TOL_CTF},
|
|
||||||
|
|
||||||
{"2D",TOL_2D},
|
|
||||||
{"MARIO",TOL_MARIO},
|
|
||||||
{"NIGHTS",TOL_NIGHTS},
|
|
||||||
{"OLDBRAK",TOL_ERZ3},
|
|
||||||
|
|
||||||
{"XMAS",TOL_XMAS},
|
|
||||||
{"CHRISTMAS",TOL_XMAS},
|
|
||||||
{"WINTER",TOL_XMAS},
|
|
||||||
|
|
||||||
{NULL, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
// copypasted from readPlayer :sleep:
|
|
||||||
static const char *const GAMETYPERULE_LIST[];
|
static const char *const GAMETYPERULE_LIST[];
|
||||||
static void readgametype(MYFILE *f, char *gtname)
|
static void readgametype(MYFILE *f, char *gtname)
|
||||||
{
|
{
|
||||||
|
@ -1271,7 +1249,7 @@ static void readgametype(MYFILE *f, char *gtname)
|
||||||
newgttol = (UINT32)i;
|
newgttol = (UINT32)i;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UINT16 tol = 0;
|
UINT32 tol = 0;
|
||||||
tmp = strtok(word2,",");
|
tmp = strtok(word2,",");
|
||||||
do {
|
do {
|
||||||
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||||
|
@ -1613,7 +1591,7 @@ static void readlevelheader(MYFILE *f, INT32 num)
|
||||||
mapheaderinfo[num-1]->typeoflevel = (UINT32)i;
|
mapheaderinfo[num-1]->typeoflevel = (UINT32)i;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UINT16 tol = 0;
|
UINT32 tol = 0;
|
||||||
tmp = strtok(word2,",");
|
tmp = strtok(word2,",");
|
||||||
do {
|
do {
|
||||||
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||||
|
@ -1828,6 +1806,24 @@ static void readlevelheader(MYFILE *f, INT32 num)
|
||||||
else
|
else
|
||||||
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARD;
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARD;
|
||||||
}
|
}
|
||||||
|
else if (fastcmp(word, "SHOWTITLECARDFOR"))
|
||||||
|
{
|
||||||
|
mapheaderinfo[num-1]->levelflags |= LF_NOTITLECARD;
|
||||||
|
tmp = strtok(word2,",");
|
||||||
|
do {
|
||||||
|
if (fastcmp(tmp, "FIRST"))
|
||||||
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARDFIRST;
|
||||||
|
else if (fastcmp(tmp, "RESPAWN"))
|
||||||
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARDRESPAWN;
|
||||||
|
else if (fastcmp(tmp, "RECORDATTACK"))
|
||||||
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARDRECORDATTACK;
|
||||||
|
else if (fastcmp(tmp, "ALL"))
|
||||||
|
mapheaderinfo[num-1]->levelflags &= ~LF_NOTITLECARD;
|
||||||
|
else if (!fastcmp(tmp, "NONE"))
|
||||||
|
deh_warning("Level header %d: unknown titlecard show option %s\n", num, tmp);
|
||||||
|
|
||||||
|
} while((tmp = strtok(NULL,",")) != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
// Individual triggers for menu flags
|
// Individual triggers for menu flags
|
||||||
else if (fastcmp(word, "HIDDEN"))
|
else if (fastcmp(word, "HIDDEN"))
|
||||||
|
@ -7482,6 +7478,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
// Got Flag Sign
|
// Got Flag Sign
|
||||||
"S_GOTFLAG",
|
"S_GOTFLAG",
|
||||||
|
|
||||||
|
// Finish flag
|
||||||
|
"S_FINISHFLAG",
|
||||||
|
|
||||||
"S_CORK",
|
"S_CORK",
|
||||||
"S_LHRT",
|
"S_LHRT",
|
||||||
|
|
||||||
|
@ -8602,6 +8601,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_LOCKONINF", // In-level Target
|
"MT_LOCKONINF", // In-level Target
|
||||||
"MT_TAG", // Tag Sign
|
"MT_TAG", // Tag Sign
|
||||||
"MT_GOTFLAG", // Got Flag sign
|
"MT_GOTFLAG", // Got Flag sign
|
||||||
|
"MT_FINISHFLAG", // Finish flag
|
||||||
|
|
||||||
// Ambient Sounds
|
// Ambient Sounds
|
||||||
"MT_AWATERA", // Ambient Water Sound 1
|
"MT_AWATERA", // Ambient Water Sound 1
|
||||||
|
@ -8992,9 +8992,11 @@ static const char *COLOR_ENUMS[] = {
|
||||||
// Desaturated
|
// Desaturated
|
||||||
"AETHER", // SKINCOLOR_AETHER,
|
"AETHER", // SKINCOLOR_AETHER,
|
||||||
"SLATE", // SKINCOLOR_SLATE,
|
"SLATE", // SKINCOLOR_SLATE,
|
||||||
|
"BLUEBELL", // SKINCOLOR_BLUEBELL,
|
||||||
"PINK", // SKINCOLOR_PINK,
|
"PINK", // SKINCOLOR_PINK,
|
||||||
"YOGURT", // SKINCOLOR_YOGURT,
|
"YOGURT", // SKINCOLOR_YOGURT,
|
||||||
"BROWN", // SKINCOLOR_BROWN,
|
"BROWN", // SKINCOLOR_BROWN,
|
||||||
|
"BRONZE", // SKINCOLOR_BRONZE,
|
||||||
"TAN", // SKINCOLOR_TAN,
|
"TAN", // SKINCOLOR_TAN,
|
||||||
"BEIGE", // SKINCOLOR_BEIGE,
|
"BEIGE", // SKINCOLOR_BEIGE,
|
||||||
"MOSS", // SKINCOLOR_MOSS,
|
"MOSS", // SKINCOLOR_MOSS,
|
||||||
|
@ -9007,9 +9009,11 @@ static const char *COLOR_ENUMS[] = {
|
||||||
"RED", // SKINCOLOR_RED,
|
"RED", // SKINCOLOR_RED,
|
||||||
"CRIMSON", // SKINCOLOR_CRIMSON,
|
"CRIMSON", // SKINCOLOR_CRIMSON,
|
||||||
"FLAME", // SKINCOLOR_FLAME,
|
"FLAME", // SKINCOLOR_FLAME,
|
||||||
|
"KETCHUP", // SKINCOLOR_KETCHUP,
|
||||||
"PEACHY", // SKINCOLOR_PEACHY,
|
"PEACHY", // SKINCOLOR_PEACHY,
|
||||||
"QUAIL", // SKINCOLOR_QUAIL,
|
"QUAIL", // SKINCOLOR_QUAIL,
|
||||||
"SUNSET", // SKINCOLOR_SUNSET,
|
"SUNSET", // SKINCOLOR_SUNSET,
|
||||||
|
"COPPER", // SKINCOLOR_COPPER,
|
||||||
"APRICOT", // SKINCOLOR_APRICOT,
|
"APRICOT", // SKINCOLOR_APRICOT,
|
||||||
"ORANGE", // SKINCOLOR_ORANGE,
|
"ORANGE", // SKINCOLOR_ORANGE,
|
||||||
"RUST", // SKINCOLOR_RUST,
|
"RUST", // SKINCOLOR_RUST,
|
||||||
|
@ -9019,6 +9023,7 @@ static const char *COLOR_ENUMS[] = {
|
||||||
"OLIVE", // SKINCOLOR_OLIVE,
|
"OLIVE", // SKINCOLOR_OLIVE,
|
||||||
"LIME", // SKINCOLOR_LIME,
|
"LIME", // SKINCOLOR_LIME,
|
||||||
"PERIDOT", // SKINCOLOR_PERIDOT,
|
"PERIDOT", // SKINCOLOR_PERIDOT,
|
||||||
|
"APPLE", // SKINCOLOR_APPLE,
|
||||||
"GREEN", // SKINCOLOR_GREEN,
|
"GREEN", // SKINCOLOR_GREEN,
|
||||||
"FOREST", // SKINCOLOR_FOREST,
|
"FOREST", // SKINCOLOR_FOREST,
|
||||||
"EMERALD", // SKINCOLOR_EMERALD,
|
"EMERALD", // SKINCOLOR_EMERALD,
|
||||||
|
@ -9045,6 +9050,7 @@ static const char *COLOR_ENUMS[] = {
|
||||||
"VIOLET", // SKINCOLOR_VIOLET,
|
"VIOLET", // SKINCOLOR_VIOLET,
|
||||||
"LILAC", // SKINCOLOR_LILAC,
|
"LILAC", // SKINCOLOR_LILAC,
|
||||||
"PLUM", // SKINCOLOR_PLUM,
|
"PLUM", // SKINCOLOR_PLUM,
|
||||||
|
"RASPBERRY", // SKINCOLOR_RASPBERRY,
|
||||||
"ROSY", // SKINCOLOR_ROSY,
|
"ROSY", // SKINCOLOR_ROSY,
|
||||||
|
|
||||||
// Super special awesome Super flashing colors!
|
// Super special awesome Super flashing colors!
|
||||||
|
@ -9138,7 +9144,8 @@ static const char *const POWERS_LIST[] = {
|
||||||
"NIGHTS_LINKFREEZE",
|
"NIGHTS_LINKFREEZE",
|
||||||
|
|
||||||
//for linedef exec 427
|
//for linedef exec 427
|
||||||
"NOCONTROL"
|
"NOCONTROL",
|
||||||
|
"JUSTLAUNCHED",
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *const HUDITEMS_LIST[] = {
|
static const char *const HUDITEMS_LIST[] = {
|
||||||
|
@ -9375,6 +9382,9 @@ struct {
|
||||||
{"LF_NOZONE",LF_NOZONE},
|
{"LF_NOZONE",LF_NOZONE},
|
||||||
{"LF_SAVEGAME",LF_SAVEGAME},
|
{"LF_SAVEGAME",LF_SAVEGAME},
|
||||||
{"LF_MIXNIGHTSCOUNTDOWN",LF_MIXNIGHTSCOUNTDOWN},
|
{"LF_MIXNIGHTSCOUNTDOWN",LF_MIXNIGHTSCOUNTDOWN},
|
||||||
|
{"LF_NOTITLECARDFIRST",LF_NOTITLECARDFIRST},
|
||||||
|
{"LF_NOTITLECARDRESPAWN",LF_NOTITLECARDRESPAWN},
|
||||||
|
{"LF_NOTITLECARDRECORDATTACK",LF_NOTITLECARDRECORDATTACK},
|
||||||
{"LF_NOTITLECARD",LF_NOTITLECARD},
|
{"LF_NOTITLECARD",LF_NOTITLECARD},
|
||||||
{"LF_WARNINGTITLE",LF_WARNINGTITLE},
|
{"LF_WARNINGTITLE",LF_WARNINGTITLE},
|
||||||
// And map flags
|
// And map flags
|
||||||
|
@ -10226,7 +10236,7 @@ static fixed_t find_const(const char **rword)
|
||||||
free(word);
|
free(word);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
else if (fastncmp("GT_",word,4)) {
|
else if (fastncmp("GT_",word,3)) {
|
||||||
r = get_gametype(word);
|
r = get_gametype(word);
|
||||||
free(word);
|
free(word);
|
||||||
return r;
|
return r;
|
||||||
|
@ -10468,18 +10478,25 @@ static inline int lib_freeslot(lua_State *L)
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "TOL"))
|
else if (fastcmp(type, "TOL"))
|
||||||
{
|
{
|
||||||
if (lastcustomtol > 31)
|
// Search if we already have a typeoflevel by that name...
|
||||||
|
int i;
|
||||||
|
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||||
|
if (fastcmp(word, TYPEOFLEVEL[i].name))
|
||||||
|
break;
|
||||||
|
|
||||||
|
// We don't, so allocate a new one.
|
||||||
|
if (TYPEOFLEVEL[i].name == NULL) {
|
||||||
|
if (lastcustomtol == (UINT32)MAXTOL) // Unless you have way too many, since they're flags.
|
||||||
CONS_Alert(CONS_WARNING, "Ran out of free typeoflevel slots!\n");
|
CONS_Alert(CONS_WARNING, "Ran out of free typeoflevel slots!\n");
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
UINT32 newtol = (1<<lastcustomtol);
|
|
||||||
CONS_Printf("TypeOfLevel TOL_%s allocated.\n",word);
|
CONS_Printf("TypeOfLevel TOL_%s allocated.\n",word);
|
||||||
G_AddTOL(newtol, word);
|
G_AddTOL(lastcustomtol, word);
|
||||||
lua_pushinteger(L, newtol);
|
lua_pushinteger(L, lastcustomtol);
|
||||||
lastcustomtol++;
|
lastcustomtol <<= 1;
|
||||||
r++;
|
r++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Z_Free(s);
|
Z_Free(s);
|
||||||
lua_remove(L, 1);
|
lua_remove(L, 1);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Emacs style mode select -*- C++ -*-
|
// Emacs style mode select -*- C++ -*-
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Copyright (C) 2005-2019 by Sonic Team Junior.
|
// Copyright (C) 2005-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License
|
// modify it under the terms of the GNU General Public License
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -143,16 +143,16 @@ extern char logfilename[1024];
|
||||||
// we use comprevision and compbranch instead.
|
// we use comprevision and compbranch instead.
|
||||||
#else
|
#else
|
||||||
#define VERSION 202 // Game version
|
#define VERSION 202 // Game version
|
||||||
#define SUBVERSION 1 // more precise version number
|
#define SUBVERSION 2 // more precise version number
|
||||||
#define VERSIONSTRING "v2.2.1"
|
#define VERSIONSTRING "v2.2.2"
|
||||||
#define VERSIONSTRINGW L"v2.2.1"
|
#define VERSIONSTRINGW L"v2.2.2"
|
||||||
// Hey! If you change this, add 1 to the MODVERSION below!
|
// Hey! If you change this, add 1 to the MODVERSION below!
|
||||||
// Otherwise we can't force updates!
|
// Otherwise we can't force updates!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Does this version require an added patch file?
|
// Does this version require an added patch file?
|
||||||
// Comment or uncomment this as necessary.
|
// Comment or uncomment this as necessary.
|
||||||
//#define USE_PATCH_DTA
|
#define USE_PATCH_DTA
|
||||||
|
|
||||||
// Use .kart extension addons
|
// Use .kart extension addons
|
||||||
//#define USE_KART
|
//#define USE_KART
|
||||||
|
@ -210,7 +210,7 @@ extern char logfilename[1024];
|
||||||
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
||||||
// Only set it higher, not lower, obviously.
|
// Only set it higher, not lower, obviously.
|
||||||
// Note that we use this to help keep internal testing in check; this is why v2.2.0 is not version "1".
|
// Note that we use this to help keep internal testing in check; this is why v2.2.0 is not version "1".
|
||||||
#define MODVERSION 41
|
#define MODVERSION 42
|
||||||
|
|
||||||
// To version config.cfg, MAJOREXECVERSION is set equal to MODVERSION automatically.
|
// To version config.cfg, MAJOREXECVERSION is set equal to MODVERSION automatically.
|
||||||
// Increment MINOREXECVERSION whenever a config change is needed that does not correspond
|
// Increment MINOREXECVERSION whenever a config change is needed that does not correspond
|
||||||
|
@ -253,9 +253,11 @@ typedef enum
|
||||||
// Desaturated
|
// Desaturated
|
||||||
SKINCOLOR_AETHER,
|
SKINCOLOR_AETHER,
|
||||||
SKINCOLOR_SLATE,
|
SKINCOLOR_SLATE,
|
||||||
|
SKINCOLOR_BLUEBELL,
|
||||||
SKINCOLOR_PINK,
|
SKINCOLOR_PINK,
|
||||||
SKINCOLOR_YOGURT,
|
SKINCOLOR_YOGURT,
|
||||||
SKINCOLOR_BROWN,
|
SKINCOLOR_BROWN,
|
||||||
|
SKINCOLOR_BRONZE,
|
||||||
SKINCOLOR_TAN,
|
SKINCOLOR_TAN,
|
||||||
SKINCOLOR_BEIGE,
|
SKINCOLOR_BEIGE,
|
||||||
SKINCOLOR_MOSS,
|
SKINCOLOR_MOSS,
|
||||||
|
@ -268,9 +270,11 @@ typedef enum
|
||||||
SKINCOLOR_RED,
|
SKINCOLOR_RED,
|
||||||
SKINCOLOR_CRIMSON,
|
SKINCOLOR_CRIMSON,
|
||||||
SKINCOLOR_FLAME,
|
SKINCOLOR_FLAME,
|
||||||
|
SKINCOLOR_KETCHUP,
|
||||||
SKINCOLOR_PEACHY,
|
SKINCOLOR_PEACHY,
|
||||||
SKINCOLOR_QUAIL,
|
SKINCOLOR_QUAIL,
|
||||||
SKINCOLOR_SUNSET,
|
SKINCOLOR_SUNSET,
|
||||||
|
SKINCOLOR_COPPER,
|
||||||
SKINCOLOR_APRICOT,
|
SKINCOLOR_APRICOT,
|
||||||
SKINCOLOR_ORANGE,
|
SKINCOLOR_ORANGE,
|
||||||
SKINCOLOR_RUST,
|
SKINCOLOR_RUST,
|
||||||
|
@ -280,6 +284,7 @@ typedef enum
|
||||||
SKINCOLOR_OLIVE,
|
SKINCOLOR_OLIVE,
|
||||||
SKINCOLOR_LIME,
|
SKINCOLOR_LIME,
|
||||||
SKINCOLOR_PERIDOT,
|
SKINCOLOR_PERIDOT,
|
||||||
|
SKINCOLOR_APPLE,
|
||||||
SKINCOLOR_GREEN,
|
SKINCOLOR_GREEN,
|
||||||
SKINCOLOR_FOREST,
|
SKINCOLOR_FOREST,
|
||||||
SKINCOLOR_EMERALD,
|
SKINCOLOR_EMERALD,
|
||||||
|
@ -306,6 +311,7 @@ typedef enum
|
||||||
SKINCOLOR_VIOLET,
|
SKINCOLOR_VIOLET,
|
||||||
SKINCOLOR_LILAC,
|
SKINCOLOR_LILAC,
|
||||||
SKINCOLOR_PLUM,
|
SKINCOLOR_PLUM,
|
||||||
|
SKINCOLOR_RASPBERRY,
|
||||||
SKINCOLOR_ROSY,
|
SKINCOLOR_ROSY,
|
||||||
|
|
||||||
// SKINCOLOR_? - one left before we bump up against 0x39, which isn't a HARD limit anymore but would be excessive
|
// SKINCOLOR_? - one left before we bump up against 0x39, which isn't a HARD limit anymore but would be excessive
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -351,15 +351,19 @@ typedef struct
|
||||||
} mapheader_t;
|
} mapheader_t;
|
||||||
|
|
||||||
// level flags
|
// level flags
|
||||||
#define LF_SCRIPTISFILE 1 ///< True if the script is a file, not a lump.
|
#define LF_SCRIPTISFILE (1<<0) ///< True if the script is a file, not a lump.
|
||||||
#define LF_SPEEDMUSIC 2 ///< Speed up act music for super sneakers
|
#define LF_SPEEDMUSIC (1<<1) ///< Speed up act music for super sneakers
|
||||||
#define LF_NOSSMUSIC 4 ///< Disable Super Sonic music
|
#define LF_NOSSMUSIC (1<<2) ///< Disable Super Sonic music
|
||||||
#define LF_NORELOAD 8 ///< Don't reload level on death
|
#define LF_NORELOAD (1<<3) ///< Don't reload level on death
|
||||||
#define LF_NOZONE 16 ///< Don't include "ZONE" on level title
|
#define LF_NOZONE (1<<4) ///< Don't include "ZONE" on level title
|
||||||
#define LF_SAVEGAME 32 ///< Save the game upon loading this level
|
#define LF_SAVEGAME (1<<5) ///< Save the game upon loading this level
|
||||||
#define LF_MIXNIGHTSCOUNTDOWN 64 ///< Play sfx_timeup instead of music change for NiGHTS countdown
|
#define LF_MIXNIGHTSCOUNTDOWN (1<<6) ///< Play sfx_timeup instead of music change for NiGHTS countdown
|
||||||
#define LF_WARNINGTITLE 128 ///< WARNING! WARNING! WARNING! WARNING!
|
#define LF_WARNINGTITLE (1<<7) ///< WARNING! WARNING! WARNING! WARNING!
|
||||||
#define LF_NOTITLECARD 256 ///< Don't start the title card
|
|
||||||
|
#define LF_NOTITLECARDFIRST (1<<8)
|
||||||
|
#define LF_NOTITLECARDRESPAWN (1<<9)
|
||||||
|
#define LF_NOTITLECARDRECORDATTACK (1<<10)
|
||||||
|
#define LF_NOTITLECARD (LF_NOTITLECARDFIRST|LF_NOTITLECARDRESPAWN|LF_NOTITLECARDRECORDATTACK) ///< Don't start the title card at all
|
||||||
|
|
||||||
#define LF2_HIDEINMENU 1 ///< Hide in the multiplayer menu
|
#define LF2_HIDEINMENU 1 ///< Hide in the multiplayer menu
|
||||||
#define LF2_HIDEINSTATS 2 ///< Hide in the statistics screen
|
#define LF2_HIDEINSTATS 2 ///< Hide in the statistics screen
|
||||||
|
@ -437,6 +441,7 @@ extern const char *Gametype_ConstantNames[NUMGAMETYPES];
|
||||||
extern INT32 pointlimits[NUMGAMETYPES];
|
extern INT32 pointlimits[NUMGAMETYPES];
|
||||||
extern INT32 timelimits[NUMGAMETYPES];
|
extern INT32 timelimits[NUMGAMETYPES];
|
||||||
|
|
||||||
|
// TypeOfLevel things
|
||||||
enum TypeOfLevel
|
enum TypeOfLevel
|
||||||
{
|
{
|
||||||
TOL_SP = 0x01, ///< Single Player
|
TOL_SP = 0x01, ///< Single Player
|
||||||
|
@ -461,16 +466,16 @@ enum TypeOfLevel
|
||||||
TOL_XMAS = 0x1000, ///< Christmas NiGHTS
|
TOL_XMAS = 0x1000, ///< Christmas NiGHTS
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NUMBASETOL 18
|
#define MAXTOL (1<<31)
|
||||||
#define NUMMAXTOL (18 + NUMGAMETYPEFREESLOTS)
|
#define NUMBASETOLNAMES (19)
|
||||||
|
#define NUMTOLNAMES (NUMBASETOLNAMES + NUMGAMETYPEFREESLOTS)
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
UINT32 flag;
|
UINT32 flag;
|
||||||
} tolinfo_t;
|
} tolinfo_t;
|
||||||
extern tolinfo_t TYPEOFLEVEL[NUMMAXTOL];
|
extern tolinfo_t TYPEOFLEVEL[NUMTOLNAMES];
|
||||||
extern INT32 numtolinfo;
|
|
||||||
extern UINT32 lastcustomtol;
|
extern UINT32 lastcustomtol;
|
||||||
|
|
||||||
extern tic_t totalplaytime;
|
extern tic_t totalplaytime;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2014-2019 by Sonic Team Junior.
|
// Copyright (C) 2014-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 2013-2016 by Matthew "Kaito Sinclaire" Walsh.
|
// Copyright (C) 2013-2016 by Matthew "Kaito Sinclaire" Walsh.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -192,8 +192,7 @@ void F_WipeStageTitle(void)
|
||||||
// draw level title
|
// draw level title
|
||||||
if ((WipeStageTitle && st_overlay)
|
if ((WipeStageTitle && st_overlay)
|
||||||
&& (wipestyle == WIPESTYLE_COLORMAP)
|
&& (wipestyle == WIPESTYLE_COLORMAP)
|
||||||
&& !(mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD)
|
&& G_IsTitleCardAvailable())
|
||||||
&& *mapheaderinfo[gamemap-1]->lvlttl != '\0')
|
|
||||||
{
|
{
|
||||||
ST_runTitleCard();
|
ST_runTitleCard();
|
||||||
ST_drawWipeTitleCard();
|
ST_drawWipeTitleCard();
|
||||||
|
|
61
src/g_game.c
61
src/g_game.c
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -1928,13 +1928,22 @@ void G_PreLevelTitleCard(void)
|
||||||
wipestyleflags = WSF_CROSSFADE;
|
wipestyleflags = WSF_CROSSFADE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static boolean titlecardforreload = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Returns true if the current level has a title card.
|
// Returns true if the current level has a title card.
|
||||||
//
|
//
|
||||||
boolean G_IsTitleCardAvailable(void)
|
boolean G_IsTitleCardAvailable(void)
|
||||||
{
|
{
|
||||||
// The current level header explicitly disabled the title card.
|
// The current level header explicitly disabled the title card.
|
||||||
if (mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD)
|
UINT16 titleflag = LF_NOTITLECARDFIRST;
|
||||||
|
|
||||||
|
if (modeattacking != ATTACKING_NONE)
|
||||||
|
titleflag = LF_NOTITLECARDRECORDATTACK;
|
||||||
|
else if (titlecardforreload)
|
||||||
|
titleflag = LF_NOTITLECARDRESPAWN;
|
||||||
|
|
||||||
|
if (mapheaderinfo[gamemap-1]->levelflags & titleflag)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// The current gametype doesn't have a title card.
|
// The current gametype doesn't have a title card.
|
||||||
|
@ -3024,7 +3033,9 @@ void G_DoReborn(INT32 playernum)
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
LUAh_MapChange(gamemap);
|
LUAh_MapChange(gamemap);
|
||||||
#endif
|
#endif
|
||||||
|
titlecardforreload = true;
|
||||||
G_DoLoadLevel(true);
|
G_DoLoadLevel(true);
|
||||||
|
titlecardforreload = false;
|
||||||
if (metalrecording)
|
if (metalrecording)
|
||||||
G_BeginMetal();
|
G_BeginMetal();
|
||||||
return;
|
return;
|
||||||
|
@ -3384,6 +3395,36 @@ UINT32 gametypetol[NUMGAMETYPES] =
|
||||||
TOL_CTF, // CTF
|
TOL_CTF, // CTF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
tolinfo_t TYPEOFLEVEL[NUMTOLNAMES] = {
|
||||||
|
{"SOLO",TOL_SP},
|
||||||
|
{"SP",TOL_SP},
|
||||||
|
{"SINGLEPLAYER",TOL_SP},
|
||||||
|
{"SINGLE",TOL_SP},
|
||||||
|
|
||||||
|
{"COOP",TOL_COOP},
|
||||||
|
{"CO-OP",TOL_COOP},
|
||||||
|
|
||||||
|
{"COMPETITION",TOL_COMPETITION},
|
||||||
|
{"RACE",TOL_RACE},
|
||||||
|
|
||||||
|
{"MATCH",TOL_MATCH},
|
||||||
|
{"TAG",TOL_TAG},
|
||||||
|
{"CTF",TOL_CTF},
|
||||||
|
|
||||||
|
{"2D",TOL_2D},
|
||||||
|
{"MARIO",TOL_MARIO},
|
||||||
|
{"NIGHTS",TOL_NIGHTS},
|
||||||
|
{"OLDBRAK",TOL_ERZ3},
|
||||||
|
|
||||||
|
{"XMAS",TOL_XMAS},
|
||||||
|
{"CHRISTMAS",TOL_XMAS},
|
||||||
|
{"WINTER",TOL_XMAS},
|
||||||
|
|
||||||
|
{NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
UINT32 lastcustomtol = (TOL_XMAS<<1);
|
||||||
|
|
||||||
//
|
//
|
||||||
// G_AddTOL
|
// G_AddTOL
|
||||||
//
|
//
|
||||||
|
@ -3391,16 +3432,16 @@ UINT32 gametypetol[NUMGAMETYPES] =
|
||||||
//
|
//
|
||||||
void G_AddTOL(UINT32 newtol, const char *tolname)
|
void G_AddTOL(UINT32 newtol, const char *tolname)
|
||||||
{
|
{
|
||||||
TYPEOFLEVEL[numtolinfo].name = Z_StrDup(tolname);
|
INT32 i;
|
||||||
TYPEOFLEVEL[numtolinfo].flag = newtol;
|
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||||
numtolinfo++;
|
;
|
||||||
|
|
||||||
TYPEOFLEVEL[numtolinfo].name = NULL;
|
TYPEOFLEVEL[i].name = Z_StrDup(tolname);
|
||||||
TYPEOFLEVEL[numtolinfo].flag = 0;
|
TYPEOFLEVEL[i].flag = newtol;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// G_AddTOL
|
// G_AddGametypeTOL
|
||||||
//
|
//
|
||||||
// Assigns a type of level to a gametype.
|
// Assigns a type of level to a gametype.
|
||||||
//
|
//
|
||||||
|
@ -3551,7 +3592,7 @@ boolean G_CompetitionGametype(void)
|
||||||
* \return The typeoflevel flag to check for that gametype.
|
* \return The typeoflevel flag to check for that gametype.
|
||||||
* \author Graue <graue@oceanbase.org>
|
* \author Graue <graue@oceanbase.org>
|
||||||
*/
|
*/
|
||||||
INT16 G_TOLFlag(INT32 pgametype)
|
UINT32 G_TOLFlag(INT32 pgametype)
|
||||||
{
|
{
|
||||||
if (!multiplayer)
|
if (!multiplayer)
|
||||||
return TOL_SP;
|
return TOL_SP;
|
||||||
|
@ -3682,7 +3723,7 @@ static void G_DoCompleted(void)
|
||||||
&& (nextmap >= 0 && nextmap < NUMMAPS))
|
&& (nextmap >= 0 && nextmap < NUMMAPS))
|
||||||
{
|
{
|
||||||
register INT16 cm = nextmap;
|
register INT16 cm = nextmap;
|
||||||
INT16 tolflag = G_TOLFlag(gametype);
|
UINT32 tolflag = G_TOLFlag(gametype);
|
||||||
UINT8 visitedmap[(NUMMAPS+7)/8];
|
UINT8 visitedmap[(NUMMAPS+7)/8];
|
||||||
|
|
||||||
memset(visitedmap, 0, sizeof (visitedmap));
|
memset(visitedmap, 0, sizeof (visitedmap));
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -309,6 +309,6 @@ FUNCMATH INT32 G_TicsToCentiseconds(tic_t tics);
|
||||||
FUNCMATH INT32 G_TicsToMilliseconds(tic_t tics);
|
FUNCMATH INT32 G_TicsToMilliseconds(tic_t tics);
|
||||||
|
|
||||||
// Don't split up TOL handling
|
// Don't split up TOL handling
|
||||||
INT16 G_TOLFlag(INT32 pgametype);
|
UINT32 G_TOLFlag(INT32 pgametype);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -48,7 +48,6 @@ struct GLMipmap_s
|
||||||
|
|
||||||
struct GLMipmap_s *nextcolormap;
|
struct GLMipmap_s *nextcolormap;
|
||||||
const UINT8 *colormap;
|
const UINT8 *colormap;
|
||||||
INT32 tcindex;
|
|
||||||
|
|
||||||
// opengl
|
// opengl
|
||||||
struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver
|
struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver
|
||||||
|
|
|
@ -509,6 +509,7 @@ light_t *t_lspr[NUMSPRITES] =
|
||||||
&lspr[NOLIGHT], // SPR_LCKN
|
&lspr[NOLIGHT], // SPR_LCKN
|
||||||
&lspr[NOLIGHT], // SPR_TTAG
|
&lspr[NOLIGHT], // SPR_TTAG
|
||||||
&lspr[NOLIGHT], // SPR_GFLG
|
&lspr[NOLIGHT], // SPR_GFLG
|
||||||
|
&lspr[NOLIGHT], // SPR_FNSF
|
||||||
|
|
||||||
&lspr[NOLIGHT], // SPR_CORK
|
&lspr[NOLIGHT], // SPR_CORK
|
||||||
&lspr[NOLIGHT], // SPR_LHRT
|
&lspr[NOLIGHT], // SPR_LHRT
|
||||||
|
|
|
@ -476,8 +476,9 @@ void HWR_InitModels(void)
|
||||||
size_t i;
|
size_t i;
|
||||||
INT32 s;
|
INT32 s;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char name[18], filename[32];
|
char name[24], filename[32];
|
||||||
float scale, offset;
|
float scale, offset;
|
||||||
|
size_t prefixlen;
|
||||||
|
|
||||||
CONS_Printf("HWR_InitModels()...\n");
|
CONS_Printf("HWR_InitModels()...\n");
|
||||||
for (s = 0; s < MAXSKINS; s++)
|
for (s = 0; s < MAXSKINS; s++)
|
||||||
|
@ -509,46 +510,54 @@ void HWR_InitModels(void)
|
||||||
nomd2s = true;
|
nomd2s = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4)
|
|
||||||
|
// length of the player model prefix
|
||||||
|
prefixlen = strlen(PLAYERMODELPREFIX);
|
||||||
|
|
||||||
|
while (fscanf(f, "%25s %31s %f %f", name, filename, &scale, &offset) == 4)
|
||||||
{
|
{
|
||||||
if (stricmp(name, "PLAY") == 0)
|
char *skinname = name;
|
||||||
|
size_t len = strlen(name);
|
||||||
|
|
||||||
|
// check for the player model prefix.
|
||||||
|
if (!strnicmp(name, PLAYERMODELPREFIX, prefixlen) && (len > prefixlen))
|
||||||
{
|
{
|
||||||
CONS_Printf("Model for sprite PLAY detected in models.dat, use a player skin instead!\n");
|
skinname += prefixlen;
|
||||||
continue;
|
goto addskinmodel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add sprite model
|
||||||
|
if (len == 4) // must be 4 characters long exactly. otherwise it's not a sprite name.
|
||||||
|
{
|
||||||
for (i = 0; i < NUMSPRITES; i++)
|
for (i = 0; i < NUMSPRITES; i++)
|
||||||
{
|
{
|
||||||
if (stricmp(name, sprnames[i]) == 0)
|
if (stricmp(name, sprnames[i]) == 0)
|
||||||
{
|
{
|
||||||
//if (stricmp(name, "PLAY") == 0)
|
|
||||||
//continue;
|
|
||||||
|
|
||||||
//CONS_Debug(DBG_RENDER, " Found: %s %s %f %f\n", name, filename, scale, offset);
|
|
||||||
md2_models[i].scale = scale;
|
md2_models[i].scale = scale;
|
||||||
md2_models[i].offset = offset;
|
md2_models[i].offset = offset;
|
||||||
md2_models[i].notfound = false;
|
md2_models[i].notfound = false;
|
||||||
strcpy(md2_models[i].filename, filename);
|
strcpy(md2_models[i].filename, filename);
|
||||||
goto md2found;
|
goto modelfound;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addskinmodel:
|
||||||
|
// add player model
|
||||||
for (s = 0; s < MAXSKINS; s++)
|
for (s = 0; s < MAXSKINS; s++)
|
||||||
{
|
{
|
||||||
if (stricmp(name, skins[s].name) == 0)
|
if (stricmp(skinname, skins[s].name) == 0)
|
||||||
{
|
{
|
||||||
//CONS_Printf(" Found: %s %s %f %f\n", name, filename, scale, offset);
|
|
||||||
md2_playermodels[s].skin = s;
|
md2_playermodels[s].skin = s;
|
||||||
md2_playermodels[s].scale = scale;
|
md2_playermodels[s].scale = scale;
|
||||||
md2_playermodels[s].offset = offset;
|
md2_playermodels[s].offset = offset;
|
||||||
md2_playermodels[s].notfound = false;
|
md2_playermodels[s].notfound = false;
|
||||||
strcpy(md2_playermodels[s].filename, filename);
|
strcpy(md2_playermodels[s].filename, filename);
|
||||||
goto md2found;
|
goto modelfound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// no sprite/player skin name found?!?
|
|
||||||
//CONS_Printf("Unknown sprite/player skin %s detected in models.dat\n", name);
|
modelfound:
|
||||||
md2found:
|
|
||||||
// move on to next line...
|
// move on to next line...
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -558,8 +567,9 @@ md2found:
|
||||||
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[18], filename[32];
|
char name[24], filename[32];
|
||||||
float scale, offset;
|
float scale, offset;
|
||||||
|
size_t prefixlen;
|
||||||
|
|
||||||
if (nomd2s)
|
if (nomd2s)
|
||||||
return;
|
return;
|
||||||
|
@ -577,32 +587,42 @@ void HWR_AddPlayerModel(int skin) // For skins that were added after startup
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for any model that match the names of player skins!
|
// length of the player model prefix
|
||||||
while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4)
|
prefixlen = strlen(PLAYERMODELPREFIX);
|
||||||
|
|
||||||
|
// Check for any models that match the names of player skins!
|
||||||
|
while (fscanf(f, "%25s %31s %f %f", name, filename, &scale, &offset) == 4)
|
||||||
{
|
{
|
||||||
if (stricmp(name, skins[skin].name) == 0)
|
char *skinname = name;
|
||||||
|
size_t len = strlen(name);
|
||||||
|
|
||||||
|
// ignore the player model prefix.
|
||||||
|
if (!strnicmp(name, PLAYERMODELPREFIX, prefixlen) && (len > prefixlen))
|
||||||
|
skinname += prefixlen;
|
||||||
|
|
||||||
|
if (stricmp(skinname, skins[skin].name) == 0)
|
||||||
{
|
{
|
||||||
md2_playermodels[skin].skin = skin;
|
md2_playermodels[skin].skin = skin;
|
||||||
md2_playermodels[skin].scale = scale;
|
md2_playermodels[skin].scale = scale;
|
||||||
md2_playermodels[skin].offset = offset;
|
md2_playermodels[skin].offset = offset;
|
||||||
md2_playermodels[skin].notfound = false;
|
md2_playermodels[skin].notfound = false;
|
||||||
strcpy(md2_playermodels[skin].filename, filename);
|
strcpy(md2_playermodels[skin].filename, filename);
|
||||||
goto playermd2found;
|
goto playermodelfound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//CONS_Printf("Model for player skin %s not found\n", skins[skin].name);
|
|
||||||
md2_playermodels[skin].notfound = true;
|
md2_playermodels[skin].notfound = true;
|
||||||
playermd2found:
|
playermodelfound:
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_AddSpriteModel(size_t spritenum) // For sprites that were added after startup
|
void HWR_AddSpriteModel(size_t spritenum) // For sprites that were added after startup
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
// name[18] 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
|
||||||
char name[18], filename[32];
|
// PLAYERMODELPREFIX is 6 characters long
|
||||||
|
char name[24], filename[32];
|
||||||
float scale, offset;
|
float scale, offset;
|
||||||
|
|
||||||
if (nomd2s)
|
if (nomd2s)
|
||||||
|
@ -622,22 +642,30 @@ void HWR_AddSpriteModel(size_t spritenum) // For sprites that were added after s
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for any MD2s that match the names of sprite names!
|
// Check for any models that match the names of sprite names!
|
||||||
while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4)
|
while (fscanf(f, "%25s %31s %f %f", name, filename, &scale, &offset) == 4)
|
||||||
{
|
{
|
||||||
|
// length of the sprite name
|
||||||
|
size_t len = strlen(name);
|
||||||
|
if (len != 4) // must be 4 characters long exactly. otherwise it's not a sprite name.
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// check for the player model prefix.
|
||||||
|
if (!strnicmp(name, PLAYERMODELPREFIX, strlen(PLAYERMODELPREFIX)))
|
||||||
|
continue; // that's not a sprite...
|
||||||
|
|
||||||
if (stricmp(name, sprnames[spritenum]) == 0)
|
if (stricmp(name, sprnames[spritenum]) == 0)
|
||||||
{
|
{
|
||||||
md2_models[spritenum].scale = scale;
|
md2_models[spritenum].scale = scale;
|
||||||
md2_models[spritenum].offset = offset;
|
md2_models[spritenum].offset = offset;
|
||||||
md2_models[spritenum].notfound = false;
|
md2_models[spritenum].notfound = false;
|
||||||
strcpy(md2_models[spritenum].filename, filename);
|
strcpy(md2_models[spritenum].filename, filename);
|
||||||
goto spritemd2found;
|
goto spritemodelfound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//CONS_Printf("MD2 for sprite %s not found\n", sprnames[spritenum]);
|
|
||||||
md2_models[spritenum].notfound = true;
|
md2_models[spritenum].notfound = true;
|
||||||
spritemd2found:
|
spritemodelfound:
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1020,32 +1048,13 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
|
||||||
// mostly copied from HWR_GetMappedPatch, hence the similarities and comment
|
// mostly copied from HWR_GetMappedPatch, hence the similarities and comment
|
||||||
GLMipmap_t *grmip, *newmip;
|
GLMipmap_t *grmip, *newmip;
|
||||||
|
|
||||||
if ((colormap == colormaps || colormap == NULL) && (skinnum > TC_DEFAULT))
|
if (colormap == colormaps || colormap == NULL)
|
||||||
{
|
{
|
||||||
// Don't do any blending
|
// Don't do any blending
|
||||||
HWD.pfnSetTexture(gpatch->mipmap);
|
HWD.pfnSetTexture(gpatch->mipmap);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// search for the mipmap
|
|
||||||
// skip the first (no colormap translated)
|
|
||||||
for (grmip = gpatch->mipmap; grmip->nextcolormap; )
|
|
||||||
{
|
|
||||||
grmip = grmip->nextcolormap;
|
|
||||||
if (grmip->colormap == colormap || (skinnum < TC_DEFAULT && grmip->tcindex == skinnum))
|
|
||||||
{
|
|
||||||
if (grmip->downloaded && grmip->grInfo.data)
|
|
||||||
{
|
|
||||||
HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture
|
|
||||||
Z_ChangeTag(grmip->grInfo.data, PU_HWRMODELTEXTURE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If here, the blended texture has not been created
|
|
||||||
// So we create it
|
|
||||||
|
|
||||||
if ((blendgpatch && blendgpatch->mipmap->grInfo.format)
|
if ((blendgpatch && blendgpatch->mipmap->grInfo.format)
|
||||||
&& (gpatch->width != blendgpatch->width || gpatch->height != blendgpatch->height))
|
&& (gpatch->width != blendgpatch->width || gpatch->height != blendgpatch->height))
|
||||||
{
|
{
|
||||||
|
@ -1054,21 +1063,39 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// search for the mipmap
|
||||||
|
// skip the first (no colormap translated)
|
||||||
|
for (grmip = gpatch->mipmap; grmip->nextcolormap; )
|
||||||
|
{
|
||||||
|
grmip = grmip->nextcolormap;
|
||||||
|
if (grmip->colormap == colormap)
|
||||||
|
{
|
||||||
|
if (grmip->downloaded && grmip->grInfo.data)
|
||||||
|
{
|
||||||
|
HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture
|
||||||
|
Z_ChangeTag(grmip->grInfo.data, PU_HWRMODELTEXTURE_UNLOCKED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If here, the blended texture has not been created
|
||||||
|
// So we create it
|
||||||
|
|
||||||
//BP: WARNING: don't free it manually without clearing the cache of harware renderer
|
//BP: WARNING: don't free it manually without clearing the cache of harware renderer
|
||||||
// (it have a liste of mipmap)
|
// (it have a liste of mipmap)
|
||||||
// this malloc is cleared in HWR_FreeTextureCache
|
// this malloc is cleared in HWR_FreeTextureCache
|
||||||
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
|
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
|
||||||
newmip = calloc(1, sizeof (*newmip));
|
newmip = calloc(1, sizeof (*newmip));
|
||||||
if (newmip == NULL)
|
if (newmip == NULL)
|
||||||
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
|
I_Error("%s: Out of memory", "HWR_GetBlendedTexture");
|
||||||
grmip->nextcolormap = newmip;
|
grmip->nextcolormap = newmip;
|
||||||
newmip->colormap = colormap;
|
newmip->colormap = colormap;
|
||||||
newmip->tcindex = skinnum;
|
|
||||||
|
|
||||||
HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color);
|
HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color);
|
||||||
|
|
||||||
HWD.pfnSetTexture(newmip);
|
HWD.pfnSetTexture(newmip);
|
||||||
Z_ChangeTag(newmip->grInfo.data, PU_HWRMODELTEXTURE);
|
Z_ChangeTag(newmip->grInfo.data, PU_HWRMODELTEXTURE_UNLOCKED);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NORMALFOG 0x00000000
|
#define NORMALFOG 0x00000000
|
||||||
|
@ -1298,7 +1325,7 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
|
|
||||||
if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture
|
if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture
|
||||||
{
|
{
|
||||||
INT32 skinnum = INT32_MAX;
|
INT32 skinnum = TC_DEFAULT;
|
||||||
|
|
||||||
if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
||||||
{
|
{
|
||||||
|
@ -1329,17 +1356,9 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translation or skin number found
|
// Translation or skin number found
|
||||||
if (skinnum != INT32_MAX)
|
|
||||||
{
|
|
||||||
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
|
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
// Sorry nothing
|
|
||||||
HWD.pfnSetTexture(gpatch->mipmap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// Sprite
|
// Sprite
|
||||||
gpatch = spr->gpatch; //W_CachePatchNum(spr->patchlumpnum, PU_CACHE);
|
gpatch = spr->gpatch; //W_CachePatchNum(spr->patchlumpnum, PU_CACHE);
|
||||||
|
|
|
@ -49,4 +49,6 @@ void HWR_AddPlayerModel(INT32 skin);
|
||||||
void HWR_AddSpriteModel(size_t spritenum);
|
void HWR_AddSpriteModel(size_t spritenum);
|
||||||
boolean HWR_DrawModel(gr_vissprite_t *spr);
|
boolean HWR_DrawModel(gr_vissprite_t *spr);
|
||||||
|
|
||||||
|
#define PLAYERMODELPREFIX "PLAYER"
|
||||||
|
|
||||||
#endif // _HW_MD2_H_
|
#endif // _HW_MD2_H_
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Emacs style mode select -*- C++ -*-
|
// Emacs style mode select -*- C++ -*-
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Copyright (C) 1998-2019 by Sonic Team Junior.
|
// Copyright (C) 1998-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License
|
// modify it under the terms of the GNU General Public License
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -787,10 +787,12 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
||||||
case SKINCOLOR_RED:
|
case SKINCOLOR_RED:
|
||||||
case SKINCOLOR_CRIMSON:
|
case SKINCOLOR_CRIMSON:
|
||||||
case SKINCOLOR_FLAME:
|
case SKINCOLOR_FLAME:
|
||||||
|
case SKINCOLOR_KETCHUP:
|
||||||
cstart = "\x85"; // V_REDMAP
|
cstart = "\x85"; // V_REDMAP
|
||||||
break;
|
break;
|
||||||
case SKINCOLOR_YOGURT:
|
case SKINCOLOR_YOGURT:
|
||||||
case SKINCOLOR_BROWN:
|
case SKINCOLOR_BROWN:
|
||||||
|
case SKINCOLOR_BRONZE:
|
||||||
case SKINCOLOR_TAN:
|
case SKINCOLOR_TAN:
|
||||||
case SKINCOLOR_BEIGE:
|
case SKINCOLOR_BEIGE:
|
||||||
case SKINCOLOR_QUAIL:
|
case SKINCOLOR_QUAIL:
|
||||||
|
@ -818,6 +820,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
||||||
cstart = "\x8e"; // V_ROSYMAP
|
cstart = "\x8e"; // V_ROSYMAP
|
||||||
break;
|
break;
|
||||||
case SKINCOLOR_SUNSET:
|
case SKINCOLOR_SUNSET:
|
||||||
|
case SKINCOLOR_COPPER:
|
||||||
case SKINCOLOR_APRICOT:
|
case SKINCOLOR_APRICOT:
|
||||||
case SKINCOLOR_ORANGE:
|
case SKINCOLOR_ORANGE:
|
||||||
case SKINCOLOR_RUST:
|
case SKINCOLOR_RUST:
|
||||||
|
@ -831,6 +834,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
||||||
break;
|
break;
|
||||||
case SKINCOLOR_LIME:
|
case SKINCOLOR_LIME:
|
||||||
case SKINCOLOR_PERIDOT:
|
case SKINCOLOR_PERIDOT:
|
||||||
|
case SKINCOLOR_APPLE:
|
||||||
cstart = "\x8b"; // V_PERIDOTMAP
|
cstart = "\x8b"; // V_PERIDOTMAP
|
||||||
break;
|
break;
|
||||||
case SKINCOLOR_SEAFOAM:
|
case SKINCOLOR_SEAFOAM:
|
||||||
|
@ -851,12 +855,14 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
||||||
case SKINCOLOR_BLUE:
|
case SKINCOLOR_BLUE:
|
||||||
case SKINCOLOR_COBALT:
|
case SKINCOLOR_COBALT:
|
||||||
case SKINCOLOR_DUSK:
|
case SKINCOLOR_DUSK:
|
||||||
|
case SKINCOLOR_BLUEBELL:
|
||||||
cstart = "\x84"; // V_BLUEMAP
|
cstart = "\x84"; // V_BLUEMAP
|
||||||
break;
|
break;
|
||||||
case SKINCOLOR_BUBBLEGUM:
|
case SKINCOLOR_BUBBLEGUM:
|
||||||
case SKINCOLOR_MAGENTA:
|
case SKINCOLOR_MAGENTA:
|
||||||
case SKINCOLOR_NEON:
|
case SKINCOLOR_NEON:
|
||||||
case SKINCOLOR_VIOLET:
|
case SKINCOLOR_VIOLET:
|
||||||
|
case SKINCOLOR_RASPBERRY:
|
||||||
cstart = "\x81"; // V_MAGENTAMAP
|
cstart = "\x81"; // V_MAGENTAMAP
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2011-2019 by Sonic Team Junior.
|
// Copyright (C) 2011-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2011-2019 by Sonic Team Junior.
|
// Copyright (C) 2011-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -32,10 +32,14 @@ typedef enum
|
||||||
render_none = 3 // for dedicated server
|
render_none = 3 // for dedicated server
|
||||||
} rendermode_t;
|
} rendermode_t;
|
||||||
|
|
||||||
/** \brief currect render mode
|
/** \brief current render mode
|
||||||
*/
|
*/
|
||||||
extern rendermode_t rendermode;
|
extern rendermode_t rendermode;
|
||||||
|
|
||||||
|
/** \brief hardware renderer loaded
|
||||||
|
0 = never loaded, 1 = loaded successfully, -1 = failed loading
|
||||||
|
*/
|
||||||
|
extern INT32 hwrenderloaded;
|
||||||
|
|
||||||
/** \brief use highcolor modes if true
|
/** \brief use highcolor modes if true
|
||||||
*/
|
*/
|
||||||
|
@ -44,6 +48,9 @@ extern boolean highcolor;
|
||||||
/** \brief setup video mode
|
/** \brief setup video mode
|
||||||
*/
|
*/
|
||||||
void I_StartupGraphics(void);
|
void I_StartupGraphics(void);
|
||||||
|
|
||||||
|
/** \brief setup hardware mode
|
||||||
|
*/
|
||||||
void I_StartupHardwareGraphics(void);
|
void I_StartupHardwareGraphics(void);
|
||||||
|
|
||||||
/** \brief restore old video mode
|
/** \brief restore old video mode
|
||||||
|
@ -82,9 +89,12 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h);
|
||||||
|
|
||||||
\param modenum video mode to set to
|
\param modenum video mode to set to
|
||||||
|
|
||||||
\return currect video mode
|
\return current video mode
|
||||||
*/
|
*/
|
||||||
INT32 VID_SetMode(INT32 modenum);
|
INT32 VID_SetMode(INT32 modenum);
|
||||||
|
|
||||||
|
/** \brief Checks the render state
|
||||||
|
*/
|
||||||
void VID_CheckRenderer(void);
|
void VID_CheckRenderer(void);
|
||||||
|
|
||||||
/** \brief The VID_GetModeName function
|
/** \brief The VID_GetModeName function
|
||||||
|
|
33
src/info.c
33
src/info.c
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -407,6 +407,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
"LCKN", // Target
|
"LCKN", // Target
|
||||||
"TTAG", // Tag Sign
|
"TTAG", // Tag Sign
|
||||||
"GFLG", // Got Flag sign
|
"GFLG", // Got Flag sign
|
||||||
|
"FNSF", // Finish flag
|
||||||
|
|
||||||
"CORK",
|
"CORK",
|
||||||
"LHRT",
|
"LHRT",
|
||||||
|
@ -3351,6 +3352,9 @@ state_t states[NUMSTATES] =
|
||||||
// CTF Sign
|
// CTF Sign
|
||||||
{SPR_GFLG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_GOTFLAG
|
{SPR_GFLG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_GOTFLAG
|
||||||
|
|
||||||
|
// Finish flag
|
||||||
|
{SPR_FNSF, FF_TRANS30, -1, {NULL}, 0, 0, S_NULL}, // S_FINISHFLAG
|
||||||
|
|
||||||
{SPR_CORK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CORK
|
{SPR_CORK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CORK
|
||||||
{SPR_LHRT, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LHRT
|
{SPR_LHRT, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LHRT
|
||||||
|
|
||||||
|
@ -17996,6 +18000,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_FINISHFLAG
|
||||||
|
-1, // doomednum
|
||||||
|
S_FINISHFLAG, // spawnstate
|
||||||
|
1000, // spawnhealth
|
||||||
|
S_NULL, // seestate
|
||||||
|
sfx_None, // seesound
|
||||||
|
8, // reactiontime
|
||||||
|
sfx_None, // attacksound
|
||||||
|
S_NULL, // painstate
|
||||||
|
0, // painchance
|
||||||
|
sfx_None, // painsound
|
||||||
|
S_NULL, // meleestate
|
||||||
|
S_NULL, // missilestate
|
||||||
|
S_NULL, // deathstate
|
||||||
|
S_NULL, // xdeathstate
|
||||||
|
sfx_None, // deathsound
|
||||||
|
4*FRACUNIT, // speed
|
||||||
|
8*FRACUNIT, // radius
|
||||||
|
8*FRACUNIT, // height
|
||||||
|
1, // display offset
|
||||||
|
16, // mass
|
||||||
|
0, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
// ambient water 1a (large)
|
// ambient water 1a (large)
|
||||||
{ // MT_AWATERA
|
{ // MT_AWATERA
|
||||||
700, // doomednum
|
700, // doomednum
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -670,6 +670,7 @@ typedef enum sprite
|
||||||
SPR_LCKN, // Target
|
SPR_LCKN, // Target
|
||||||
SPR_TTAG, // Tag Sign
|
SPR_TTAG, // Tag Sign
|
||||||
SPR_GFLG, // Got Flag sign
|
SPR_GFLG, // Got Flag sign
|
||||||
|
SPR_FNSF, // Finish flag
|
||||||
|
|
||||||
SPR_CORK,
|
SPR_CORK,
|
||||||
SPR_LHRT,
|
SPR_LHRT,
|
||||||
|
@ -3486,6 +3487,9 @@ typedef enum state
|
||||||
// Got Flag Sign
|
// Got Flag Sign
|
||||||
S_GOTFLAG,
|
S_GOTFLAG,
|
||||||
|
|
||||||
|
// Finish flag
|
||||||
|
S_FINISHFLAG,
|
||||||
|
|
||||||
S_CORK,
|
S_CORK,
|
||||||
S_LHRT,
|
S_LHRT,
|
||||||
|
|
||||||
|
@ -4626,6 +4630,7 @@ typedef enum mobj_type
|
||||||
MT_LOCKONINF, // In-level Target
|
MT_LOCKONINF, // In-level Target
|
||||||
MT_TAG, // Tag Sign
|
MT_TAG, // Tag Sign
|
||||||
MT_GOTFLAG, // Got Flag sign
|
MT_GOTFLAG, // Got Flag sign
|
||||||
|
MT_FINISHFLAG, // Finish flag
|
||||||
|
|
||||||
// Ambient Sounds
|
// Ambient Sounds
|
||||||
MT_AWATERA, // Ambient Water Sound 1
|
MT_AWATERA, // Ambient Water Sound 1
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -20,6 +20,7 @@
|
||||||
#endif
|
#endif
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
|
#include "r_draw.h"
|
||||||
#include "r_things.h"
|
#include "r_things.h"
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
|
@ -2315,9 +2316,29 @@ static int lib_rTextureNumForName(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// R_DRAW
|
||||||
|
////////////
|
||||||
|
static int lib_rGetColorByName(lua_State *L)
|
||||||
|
{
|
||||||
|
const char* colorname = luaL_checkstring(L, 1);
|
||||||
|
//HUDSAFE
|
||||||
|
lua_pushinteger(L, R_GetColorByName(colorname));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lua exclusive function, returns the name of a color from the SKINCOLOR_ constant.
|
||||||
|
// SKINCOLOR_GREEN > "Green" for example
|
||||||
|
static int lib_rGetNameByColor(lua_State *L)
|
||||||
|
{
|
||||||
|
UINT8 colornum = (UINT8)luaL_checkinteger(L, 1);
|
||||||
|
if (!colornum || colornum >= MAXSKINCOLORS)
|
||||||
|
return luaL_error(L, "skincolor %d out of range (1 - %d).", colornum, MAXSKINCOLORS-1);
|
||||||
|
lua_pushstring(L, Color_Names[colornum]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// S_SOUND
|
// S_SOUND
|
||||||
////////////
|
////////////
|
||||||
|
|
||||||
static int lib_sStartSound(lua_State *L)
|
static int lib_sStartSound(lua_State *L)
|
||||||
{
|
{
|
||||||
const void *origin = NULL;
|
const void *origin = NULL;
|
||||||
|
@ -3155,6 +3176,10 @@ static luaL_Reg lib[] = {
|
||||||
{"R_CheckTextureNumForName",lib_rCheckTextureNumForName},
|
{"R_CheckTextureNumForName",lib_rCheckTextureNumForName},
|
||||||
{"R_TextureNumForName",lib_rTextureNumForName},
|
{"R_TextureNumForName",lib_rTextureNumForName},
|
||||||
|
|
||||||
|
// r_draw
|
||||||
|
{"R_GetColorByName", lib_rGetColorByName},
|
||||||
|
{"R_GetNameByColor", lib_rGetNameByColor},
|
||||||
|
|
||||||
// s_sound
|
// s_sound
|
||||||
{"S_StartSound",lib_sStartSound},
|
{"S_StartSound",lib_sStartSound},
|
||||||
{"S_StartSoundAtVolume",lib_sStartSoundAtVolume},
|
{"S_StartSoundAtVolume",lib_sStartSoundAtVolume},
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2016 by Iestyn "Monster Iestyn" Jealous.
|
// Copyright (C) 2016 by Iestyn "Monster Iestyn" Jealous.
|
||||||
// Copyright (C) 2016-2019 by Sonic Team Junior.
|
// Copyright (C) 2016-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -142,6 +142,7 @@ static int lib_addHook(lua_State *L)
|
||||||
case hook_HurtMsg:
|
case hook_HurtMsg:
|
||||||
case hook_MobjMoveBlocked:
|
case hook_MobjMoveBlocked:
|
||||||
case hook_MapThingSpawn:
|
case hook_MapThingSpawn:
|
||||||
|
case hook_FollowMobj:
|
||||||
hook.s.mt = MT_NULL;
|
hook.s.mt = MT_NULL;
|
||||||
if (lua_isnumber(L, 2))
|
if (lua_isnumber(L, 2))
|
||||||
hook.s.mt = lua_tonumber(L, 2);
|
hook.s.mt = lua_tonumber(L, 2);
|
||||||
|
@ -203,6 +204,7 @@ static int lib_addHook(lua_State *L)
|
||||||
case hook_MobjRemoved:
|
case hook_MobjRemoved:
|
||||||
case hook_MobjMoveBlocked:
|
case hook_MobjMoveBlocked:
|
||||||
case hook_MapThingSpawn:
|
case hook_MapThingSpawn:
|
||||||
|
case hook_FollowMobj:
|
||||||
lastp = &mobjhooks[hook.s.mt];
|
lastp = &mobjhooks[hook.s.mt];
|
||||||
break;
|
break;
|
||||||
case hook_JumpSpecial:
|
case hook_JumpSpecial:
|
||||||
|
@ -210,7 +212,6 @@ static int lib_addHook(lua_State *L)
|
||||||
case hook_SpinSpecial:
|
case hook_SpinSpecial:
|
||||||
case hook_JumpSpinSpecial:
|
case hook_JumpSpinSpecial:
|
||||||
case hook_PlayerSpawn:
|
case hook_PlayerSpawn:
|
||||||
case hook_FollowMobj:
|
|
||||||
case hook_PlayerCanDamage:
|
case hook_PlayerCanDamage:
|
||||||
case hook_TeamSwitch:
|
case hook_TeamSwitch:
|
||||||
case hook_ViewpointSwitch:
|
case hook_ViewpointSwitch:
|
||||||
|
@ -1364,7 +1365,34 @@ boolean LUAh_FollowMobj(player_t *player, mobj_t *mobj)
|
||||||
|
|
||||||
lua_settop(gL, 0);
|
lua_settop(gL, 0);
|
||||||
|
|
||||||
for (hookp = playerhooks; hookp; hookp = hookp->next)
|
// Look for all generic mobj follow item hooks
|
||||||
|
for (hookp = mobjhooks[MT_NULL]; hookp; hookp = hookp->next)
|
||||||
|
{
|
||||||
|
if (hookp->type != hook_FollowMobj)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (lua_gettop(gL) == 0)
|
||||||
|
{
|
||||||
|
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||||
|
LUA_PushUserdata(gL, mobj, META_MOBJ);
|
||||||
|
}
|
||||||
|
lua_pushfstring(gL, FMT_HOOKID, hookp->id);
|
||||||
|
lua_gettable(gL, LUA_REGISTRYINDEX);
|
||||||
|
lua_pushvalue(gL, -3);
|
||||||
|
lua_pushvalue(gL, -3);
|
||||||
|
if (lua_pcall(gL, 2, 1, 0)) {
|
||||||
|
if (!hookp->error || cv_debug & DBG_LUA)
|
||||||
|
CONS_Alert(CONS_WARNING,"%s\n",lua_tostring(gL, -1));
|
||||||
|
lua_pop(gL, 1);
|
||||||
|
hookp->error = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (lua_toboolean(gL, -1))
|
||||||
|
hooked = true;
|
||||||
|
lua_pop(gL, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (hookp = mobjhooks[mobj->type]; hookp; hookp = hookp->next)
|
||||||
{
|
{
|
||||||
if (hookp->type != hook_FollowMobj)
|
if (hookp->type != hook_FollowMobj)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1594,7 +1622,7 @@ boolean LUAh_SeenPlayer(player_t *player, player_t *seenfriend)
|
||||||
hook_p hookp;
|
hook_p hookp;
|
||||||
boolean hasSeenPlayer = true;
|
boolean hasSeenPlayer = true;
|
||||||
if (!gL || !(hooksAvailable[hook_SeenPlayer/8] & (1<<(hook_SeenPlayer%8))))
|
if (!gL || !(hooksAvailable[hook_SeenPlayer/8] & (1<<(hook_SeenPlayer%8))))
|
||||||
return 0;
|
return true;
|
||||||
|
|
||||||
lua_settop(gL, 0);
|
lua_settop(gL, 0);
|
||||||
hud_running = true; // local hook
|
hud_running = true; // local hook
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2014-2016 by John "JTE" Muniz.
|
// Copyright (C) 2014-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2014-2019 by Sonic Team Junior.
|
// Copyright (C) 2014-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2014-2016 by John "JTE" Muniz.
|
// Copyright (C) 2014-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2014-2019 by Sonic Team Junior.
|
// Copyright (C) 2014-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -119,9 +119,25 @@ enum align {
|
||||||
align_center,
|
align_center,
|
||||||
align_right,
|
align_right,
|
||||||
align_fixed,
|
align_fixed,
|
||||||
|
align_fixedcenter,
|
||||||
|
align_fixedright,
|
||||||
align_small,
|
align_small,
|
||||||
|
align_smallfixed,
|
||||||
|
align_smallfixedcenter,
|
||||||
|
align_smallfixedright,
|
||||||
|
align_smallcenter,
|
||||||
align_smallright,
|
align_smallright,
|
||||||
|
align_smallthin,
|
||||||
|
align_smallthincenter,
|
||||||
|
align_smallthinright,
|
||||||
|
align_smallthinfixed,
|
||||||
|
align_smallthinfixedcenter,
|
||||||
|
align_smallthinfixedright,
|
||||||
align_thin,
|
align_thin,
|
||||||
|
align_thinfixed,
|
||||||
|
align_thinfixedcenter,
|
||||||
|
align_thinfixedright,
|
||||||
|
align_thincenter,
|
||||||
align_thinright
|
align_thinright
|
||||||
};
|
};
|
||||||
static const char *const align_opt[] = {
|
static const char *const align_opt[] = {
|
||||||
|
@ -129,9 +145,25 @@ static const char *const align_opt[] = {
|
||||||
"center",
|
"center",
|
||||||
"right",
|
"right",
|
||||||
"fixed",
|
"fixed",
|
||||||
|
"fixed-center",
|
||||||
|
"fixed-right",
|
||||||
"small",
|
"small",
|
||||||
|
"small-fixed",
|
||||||
|
"small-fixed-center",
|
||||||
|
"small-fixed-right",
|
||||||
|
"small-center",
|
||||||
"small-right",
|
"small-right",
|
||||||
|
"small-thin",
|
||||||
|
"small-thin-center",
|
||||||
|
"small-thin-right",
|
||||||
|
"small-thin-fixed",
|
||||||
|
"small-thin-fixed-center",
|
||||||
|
"small-thin-fixed-right",
|
||||||
"thin",
|
"thin",
|
||||||
|
"thin-fixed",
|
||||||
|
"thin-fixed-center",
|
||||||
|
"thin-fixed-right",
|
||||||
|
"thin-center",
|
||||||
"thin-right",
|
"thin-right",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
|
@ -775,20 +807,68 @@ static int libd_drawString(lua_State *L)
|
||||||
case align_fixed:
|
case align_fixed:
|
||||||
V_DrawStringAtFixed(x, y, flags, str);
|
V_DrawStringAtFixed(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_fixedcenter:
|
||||||
|
V_DrawCenteredStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_fixedright:
|
||||||
|
V_DrawRightAlignedStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
// hu_font, 0.5x scale
|
// hu_font, 0.5x scale
|
||||||
case align_small:
|
case align_small:
|
||||||
V_DrawSmallString(x, y, flags, str);
|
V_DrawSmallString(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_smallfixed:
|
||||||
|
V_DrawSmallStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallfixedcenter:
|
||||||
|
V_DrawCenteredSmallStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallfixedright:
|
||||||
|
V_DrawRightAlignedSmallStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallcenter:
|
||||||
|
V_DrawCenteredSmallString(x, y, flags, str);
|
||||||
|
break;
|
||||||
case align_smallright:
|
case align_smallright:
|
||||||
V_DrawRightAlignedSmallString(x, y, flags, str);
|
V_DrawRightAlignedSmallString(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_smallthin:
|
||||||
|
V_DrawSmallThinString(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthincenter:
|
||||||
|
V_DrawCenteredSmallThinString(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthinright:
|
||||||
|
V_DrawRightAlignedSmallThinString(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthinfixed:
|
||||||
|
V_DrawSmallThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthinfixedcenter:
|
||||||
|
V_DrawCenteredSmallThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_smallthinfixedright:
|
||||||
|
V_DrawRightAlignedSmallThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
// tny_font
|
// tny_font
|
||||||
case align_thin:
|
case align_thin:
|
||||||
V_DrawThinString(x, y, flags, str);
|
V_DrawThinString(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_thincenter:
|
||||||
|
V_DrawCenteredThinString(x, y, flags, str);
|
||||||
|
break;
|
||||||
case align_thinright:
|
case align_thinright:
|
||||||
V_DrawRightAlignedThinString(x, y, flags, str);
|
V_DrawRightAlignedThinString(x, y, flags, str);
|
||||||
break;
|
break;
|
||||||
|
case align_thinfixed:
|
||||||
|
V_DrawThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_thinfixedcenter:
|
||||||
|
V_DrawCenteredThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
|
case align_thinfixedright:
|
||||||
|
V_DrawRightAlignedThinStringAtFixed(x, y, flags, str);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -97,6 +97,10 @@ static int player_get(lua_State *L)
|
||||||
lua_pushboolean(L, true);
|
lua_pushboolean(L, true);
|
||||||
else if (fastcmp(field,"name"))
|
else if (fastcmp(field,"name"))
|
||||||
lua_pushstring(L, player_names[plr-players]);
|
lua_pushstring(L, player_names[plr-players]);
|
||||||
|
else if (fastcmp(field,"realmo"))
|
||||||
|
LUA_PushUserdata(L, plr->mo, META_MOBJ);
|
||||||
|
// Kept for backward-compatibility
|
||||||
|
// Should be fixed to work like "realmo" later
|
||||||
else if (fastcmp(field,"mo"))
|
else if (fastcmp(field,"mo"))
|
||||||
{
|
{
|
||||||
if (plr->spectator)
|
if (plr->spectator)
|
||||||
|
@ -398,7 +402,7 @@ static int player_set(lua_State *L)
|
||||||
if (hud_running)
|
if (hud_running)
|
||||||
return luaL_error(L, "Do not alter player_t in HUD rendering code!");
|
return luaL_error(L, "Do not alter player_t in HUD rendering code!");
|
||||||
|
|
||||||
if (fastcmp(field,"mo")) {
|
if (fastcmp(field,"mo") || fastcmp(field,"realmo")) {
|
||||||
mobj_t *newmo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
mobj_t *newmo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
||||||
plr->mo->player = NULL; // remove player pointer from old mobj
|
plr->mo->player = NULL; // remove player pointer from old mobj
|
||||||
(newmo->player = plr)->mo = newmo; // set player pointer for new mobj, and set new mobj as the player's mobj
|
(newmo->player = plr)->mo = newmo; // set player pointer for new mobj, and set new mobj as the player's mobj
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2014-2016 by John "JTE" Muniz.
|
// Copyright (C) 2014-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2014-2019 by Sonic Team Junior.
|
// Copyright (C) 2014-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2013-2016 by Matthew "Kaito Sinclaire" Walsh.
|
// Copyright (C) 2013-2016 by Matthew "Kaito Sinclaire" Walsh.
|
||||||
// Copyright (C) 2013 by "Ninji".
|
// Copyright (C) 2013 by "Ninji".
|
||||||
// Copyright (C) 2013-2019 by Sonic Team Junior.
|
// Copyright (C) 2013-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -19,6 +19,7 @@
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
#include "i_video.h"
|
#include "i_video.h"
|
||||||
#include "m_misc.h"
|
#include "m_misc.h"
|
||||||
|
#include "st_stuff.h" // st_palette
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
#include "hardware/hw_main.h"
|
#include "hardware/hw_main.h"
|
||||||
|
@ -29,11 +30,17 @@
|
||||||
|
|
||||||
consvar_t cv_gif_optimize = {"gif_optimize", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_gif_optimize = {"gif_optimize", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_gif_downscale = {"gif_downscale", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_gif_downscale = {"gif_downscale", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_gif_localcolortable = {"gif_localcolortable", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
#ifdef HAVE_ANIGIF
|
#ifdef HAVE_ANIGIF
|
||||||
static boolean gif_optimize = false; // So nobody can do something dumb
|
static boolean gif_optimize = false; // So nobody can do something dumb
|
||||||
static boolean gif_downscale = false; // like changing cvars mid output
|
static boolean gif_downscale = false; // like changing cvars mid output
|
||||||
static RGBA_t *gif_palette = NULL;
|
|
||||||
|
// Palette handling
|
||||||
|
static boolean gif_localcolortable = false;
|
||||||
|
static boolean gif_colorprofile = false;
|
||||||
|
static RGBA_t *gif_headerpalette = NULL;
|
||||||
|
static RGBA_t *gif_framepalette = NULL;
|
||||||
|
|
||||||
static FILE *gif_out = NULL;
|
static FILE *gif_out = NULL;
|
||||||
static INT32 gif_frames = 0;
|
static INT32 gif_frames = 0;
|
||||||
|
@ -393,16 +400,47 @@ const UINT8 gifhead_nsid[19] = {0x21,0xFF,0x0B, // extension block + size
|
||||||
0x4E,0x45,0x54,0x53,0x43,0x41,0x50,0x45,0x32,0x2E,0x30, // NETSCAPE2.0
|
0x4E,0x45,0x54,0x53,0x43,0x41,0x50,0x45,0x32,0x2E,0x30, // NETSCAPE2.0
|
||||||
0x03,0x01,0xFF,0xFF,0x00}; // sub-block, repetitions
|
0x03,0x01,0xFF,0xFF,0x00}; // sub-block, repetitions
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// GIF_getpalette
|
||||||
|
// determine the palette for the current frame.
|
||||||
|
//
|
||||||
|
static RGBA_t *GIF_getpalette(size_t palnum)
|
||||||
|
{
|
||||||
|
// In hardware mode, always returns the local palette
|
||||||
|
#ifdef HWRENDER
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
return pLocalPalette;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return (gif_colorprofile ? &pLocalPalette[palnum*256] : &pMasterPalette[palnum*256]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// GIF_palwrite
|
||||||
|
// writes the gif palette.
|
||||||
|
// used both for the header and local color tables.
|
||||||
|
//
|
||||||
|
static UINT8 *GIF_palwrite(UINT8 *p, RGBA_t *pal)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
WRITEUINT8(p, pal[i].s.red);
|
||||||
|
WRITEUINT8(p, pal[i].s.green);
|
||||||
|
WRITEUINT8(p, pal[i].s.blue);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// GIF_headwrite
|
// GIF_headwrite
|
||||||
// writes the gif header to the currently open output file.
|
// writes the gif header to the currently open output file.
|
||||||
// NOTE that this code does not accomodate for palette changes.
|
|
||||||
//
|
//
|
||||||
static void GIF_headwrite(void)
|
static void GIF_headwrite(void)
|
||||||
{
|
{
|
||||||
UINT8 *gifhead = Z_Malloc(800, PU_STATIC, NULL);
|
UINT8 *gifhead = Z_Malloc(800, PU_STATIC, NULL);
|
||||||
UINT8 *p = gifhead;
|
UINT8 *p = gifhead;
|
||||||
INT32 i;
|
|
||||||
UINT16 rwidth, rheight;
|
UINT16 rwidth, rheight;
|
||||||
|
|
||||||
if (!gif_out)
|
if (!gif_out)
|
||||||
|
@ -423,24 +461,17 @@ static void GIF_headwrite(void)
|
||||||
rwidth = vid.width;
|
rwidth = vid.width;
|
||||||
rheight = vid.height;
|
rheight = vid.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITEUINT16(p, rwidth);
|
WRITEUINT16(p, rwidth);
|
||||||
WRITEUINT16(p, rheight);
|
WRITEUINT16(p, rheight);
|
||||||
|
|
||||||
// colors, aspect, etc
|
// colors, aspect, etc
|
||||||
WRITEUINT8(p, 0xF7);
|
WRITEUINT8(p, 0xF7); // (0xF7 = 1111 0111)
|
||||||
WRITEUINT8(p, 0x00);
|
WRITEUINT8(p, 0x00);
|
||||||
WRITEUINT8(p, 0x00);
|
WRITEUINT8(p, 0x00);
|
||||||
|
|
||||||
// write color table
|
// write color table
|
||||||
{
|
p = GIF_palwrite(p, gif_headerpalette);
|
||||||
RGBA_t *pal = gif_palette;
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
WRITEUINT8(p, pal[i].s.red);
|
|
||||||
WRITEUINT8(p, pal[i].s.green);
|
|
||||||
WRITEUINT8(p, pal[i].s.blue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write extension block
|
// write extension block
|
||||||
WRITEMEM(p, gifhead_nsid, sizeof(gifhead_nsid));
|
WRITEMEM(p, gifhead_nsid, sizeof(gifhead_nsid));
|
||||||
|
@ -468,7 +499,7 @@ static void hwrconvert(void)
|
||||||
INT32 x, y;
|
INT32 x, y;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
InitColorLUT(gif_palette);
|
InitColorLUT(gif_framepalette);
|
||||||
|
|
||||||
for (y = 0; y < vid.height; y++)
|
for (y = 0; y < vid.height; y++)
|
||||||
{
|
{
|
||||||
|
@ -494,6 +525,7 @@ static void GIF_framewrite(void)
|
||||||
UINT8 *p;
|
UINT8 *p;
|
||||||
UINT8 *movie_screen = screens[2];
|
UINT8 *movie_screen = screens[2];
|
||||||
INT32 blitx, blity, blitw, blith;
|
INT32 blitx, blity, blitw, blith;
|
||||||
|
boolean palchanged;
|
||||||
|
|
||||||
if (!gifframe_data)
|
if (!gifframe_data)
|
||||||
gifframe_data = Z_Malloc(gifframe_size, PU_STATIC, NULL);
|
gifframe_data = Z_Malloc(gifframe_size, PU_STATIC, NULL);
|
||||||
|
@ -502,8 +534,18 @@ static void GIF_framewrite(void)
|
||||||
if (!gif_out)
|
if (!gif_out)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Lactozilla: Compare the header's palette with the current frame's palette and see if it changed.
|
||||||
|
if (gif_localcolortable)
|
||||||
|
{
|
||||||
|
gif_framepalette = GIF_getpalette(max(st_palette, 0));
|
||||||
|
palchanged = memcmp(gif_headerpalette, gif_framepalette, sizeof(RGBA_t) * 256);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
palchanged = false;
|
||||||
|
|
||||||
// Compare image data (for optimizing GIF)
|
// Compare image data (for optimizing GIF)
|
||||||
if (gif_optimize && gif_frames > 0)
|
// If the palette has changed, the entire frame is considered to be different.
|
||||||
|
if (gif_optimize && gif_frames > 0 && (!palchanged))
|
||||||
{
|
{
|
||||||
// before blit movie_screen points to last frame, cur_screen points to this frame
|
// before blit movie_screen points to last frame, cur_screen points to this frame
|
||||||
UINT8 *cur_screen = screens[0];
|
UINT8 *cur_screen = screens[0];
|
||||||
|
@ -566,7 +608,20 @@ static void GIF_framewrite(void)
|
||||||
WRITEUINT16(p, (UINT16)(blity / scrbuf_downscaleamt));
|
WRITEUINT16(p, (UINT16)(blity / scrbuf_downscaleamt));
|
||||||
WRITEUINT16(p, (UINT16)(blitw / scrbuf_downscaleamt));
|
WRITEUINT16(p, (UINT16)(blitw / scrbuf_downscaleamt));
|
||||||
WRITEUINT16(p, (UINT16)(blith / scrbuf_downscaleamt));
|
WRITEUINT16(p, (UINT16)(blith / scrbuf_downscaleamt));
|
||||||
|
|
||||||
|
if (!gif_localcolortable)
|
||||||
WRITEUINT8(p, 0); // no local table of colors
|
WRITEUINT8(p, 0); // no local table of colors
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (palchanged)
|
||||||
|
{
|
||||||
|
// The palettes are different, so write the Local Color Table!
|
||||||
|
WRITEUINT8(p, 0x87); // (0x87 = 1000 0111)
|
||||||
|
p = GIF_palwrite(p, gif_framepalette);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
WRITEUINT8(p, 0); // They are equal, no Local Color Table needed.
|
||||||
|
}
|
||||||
|
|
||||||
scrbuf_pos = movie_screen + blitx + (blity * vid.width);
|
scrbuf_pos = movie_screen + blitx + (blity * vid.width);
|
||||||
scrbuf_writeend = scrbuf_pos + (blitw - 1) + ((blith - 1) * vid.width);
|
scrbuf_writeend = scrbuf_pos + (blitw - 1) + ((blith - 1) * vid.width);
|
||||||
|
@ -630,15 +685,9 @@ INT32 GIF_open(const char *filename)
|
||||||
|
|
||||||
gif_optimize = (!!cv_gif_optimize.value);
|
gif_optimize = (!!cv_gif_optimize.value);
|
||||||
gif_downscale = (!!cv_gif_downscale.value);
|
gif_downscale = (!!cv_gif_downscale.value);
|
||||||
|
gif_localcolortable = (!!cv_gif_localcolortable.value);
|
||||||
// GIF color table
|
gif_colorprofile = (!!cv_screenshot_colorprofile.value);
|
||||||
// In hardware mode, forces the local palette
|
gif_headerpalette = GIF_getpalette(0);
|
||||||
#ifdef HWRENDER
|
|
||||||
if (rendermode == render_opengl)
|
|
||||||
gif_palette = pLocalPalette;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
gif_palette = ((cv_screenshot_colorprofile.value) ? pLocalPalette : pMasterPalette);
|
|
||||||
|
|
||||||
GIF_headwrite();
|
GIF_headwrite();
|
||||||
gif_frames = 0;
|
gif_frames = 0;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2013-2016 by Matthew "Kaito Sinclaire" Walsh.
|
// Copyright (C) 2013-2016 by Matthew "Kaito Sinclaire" Walsh.
|
||||||
// Copyright (C) 2013-2019 by Sonic Team Junior.
|
// Copyright (C) 2013-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -27,6 +27,6 @@ void GIF_frame(void);
|
||||||
INT32 GIF_close(void);
|
INT32 GIF_close(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern consvar_t cv_gif_optimize, cv_gif_downscale;
|
extern consvar_t cv_gif_optimize, cv_gif_downscale, cv_gif_localcolortable;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
23
src/m_argv.c
23
src/m_argv.c
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
@ -92,36 +92,21 @@ const char *M_GetNextParm(void)
|
||||||
void M_PushSpecialParameters(void)
|
void M_PushSpecialParameters(void)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
char s[256];
|
|
||||||
boolean onetime = false;
|
|
||||||
|
|
||||||
for (i = 1; i < myargc; i++)
|
for (i = 1; i < myargc; i++)
|
||||||
{
|
{
|
||||||
if (myargv[i][0] == '+')
|
if (myargv[i][0] == '+')
|
||||||
{
|
{
|
||||||
strcpy(s, &myargv[i][1]);
|
COM_BufAddText(&myargv[i][1]);
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
// get the parameters of the command too
|
// get the parameters of the command too
|
||||||
for (; i < myargc && myargv[i][0] != '+' && myargv[i][0] != '-'; i++)
|
for (; i < myargc && myargv[i][0] != '+' && myargv[i][0] != '-'; i++)
|
||||||
{
|
{
|
||||||
strcat(s, " ");
|
COM_BufAddText(va(" \"%s\"", myargv[i]));
|
||||||
if (!onetime)
|
|
||||||
{
|
|
||||||
strcat(s, "\"");
|
|
||||||
onetime = true;
|
|
||||||
}
|
}
|
||||||
strcat(s, myargv[i]);
|
|
||||||
}
|
|
||||||
if (onetime)
|
|
||||||
{
|
|
||||||
strcat(s, "\"");
|
|
||||||
onetime = false;
|
|
||||||
}
|
|
||||||
strcat(s, "\n");
|
|
||||||
|
|
||||||
// push it
|
// push it
|
||||||
COM_BufAddText(s);
|
COM_BufAddText("\n");
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
// Copyright (C) 1999-2019 by Sonic Team Junior.
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by Matthew "Kaito Sinclaire" Walsh.
|
// Copyright (C) 2012-2016 by Matthew "Kaito Sinclaire" Walsh.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by Matthew "Kaito Sinclaire" Walsh.
|
// Copyright (C) 2012-2016 by Matthew "Kaito Sinclaire" Walsh.
|
||||||
// Copyright (C) 2012-2019 by Sonic Team Junior.
|
// Copyright (C) 2012-2020 by Sonic Team Junior.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue