mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-25 05:31:00 +00:00
Merge branch 'master' of https://github.com/rheit/zdoom
This commit is contained in:
commit
747b612860
31 changed files with 591 additions and 259 deletions
|
@ -91,8 +91,6 @@ conversation // Starts a dialog.
|
||||||
panel = <string>; // Name of lump to render as the background.
|
panel = <string>; // Name of lump to render as the background.
|
||||||
voice = <string>; // Narration sound lump.
|
voice = <string>; // Narration sound lump.
|
||||||
dialog = <string>; // Dialog of the page.
|
dialog = <string>; // Dialog of the page.
|
||||||
goodbye = <string>; // Custom goodbye message. If omitted then the
|
|
||||||
// generic goodbyes will be displayed instead.
|
|
||||||
drop = <integer>; // mobj for the object to drop if the actor is
|
drop = <integer>; // mobj for the object to drop if the actor is
|
||||||
// killed.
|
// killed.
|
||||||
link = <integer>; // Page to jump to if all ifitem conditions are
|
link = <integer>; // Page to jump to if all ifitem conditions are
|
||||||
|
|
|
@ -76,8 +76,8 @@ namespace = "ZDoom";
|
||||||
III.A : Conversations
|
III.A : Conversations
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
This block only lists the newly added fields. Currently ZDoom only adds one
|
This block only lists the newly added fields. Currently ZDoom only adds a few
|
||||||
field to the specification:
|
fields to the specification:
|
||||||
|
|
||||||
conversation // Starts a dialog.
|
conversation // Starts a dialog.
|
||||||
{
|
{
|
||||||
|
@ -86,6 +86,35 @@ conversation // Starts a dialog.
|
||||||
// the standard conversation ID ('actor' property) is used instead
|
// the standard conversation ID ('actor' property) is used instead
|
||||||
// for this purpose but since 'ZDoom' namespace requires the actor
|
// for this purpose but since 'ZDoom' namespace requires the actor
|
||||||
// to be a class name it needs a separate field for this.
|
// to be a class name it needs a separate field for this.
|
||||||
|
|
||||||
|
page
|
||||||
|
{
|
||||||
|
goodbye = <string>; // Custom goodbye message. If omitted then the
|
||||||
|
// generic goodbyes will be displayed instead.
|
||||||
|
|
||||||
|
choice
|
||||||
|
{
|
||||||
|
// The amount of an item needed for this option to become available.
|
||||||
|
// You can have as many as needed. All require blocks must be satisfied
|
||||||
|
// to show this option.
|
||||||
|
require
|
||||||
|
{
|
||||||
|
item = <string>; // Item that is required to show this option.
|
||||||
|
amount = <integer>; // Minimum amount of the item needed.
|
||||||
|
}
|
||||||
|
|
||||||
|
// The undesired amount of an item. This option will become available
|
||||||
|
// if you have less than the specified amount. You can have as many
|
||||||
|
// as needed. All exclude blocks must be satisfied to show this option.
|
||||||
|
// Note: if both require and exclude are defined then all require
|
||||||
|
// and all exclude blocks must be satisfied to show this option.
|
||||||
|
exclude
|
||||||
|
{
|
||||||
|
item = <string>; // Item that is unwanted to show this option.
|
||||||
|
amount = <integer>; // Unwanted minimum amount of the item.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
|
|
|
@ -198,7 +198,10 @@ SetTiltedSpanSize:
|
||||||
mov [y8+2],cl
|
mov [y8+2],cl
|
||||||
mov [y9+2],cl
|
mov [y9+2],cl
|
||||||
mov [y10+2],cl
|
mov [y10+2],cl
|
||||||
|
cmp eax,0 ; if x bits is 0, mask must be 0 too.
|
||||||
|
jz .notted
|
||||||
not eax
|
not eax
|
||||||
|
.notted:
|
||||||
pop ecx
|
pop ecx
|
||||||
|
|
||||||
mov [m1+2],eax
|
mov [m1+2],eax
|
||||||
|
|
|
@ -71,6 +71,9 @@ extern bool netgame;
|
||||||
// Bot game? Like netgame, but doesn't involve network communication.
|
// Bot game? Like netgame, but doesn't involve network communication.
|
||||||
extern bool multiplayer;
|
extern bool multiplayer;
|
||||||
|
|
||||||
|
// [SP] Map dm/coop implementation - invokes fake multiplayer without bots
|
||||||
|
extern bool multiplayernext;
|
||||||
|
|
||||||
// Flag: true only if started as net deathmatch.
|
// Flag: true only if started as net deathmatch.
|
||||||
EXTERN_CVAR (Int, deathmatch)
|
EXTERN_CVAR (Int, deathmatch)
|
||||||
|
|
||||||
|
|
|
@ -164,6 +164,7 @@ bool viewactive;
|
||||||
|
|
||||||
bool netgame; // only true if packets are broadcast
|
bool netgame; // only true if packets are broadcast
|
||||||
bool multiplayer;
|
bool multiplayer;
|
||||||
|
bool multiplayernext = false; // [SP] Map coop/dm implementation
|
||||||
player_t players[MAXPLAYERS];
|
player_t players[MAXPLAYERS];
|
||||||
bool playeringame[MAXPLAYERS];
|
bool playeringame[MAXPLAYERS];
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,8 @@
|
||||||
|
|
||||||
#include "g_hub.h"
|
#include "g_hub.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
void STAT_StartNewGame(const char *lev);
|
void STAT_StartNewGame(const char *lev);
|
||||||
void STAT_ChangeLevel(const char *newl);
|
void STAT_ChangeLevel(const char *newl);
|
||||||
|
|
||||||
|
@ -181,6 +183,16 @@ CCMD (map)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (argv.argc() > 2 && stricmp(argv[2], "coop") == 0)
|
||||||
|
{
|
||||||
|
deathmatch = false;
|
||||||
|
multiplayernext = true;
|
||||||
|
}
|
||||||
|
else if (argv.argc() > 2 && stricmp(argv[2], "dm") == 0)
|
||||||
|
{
|
||||||
|
deathmatch = true;
|
||||||
|
multiplayernext = true;
|
||||||
|
}
|
||||||
G_DeferedInitNew (argv[1]);
|
G_DeferedInitNew (argv[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -192,7 +204,7 @@ CCMD (map)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Printf ("Usage: map <map name>\n");
|
Printf ("Usage: map <map name> [coop|dm]\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,6 +230,16 @@ CCMD(recordmap)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (argv.argc() > 3 && stricmp(argv[3], "coop") == 0)
|
||||||
|
{
|
||||||
|
deathmatch = false;
|
||||||
|
multiplayernext = true;
|
||||||
|
}
|
||||||
|
else if (argv.argc() > 3 && stricmp(argv[3], "dm") == 0)
|
||||||
|
{
|
||||||
|
deathmatch = true;
|
||||||
|
multiplayernext = true;
|
||||||
|
}
|
||||||
G_DeferedInitNew(argv[2]);
|
G_DeferedInitNew(argv[2]);
|
||||||
gameaction = ga_recordgame;
|
gameaction = ga_recordgame;
|
||||||
newdemoname = argv[1];
|
newdemoname = argv[1];
|
||||||
|
@ -232,7 +254,7 @@ CCMD(recordmap)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Printf("Usage: recordmap <filename> <map name>\n");
|
Printf("Usage: recordmap <filename> <map name> [coop|dm]\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,13 +280,23 @@ CCMD (open)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (argv.argc() > 2 && stricmp(argv[2], "coop") == 0)
|
||||||
|
{
|
||||||
|
deathmatch = false;
|
||||||
|
multiplayernext = true;
|
||||||
|
}
|
||||||
|
else if (argv.argc() > 2 && stricmp(argv[2], "dm") == 0)
|
||||||
|
{
|
||||||
|
deathmatch = true;
|
||||||
|
multiplayernext = true;
|
||||||
|
}
|
||||||
gameaction = ga_newgame2;
|
gameaction = ga_newgame2;
|
||||||
d_skill = -1;
|
d_skill = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Printf ("Usage: open <map file>\n");
|
Printf ("Usage: open <map file> [coop|dm]\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,7 +325,8 @@ void G_NewInit ()
|
||||||
G_ClearSnapshots ();
|
G_ClearSnapshots ();
|
||||||
ST_SetNeedRefresh();
|
ST_SetNeedRefresh();
|
||||||
netgame = false;
|
netgame = false;
|
||||||
multiplayer = false;
|
multiplayer = multiplayernext;
|
||||||
|
multiplayernext = false;
|
||||||
if (demoplayback)
|
if (demoplayback)
|
||||||
{
|
{
|
||||||
C_RestoreCVars ();
|
C_RestoreCVars ();
|
||||||
|
|
|
@ -640,6 +640,7 @@ void AWeapon::PostMorphWeapon ()
|
||||||
|
|
||||||
pspr = Owner->player->GetPSprite(PSP_WEAPON);
|
pspr = Owner->player->GetPSprite(PSP_WEAPON);
|
||||||
pspr->y = WEAPONBOTTOM;
|
pspr->y = WEAPONBOTTOM;
|
||||||
|
pspr->ResetInterpolation();
|
||||||
pspr->SetState(GetUpState());
|
pspr->SetState(GetUpState());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -585,6 +585,8 @@ xx(Ifitem)
|
||||||
xx(Choice)
|
xx(Choice)
|
||||||
xx(Link)
|
xx(Link)
|
||||||
xx(Goodbye)
|
xx(Goodbye)
|
||||||
|
xx(Require)
|
||||||
|
xx(Exclude)
|
||||||
|
|
||||||
// Special menus
|
// Special menus
|
||||||
xx(Mainmenu)
|
xx(Mainmenu)
|
||||||
|
|
|
@ -375,6 +375,7 @@ void ACSStringPool::Clear()
|
||||||
|
|
||||||
int ACSStringPool::AddString(const char *str)
|
int ACSStringPool::AddString(const char *str)
|
||||||
{
|
{
|
||||||
|
if (str == nullptr) str = "";
|
||||||
size_t len = strlen(str);
|
size_t len = strlen(str);
|
||||||
unsigned int h = SuperFastHash(str, len);
|
unsigned int h = SuperFastHash(str, len);
|
||||||
unsigned int bucketnum = h % NUM_BUCKETS;
|
unsigned int bucketnum = h % NUM_BUCKETS;
|
||||||
|
@ -791,6 +792,10 @@ void ACSStringPool::WriteStrings(FSerializer &file, const char *key) const
|
||||||
{
|
{
|
||||||
if (file.BeginObject(nullptr))
|
if (file.BeginObject(nullptr))
|
||||||
{
|
{
|
||||||
|
if (i == 430)
|
||||||
|
{
|
||||||
|
int a = 0;
|
||||||
|
}
|
||||||
file("index", i)
|
file("index", i)
|
||||||
("string", entry->Str)
|
("string", entry->Str)
|
||||||
("lockcount", entry->LockCount)
|
("lockcount", entry->LockCount)
|
||||||
|
@ -5345,7 +5350,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
|
||||||
|
|
||||||
case ACSF_PlaySound:
|
case ACSF_PlaySound:
|
||||||
case ACSF_PlayActorSound:
|
case ACSF_PlayActorSound:
|
||||||
// PlaySound(tid, "SoundName", channel, volume, looping, attenuation)
|
// PlaySound(tid, "SoundName", channel, volume, looping, attenuation, local)
|
||||||
{
|
{
|
||||||
FSoundID sid;
|
FSoundID sid;
|
||||||
|
|
||||||
|
@ -5366,6 +5371,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
|
||||||
float vol = argCount > 3 ? ACSToFloat(args[3]) : 1.f;
|
float vol = argCount > 3 ? ACSToFloat(args[3]) : 1.f;
|
||||||
INTBOOL looping = argCount > 4 ? args[4] : false;
|
INTBOOL looping = argCount > 4 ? args[4] : false;
|
||||||
float atten = argCount > 5 ? ACSToFloat(args[5]) : ATTN_NORM;
|
float atten = argCount > 5 ? ACSToFloat(args[5]) : ATTN_NORM;
|
||||||
|
INTBOOL local = argCount > 6 ? args[6] : false;
|
||||||
|
|
||||||
if (args[0] == 0)
|
if (args[0] == 0)
|
||||||
{
|
{
|
||||||
|
@ -5382,11 +5388,11 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
|
||||||
{
|
{
|
||||||
if (!looping)
|
if (!looping)
|
||||||
{
|
{
|
||||||
S_Sound(spot, chan, sid, vol, atten);
|
S_PlaySound(spot, chan, sid, vol, atten, local);
|
||||||
}
|
}
|
||||||
else if (!S_IsActorPlayingSomething(spot, chan & 7, sid))
|
else if (!S_IsActorPlayingSomething(spot, chan & 7, sid))
|
||||||
{
|
{
|
||||||
S_Sound(spot, chan | CHAN_LOOP, sid, vol, atten);
|
S_PlaySound(spot, chan | CHAN_LOOP, sid, vol, atten, local);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1032,16 +1032,17 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_PlaySound)
|
||||||
PARAM_FLOAT_OPT (volume) { volume = 1; }
|
PARAM_FLOAT_OPT (volume) { volume = 1; }
|
||||||
PARAM_BOOL_OPT (looping) { looping = false; }
|
PARAM_BOOL_OPT (looping) { looping = false; }
|
||||||
PARAM_FLOAT_OPT (attenuation) { attenuation = ATTN_NORM; }
|
PARAM_FLOAT_OPT (attenuation) { attenuation = ATTN_NORM; }
|
||||||
|
PARAM_BOOL_OPT (local) { local = false; }
|
||||||
|
|
||||||
if (!looping)
|
if (!looping)
|
||||||
{
|
{
|
||||||
S_Sound (self, channel, soundid, (float)volume, (float)attenuation);
|
S_PlaySound(self, channel, soundid, (float)volume, (float)attenuation, local);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!S_IsActorPlayingSomething (self, channel&7, soundid))
|
if (!S_IsActorPlayingSomething (self, channel&7, soundid))
|
||||||
{
|
{
|
||||||
S_Sound (self, channel | CHAN_LOOP, soundid, (float)volume, (float)attenuation);
|
S_PlaySound(self, channel | CHAN_LOOP, soundid, (float)volume, (float)attenuation, local);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -516,6 +516,8 @@ static void ParseReplies (FStrifeDialogueReply **replyptr, Response *responses)
|
||||||
reply->ItemCheck[k].Item = dyn_cast<PClassInventory>(GetStrifeType(rsp->Item[k]));
|
reply->ItemCheck[k].Item = dyn_cast<PClassInventory>(GetStrifeType(rsp->Item[k]));
|
||||||
reply->ItemCheck[k].Amount = rsp->Count[k];
|
reply->ItemCheck[k].Amount = rsp->Count[k];
|
||||||
}
|
}
|
||||||
|
reply->ItemCheckRequire.Clear();
|
||||||
|
reply->ItemCheckExclude.Clear();
|
||||||
|
|
||||||
// If the first item check has a positive amount required, then
|
// If the first item check has a positive amount required, then
|
||||||
// add that to the reply string. Otherwise, use the reply as-is.
|
// add that to the reply string. Otherwise, use the reply as-is.
|
||||||
|
@ -656,6 +658,38 @@ CUSTOM_CVAR(Float, dlg_musicvolume, 1.0f, CVAR_ARCHIVE)
|
||||||
else if (self > 1.f) self = 1.f;
|
else if (self > 1.f) self = 1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// ShouldSkipReply
|
||||||
|
//
|
||||||
|
// Determines whether this reply should be skipped or not.
|
||||||
|
//
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
static bool ShouldSkipReply(FStrifeDialogueReply *reply, player_t *player)
|
||||||
|
{
|
||||||
|
if (reply->Reply == nullptr)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < (int)reply->ItemCheckRequire.Size(); ++i)
|
||||||
|
{
|
||||||
|
if (!CheckStrifeItem(player, reply->ItemCheckRequire[i].Item, reply->ItemCheckRequire[i].Amount))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < (int)reply->ItemCheckExclude.Size(); ++i)
|
||||||
|
{
|
||||||
|
if (CheckStrifeItem(player, reply->ItemCheckExclude[i].Item, reply->ItemCheckExclude[i].Amount))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// The conversation menu
|
// The conversation menu
|
||||||
|
@ -673,6 +707,7 @@ class DConversationMenu : public DMenu
|
||||||
bool mShowGold;
|
bool mShowGold;
|
||||||
FStrifeDialogueNode *mCurNode;
|
FStrifeDialogueNode *mCurNode;
|
||||||
int mYpos;
|
int mYpos;
|
||||||
|
player_t *mPlayer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int mSelection;
|
static int mSelection;
|
||||||
|
@ -683,9 +718,10 @@ public:
|
||||||
//
|
//
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
DConversationMenu(FStrifeDialogueNode *CurNode)
|
DConversationMenu(FStrifeDialogueNode *CurNode, player_t *player)
|
||||||
{
|
{
|
||||||
mCurNode = CurNode;
|
mCurNode = CurNode;
|
||||||
|
mPlayer = player;
|
||||||
mDialogueLines = NULL;
|
mDialogueLines = NULL;
|
||||||
mShowGold = false;
|
mShowGold = false;
|
||||||
|
|
||||||
|
@ -720,7 +756,7 @@ public:
|
||||||
int i,j;
|
int i,j;
|
||||||
for (reply = CurNode->Children, i = 1; reply != NULL; reply = reply->Next)
|
for (reply = CurNode->Children, i = 1; reply != NULL; reply = reply->Next)
|
||||||
{
|
{
|
||||||
if (reply->Reply == NULL)
|
if (ShouldSkipReply(reply, mPlayer))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -778,6 +814,13 @@ public:
|
||||||
}
|
}
|
||||||
ConversationMenuY = mYpos;
|
ConversationMenuY = mYpos;
|
||||||
//ConversationMenu.indent = 50;
|
//ConversationMenu.indent = 50;
|
||||||
|
|
||||||
|
// Because replies can be selectively hidden mResponses.Size() won't be consistent.
|
||||||
|
// So make sure mSelection doesn't exceed mResponses.Size(). [FishyClockwork]
|
||||||
|
if (mSelection >= (int)mResponses.Size())
|
||||||
|
{
|
||||||
|
mSelection = mResponses.Size() - 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
@ -839,12 +882,24 @@ public:
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Send dialogue and reply numbers across the wire.
|
|
||||||
assert((unsigned)mCurNode->ThisNodeNum < StrifeDialogues.Size());
|
assert((unsigned)mCurNode->ThisNodeNum < StrifeDialogues.Size());
|
||||||
assert(StrifeDialogues[mCurNode->ThisNodeNum] == mCurNode);
|
assert(StrifeDialogues[mCurNode->ThisNodeNum] == mCurNode);
|
||||||
|
|
||||||
|
// This is needed because mSelection represents the replies currently being displayed which will
|
||||||
|
// not match up with what's supposed to be selected if there are any hidden/skipped replies. [FishyClockwork]
|
||||||
|
FStrifeDialogueReply *reply = mCurNode->Children;
|
||||||
|
int replynum = mSelection;
|
||||||
|
for (int i = 0; i <= mSelection && reply != nullptr; reply = reply->Next)
|
||||||
|
{
|
||||||
|
if (ShouldSkipReply(reply, mPlayer))
|
||||||
|
replynum++;
|
||||||
|
else
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
// Send dialogue and reply numbers across the wire.
|
||||||
Net_WriteByte(DEM_CONVREPLY);
|
Net_WriteByte(DEM_CONVREPLY);
|
||||||
Net_WriteWord(mCurNode->ThisNodeNum);
|
Net_WriteWord(mCurNode->ThisNodeNum);
|
||||||
Net_WriteByte(mSelection);
|
Net_WriteByte(replynum);
|
||||||
}
|
}
|
||||||
Close();
|
Close();
|
||||||
return true;
|
return true;
|
||||||
|
@ -1169,7 +1224,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang
|
||||||
S_Sound (npc, CHAN_VOICE|CHAN_NOPAUSE, CurNode->SpeakerVoice, 1, ATTN_NORM);
|
S_Sound (npc, CHAN_VOICE|CHAN_NOPAUSE, CurNode->SpeakerVoice, 1, ATTN_NORM);
|
||||||
}
|
}
|
||||||
|
|
||||||
DConversationMenu *cmenu = new DConversationMenu(CurNode);
|
DConversationMenu *cmenu = new DConversationMenu(CurNode, pc->player);
|
||||||
|
|
||||||
|
|
||||||
if (CurNode != PrevNode)
|
if (CurNode != PrevNode)
|
||||||
|
|
|
@ -45,6 +45,8 @@ struct FStrifeDialogueReply
|
||||||
int ActionSpecial;
|
int ActionSpecial;
|
||||||
int Args[5];
|
int Args[5];
|
||||||
TArray<FStrifeDialogueItemCheck> ItemCheck;
|
TArray<FStrifeDialogueItemCheck> ItemCheck;
|
||||||
|
TArray<FStrifeDialogueItemCheck> ItemCheckRequire;
|
||||||
|
TArray<FStrifeDialogueItemCheck> ItemCheckExclude;
|
||||||
char *Reply;
|
char *Reply;
|
||||||
char *QuickYes;
|
char *QuickYes;
|
||||||
int NextNode; // index into StrifeDialogues
|
int NextNode; // index into StrifeDialogues
|
||||||
|
|
|
@ -262,8 +262,7 @@ void DPSprite::NewTick()
|
||||||
while (pspr)
|
while (pspr)
|
||||||
{
|
{
|
||||||
pspr->processPending = true;
|
pspr->processPending = true;
|
||||||
pspr->oldx = pspr->x;
|
pspr->ResetInterpolation();
|
||||||
pspr->oldy = pspr->y;
|
|
||||||
|
|
||||||
pspr = pspr->Next;
|
pspr = pspr->Next;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,11 +29,8 @@
|
||||||
|
|
||||||
#define WEAPONBOTTOM 128.
|
#define WEAPONBOTTOM 128.
|
||||||
|
|
||||||
// [RH] +0x6000 helps it meet the screen bottom
|
#define WEAPONTOP 32.
|
||||||
// at higher resolutions while still being in
|
#define WEAPON_FUDGE_Y 0.375
|
||||||
// the right spot at 320x200.
|
|
||||||
#define WEAPONTOP (32+6./16)
|
|
||||||
|
|
||||||
class AInventory;
|
class AInventory;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -78,6 +75,7 @@ public:
|
||||||
DPSprite* GetNext() { return Next; }
|
DPSprite* GetNext() { return Next; }
|
||||||
AActor* GetCaller() { return Caller; }
|
AActor* GetCaller() { return Caller; }
|
||||||
void SetCaller(AActor *newcaller) { Caller = newcaller; }
|
void SetCaller(AActor *newcaller) { Caller = newcaller; }
|
||||||
|
void ResetInterpolation() { oldx = x; oldy = y; }
|
||||||
|
|
||||||
double x, y;
|
double x, y;
|
||||||
double oldx, oldy;
|
double oldx, oldy;
|
||||||
|
|
|
@ -76,11 +76,11 @@ class USDFParser : public UDMFParserBase
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// Parse a cost block
|
// Parse a cost/require/exclude block
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
bool ParseCost(FStrifeDialogueReply *response)
|
bool ParseCostRequireExclude(FStrifeDialogueReply *response, FName type)
|
||||||
{
|
{
|
||||||
FStrifeDialogueItemCheck check;
|
FStrifeDialogueItemCheck check;
|
||||||
check.Item = NULL;
|
check.Item = NULL;
|
||||||
|
@ -101,7 +101,12 @@ class USDFParser : public UDMFParserBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
response->ItemCheck.Push(check);
|
switch (type)
|
||||||
|
{
|
||||||
|
case NAME_Cost: response->ItemCheck.Push(check); break;
|
||||||
|
case NAME_Require: response->ItemCheckRequire.Push(check); break;
|
||||||
|
case NAME_Exclude: response->ItemCheckExclude.Push(check); break;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,8 +211,15 @@ class USDFParser : public UDMFParserBase
|
||||||
switch(key)
|
switch(key)
|
||||||
{
|
{
|
||||||
case NAME_Cost:
|
case NAME_Cost:
|
||||||
ParseCost(reply);
|
case NAME_Require:
|
||||||
|
case NAME_Exclude:
|
||||||
|
// Require and Exclude are exclusive to namespace ZDoom. [FishyClockwork]
|
||||||
|
if (key == NAME_Cost || namespace_bits == Zd)
|
||||||
|
{
|
||||||
|
ParseCostRequireExclude(reply, key);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
// Intentional fall-through
|
||||||
|
|
||||||
default:
|
default:
|
||||||
sc.UnGet();
|
sc.UnGet();
|
||||||
|
@ -333,7 +345,11 @@ class USDFParser : public UDMFParserBase
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NAME_Goodbye:
|
case NAME_Goodbye:
|
||||||
|
// Custom goodbyes are exclusive to namespace ZDoom. [FishyClockwork]
|
||||||
|
if (namespace_bits == Zd)
|
||||||
|
{
|
||||||
Goodbye = CheckString(key);
|
Goodbye = CheckString(key);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
83
src/posix/zdoom.xpm
Normal file
83
src/posix/zdoom.xpm
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * zdoom_xpm[] = {
|
||||||
|
"48 48 32 1",
|
||||||
|
" c None",
|
||||||
|
". c #ADA990",
|
||||||
|
"+ c #999966",
|
||||||
|
"@ c #666666",
|
||||||
|
"# c #393939",
|
||||||
|
"$ c #555555",
|
||||||
|
"% c #996666",
|
||||||
|
"& c #777777",
|
||||||
|
"* c #5F5F5F",
|
||||||
|
"= c #333333",
|
||||||
|
"- c #4D4D4D",
|
||||||
|
"; c #868686",
|
||||||
|
"> c #969696",
|
||||||
|
", c #1C1C1C",
|
||||||
|
"' c #339933",
|
||||||
|
") c #336633",
|
||||||
|
"! c #66CC66",
|
||||||
|
"~ c #66FF66",
|
||||||
|
"{ c #66CC33",
|
||||||
|
"] c #222222",
|
||||||
|
"^ c #333300",
|
||||||
|
"/ c #292929",
|
||||||
|
"( c #040404",
|
||||||
|
"_ c #0C0C0C",
|
||||||
|
": c #663333",
|
||||||
|
"< c #996633",
|
||||||
|
"[ c #CC9966",
|
||||||
|
"} c #CC6633",
|
||||||
|
"| c #CC9999",
|
||||||
|
"1 c #FFCC99",
|
||||||
|
"2 c #FF9966",
|
||||||
|
"3 c #FFCCCC",
|
||||||
|
" ... ",
|
||||||
|
" ++@##$+ ",
|
||||||
|
" +...+%&+ ",
|
||||||
|
" %*=-*&;$=&* ",
|
||||||
|
" %**=$@;>@=&*% ",
|
||||||
|
" &**@$*@@$-.+& ",
|
||||||
|
" %$%@*..$@.. ",
|
||||||
|
" ,#@+++@@#& ",
|
||||||
|
" $,#$$@@$#=$'' ",
|
||||||
|
" )!!!~!{=],,,,]^)'!{') =/, ",
|
||||||
|
" )){'~!!'')=],=))'{)'')) /=],( ",
|
||||||
|
" )'!!'!)~'{'),)''''''')) @@/==](( ",
|
||||||
|
" ^)''')'{{''')'''''),))) $$@$/,( ",
|
||||||
|
" ,^))),))''''))'')^,__/$$$-#-(( ",
|
||||||
|
" :<[}<,_)))))))),___,]#@@-/]] ",
|
||||||
|
" :<|12<:_,,,,,_,#$$-#/,^^=^}}< ",
|
||||||
|
" :<[1}::,^,,__,#$-==/,,::^:<<< ",
|
||||||
|
" ::&+@#^,,__/)#-=/,,,,-::^<::= ",
|
||||||
|
" :*+12[:==_,$-=/,,,,/,#::::=^ ",
|
||||||
|
" #*}331}-$]-==/,,,,// ##:=^ ",
|
||||||
|
" /]<13[---],,,,,,,]_] ",
|
||||||
|
" ,:--/,___]]]]:^___/ ",
|
||||||
|
" _______,^^,^,__/# ",
|
||||||
|
" ______:::::/$,,/# ",
|
||||||
|
" ____^:::=,^^^^,^^ ",
|
||||||
|
" __,,:=^,,)))^,,= ",
|
||||||
|
" _,,),,,,,^)^^^,, ",
|
||||||
|
" ,^,,),__,^))),,^ ",
|
||||||
|
" ,,,^^,,,,,)))),, ",
|
||||||
|
" ,,,,,,,)^))))^ ",
|
||||||
|
" ,,^,,,^^)))))^ ",
|
||||||
|
" ,^^,,,,)))))), ",
|
||||||
|
" ,^,,,,))^))), ",
|
||||||
|
" ],,,,,$&&&*$# ",
|
||||||
|
" ],,,]#****$# ",
|
||||||
|
" ]]]]]^####, ",
|
||||||
|
" ]]]]*,,,,#* ",
|
||||||
|
" ,_,#@&&@*/ ",
|
||||||
|
" __$####=# ",
|
||||||
|
" ,_/$$$$$# ",
|
||||||
|
" ,,,$*$$$ ",
|
||||||
|
" ],,,$**$# ",
|
||||||
|
" ],,,@&&@# ",
|
||||||
|
" ],,,$**#= ",
|
||||||
|
" ,,=+++%$ ",
|
||||||
|
" *%%%*$ ",
|
||||||
|
" /$*$#/ ",
|
||||||
|
" ],,]] "};
|
|
@ -116,7 +116,6 @@ extern void (*R_DrawSpanMaskedAddClamp)(void);
|
||||||
|
|
||||||
// [RH] Span blit into an interleaved intermediate buffer
|
// [RH] Span blit into an interleaved intermediate buffer
|
||||||
extern void (*R_DrawColumnHoriz)(void);
|
extern void (*R_DrawColumnHoriz)(void);
|
||||||
void R_DrawMaskedColumnHoriz (const BYTE *column, const FTexture::Span *spans);
|
|
||||||
|
|
||||||
// [RH] Initialize the above pointers
|
// [RH] Initialize the above pointers
|
||||||
void R_InitColumnDrawers ();
|
void R_InitColumnDrawers ();
|
||||||
|
@ -183,6 +182,7 @@ extern void (*rt_map4cols)(int sx, int yl, int yh);
|
||||||
#define rt_addclamp4cols rt_addclamp4cols_c
|
#define rt_addclamp4cols rt_addclamp4cols_c
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void rt_flip_posts();
|
||||||
void rt_draw4cols (int sx);
|
void rt_draw4cols (int sx);
|
||||||
|
|
||||||
// [RH] Preps the temporary horizontal buffer.
|
// [RH] Preps the temporary horizontal buffer.
|
||||||
|
|
113
src/r_drawt.cpp
113
src/r_drawt.cpp
|
@ -838,6 +838,21 @@ void rt_tlaterevsubclamp4cols (int sx, int yl, int yh)
|
||||||
rt_revsubclamp4cols(sx, yl, yh);
|
rt_revsubclamp4cols(sx, yl, yh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reorder the posts so that they get drawn top-to-bottom instead of bottom-to-top.
|
||||||
|
void rt_flip_posts()
|
||||||
|
{
|
||||||
|
unsigned int *front = horizspan[dc_x & 3];
|
||||||
|
unsigned int *back = dc_ctspan[dc_x & 3] - 2;
|
||||||
|
|
||||||
|
while (front < back)
|
||||||
|
{
|
||||||
|
swapvalues(front[0], back[0]);
|
||||||
|
swapvalues(front[1], back[1]);
|
||||||
|
front += 2;
|
||||||
|
back -= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Copies all spans in all four columns to the screen starting at sx.
|
// Copies all spans in all four columns to the screen starting at sx.
|
||||||
// sx should be dword-aligned.
|
// sx should be dword-aligned.
|
||||||
void rt_draw4cols (int sx)
|
void rt_draw4cols (int sx)
|
||||||
|
@ -1103,101 +1118,3 @@ void R_FillColumnHorizP (void)
|
||||||
dest += 8;
|
dest += 8;
|
||||||
} while (--count);
|
} while (--count);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Same as R_DrawMaskedColumn() except that it always uses R_DrawColumnHoriz().
|
|
||||||
|
|
||||||
void R_DrawMaskedColumnHoriz (const BYTE *column, const FTexture::Span *span)
|
|
||||||
{
|
|
||||||
const fixed_t texturemid = FLOAT2FIXED(dc_texturemid);
|
|
||||||
while (span->Length != 0)
|
|
||||||
{
|
|
||||||
const int length = span->Length;
|
|
||||||
const int top = span->TopOffset;
|
|
||||||
|
|
||||||
// calculate unclipped screen coordinates for post
|
|
||||||
dc_yl = xs_RoundToInt(sprtopscreen + spryscale * top);
|
|
||||||
dc_yh = xs_RoundToInt(sprtopscreen + spryscale * (top + length) - 1);
|
|
||||||
|
|
||||||
if (sprflipvert)
|
|
||||||
{
|
|
||||||
swapvalues (dc_yl, dc_yh);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dc_yh >= mfloorclip[dc_x])
|
|
||||||
{
|
|
||||||
dc_yh = mfloorclip[dc_x] - 1;
|
|
||||||
}
|
|
||||||
if (dc_yl < mceilingclip[dc_x])
|
|
||||||
{
|
|
||||||
dc_yl = mceilingclip[dc_x];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dc_yl <= dc_yh)
|
|
||||||
{
|
|
||||||
if (sprflipvert)
|
|
||||||
{
|
|
||||||
dc_texturefrac = (dc_yl*dc_iscale) - (top << FRACBITS)
|
|
||||||
- fixed_t(CenterY * dc_iscale) - texturemid;
|
|
||||||
const fixed_t maxfrac = length << FRACBITS;
|
|
||||||
while (dc_texturefrac >= maxfrac)
|
|
||||||
{
|
|
||||||
if (++dc_yl > dc_yh)
|
|
||||||
goto nextpost;
|
|
||||||
dc_texturefrac += dc_iscale;
|
|
||||||
}
|
|
||||||
fixed_t endfrac = dc_texturefrac + (dc_yh-dc_yl)*dc_iscale;
|
|
||||||
while (endfrac < 0)
|
|
||||||
{
|
|
||||||
if (--dc_yh < dc_yl)
|
|
||||||
goto nextpost;
|
|
||||||
endfrac -= dc_iscale;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dc_texturefrac = texturemid - (top << FRACBITS)
|
|
||||||
+ (dc_yl*dc_iscale) - fixed_t((CenterY-1) * dc_iscale);
|
|
||||||
while (dc_texturefrac < 0)
|
|
||||||
{
|
|
||||||
if (++dc_yl > dc_yh)
|
|
||||||
goto nextpost;
|
|
||||||
dc_texturefrac += dc_iscale;
|
|
||||||
}
|
|
||||||
fixed_t endfrac = dc_texturefrac + (dc_yh-dc_yl)*dc_iscale;
|
|
||||||
const fixed_t maxfrac = length << FRACBITS;
|
|
||||||
if (dc_yh < mfloorclip[dc_x]-1 && endfrac < maxfrac - dc_iscale)
|
|
||||||
{
|
|
||||||
dc_yh++;
|
|
||||||
}
|
|
||||||
else while (endfrac >= maxfrac)
|
|
||||||
{
|
|
||||||
if (--dc_yh < dc_yl)
|
|
||||||
goto nextpost;
|
|
||||||
endfrac -= dc_iscale;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dc_source = column + top;
|
|
||||||
dc_dest = ylookup[dc_yl] + dc_x + dc_destorg;
|
|
||||||
dc_count = dc_yh - dc_yl + 1;
|
|
||||||
hcolfunc_pre ();
|
|
||||||
}
|
|
||||||
nextpost:
|
|
||||||
span++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sprflipvert)
|
|
||||||
{
|
|
||||||
unsigned int *front = horizspan[dc_x&3];
|
|
||||||
unsigned int *back = dc_ctspan[dc_x&3] - 2;
|
|
||||||
|
|
||||||
// Reorder the posts so that they get drawn top-to-bottom
|
|
||||||
// instead of bottom-to-top.
|
|
||||||
while (front < back)
|
|
||||||
{
|
|
||||||
swapvalues (front[0], back[0]);
|
|
||||||
swapvalues (front[1], back[1]);
|
|
||||||
front += 2;
|
|
||||||
back -= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -355,7 +355,7 @@ void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight,
|
||||||
MaxVisForWall = (InvZtoScale * (SCREENWIDTH*r_Yaspect) /
|
MaxVisForWall = (InvZtoScale * (SCREENWIDTH*r_Yaspect) /
|
||||||
(viewwidth*SCREENHEIGHT * FocalTangent));
|
(viewwidth*SCREENHEIGHT * FocalTangent));
|
||||||
MaxVisForWall = 32767.0 / MaxVisForWall;
|
MaxVisForWall = 32767.0 / MaxVisForWall;
|
||||||
MaxVisForFloor = 32767.0 / (viewheight * FocalLengthY / 160);
|
MaxVisForFloor = 32767.0 / (viewheight >> 2) * FocalLengthY / 160;
|
||||||
|
|
||||||
// Reset r_*Visibility vars
|
// Reset r_*Visibility vars
|
||||||
R_SetVisibility(R_GetVisibility());
|
R_SetVisibility(R_GetVisibility());
|
||||||
|
|
|
@ -221,10 +221,26 @@ void R_MapPlane (int y, int x1)
|
||||||
|
|
||||||
distance = planeheight * yslope[y];
|
distance = planeheight * yslope[y];
|
||||||
|
|
||||||
ds_xstep = xs_ToFixed(32-ds_xbits, distance * xstepscale);
|
if (ds_xbits != 0)
|
||||||
ds_ystep = xs_ToFixed(32-ds_ybits, distance * ystepscale);
|
{
|
||||||
ds_xfrac = xs_ToFixed(32-ds_xbits, distance * basexfrac) + pviewx;
|
ds_xstep = xs_ToFixed(32 - ds_xbits, distance * xstepscale);
|
||||||
ds_yfrac = xs_ToFixed(32-ds_ybits, distance * baseyfrac) + pviewy;
|
ds_xfrac = xs_ToFixed(32 - ds_xbits, distance * basexfrac) + pviewx;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ds_xstep = 0;
|
||||||
|
ds_xfrac = 0;
|
||||||
|
}
|
||||||
|
if (ds_ybits != 0)
|
||||||
|
{
|
||||||
|
ds_ystep = xs_ToFixed(32 - ds_ybits, distance * ystepscale);
|
||||||
|
ds_yfrac = xs_ToFixed(32 - ds_ybits, distance * baseyfrac) + pviewy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ds_ystep = 0;
|
||||||
|
ds_yfrac = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (plane_shade)
|
if (plane_shade)
|
||||||
{
|
{
|
||||||
|
@ -357,7 +373,7 @@ void R_CalcTiltedLighting (double lval, double lend, int width)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void R_MapTiltedPlane (int y, int x1)
|
void R_MapTiltedPlane(int y, int x1)
|
||||||
{
|
{
|
||||||
int x2 = spanend[y];
|
int x2 = spanend[y];
|
||||||
int width = x2 - x1;
|
int width = x2 - x1;
|
||||||
|
@ -366,18 +382,18 @@ void R_MapTiltedPlane (int y, int x1)
|
||||||
DWORD u, v;
|
DWORD u, v;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
iz = plane_sz[2] + plane_sz[1]*(centery-y) + plane_sz[0]*(x1-centerx);
|
iz = plane_sz[2] + plane_sz[1] * (centery - y) + plane_sz[0] * (x1 - centerx);
|
||||||
|
|
||||||
// Lighting is simple. It's just linear interpolation from start to end
|
// Lighting is simple. It's just linear interpolation from start to end
|
||||||
if (plane_shade)
|
if (plane_shade)
|
||||||
{
|
{
|
||||||
uz = (iz + plane_sz[0]*width) * planelightfloat;
|
uz = (iz + plane_sz[0] * width) * planelightfloat;
|
||||||
vz = iz * planelightfloat;
|
vz = iz * planelightfloat;
|
||||||
R_CalcTiltedLighting (vz, uz, width);
|
R_CalcTiltedLighting(vz, uz, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
uz = plane_su[2] + plane_su[1]*(centery-y) + plane_su[0]*(x1-centerx);
|
uz = plane_su[2] + plane_su[1] * (centery - y) + plane_su[0] * (x1 - centerx);
|
||||||
vz = plane_sv[2] + plane_sv[1]*(centery-y) + plane_sv[0]*(x1-centerx);
|
vz = plane_sv[2] + plane_sv[1] * (centery - y) + plane_sv[0] * (x1 - centerx);
|
||||||
|
|
||||||
fb = ylookup[y] + x1 + dc_destorg;
|
fb = ylookup[y] + x1 + dc_destorg;
|
||||||
|
|
||||||
|
@ -595,9 +611,10 @@ visplane_t *R_FindPlane (const secplane_t &height, FTextureID picnum, int lightl
|
||||||
fixed_t alpha = FLOAT2FIXED(Alpha);
|
fixed_t alpha = FLOAT2FIXED(Alpha);
|
||||||
//angle_t angle = (xform.Angle + xform.baseAngle).BAMs();
|
//angle_t angle = (xform.Angle + xform.baseAngle).BAMs();
|
||||||
|
|
||||||
|
FTransform nulltransform;
|
||||||
|
|
||||||
if (picnum == skyflatnum) // killough 10/98
|
if (picnum == skyflatnum) // killough 10/98
|
||||||
{ // most skies map together
|
{ // most skies map together
|
||||||
FTransform nulltransform;
|
|
||||||
lightlevel = 0;
|
lightlevel = 0;
|
||||||
xform = &nulltransform;
|
xform = &nulltransform;
|
||||||
nulltransform.xOffs = nulltransform.yOffs = nulltransform.baseyOffs = 0;
|
nulltransform.xOffs = nulltransform.yOffs = nulltransform.baseyOffs = 0;
|
||||||
|
@ -1887,6 +1904,15 @@ void R_DrawTiltedPlane (visplane_t *pl, double _xscale, double _yscale, fixed_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hack in support for 1 x Z and Z x 1 texture sizes
|
||||||
|
if (ds_ybits == 0)
|
||||||
|
{
|
||||||
|
plane_sv[2] = plane_sv[1] = plane_sv[0] = 0;
|
||||||
|
}
|
||||||
|
if (ds_xbits == 0)
|
||||||
|
{
|
||||||
|
plane_su[2] = plane_su[1] = plane_su[0] = 0;
|
||||||
|
}
|
||||||
#if defined(X86_ASM)
|
#if defined(X86_ASM)
|
||||||
if (ds_source != ds_curtiltedsource)
|
if (ds_source != ds_curtiltedsource)
|
||||||
R_SetTiltedSpanSource_ASM (ds_source);
|
R_SetTiltedSpanSource_ASM (ds_source);
|
||||||
|
|
|
@ -173,7 +173,7 @@ CVAR(Bool, r_drawmirrors, true, 0)
|
||||||
float *MaskedSWall;
|
float *MaskedSWall;
|
||||||
float MaskedScaleY;
|
float MaskedScaleY;
|
||||||
|
|
||||||
static void BlastMaskedColumn (void (*blastfunc)(const BYTE *pixels, const FTexture::Span *spans), FTexture *tex)
|
static void BlastMaskedColumn (FTexture *tex, bool useRt)
|
||||||
{
|
{
|
||||||
// calculate lighting
|
// calculate lighting
|
||||||
if (fixedcolormap == NULL && fixedlightlev < 0)
|
if (fixedcolormap == NULL && fixedlightlev < 0)
|
||||||
|
@ -198,7 +198,7 @@ static void BlastMaskedColumn (void (*blastfunc)(const BYTE *pixels, const FText
|
||||||
// draw the texture
|
// draw the texture
|
||||||
const FTexture::Span *spans;
|
const FTexture::Span *spans;
|
||||||
const BYTE *pixels = tex->GetColumn (maskedtexturecol[dc_x] >> FRACBITS, &spans);
|
const BYTE *pixels = tex->GetColumn (maskedtexturecol[dc_x] >> FRACBITS, &spans);
|
||||||
blastfunc (pixels, spans);
|
R_DrawMaskedColumn(pixels, spans, useRt);
|
||||||
rw_light += rw_lightstep;
|
rw_light += rw_lightstep;
|
||||||
spryscale += rw_scalestep;
|
spryscale += rw_scalestep;
|
||||||
}
|
}
|
||||||
|
@ -441,7 +441,7 @@ void R_RenderMaskedSegRange (drawseg_t *ds, int x1, int x2)
|
||||||
{
|
{
|
||||||
for (dc_x = x1; dc_x < x2; ++dc_x)
|
for (dc_x = x1; dc_x < x2; ++dc_x)
|
||||||
{
|
{
|
||||||
BlastMaskedColumn (R_DrawMaskedColumn, tex);
|
BlastMaskedColumn (tex, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -456,24 +456,24 @@ void R_RenderMaskedSegRange (drawseg_t *ds, int x1, int x2)
|
||||||
|
|
||||||
while ((dc_x < stop) && (dc_x & 3))
|
while ((dc_x < stop) && (dc_x & 3))
|
||||||
{
|
{
|
||||||
BlastMaskedColumn (R_DrawMaskedColumn, tex);
|
BlastMaskedColumn (tex, false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (dc_x < stop)
|
while (dc_x < stop)
|
||||||
{
|
{
|
||||||
rt_initcols();
|
rt_initcols();
|
||||||
BlastMaskedColumn (R_DrawMaskedColumnHoriz, tex); dc_x++;
|
BlastMaskedColumn (tex, true); dc_x++;
|
||||||
BlastMaskedColumn (R_DrawMaskedColumnHoriz, tex); dc_x++;
|
BlastMaskedColumn (tex, true); dc_x++;
|
||||||
BlastMaskedColumn (R_DrawMaskedColumnHoriz, tex); dc_x++;
|
BlastMaskedColumn (tex, true); dc_x++;
|
||||||
BlastMaskedColumn (R_DrawMaskedColumnHoriz, tex);
|
BlastMaskedColumn (tex, true);
|
||||||
rt_draw4cols (dc_x - 3);
|
rt_draw4cols (dc_x - 3);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (dc_x < x2)
|
while (dc_x < x2)
|
||||||
{
|
{
|
||||||
BlastMaskedColumn (R_DrawMaskedColumn, tex);
|
BlastMaskedColumn (tex, false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1104,6 +1104,12 @@ void wallscan (int x1, int x2, short *uwal, short *dwal, float *swal, fixed_t *l
|
||||||
|
|
||||||
rw_pic->GetHeight(); // Make sure texture size is loaded
|
rw_pic->GetHeight(); // Make sure texture size is loaded
|
||||||
fracbits = 32 - rw_pic->HeightBits;
|
fracbits = 32 - rw_pic->HeightBits;
|
||||||
|
if (fracbits == 32)
|
||||||
|
{ // Hack for one pixel tall textures
|
||||||
|
fracbits = 0;
|
||||||
|
yrepeat = 0;
|
||||||
|
dc_texturemid = 0;
|
||||||
|
}
|
||||||
setupvline(fracbits);
|
setupvline(fracbits);
|
||||||
xoffset = rw_offset;
|
xoffset = rw_offset;
|
||||||
basecolormapdata = basecolormap->Maps;
|
basecolormapdata = basecolormap->Maps;
|
||||||
|
@ -1456,6 +1462,12 @@ void maskwallscan (int x1, int x2, short *uwal, short *dwal, float *swal, fixed_
|
||||||
|
|
||||||
rw_pic->GetHeight(); // Make sure texture size is loaded
|
rw_pic->GetHeight(); // Make sure texture size is loaded
|
||||||
fracbits = 32- rw_pic->HeightBits;
|
fracbits = 32- rw_pic->HeightBits;
|
||||||
|
if (fracbits == 32)
|
||||||
|
{ // Hack for one pixel tall textures
|
||||||
|
fracbits = 0;
|
||||||
|
yrepeat = 0;
|
||||||
|
dc_texturemid = 0;
|
||||||
|
}
|
||||||
setupmvline(fracbits);
|
setupmvline(fracbits);
|
||||||
xoffset = rw_offset;
|
xoffset = rw_offset;
|
||||||
basecolormapdata = basecolormap->Maps;
|
basecolormapdata = basecolormap->Maps;
|
||||||
|
@ -1631,6 +1643,12 @@ void transmaskwallscan (int x1, int x2, short *uwal, short *dwal, float *swal, f
|
||||||
|
|
||||||
rw_pic->GetHeight(); // Make sure texture size is loaded
|
rw_pic->GetHeight(); // Make sure texture size is loaded
|
||||||
fracbits = 32 - rw_pic->HeightBits;
|
fracbits = 32 - rw_pic->HeightBits;
|
||||||
|
if (fracbits == 32)
|
||||||
|
{ // Hack for one pixel tall textures
|
||||||
|
fracbits = 0;
|
||||||
|
yrepeat = 0;
|
||||||
|
dc_texturemid = 0;
|
||||||
|
}
|
||||||
setuptmvline(fracbits);
|
setuptmvline(fracbits);
|
||||||
xoffset = rw_offset;
|
xoffset = rw_offset;
|
||||||
basecolormapdata = basecolormap->Maps;
|
basecolormapdata = basecolormap->Maps;
|
||||||
|
@ -2521,7 +2539,7 @@ void R_StoreWallRange (int start, int stop)
|
||||||
lwal = (fixed_t *)(openings + ds_p->maskedtexturecol);
|
lwal = (fixed_t *)(openings + ds_p->maskedtexturecol);
|
||||||
swal = (float *)(openings + ds_p->swall);
|
swal = (float *)(openings + ds_p->swall);
|
||||||
FTexture *pic = TexMan(sidedef->GetTexture(side_t::mid), true);
|
FTexture *pic = TexMan(sidedef->GetTexture(side_t::mid), true);
|
||||||
double yscale = pic->Scale.X * sidedef->GetTextureYScale(side_t::mid);
|
double yscale = pic->Scale.Y * sidedef->GetTextureYScale(side_t::mid);
|
||||||
fixed_t xoffset = FLOAT2FIXED(sidedef->GetTextureXOffset(side_t::mid));
|
fixed_t xoffset = FLOAT2FIXED(sidedef->GetTextureXOffset(side_t::mid));
|
||||||
|
|
||||||
if (pic->bWorldPanning)
|
if (pic->bWorldPanning)
|
||||||
|
@ -3245,7 +3263,7 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
||||||
{ // calculate lighting
|
{ // calculate lighting
|
||||||
dc_colormap = usecolormap->Maps + (GETPALOOKUP (rw_light, wallshade) << COLORMAPSHIFT);
|
dc_colormap = usecolormap->Maps + (GETPALOOKUP (rw_light, wallshade) << COLORMAPSHIFT);
|
||||||
}
|
}
|
||||||
R_WallSpriteColumn (R_DrawMaskedColumn);
|
R_WallSpriteColumn (false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3258,7 +3276,7 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
||||||
rt_initcols();
|
rt_initcols();
|
||||||
for (int zz = 4; zz; --zz)
|
for (int zz = 4; zz; --zz)
|
||||||
{
|
{
|
||||||
R_WallSpriteColumn (R_DrawMaskedColumnHoriz);
|
R_WallSpriteColumn (true);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
}
|
}
|
||||||
rt_draw4cols (dc_x - 4);
|
rt_draw4cols (dc_x - 4);
|
||||||
|
@ -3270,7 +3288,7 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
||||||
{ // calculate lighting
|
{ // calculate lighting
|
||||||
dc_colormap = usecolormap->Maps + (GETPALOOKUP (rw_light, wallshade) << COLORMAPSHIFT);
|
dc_colormap = usecolormap->Maps + (GETPALOOKUP (rw_light, wallshade) << COLORMAPSHIFT);
|
||||||
}
|
}
|
||||||
R_WallSpriteColumn (R_DrawMaskedColumn);
|
R_WallSpriteColumn (false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -250,18 +250,16 @@ double sprtopscreen;
|
||||||
|
|
||||||
bool sprflipvert;
|
bool sprflipvert;
|
||||||
|
|
||||||
void R_DrawMaskedColumn (const BYTE *column, const FTexture::Span *span)
|
void R_DrawMaskedColumn (const BYTE *column, const FTexture::Span *span, bool useRt)
|
||||||
{
|
{
|
||||||
const fixed_t centeryfrac = FLOAT2FIXED(CenterY);
|
|
||||||
const fixed_t texturemid = FLOAT2FIXED(dc_texturemid);
|
|
||||||
while (span->Length != 0)
|
while (span->Length != 0)
|
||||||
{
|
{
|
||||||
const int length = span->Length;
|
const int length = span->Length;
|
||||||
const int top = span->TopOffset;
|
const int top = span->TopOffset;
|
||||||
|
|
||||||
// calculate unclipped screen coordinates for post
|
// calculate unclipped screen coordinates for post
|
||||||
dc_yl = xs_RoundToInt(sprtopscreen + spryscale * top);
|
dc_yl = (int)(sprtopscreen + spryscale * top + 0.5);
|
||||||
dc_yh = xs_RoundToInt(sprtopscreen + spryscale * (top + length)) - 1;
|
dc_yh = (int)(sprtopscreen + spryscale * (top + length) + 0.5) - 1;
|
||||||
|
|
||||||
if (sprflipvert)
|
if (sprflipvert)
|
||||||
{
|
{
|
||||||
|
@ -279,56 +277,20 @@ void R_DrawMaskedColumn (const BYTE *column, const FTexture::Span *span)
|
||||||
|
|
||||||
if (dc_yl <= dc_yh)
|
if (dc_yl <= dc_yh)
|
||||||
{
|
{
|
||||||
if (sprflipvert)
|
dc_texturefrac = FLOAT2FIXED((dc_yl + 0.5 - sprtopscreen) / spryscale);
|
||||||
{
|
dc_source = column;
|
||||||
dc_texturefrac = (dc_yl*dc_iscale) - (top << FRACBITS)
|
dc_dest = (ylookup[dc_yl] + dc_x) + dc_destorg;
|
||||||
- FixedMul (centeryfrac, dc_iscale) - texturemid;
|
|
||||||
const fixed_t maxfrac = length << FRACBITS;
|
|
||||||
while (dc_texturefrac >= maxfrac)
|
|
||||||
{
|
|
||||||
if (++dc_yl > dc_yh)
|
|
||||||
goto nextpost;
|
|
||||||
dc_texturefrac += dc_iscale;
|
|
||||||
}
|
|
||||||
fixed_t endfrac = dc_texturefrac + (dc_yh-dc_yl)*dc_iscale;
|
|
||||||
while (endfrac < 0)
|
|
||||||
{
|
|
||||||
if (--dc_yh < dc_yl)
|
|
||||||
goto nextpost;
|
|
||||||
endfrac -= dc_iscale;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dc_texturefrac = texturemid - (top << FRACBITS)
|
|
||||||
+ (dc_yl*dc_iscale) - FixedMul (centeryfrac-FRACUNIT, dc_iscale);
|
|
||||||
while (dc_texturefrac < 0)
|
|
||||||
{
|
|
||||||
if (++dc_yl > dc_yh)
|
|
||||||
goto nextpost;
|
|
||||||
dc_texturefrac += dc_iscale;
|
|
||||||
}
|
|
||||||
fixed_t endfrac = dc_texturefrac + (dc_yh-dc_yl)*dc_iscale;
|
|
||||||
const fixed_t maxfrac = length << FRACBITS;
|
|
||||||
if (dc_yh < mfloorclip[dc_x]-1 && endfrac < maxfrac - dc_iscale)
|
|
||||||
{
|
|
||||||
dc_yh++;
|
|
||||||
}
|
|
||||||
else while (endfrac >= maxfrac)
|
|
||||||
{
|
|
||||||
if (--dc_yh < dc_yl)
|
|
||||||
goto nextpost;
|
|
||||||
endfrac -= dc_iscale;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dc_source = column + top;
|
|
||||||
dc_dest = ylookup[dc_yl] + dc_x + dc_destorg;
|
|
||||||
dc_count = dc_yh - dc_yl + 1;
|
dc_count = dc_yh - dc_yl + 1;
|
||||||
|
if (useRt)
|
||||||
|
hcolfunc_pre();
|
||||||
|
else
|
||||||
colfunc ();
|
colfunc ();
|
||||||
}
|
}
|
||||||
nextpost:
|
|
||||||
span++;
|
span++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sprflipvert && useRt)
|
||||||
|
rt_flip_posts();
|
||||||
}
|
}
|
||||||
|
|
||||||
// [ZZ]
|
// [ZZ]
|
||||||
|
@ -470,7 +432,7 @@ void R_DrawVisSprite (vissprite_t *vis)
|
||||||
{
|
{
|
||||||
pixels = tex->GetColumn (frac >> FRACBITS, &spans);
|
pixels = tex->GetColumn (frac >> FRACBITS, &spans);
|
||||||
if (ispsprite || !R_ClipSpriteColumnWithPortals(vis))
|
if (ispsprite || !R_ClipSpriteColumnWithPortals(vis))
|
||||||
R_DrawMaskedColumn (pixels, spans);
|
R_DrawMaskedColumn (pixels, spans, false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
frac += xiscale;
|
frac += xiscale;
|
||||||
}
|
}
|
||||||
|
@ -482,7 +444,7 @@ void R_DrawVisSprite (vissprite_t *vis)
|
||||||
{
|
{
|
||||||
pixels = tex->GetColumn (frac >> FRACBITS, &spans);
|
pixels = tex->GetColumn (frac >> FRACBITS, &spans);
|
||||||
if (ispsprite || !R_ClipSpriteColumnWithPortals(vis))
|
if (ispsprite || !R_ClipSpriteColumnWithPortals(vis))
|
||||||
R_DrawMaskedColumnHoriz (pixels, spans);
|
R_DrawMaskedColumn (pixels, spans, true);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
frac += xiscale;
|
frac += xiscale;
|
||||||
}
|
}
|
||||||
|
@ -493,7 +455,7 @@ void R_DrawVisSprite (vissprite_t *vis)
|
||||||
{
|
{
|
||||||
pixels = tex->GetColumn (frac >> FRACBITS, &spans);
|
pixels = tex->GetColumn (frac >> FRACBITS, &spans);
|
||||||
if (ispsprite || !R_ClipSpriteColumnWithPortals(vis))
|
if (ispsprite || !R_ClipSpriteColumnWithPortals(vis))
|
||||||
R_DrawMaskedColumn (pixels, spans);
|
R_DrawMaskedColumn (pixels, spans, false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
frac += xiscale;
|
frac += xiscale;
|
||||||
}
|
}
|
||||||
|
@ -603,7 +565,7 @@ void R_DrawWallSprite(vissprite_t *spr)
|
||||||
dc_colormap = usecolormap->Maps + (GETPALOOKUP (rw_light, shade) << COLORMAPSHIFT);
|
dc_colormap = usecolormap->Maps + (GETPALOOKUP (rw_light, shade) << COLORMAPSHIFT);
|
||||||
}
|
}
|
||||||
if (!R_ClipSpriteColumnWithPortals(spr))
|
if (!R_ClipSpriteColumnWithPortals(spr))
|
||||||
R_WallSpriteColumn(R_DrawMaskedColumn);
|
R_WallSpriteColumn(false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,7 +579,7 @@ void R_DrawWallSprite(vissprite_t *spr)
|
||||||
for (int zz = 4; zz; --zz)
|
for (int zz = 4; zz; --zz)
|
||||||
{
|
{
|
||||||
if (!R_ClipSpriteColumnWithPortals(spr))
|
if (!R_ClipSpriteColumnWithPortals(spr))
|
||||||
R_WallSpriteColumn(R_DrawMaskedColumnHoriz);
|
R_WallSpriteColumn(true);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
}
|
}
|
||||||
rt_draw4cols(dc_x - 4);
|
rt_draw4cols(dc_x - 4);
|
||||||
|
@ -630,14 +592,14 @@ void R_DrawWallSprite(vissprite_t *spr)
|
||||||
dc_colormap = usecolormap->Maps + (GETPALOOKUP (rw_light, shade) << COLORMAPSHIFT);
|
dc_colormap = usecolormap->Maps + (GETPALOOKUP (rw_light, shade) << COLORMAPSHIFT);
|
||||||
}
|
}
|
||||||
if (!R_ClipSpriteColumnWithPortals(spr))
|
if (!R_ClipSpriteColumnWithPortals(spr))
|
||||||
R_WallSpriteColumn(R_DrawMaskedColumn);
|
R_WallSpriteColumn(false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
R_FinishSetPatchStyle();
|
R_FinishSetPatchStyle();
|
||||||
}
|
}
|
||||||
|
|
||||||
void R_WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Span *spans))
|
void R_WallSpriteColumn (bool useRt)
|
||||||
{
|
{
|
||||||
float iscale = swall[dc_x] * MaskedScaleY;
|
float iscale = swall[dc_x] * MaskedScaleY;
|
||||||
dc_iscale = FLOAT2FIXED(iscale);
|
dc_iscale = FLOAT2FIXED(iscale);
|
||||||
|
@ -651,7 +613,7 @@ void R_WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Sp
|
||||||
const FTexture::Span *spans;
|
const FTexture::Span *spans;
|
||||||
column = WallSpriteTile->GetColumn (lwall[dc_x] >> FRACBITS, &spans);
|
column = WallSpriteTile->GetColumn (lwall[dc_x] >> FRACBITS, &spans);
|
||||||
dc_texturefrac = 0;
|
dc_texturefrac = 0;
|
||||||
drawfunc (column, spans);
|
R_DrawMaskedColumn(column, spans, useRt);
|
||||||
rw_light += rw_lightstep;
|
rw_light += rw_lightstep;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -984,21 +946,23 @@ void R_ProjectSprite (AActor *thing, int fakeside, F3DFloor *fakefloor, F3DFloor
|
||||||
const double thingxscalemul = spriteScale.X / tex->Scale.X;
|
const double thingxscalemul = spriteScale.X / tex->Scale.X;
|
||||||
|
|
||||||
tx -= ((renderflags & RF_XFLIP) ? (tex->GetWidth() - tex->LeftOffset - 1) : tex->LeftOffset) * thingxscalemul;
|
tx -= ((renderflags & RF_XFLIP) ? (tex->GetWidth() - tex->LeftOffset - 1) : tex->LeftOffset) * thingxscalemul;
|
||||||
x1 = centerx + xs_RoundToInt(tx * xscale);
|
double dtx1 = tx * xscale;
|
||||||
|
x1 = centerx + xs_RoundToInt(dtx1);
|
||||||
|
|
||||||
// off the right side?
|
// off the right side?
|
||||||
if (x1 >= WindowRight)
|
if (x1 >= WindowRight)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
tx += tex->GetWidth() * thingxscalemul;
|
tx += tex->GetWidth() * thingxscalemul;
|
||||||
x2 = centerx + xs_RoundToInt(tx * xscale);
|
double dtx2 = tx * xscale;
|
||||||
|
x2 = centerx + xs_RoundToInt(dtx2);
|
||||||
|
|
||||||
// off the left side or too small?
|
// off the left side or too small?
|
||||||
if ((x2 < WindowLeft || x2 <= x1))
|
if ((x2 < WindowLeft || x2 <= x1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
xscale = spriteScale.X * xscale / tex->Scale.X;
|
xscale = spriteScale.X * xscale / tex->Scale.X;
|
||||||
iscale = (tex->GetWidth() << FRACBITS) / (x2 - x1);
|
iscale = (fixed_t)(tex->GetWidth() / (dtx2 - dtx1) * FRACUNIT);
|
||||||
|
|
||||||
double yscale = spriteScale.Y / tex->Scale.Y;
|
double yscale = spriteScale.Y / tex->Scale.Y;
|
||||||
|
|
||||||
|
@ -1026,8 +990,7 @@ void R_ProjectSprite (AActor *thing, int fakeside, F3DFloor *fakefloor, F3DFloor
|
||||||
vis->xiscale = iscale;
|
vis->xiscale = iscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vis->x1 > x1)
|
vis->startfrac += (fixed_t)(vis->xiscale * (vis->x1 - centerx - dtx1 + 0.5 * thingxscalemul));
|
||||||
vis->startfrac += vis->xiscale * (vis->x1 - x1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1339,7 +1302,7 @@ void R_DrawPSprite(DPSprite *pspr, AActor *owner, float bobx, float boby, double
|
||||||
}
|
}
|
||||||
|
|
||||||
sx = pspr->oldx + (pspr->x - pspr->oldx) * ticfrac;
|
sx = pspr->oldx + (pspr->x - pspr->oldx) * ticfrac;
|
||||||
sy = pspr->oldy + (pspr->y - pspr->oldy) * ticfrac;
|
sy = pspr->oldy + (pspr->y - pspr->oldy) * ticfrac + WEAPON_FUDGE_Y;
|
||||||
|
|
||||||
if (pspr->Flags & PSPF_ADDBOB)
|
if (pspr->Flags & PSPF_ADDBOB)
|
||||||
{
|
{
|
||||||
|
@ -1647,7 +1610,7 @@ void R_DrawPlayerSprites ()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wx = weapon->oldx + (weapon->x - weapon->oldx) * r_TicFracF;
|
wx = weapon->oldx + (weapon->x - weapon->oldx) * r_TicFracF;
|
||||||
wy = weapon->oldy + (weapon->y - weapon->oldy) * r_TicFracF;
|
wy = weapon->oldy + (weapon->y - weapon->oldy) * r_TicFracF + WEAPON_FUDGE_Y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -124,8 +124,8 @@ extern double pspriteyscale;
|
||||||
extern FTexture *WallSpriteTile;
|
extern FTexture *WallSpriteTile;
|
||||||
|
|
||||||
|
|
||||||
void R_DrawMaskedColumn (const BYTE *column, const FTexture::Span *spans);
|
void R_DrawMaskedColumn (const BYTE *column, const FTexture::Span *spans, bool useRt);
|
||||||
void R_WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Span *spans));
|
void R_WallSpriteColumn (bool useRt);
|
||||||
|
|
||||||
void R_CacheSprite (spritedef_t *sprite);
|
void R_CacheSprite (spritedef_t *sprite);
|
||||||
void R_SortVisSprites (int (*compare)(const void *, const void *), size_t first);
|
void R_SortVisSprites (int (*compare)(const void *, const void *), size_t first);
|
||||||
|
|
|
@ -1301,6 +1301,32 @@ void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, fl
|
||||||
S_StartSound (NULL, sec, NULL, NULL, channel, sfxid, volume, attenuation);
|
S_StartSound (NULL, sec, NULL, NULL, channel, sfxid, volume, attenuation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// S_PlaySound - Subfunction used by ACS and DECORATE
|
||||||
|
//
|
||||||
|
// Has a local parameter to make the sound audible only to the source
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local)
|
||||||
|
{
|
||||||
|
if (a == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!local)
|
||||||
|
{
|
||||||
|
S_Sound(a, chan, sid, vol, atten);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (a->CheckLocalView(consoleplayer))
|
||||||
|
{
|
||||||
|
S_Sound(chan, sid, vol, ATTN_NONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// S_LoadSound
|
// S_LoadSound
|
||||||
|
|
|
@ -241,6 +241,9 @@ void S_Sound (const FPolyObj *poly, int channel, FSoundID sfxid, float volume, f
|
||||||
void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation);
|
void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation);
|
||||||
void S_Sound(const DVector3 &pos, int channel, FSoundID sfxid, float volume, float attenuation);
|
void S_Sound(const DVector3 &pos, int channel, FSoundID sfxid, float volume, float attenuation);
|
||||||
|
|
||||||
|
// [Nash] Used by ACS and DECORATE
|
||||||
|
void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local);
|
||||||
|
|
||||||
// sound channels
|
// sound channels
|
||||||
// channel 0 never willingly overrides
|
// channel 0 never willingly overrides
|
||||||
// other channels (1-7) always override a playing sound on that channel
|
// other channels (1-7) always override a playing sound on that channel
|
||||||
|
|
|
@ -67,6 +67,143 @@
|
||||||
char nulspace[1024 * 1024 * 4];
|
char nulspace[1024 * 1024 * 4];
|
||||||
bool save_full = false; // for testing. Should be removed afterward.
|
bool save_full = false; // for testing. Should be removed afterward.
|
||||||
|
|
||||||
|
int utf8_encode(int32_t codepoint, char *buffer, int *size)
|
||||||
|
{
|
||||||
|
if (codepoint < 0)
|
||||||
|
return -1;
|
||||||
|
else if (codepoint < 0x80)
|
||||||
|
{
|
||||||
|
buffer[0] = (char)codepoint;
|
||||||
|
*size = 1;
|
||||||
|
}
|
||||||
|
else if (codepoint < 0x800)
|
||||||
|
{
|
||||||
|
buffer[0] = 0xC0 + ((codepoint & 0x7C0) >> 6);
|
||||||
|
buffer[1] = 0x80 + ((codepoint & 0x03F));
|
||||||
|
*size = 2;
|
||||||
|
}
|
||||||
|
else if (codepoint < 0x10000)
|
||||||
|
{
|
||||||
|
buffer[0] = 0xE0 + ((codepoint & 0xF000) >> 12);
|
||||||
|
buffer[1] = 0x80 + ((codepoint & 0x0FC0) >> 6);
|
||||||
|
buffer[2] = 0x80 + ((codepoint & 0x003F));
|
||||||
|
*size = 3;
|
||||||
|
}
|
||||||
|
else if (codepoint <= 0x10FFFF)
|
||||||
|
{
|
||||||
|
buffer[0] = 0xF0 + ((codepoint & 0x1C0000) >> 18);
|
||||||
|
buffer[1] = 0x80 + ((codepoint & 0x03F000) >> 12);
|
||||||
|
buffer[2] = 0x80 + ((codepoint & 0x000FC0) >> 6);
|
||||||
|
buffer[3] = 0x80 + ((codepoint & 0x00003F));
|
||||||
|
*size = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int utf8_decode(const char *src, int *size)
|
||||||
|
{
|
||||||
|
int c = src[0] & 255;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
*size = 1;
|
||||||
|
if ((c & 0x80) == 0)
|
||||||
|
{
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int c1 = src[1] & 255;
|
||||||
|
|
||||||
|
if ((c & 0xE0) == 0xC0)
|
||||||
|
{
|
||||||
|
r = ((c & 0x1F) << 6) | c1;
|
||||||
|
if (r >= 128)
|
||||||
|
{
|
||||||
|
*size = 2;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int c2 = src[2] & 255;
|
||||||
|
|
||||||
|
if ((c & 0xF0) == 0xE0)
|
||||||
|
{
|
||||||
|
r = ((c & 0x0F) << 12) | (c1 << 6) | c2;
|
||||||
|
if (r >= 2048 && (r < 55296 || r > 57343))
|
||||||
|
{
|
||||||
|
*size = 3;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int c3 = src[3] & 255;
|
||||||
|
|
||||||
|
if ((c & 0xF8) == 0xF0)
|
||||||
|
{
|
||||||
|
r = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
|
||||||
|
if (r >= 65536 && r <= 1114111)
|
||||||
|
{
|
||||||
|
*size = 4;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static TArray<char> out;
|
||||||
|
static const char *StringToUnicode(const char *cc, int size = -1)
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
const char *c = cc;
|
||||||
|
int count = 0;
|
||||||
|
int count1 = 0;
|
||||||
|
out.Clear();
|
||||||
|
while (ch = (*c++) & 255)
|
||||||
|
{
|
||||||
|
count1++;
|
||||||
|
if (ch >= 128)
|
||||||
|
{
|
||||||
|
if (ch < 0x800) count += 2;
|
||||||
|
else count += 3;
|
||||||
|
// The source cannot contain 4-byte chars.
|
||||||
|
}
|
||||||
|
else count++;
|
||||||
|
if (count1 == size && size > 0) break;
|
||||||
|
}
|
||||||
|
if (count == count1) return cc; // string is pure ASCII.
|
||||||
|
// we need to convert
|
||||||
|
out.Resize(count + 1);
|
||||||
|
out.Last() = 0;
|
||||||
|
c = cc;
|
||||||
|
int i = 0;
|
||||||
|
while (ch = (*c++) & 255)
|
||||||
|
{
|
||||||
|
utf8_encode(ch, &out[i], &count1);
|
||||||
|
i += count1;
|
||||||
|
}
|
||||||
|
return &out[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *UnicodeToString(const char *cc)
|
||||||
|
{
|
||||||
|
out.Resize((unsigned)strlen(cc) + 1);
|
||||||
|
int ndx = 0;
|
||||||
|
while (*cc != 0)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
int c = utf8_decode(cc, &size);
|
||||||
|
if (c < 0 || c > 255) c = '?';
|
||||||
|
out[ndx++] = c;
|
||||||
|
cc += size;
|
||||||
|
}
|
||||||
|
out[ndx] = 0;
|
||||||
|
return &out[0];
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -99,8 +236,8 @@ struct FJSONObject
|
||||||
|
|
||||||
struct FWriter
|
struct FWriter
|
||||||
{
|
{
|
||||||
typedef rapidjson::Writer<rapidjson::StringBuffer, rapidjson::ASCII<> > Writer;
|
typedef rapidjson::Writer<rapidjson::StringBuffer, rapidjson::UTF8<> > Writer;
|
||||||
typedef rapidjson::PrettyWriter<rapidjson::StringBuffer, rapidjson::ASCII<> > PrettyWriter;
|
typedef rapidjson::PrettyWriter<rapidjson::StringBuffer, rapidjson::UTF8<> > PrettyWriter;
|
||||||
|
|
||||||
Writer *mWriter1;
|
Writer *mWriter1;
|
||||||
PrettyWriter *mWriter2;
|
PrettyWriter *mWriter2;
|
||||||
|
@ -173,14 +310,16 @@ struct FWriter
|
||||||
|
|
||||||
void String(const char *k)
|
void String(const char *k)
|
||||||
{
|
{
|
||||||
|
k = StringToUnicode(k);
|
||||||
if (mWriter1) mWriter1->String(k);
|
if (mWriter1) mWriter1->String(k);
|
||||||
else if (mWriter2) mWriter2->String(k);
|
else if (mWriter2) mWriter2->String(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
void String(const char *k, int size)
|
void String(const char *k, int size)
|
||||||
{
|
{
|
||||||
if (mWriter1) mWriter1->String(k, size);
|
k = StringToUnicode(k, size);
|
||||||
else if (mWriter2) mWriter2->String(k, size);
|
if (mWriter1) mWriter1->String(k);
|
||||||
|
else if (mWriter2) mWriter2->String(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bool(bool k)
|
void Bool(bool k)
|
||||||
|
@ -602,7 +741,7 @@ FSerializer &FSerializer::Args(const char *key, int *args, int *defargs, int spe
|
||||||
}
|
}
|
||||||
else if (i == 0 && aval.IsString())
|
else if (i == 0 && aval.IsString())
|
||||||
{
|
{
|
||||||
args[i] = -FName(aval.GetString());
|
args[i] = -FName(UnicodeToString(aval.GetString()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -654,7 +793,7 @@ FSerializer &FSerializer::ScriptNum(const char *key, int &num)
|
||||||
}
|
}
|
||||||
else if (val->IsString())
|
else if (val->IsString())
|
||||||
{
|
{
|
||||||
num = -FName(val->GetString());
|
num = -FName(UnicodeToString(val->GetString()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -709,7 +848,7 @@ FSerializer &FSerializer::Sprite(const char *key, int32_t &spritenum, int32_t *d
|
||||||
{
|
{
|
||||||
if (val->IsString())
|
if (val->IsString())
|
||||||
{
|
{
|
||||||
uint32_t name = *reinterpret_cast<const uint32_t*>(val->GetString());
|
uint32_t name = *reinterpret_cast<const uint32_t*>(UnicodeToString(val->GetString()));
|
||||||
for (auto hint = NumStdSprites; hint-- != 0; )
|
for (auto hint = NumStdSprites; hint-- != 0; )
|
||||||
{
|
{
|
||||||
if (sprites[hint].dwName == name)
|
if (sprites[hint].dwName == name)
|
||||||
|
@ -747,7 +886,7 @@ FSerializer &FSerializer::StringPtr(const char *key, const char *&charptr)
|
||||||
{
|
{
|
||||||
if (val->IsString())
|
if (val->IsString())
|
||||||
{
|
{
|
||||||
charptr = val->GetString();
|
charptr = UnicodeToString(val->GetString());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1403,7 +1542,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FTextureID &value, FTe
|
||||||
assert(nameval.IsString() && typeval.IsInt());
|
assert(nameval.IsString() && typeval.IsInt());
|
||||||
if (nameval.IsString() && typeval.IsInt())
|
if (nameval.IsString() && typeval.IsInt())
|
||||||
{
|
{
|
||||||
value = TexMan.GetTexture(nameval.GetString(), typeval.GetInt());
|
value = TexMan.GetTexture(UnicodeToString(nameval.GetString()), typeval.GetInt());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1553,7 +1692,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FName &value, FName *d
|
||||||
assert(val->IsString());
|
assert(val->IsString());
|
||||||
if (val->IsString())
|
if (val->IsString())
|
||||||
{
|
{
|
||||||
value = val->GetString();
|
value = UnicodeToString(val->GetString());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1638,7 +1777,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FSoundID &sid, FSoundI
|
||||||
assert(val->IsString() || val->IsNull());
|
assert(val->IsString() || val->IsNull());
|
||||||
if (val->IsString())
|
if (val->IsString())
|
||||||
{
|
{
|
||||||
sid = val->GetString();
|
sid = UnicodeToString(val->GetString());
|
||||||
}
|
}
|
||||||
else if (val->IsNull())
|
else if (val->IsNull())
|
||||||
{
|
{
|
||||||
|
@ -1687,7 +1826,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, PClassActor
|
||||||
assert(val->IsString() || val->IsNull());
|
assert(val->IsString() || val->IsNull());
|
||||||
if (val->IsString())
|
if (val->IsString())
|
||||||
{
|
{
|
||||||
clst = PClass::FindActor(val->GetString());
|
clst = PClass::FindActor(UnicodeToString(val->GetString()));
|
||||||
}
|
}
|
||||||
else if (val->IsNull())
|
else if (val->IsNull())
|
||||||
{
|
{
|
||||||
|
@ -1735,7 +1874,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, PClass *&cl
|
||||||
{
|
{
|
||||||
if (val->IsString())
|
if (val->IsString())
|
||||||
{
|
{
|
||||||
clst = PClass::FindClass(val->GetString());
|
clst = PClass::FindClass(UnicodeToString(val->GetString()));
|
||||||
}
|
}
|
||||||
else if (val->IsNull())
|
else if (val->IsNull())
|
||||||
{
|
{
|
||||||
|
@ -1810,7 +1949,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FState *&state, FState
|
||||||
assert(cls.IsString() && ndx.IsUint());
|
assert(cls.IsString() && ndx.IsUint());
|
||||||
if (cls.IsString() && ndx.IsUint())
|
if (cls.IsString() && ndx.IsUint())
|
||||||
{
|
{
|
||||||
PClassActor *clas = PClass::FindActor(cls.GetString());
|
PClassActor *clas = PClass::FindActor(UnicodeToString(cls.GetString()));
|
||||||
if (clas && ndx.GetUint() < (unsigned)clas->NumOwnedStates)
|
if (clas && ndx.GetUint() < (unsigned)clas->NumOwnedStates)
|
||||||
{
|
{
|
||||||
state = clas->OwnedStates + ndx.GetUint();
|
state = clas->OwnedStates + ndx.GetUint();
|
||||||
|
@ -1932,7 +2071,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FString *&p
|
||||||
}
|
}
|
||||||
else if (val->IsString())
|
else if (val->IsString())
|
||||||
{
|
{
|
||||||
pstr = AActor::mStringPropertyData.Alloc(val->GetString());
|
pstr = AActor::mStringPropertyData.Alloc(UnicodeToString(val->GetString()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1974,7 +2113,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FString &pstr, FString
|
||||||
}
|
}
|
||||||
else if (val->IsString())
|
else if (val->IsString())
|
||||||
{
|
{
|
||||||
pstr = val->GetString();
|
pstr = UnicodeToString(val->GetString());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2023,7 +2162,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, char *&pstr
|
||||||
}
|
}
|
||||||
else if (val->IsString())
|
else if (val->IsString())
|
||||||
{
|
{
|
||||||
pstr = copystring(val->GetString());
|
pstr = copystring(UnicodeToString(val->GetString()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -210,8 +210,9 @@ void FTexture::CalcBitSize ()
|
||||||
}
|
}
|
||||||
WidthMask = (1 << WidthBits) - 1;
|
WidthMask = (1 << WidthBits) - 1;
|
||||||
|
|
||||||
// The minimum height is 2, because we cannot shift right 32 bits.
|
// <hr>The minimum height is 2, because we cannot shift right 32 bits.</hr>
|
||||||
for (i = 1; (1 << i) < Height; ++i)
|
// Scratch that. Somebody actually made a 1x1 texture, so now we have to handle it.
|
||||||
|
for (i = 0; (1 << i) < Height; ++i)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
HeightBits = i;
|
HeightBits = i;
|
||||||
|
|
|
@ -299,7 +299,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
|
||||||
while ((dc_x < stop4) && (dc_x & 3))
|
while ((dc_x < stop4) && (dc_x & 3))
|
||||||
{
|
{
|
||||||
pixels = img->GetColumn(frac >> FRACBITS, spanptr);
|
pixels = img->GetColumn(frac >> FRACBITS, spanptr);
|
||||||
R_DrawMaskedColumn(pixels, spans);
|
R_DrawMaskedColumn(pixels, spans, false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
frac += xiscale_i;
|
frac += xiscale_i;
|
||||||
}
|
}
|
||||||
|
@ -310,7 +310,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
|
||||||
for (int zz = 4; zz; --zz)
|
for (int zz = 4; zz; --zz)
|
||||||
{
|
{
|
||||||
pixels = img->GetColumn(frac >> FRACBITS, spanptr);
|
pixels = img->GetColumn(frac >> FRACBITS, spanptr);
|
||||||
R_DrawMaskedColumnHoriz(pixels, spans);
|
R_DrawMaskedColumn(pixels, spans, true);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
frac += xiscale_i;
|
frac += xiscale_i;
|
||||||
}
|
}
|
||||||
|
@ -320,7 +320,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
|
||||||
while (dc_x < x2_i)
|
while (dc_x < x2_i)
|
||||||
{
|
{
|
||||||
pixels = img->GetColumn(frac >> FRACBITS, spanptr);
|
pixels = img->GetColumn(frac >> FRACBITS, spanptr);
|
||||||
R_DrawMaskedColumn(pixels, spans);
|
R_DrawMaskedColumn(pixels, spans, false);
|
||||||
dc_x++;
|
dc_x++;
|
||||||
frac += xiscale_i;
|
frac += xiscale_i;
|
||||||
}
|
}
|
||||||
|
@ -1330,6 +1330,13 @@ void DCanvas::FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BYTE *destorgsave = dc_destorg;
|
||||||
|
dc_destorg = screen->GetBuffer();
|
||||||
|
if (dc_destorg == NULL)
|
||||||
|
{
|
||||||
|
I_FatalError("Attempt to write to buffer of hardware canvas");
|
||||||
|
}
|
||||||
|
|
||||||
scalex /= tex->Scale.X;
|
scalex /= tex->Scale.X;
|
||||||
scaley /= tex->Scale.Y;
|
scaley /= tex->Scale.Y;
|
||||||
|
|
||||||
|
@ -1432,6 +1439,7 @@ void DCanvas::FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
|
||||||
pt1 = pt2;
|
pt1 = pt2;
|
||||||
pt2--; if (pt2 < 0) pt2 = npoints;
|
pt2--; if (pt2 < 0) pt2 = npoints;
|
||||||
} while (pt1 != botpt);
|
} while (pt1 != botpt);
|
||||||
|
dc_destorg = destorgsave;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1092,6 +1092,7 @@ void D3DFB::Update ()
|
||||||
DrawRateStuff();
|
DrawRateStuff();
|
||||||
DrawPackedTextures(d3d_showpacks);
|
DrawPackedTextures(d3d_showpacks);
|
||||||
EndBatch(); // Make sure all batched primitives are drawn.
|
EndBatch(); // Make sure all batched primitives are drawn.
|
||||||
|
In2D = 0;
|
||||||
Flip();
|
Flip();
|
||||||
}
|
}
|
||||||
In2D = 0;
|
In2D = 0;
|
||||||
|
|
|
@ -191,7 +191,7 @@ ACTOR Actor native //: Thinker
|
||||||
action native A_ComboAttack();
|
action native A_ComboAttack();
|
||||||
action native A_BulletAttack();
|
action native A_BulletAttack();
|
||||||
action native A_WolfAttack(int flags = 0, sound whattoplay = "weapons/pistol", float snipe = 1.0, int maxdamage = 64, int blocksize = 128, int pointblank = 2, int longrange = 4, float runspeed = 160.0, class<Actor> pufftype = "BulletPuff");
|
action native A_WolfAttack(int flags = 0, sound whattoplay = "weapons/pistol", float snipe = 1.0, int maxdamage = 64, int blocksize = 128, int pointblank = 2, int longrange = 4, float runspeed = 160.0, class<Actor> pufftype = "BulletPuff");
|
||||||
action native A_PlaySound(sound whattoplay = "weapons/pistol", int slot = CHAN_BODY, float volume = 1.0, bool looping = false, float attenuation = ATTN_NORM);
|
action native A_PlaySound(sound whattoplay = "weapons/pistol", int slot = CHAN_BODY, float volume = 1.0, bool looping = false, float attenuation = ATTN_NORM, bool local = false);
|
||||||
native void A_PlayWeaponSound(sound whattoplay);
|
native void A_PlayWeaponSound(sound whattoplay);
|
||||||
action native A_FLoopActiveSound();
|
action native A_FLoopActiveSound();
|
||||||
action native A_LoopActiveSound();
|
action native A_LoopActiveSound();
|
||||||
|
|
|
@ -681,8 +681,8 @@ OptionMenu "VideoOptions"
|
||||||
|
|
||||||
Option "$DSPLYMNU_VSYNC", "vid_vsync", "OnOff"
|
Option "$DSPLYMNU_VSYNC", "vid_vsync", "OnOff"
|
||||||
Option "$DSPLYMNU_CAPFPS", "cl_capfps", "OffOn"
|
Option "$DSPLYMNU_CAPFPS", "cl_capfps", "OffOn"
|
||||||
Slider "$DSPLYMNU_BLOODFADE", "blood_fade_scalar", 0.0, 1.0, 0.05, 1
|
Slider "$DSPLYMNU_BLOODFADE", "blood_fade_scalar", 0.0, 1.0, 0.05, 2
|
||||||
Slider "$DSPLYMNU_PICKUPFADE", "pickup_fade_scalar", 0.0, 1.0, 0.05, 1
|
Slider "$DSPLYMNU_PICKUPFADE", "pickup_fade_scalar", 0.0, 1.0, 0.05, 2
|
||||||
Option "$DSPLYMNU_COLUMNMETHOD", "r_columnmethod", "ColumnMethods"
|
Option "$DSPLYMNU_COLUMNMETHOD", "r_columnmethod", "ColumnMethods"
|
||||||
|
|
||||||
StaticText " "
|
StaticText " "
|
||||||
|
@ -714,7 +714,7 @@ OptionMenu "VideoOptions"
|
||||||
ColorPicker "$DSPLYMNU_DIMCOLOR", "dimcolor"
|
ColorPicker "$DSPLYMNU_DIMCOLOR", "dimcolor"
|
||||||
Slider "$DSPLYMNU_MOVEBOB", "movebob", 0, 1.0, 0.05, 2
|
Slider "$DSPLYMNU_MOVEBOB", "movebob", 0, 1.0, 0.05, 2
|
||||||
Slider "$DSPLYMNU_STILLBOB", "stillbob", 0, 1.0, 0.05, 2
|
Slider "$DSPLYMNU_STILLBOB", "stillbob", 0, 1.0, 0.05, 2
|
||||||
Slider "$DSPLYMNU_BOBSPEED", "wbobspeed", 0, 2.0, 0.1, 2
|
Slider "$DSPLYMNU_BOBSPEED", "wbobspeed", 0, 2.0, 0.1
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1256,7 +1256,7 @@ OptionMenu GameplayOptions
|
||||||
Title "$GMPLYMNU_TITLE"
|
Title "$GMPLYMNU_TITLE"
|
||||||
//Indent 222
|
//Indent 222
|
||||||
Option "$GMPLYMNU_TEAMPLAY", "teamplay", "OnOff"
|
Option "$GMPLYMNU_TEAMPLAY", "teamplay", "OnOff"
|
||||||
Slider "$GMPLYMNU_TEAMDAMAGE", "teamdamage", 0, 1, 0.05
|
Slider "$GMPLYMNU_TEAMDAMAGE", "teamdamage", 0, 1, 0.05,2
|
||||||
StaticText " "
|
StaticText " "
|
||||||
Option "$GMPLYMNU_SMARTAUTOAIM", "sv_smartaim", "SmartAim"
|
Option "$GMPLYMNU_SMARTAUTOAIM", "sv_smartaim", "SmartAim"
|
||||||
StaticText " "
|
StaticText " "
|
||||||
|
@ -1806,7 +1806,7 @@ OptionMenu NetworkOptions
|
||||||
StaticText "$NETMNU_LOCALOPTIONS", 1
|
StaticText "$NETMNU_LOCALOPTIONS", 1
|
||||||
Option "$NETMNU_MOVEPREDICTION", "cl_noprediction", "OffOn"
|
Option "$NETMNU_MOVEPREDICTION", "cl_noprediction", "OffOn"
|
||||||
Option "$NETMNU_LINESPECIALPREDICTION", "cl_predict_specials", "OnOff"
|
Option "$NETMNU_LINESPECIALPREDICTION", "cl_predict_specials", "OnOff"
|
||||||
Slider "$NETMNU_PREDICTIONLERPSCALE", "cl_predict_lerpscale", 0.0, 0.5, 0.05
|
Slider "$NETMNU_PREDICTIONLERPSCALE", "cl_predict_lerpscale", 0.0, 0.5, 0.05, 2
|
||||||
Slider "$NETMNU_LERPTHRESHOLD", "cl_predict_lerpthreshold", 0.1, 16.0, 0.1
|
Slider "$NETMNU_LERPTHRESHOLD", "cl_predict_lerpthreshold", 0.1, 16.0, 0.1
|
||||||
StaticText " "
|
StaticText " "
|
||||||
StaticText "$NETMNU_HOSTOPTIONS", 1
|
StaticText "$NETMNU_HOSTOPTIONS", 1
|
||||||
|
|
Loading…
Reference in a new issue