This commit is contained in:
Rachael Alexanderson 2017-01-20 20:56:02 -05:00
commit 410a1aa24c
23 changed files with 529 additions and 684 deletions

View file

@ -769,8 +769,8 @@ file( GLOB HEADER_FILES
${EXTRA_HEADER_DIRS} ${EXTRA_HEADER_DIRS}
fragglescript/*.h fragglescript/*.h
g_shared/*.h g_shared/*.h
g_statusbar/*.h
g_inventory/*.h g_inventory/*.h
g_strife/*.h
intermission/*.h intermission/*.h
menu/*.h menu/*.h
oplsynth/*.h oplsynth/*.h
@ -825,7 +825,7 @@ set( NOT_COMPILED_SOURCE_FILES
${OTHER_SYSTEM_SOURCES} ${OTHER_SYSTEM_SOURCES}
sc_man_scanner.h sc_man_scanner.h
sc_man_scanner.re sc_man_scanner.re
g_shared/sbarinfo_commands.cpp g_statusbar/sbarinfo_commands.cpp
xlat/xlat_parser.y xlat/xlat_parser.y
xlat_parser.c xlat_parser.c
xlat_parser.h xlat_parser.h
@ -1198,7 +1198,6 @@ set (PCH_SOURCES
g_inventory/a_keys.cpp g_inventory/a_keys.cpp
g_inventory/a_pickups.cpp g_inventory/a_pickups.cpp
g_inventory/a_weapons.cpp g_inventory/a_weapons.cpp
g_strife/strife_sbar.cpp
g_shared/a_action.cpp g_shared/a_action.cpp
g_shared/a_decals.cpp g_shared/a_decals.cpp
g_shared/a_flashfader.cpp g_shared/a_flashfader.cpp
@ -1207,10 +1206,11 @@ set (PCH_SOURCES
g_shared/a_quake.cpp g_shared/a_quake.cpp
g_shared/a_specialspot.cpp g_shared/a_specialspot.cpp
g_shared/hudmessages.cpp g_shared/hudmessages.cpp
g_shared/sbarinfo.cpp
g_shared/sbar_mugshot.cpp
g_shared/shared_hud.cpp g_shared/shared_hud.cpp
g_shared/shared_sbar.cpp g_statusbar/sbarinfo.cpp
g_statusbar/sbar_mugshot.cpp
g_statusbar/shared_sbar.cpp
g_statusbar/strife_sbar.cpp
resourcefiles/ancientzip.cpp resourcefiles/ancientzip.cpp
resourcefiles/file_7z.cpp resourcefiles/file_7z.cpp
resourcefiles/file_grp.cpp resourcefiles/file_grp.cpp
@ -1342,7 +1342,7 @@ endif()
target_link_libraries( zdoom ${ZDOOM_LIBS} gdtoa dumb lzma ) target_link_libraries( zdoom ${ZDOOM_LIBS} gdtoa dumb lzma )
include_directories( . include_directories( .
g_strife g_statusbar
g_shared g_shared
g_inventory g_inventory
oplsynth oplsynth
@ -1471,7 +1471,6 @@ source_group("External\\Math" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/m
source_group("External\\RapidJSON" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rapidjson/.+") source_group("External\\RapidJSON" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rapidjson/.+")
source_group("External\\SFMT" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sfmt/.+") source_group("External\\SFMT" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sfmt/.+")
source_group("FraggleScript" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/fragglescript/.+") source_group("FraggleScript" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/fragglescript/.+")
source_group("Games\\Strife Game" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_strife/.+")
source_group("Intermission" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/intermission/.+") source_group("Intermission" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/intermission/.+")
source_group("Inventory" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_inventory/.+") source_group("Inventory" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_inventory/.+")
source_group("Menu" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/menu/.+") source_group("Menu" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/menu/.+")
@ -1517,6 +1516,7 @@ source_group("Scripting\\Code Generation" REGULAR_EXPRESSION "^${CMAKE_CURRENT_S
source_group("Scripting\\VM" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/scripting/vm/.+") source_group("Scripting\\VM" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/scripting/vm/.+")
source_group("Scripting" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/scripting/.+") source_group("Scripting" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/scripting/.+")
source_group("Shared Game" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_shared/.+") source_group("Shared Game" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_shared/.+")
source_group("Statusbar" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_statusbar/.+")
source_group("Versioning" FILES version.h win32/zdoom.rc) source_group("Versioning" FILES version.h win32/zdoom.rc)
source_group("Xlat" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/xlat/.+" FILES ${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.c ${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.h) source_group("Xlat" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/xlat/.+" FILES ${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.c ${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.h)
source_group("Source Files" FILES ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h sc_man_scanner.re) source_group("Source Files" FILES ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h sc_man_scanner.re)

View file

@ -1059,7 +1059,7 @@ static void AM_findMinMaxBoundaries ()
static void AM_calcMinMaxMtoF() static void AM_calcMinMaxMtoF()
{ {
double a = SCREENWIDTH / max_w; double a = SCREENWIDTH / max_w;
double b = ::ST_Y / max_h; double b = gST_Y / max_h;
min_scale_mtof = a < b ? a : b; min_scale_mtof = a < b ? a : b;
max_scale_mtof = SCREENHEIGHT / (2*PLAYERRADIUS); max_scale_mtof = SCREENHEIGHT / (2*PLAYERRADIUS);
@ -1417,7 +1417,7 @@ void AM_NewResolution()
else if (scale_mtof > max_scale_mtof) else if (scale_mtof > max_scale_mtof)
AM_maxOutWindowScale(); AM_maxOutWindowScale();
f_w = screen->GetWidth(); f_w = screen->GetWidth();
f_h = ST_Y; f_h = gST_Y;
AM_activateNewScale(); AM_activateNewScale();
} }
@ -3066,7 +3066,7 @@ void AM_Drawer ()
// and view size adjustments. // and view size adjustments.
f_x = f_y = 0; f_x = f_y = 0;
f_w = screen->GetWidth (); f_w = screen->GetWidth ();
f_h = ST_Y; f_h = gST_Y;
f_p = screen->GetPitch (); f_p = screen->GetPitch ();
AM_clearFB(AMColors[AMColors.Background]); AM_clearFB(AMColors[AMColors.Background]);

View file

@ -241,13 +241,13 @@ void CT_Drawer (void)
{ {
screen_width = SCREENWIDTH; screen_width = SCREENWIDTH;
screen_height = SCREENHEIGHT; screen_height = SCREENHEIGHT;
st_y = ST_Y; st_y = gST_Y;
} }
else else
{ {
screen_width = SCREENWIDTH / active_con_scaletext(); screen_width = SCREENWIDTH / active_con_scaletext();
screen_height = SCREENHEIGHT / active_con_scaletext(); screen_height = SCREENHEIGHT / active_con_scaletext();
st_y = ST_Y / active_con_scaletext(); st_y = gST_Y / active_con_scaletext();
} }
y += ((SCREENHEIGHT == viewheight && viewactive) || gamestate != GS_LEVEL) ? screen_height : st_y; y += ((SCREENHEIGHT == viewheight && viewactive) || gamestate != GS_LEVEL) ? screen_height : st_y;

View file

@ -790,7 +790,7 @@ void SetDehParams(FState *state, int codepointer)
// Let's identify the codepointer we're dealing with. // Let's identify the codepointer we're dealing with.
PFunction *sym; PFunction *sym;
sym = dyn_cast<PFunction>(RUNTIME_CLASS(AStateProvider)->Symbols.FindSymbol(FName(MBFCodePointers[codepointer].name), true)); sym = dyn_cast<PFunction>(RUNTIME_CLASS(AWeapon)->Symbols.FindSymbol(FName(MBFCodePointers[codepointer].name), true));
if (sym == NULL) return; if (sym == NULL) return;
if (codepointer < 0 || (unsigned)codepointer >= countof(MBFCodePointerFactories)) if (codepointer < 0 || (unsigned)codepointer >= countof(MBFCodePointerFactories))
@ -2108,7 +2108,7 @@ static int PatchCodePtrs (int dummy)
// This skips the action table and goes directly to the internal symbol table // This skips the action table and goes directly to the internal symbol table
// DEH compatible functions are easy to recognize. // DEH compatible functions are easy to recognize.
PFunction *sym = dyn_cast<PFunction>(RUNTIME_CLASS(AStateProvider)->Symbols.FindSymbol(symname, true)); PFunction *sym = dyn_cast<PFunction>(RUNTIME_CLASS(AWeapon)->Symbols.FindSymbol(symname, true));
if (sym == NULL) if (sym == NULL)
{ {
Printf(TEXTCOLOR_RED "Frame %d: Unknown code pointer '%s'\n", frame, Line2); Printf(TEXTCOLOR_RED "Frame %d: Unknown code pointer '%s'\n", frame, Line2);
@ -2717,11 +2717,11 @@ static bool LoadDehSupp ()
} }
else else
{ {
// all relevant code pointers are either defined in AStateProvider // all relevant code pointers are either defined in AWeapon
// or AActor so this will find all of them. // or AActor so this will find all of them.
FString name = "A_"; FString name = "A_";
name << sc.String; name << sc.String;
PFunction *sym = dyn_cast<PFunction>(RUNTIME_CLASS(AStateProvider)->Symbols.FindSymbol(name, true)); PFunction *sym = dyn_cast<PFunction>(RUNTIME_CLASS(AWeapon)->Symbols.FindSymbol(name, true));
if (sym == NULL) if (sym == NULL)
{ {
sc.ScriptError("Unknown code pointer '%s'", sc.String); sc.ScriptError("Unknown code pointer '%s'", sc.String);
@ -3093,7 +3093,7 @@ void FinishDehPatch ()
{ {
if (AmmoPerAttacks[j].ptr == nullptr) if (AmmoPerAttacks[j].ptr == nullptr)
{ {
auto p = dyn_cast<PFunction>(RUNTIME_CLASS(AStateProvider)->Symbols.FindSymbol(AmmoPerAttacks[j].func, true)); auto p = dyn_cast<PFunction>(RUNTIME_CLASS(AWeapon)->Symbols.FindSymbol(AmmoPerAttacks[j].func, true));
if (p != nullptr) AmmoPerAttacks[j].ptr = p->Variants[0].Implementation; if (p != nullptr) AmmoPerAttacks[j].ptr = p->Variants[0].Implementation;
} }
if (state->ActionFunc == AmmoPerAttacks[j].ptr) if (state->ActionFunc == AmmoPerAttacks[j].ptr)

View file

@ -785,13 +785,13 @@ void D_Display ()
screen->DrawBlendingRect(); screen->DrawBlendingRect();
if (automapactive) if (automapactive)
{ {
int saved_ST_Y = ST_Y; int saved_ST_Y = gST_Y;
if (hud_althud && viewheight == SCREENHEIGHT) if (hud_althud && viewheight == SCREENHEIGHT)
{ {
ST_Y = viewheight; gST_Y = viewheight;
} }
AM_Drawer (); AM_Drawer ();
ST_Y = saved_ST_Y; gST_Y = saved_ST_Y;
} }
if (!automapactive || viewactive) if (!automapactive || viewactive)
{ {

View file

@ -443,7 +443,7 @@ bool P_MorphMonster (AActor *actor, PClassActor *spawntype, int duration, int st
DEFINE_ACTION_FUNCTION(AActor, MorphMonster) DEFINE_ACTION_FUNCTION(AActor, MorphMonster)
{ {
PARAM_SELF_PROLOGUE(AActor); PARAM_SELF_PROLOGUE(AActor);
PARAM_CLASS(spawntype, APlayerPawn); PARAM_CLASS(spawntype, AActor);
PARAM_INT(duration); PARAM_INT(duration);
PARAM_INT(style); PARAM_INT(style);
PARAM_CLASS_DEF(enter_flash, AActor); PARAM_CLASS_DEF(enter_flash, AActor);

View file

@ -307,6 +307,7 @@ enum
class DBaseStatusBar : public DObject class DBaseStatusBar : public DObject
{ {
friend class DSBarInfo;
DECLARE_CLASS (DBaseStatusBar, DObject) DECLARE_CLASS (DBaseStatusBar, DObject)
HAS_OBJECT_POINTERS HAS_OBJECT_POINTERS
public: public:
@ -342,8 +343,6 @@ public:
DBaseStatusBar (int reltop, int hres=320, int vres=200); DBaseStatusBar (int reltop, int hres=320, int vres=200);
void OnDestroy() override; void OnDestroy() override;
void SetScaled (bool scale, bool force=false);
void AttachMessage (DHUDMessage *msg, uint32 id=0, int layer=HUDMSGLayer_Default); void AttachMessage (DHUDMessage *msg, uint32 id=0, int layer=HUDMSGLayer_Default);
DHUDMessage *DetachMessage (DHUDMessage *msg); DHUDMessage *DetachMessage (DHUDMessage *msg);
DHUDMessage *DetachMessage (uint32 id); DHUDMessage *DetachMessage (uint32 id);
@ -357,6 +356,7 @@ public:
// do not make this a DObject Serialize function because it's not used like one! // do not make this a DObject Serialize function because it's not used like one!
void SerializeMessages(FSerializer &arc); void SerializeMessages(FSerializer &arc);
virtual void SetScaled(bool scale, bool force = false);
virtual void Tick (); virtual void Tick ();
virtual void Draw (EHudState state); virtual void Draw (EHudState state);
void DrawBottomStuff (EHudState state); void DrawBottomStuff (EHudState state);
@ -375,23 +375,17 @@ public:
virtual void SetMugShotState (const char *state_name, bool wait_till_done=false, bool reset=false); virtual void SetMugShotState (const char *state_name, bool wait_till_done=false, bool reset=false);
void DrawLog(); void DrawLog();
void GetCoords(int &x, int &y)
{
x = ST_X;
y = ST_Y;
}
protected: protected:
void DrawPowerups (); void DrawPowerups ();
void UpdateRect (int x, int y, int width, int height) const;
void DrawImage (FTexture *image, int x, int y, FRemapTable *translation=NULL) const;
void DrawDimImage (FTexture *image, int x, int y, bool dimmed) const;
void DrawPartialImage (FTexture *image, int wx, int ww) const;
void DrINumber (signed int val, int x, int y, int imgBase=imgINumbers) const;
void DrBNumber (signed int val, int x, int y, int w=3) const;
void DrSmallNumber (int val, int x, int y) const;
void DrINumberOuter (signed int val, int x, int y, bool center=false, int w=9) const;
void DrBNumberOuter (signed int val, int x, int y, int w=3) const;
void DrBNumberOuterFont (signed int val, int x, int y, int w=3) const;
void DrSmallNumberOuter (int val, int x, int y, bool center) const;
void RefreshBackground () const; void RefreshBackground () const;
void GetCurrentAmmo (AInventory *&ammo1, AInventory *&ammo2, int &ammocount1, int &ammocount2) const; void GetCurrentAmmo (AInventory *&ammo1, AInventory *&ammo2, int &ammocount1, int &ammocount2) const;
@ -402,7 +396,7 @@ public:
int ST_X, ST_Y; int ST_X, ST_Y;
int RelTop; int RelTop;
int HorizontalResolution, VirticalResolution; int HorizontalResolution, VerticalResolution;
bool Scaled; bool Scaled;
bool Centering; bool Centering;
bool FixedOrigin; bool FixedOrigin;

View file

@ -970,17 +970,16 @@ inline void adjustRelCenter(bool relX, bool relY, const double &x, const double
outY = y; outY = y;
} }
class DSBarInfo : public DBaseStatusBar class DSBarInfo
{ {
DECLARE_CLASS(DSBarInfo, DBaseStatusBar)
HAS_OBJECT_POINTERS
public: public:
DSBarInfo (SBarInfo *script=NULL) : DBaseStatusBar(script->height, script->resW, script->resH), DSBarInfo (DBaseStatusBar *wrapper, SBarInfo *script=NULL) :
ammo1(NULL), ammo2(NULL), ammocount1(0), ammocount2(0), armor(NULL), ammo1(NULL), ammo2(NULL), ammocount1(0), ammocount2(0), armor(NULL),
pendingPopup(POP_None), currentPopup(POP_None), lastHud(-1), pendingPopup(DBaseStatusBar::POP_None), currentPopup(DBaseStatusBar::POP_None), lastHud(-1),
scalingWasForced(false), lastInventoryBar(NULL), lastPopup(NULL) scalingWasForced(false), lastInventoryBar(NULL), lastPopup(NULL)
{ {
this->script = script; this->script = script;
this->wrapper = wrapper;
static const char *InventoryBarLumps[] = static const char *InventoryBarLumps[] =
{ {
@ -1001,8 +1000,6 @@ public:
} }
invBarOffset = script->Images.Size(); invBarOffset = script->Images.Size();
Images.Init(&patchnames[0], patchnames.Size()); Images.Init(&patchnames[0], patchnames.Size());
CompleteBorder = script->completeBorder;
} }
~DSBarInfo () ~DSBarInfo ()
@ -1010,9 +1007,18 @@ public:
Images.Uninit(); Images.Uninit();
} }
void ScreenSizeChanged() override void _SetScaled(bool scaled)
{
Scaled = scaled;
}
void _AttachToPlayer(player_t *player)
{
CPlayer = player;
}
void _ScreenSizeChanged()
{ {
Super::ScreenSizeChanged();
if (uiscale > 0) if (uiscale > 0)
{ {
script->cleanX = uiscale; script->cleanX = uiscale;
@ -1024,13 +1030,13 @@ public:
} }
} }
void Draw (EHudState state) override void _Draw (EHudState state)
{ {
DBaseStatusBar::Draw(state);
if (script->cleanX <= 0) if (script->cleanX <= 0)
{ // Calculate cleanX and cleanY { // Calculate cleanX and cleanY
ScreenSizeChanged(); wrapper->ScreenSizeChanged();
} }
wrapper->GetCoords(ST_X, ST_Y);
int hud = STBAR_NORMAL; int hud = STBAR_NORMAL;
if(state == HUD_StatusBar) if(state == HUD_StatusBar)
{ {
@ -1059,13 +1065,13 @@ public:
else if(!Scaled) else if(!Scaled)
{ {
scalingWasForced = true; scalingWasForced = true;
SetScaled(true, true); wrapper->SetScaled(true, true);
setsizeneeded = true; setsizeneeded = true;
} }
} }
//prepare ammo counts //prepare ammo counts
GetCurrentAmmo(ammo1, ammo2, ammocount1, ammocount2); wrapper->GetCurrentAmmo(ammo1, ammo2, ammocount1, ammocount2);
armor = CPlayer->mo->FindInventory(NAME_BasicArmor); armor = CPlayer->mo->FindInventory(NAME_BasicArmor);
if(state != HUD_AltHud) if(state != HUD_AltHud)
@ -1078,12 +1084,12 @@ public:
if(scalingWasForced) if(scalingWasForced)
{ {
scalingWasForced = false; scalingWasForced = false;
SetScaled(false); wrapper->SetScaled(false);
setsizeneeded = true; setsizeneeded = true;
} }
} }
if(currentPopup != POP_None && !script->huds[hud]->FullScreenOffsets()) if(currentPopup != DBaseStatusBar::POP_None && !script->huds[hud]->FullScreenOffsets())
script->huds[hud]->Draw(NULL, this, script->popups[currentPopup-1].getXDisplacement(), script->popups[currentPopup-1].getYDisplacement(), 1.); script->huds[hud]->Draw(NULL, this, script->popups[currentPopup-1].getXDisplacement(), script->popups[currentPopup-1].getYDisplacement(), 1.);
else else
script->huds[hud]->Draw(NULL, this, 0, 0, 1.); script->huds[hud]->Draw(NULL, this, 0, 0, 1.);
@ -1105,14 +1111,14 @@ public:
} }
// Handle popups // Handle popups
if(currentPopup != POP_None) if(currentPopup != DBaseStatusBar::POP_None)
{ {
int popbar = 0; int popbar = 0;
if(currentPopup == POP_Log) if(currentPopup == DBaseStatusBar::POP_Log)
popbar = STBAR_POPUPLOG; popbar = STBAR_POPUPLOG;
else if(currentPopup == POP_Keys) else if(currentPopup == DBaseStatusBar::POP_Keys)
popbar = STBAR_POPUPKEYS; popbar = STBAR_POPUPKEYS;
else if(currentPopup == POP_Status) else if(currentPopup == DBaseStatusBar::POP_Status)
popbar = STBAR_POPUPSTATUS; popbar = STBAR_POPUPSTATUS;
if(script->huds[popbar] != lastPopup) if(script->huds[popbar] != lastPopup)
{ {
@ -1129,40 +1135,33 @@ public:
hud_scale = oldhud_scale; hud_scale = oldhud_scale;
} }
void NewGame () override void _NewGame ()
{ {
if (CPlayer != NULL) // Reset the huds
{ script->ResetHuds();
AttachToPlayer (CPlayer); lastHud = -1; // Reset
// Reset the huds
script->ResetHuds();
lastHud = -1; // Reset
}
} }
bool MustDrawLog (EHudState state) override bool _MustDrawLog (EHudState state)
{ {
return script->huds[STBAR_POPUPLOG]->NumCommands() == 0; return script->huds[STBAR_POPUPLOG]->NumCommands() == 0;
} }
void SetMugShotState (const char *state_name, bool wait_till_done, bool reset) override void _SetMugShotState (const char *state_name, bool wait_till_done, bool reset)
{ {
script->MugShot.SetState(state_name, wait_till_done, reset); script->MugShot.SetState(state_name, wait_till_done, reset);
} }
void Tick () override void _Tick ()
{ {
DBaseStatusBar::Tick();
script->MugShot.Tick(CPlayer); script->MugShot.Tick(CPlayer);
if(currentPopup != POP_None) if(currentPopup != DBaseStatusBar::POP_None)
{ {
script->popups[currentPopup-1].tick(); script->popups[currentPopup-1].tick();
if(script->popups[currentPopup-1].opened == false && script->popups[currentPopup-1].isDoneMoving()) if(script->popups[currentPopup-1].opened == false && script->popups[currentPopup-1].isDoneMoving())
{ {
currentPopup = pendingPopup; currentPopup = pendingPopup;
if(currentPopup != POP_None) if(currentPopup != DBaseStatusBar::POP_None)
script->popups[currentPopup-1].open(); script->popups[currentPopup-1].open();
} }
@ -1175,30 +1174,29 @@ public:
lastInventoryBar->Tick(NULL, this, false); lastInventoryBar->Tick(NULL, this, false);
} }
void ReceivedWeapon(AWeapon *weapon) override void _ReceivedWeapon(AWeapon *weapon)
{ {
script->MugShot.Grin(); script->MugShot.Grin();
} }
// void DSBarInfo::FlashItem(const PClass *itemtype) - Is defined with CommandDrawSelectedInventory // void DSBarInfo::FlashItem(const PClass *itemtype) - Is defined with CommandDrawSelectedInventory
void FlashItem(const PClass *itemtype) override; void _FlashItem(const PClass *itemtype);
void ShowPop(int popnum) override void _ShowPop(int popnum)
{ {
DBaseStatusBar::ShowPop(popnum);
if(popnum != currentPopup) if(popnum != currentPopup)
{ {
pendingPopup = popnum; pendingPopup = popnum;
} }
else else
pendingPopup = POP_None; pendingPopup = DBaseStatusBar::POP_None;
if(currentPopup != POP_None) if(currentPopup != DBaseStatusBar::POP_None)
script->popups[currentPopup-1].close(); script->popups[currentPopup-1].close();
else else
{ {
currentPopup = pendingPopup; currentPopup = pendingPopup;
pendingPopup = POP_None; pendingPopup = DBaseStatusBar::POP_None;
if(currentPopup != POP_None) if(currentPopup != DBaseStatusBar::POP_None)
script->popups[currentPopup-1].open(); script->popups[currentPopup-1].open();
} }
} }
@ -1519,6 +1517,10 @@ public:
AInventory *armor; AInventory *armor;
FImageCollection Images; FImageCollection Images;
unsigned int invBarOffset; unsigned int invBarOffset;
player_t *CPlayer = nullptr;
DBaseStatusBar *wrapper;
bool Scaled;
int ST_X, ST_Y;
private: private:
SBarInfo *script; SBarInfo *script;
@ -1530,20 +1532,6 @@ private:
SBarInfoMainBlock *lastPopup; SBarInfoMainBlock *lastPopup;
}; };
IMPLEMENT_CLASS(DSBarInfo, false, true)
IMPLEMENT_POINTERS_START(DSBarInfo)
IMPLEMENT_POINTER(ammo1)
IMPLEMENT_POINTER(ammo2)
IMPLEMENT_POINTER(armor)
IMPLEMENT_POINTERS_END
DBaseStatusBar *CreateCustomStatusBar (int script)
{
if(SBarInfoScript[script] == NULL)
I_FatalError("Tried to create a status bar with no script!");
return new DSBarInfo(SBarInfoScript[script]);
}
void SBarInfoMainBlock::DrawAux(const SBarInfoMainBlock *block, DSBarInfo *statusBar, int xOffset, int yOffset, double alpha) void SBarInfoMainBlock::DrawAux(const SBarInfoMainBlock *block, DSBarInfo *statusBar, int xOffset, int yOffset, double alpha)
{ {
@ -1562,7 +1550,7 @@ void SBarInfoMainBlock::DrawAux(const SBarInfoMainBlock *block, DSBarInfo *statu
else if(!statusBar->Scaled) else if(!statusBar->Scaled)
{ {
rescale = true; rescale = true;
statusBar->SetScaled(true, true); statusBar->wrapper->SetScaled(true, true);
} }
} }
@ -1573,8 +1561,111 @@ void SBarInfoMainBlock::DrawAux(const SBarInfoMainBlock *block, DSBarInfo *statu
if(FullScreenOffsets()) if(FullScreenOffsets())
hud_scale = false; hud_scale = false;
else else
statusBar->SetScaled(false); statusBar->wrapper->SetScaled(false);
} }
} }
#include "sbarinfo_commands.cpp" #include "sbarinfo_commands.cpp"
//==========================================================================
//
// SBarinfoWrapper
//
// This class abstracts SBARINFO from the rest of the engine.
// The idea is, when status bars are moved to ZScript that only
// this small wrapper class needs to be dealt with and the implementation
// can be left alone.
//
//==========================================================================
DSBarInfoWrapper::DSBarInfoWrapper(SBarInfo *script)
: DBaseStatusBar(script->height, script->resW, script->resH)
{
core = new DSBarInfo(this, script);
core->_SetScaled(Scaled);
CompleteBorder = script->completeBorder;
}
void DSBarInfoWrapper::OnDestroy()
{
if (core != nullptr) delete core;
Super::OnDestroy();
}
void DSBarInfoWrapper::SetScaled(bool scale, bool force)
{
Super::SetScaled(scale, force);
core->_SetScaled(scale);
}
void DSBarInfoWrapper::AttachToPlayer(player_t *player)
{
Super::AttachToPlayer(player);
core->_AttachToPlayer(player);
}
void DSBarInfoWrapper::ScreenSizeChanged()
{
Super::ScreenSizeChanged();
core->_ScreenSizeChanged();
}
void DSBarInfoWrapper::Draw(EHudState state)
{
Super::Draw(state);
core->_Draw(state);
}
void DSBarInfoWrapper::NewGame()
{
Super::NewGame();
if (CPlayer != NULL)
{
AttachToPlayer(CPlayer);
core->_NewGame();
}
}
bool DSBarInfoWrapper::MustDrawLog(EHudState state)
{
return core->_MustDrawLog(state);
}
void DSBarInfoWrapper::SetMugShotState(const char *state_name, bool wait_till_done, bool reset)
{
core->_SetMugShotState(state_name, wait_till_done, reset);
}
void DSBarInfoWrapper::Tick()
{
DBaseStatusBar::Tick();
core->_Tick();
}
void DSBarInfoWrapper::ReceivedWeapon(AWeapon *weapon)
{
core->_ReceivedWeapon(weapon);
}
void DSBarInfoWrapper::FlashItem(const PClass *itemtype)
{
core->_FlashItem(itemtype);
}
void DSBarInfoWrapper::ShowPop(int popnum)
{
DBaseStatusBar::ShowPop(popnum); //DBaseStatusBar supercall
core->_ShowPop(popnum);
}
IMPLEMENT_CLASS(DSBarInfoWrapper, false, false)
DBaseStatusBar *CreateCustomStatusBar(int script)
{
if (SBarInfoScript[script] == NULL)
I_FatalError("Tried to create a status bar with no script!");
return new DSBarInfoWrapper(SBarInfoScript[script]);
}

View file

@ -42,7 +42,7 @@
#define NUMPOPUPS 3 #define NUMPOPUPS 3
class FScanner; class FScanner;
class DSBarInfo;
class SBarInfoMainBlock; class SBarInfoMainBlock;
//Popups! //Popups!
@ -129,4 +129,27 @@ struct SBarInfo
#define SCRIPT_DEFAULT 1 #define SCRIPT_DEFAULT 1
extern SBarInfo *SBarInfoScript[2]; extern SBarInfo *SBarInfoScript[2];
class DSBarInfoWrapper : public DBaseStatusBar
{
DSBarInfo *core;
DECLARE_CLASS(DSBarInfoWrapper, DBaseStatusBar)
public:
DSBarInfoWrapper() : DBaseStatusBar(10, 10, 10) { core = nullptr; }
DSBarInfoWrapper(SBarInfo *script);
void OnDestroy() override;
void SetScaled(bool scale, bool force);
void AttachToPlayer(player_t *player) override;
void ScreenSizeChanged() override;
void Draw(EHudState state) override;
void NewGame() override;
bool MustDrawLog(EHudState state) override;
void SetMugShotState(const char *state_name, bool wait_till_done, bool reset) override;
void Tick() override;
void ReceivedWeapon(AWeapon *weapon) override;
void FlashItem(const PClass *itemtype) override;
void ShowPop(int popnum) override;
};
#endif //__SBarInfo_SBAR_H__ #endif //__SBarInfo_SBAR_H__

View file

@ -1818,7 +1818,7 @@ class CommandDrawSelectedInventory : public CommandDrawImage, private CommandDra
int CommandDrawSelectedInventory::artiflashTick = 0; int CommandDrawSelectedInventory::artiflashTick = 0;
double CommandDrawSelectedInventory::itemflashFade = 0.75; double CommandDrawSelectedInventory::itemflashFade = 0.75;
void DSBarInfo::FlashItem(const PClass *itemtype) void DSBarInfo::_FlashItem(const PClass *itemtype)
{ {
CommandDrawSelectedInventory::Flash(); CommandDrawSelectedInventory::Flash();
} }
@ -2190,7 +2190,7 @@ class CommandDrawInventoryBar : public SBarInfoCommand
AInventory *item; AInventory *item;
unsigned int i = 0; unsigned int i = 0;
// If the player has no artifacts, don't draw the bar // If the player has no artifacts, don't draw the bar
statusBar->CPlayer->mo->InvFirst = statusBar->ValidateInvFirst(size); statusBar->CPlayer->mo->InvFirst = statusBar->wrapper->ValidateInvFirst(size);
if(statusBar->CPlayer->mo->InvFirst != NULL || alwaysShow) if(statusBar->CPlayer->mo->InvFirst != NULL || alwaysShow)
{ {
for(item = statusBar->CPlayer->mo->InvFirst, i = 0; item != NULL && i < size; item = item->NextInv(), ++i) for(item = statusBar->CPlayer->mo->InvFirst, i = 0; item != NULL && i < size; item = item->NextInv(), ++i)

View file

@ -86,7 +86,7 @@ DBaseStatusBar *StatusBar;
extern int setblocks; extern int setblocks;
int ST_X, ST_Y; int gST_X, gST_Y;
int SB_state = 3; int SB_state = 3;
FTexture *CrosshairImage; FTexture *CrosshairImage;
@ -248,7 +248,7 @@ DBaseStatusBar::DBaseStatusBar (int reltop, int hres, int vres)
CPlayer = NULL; CPlayer = NULL;
ShowLog = false; ShowLog = false;
HorizontalResolution = hres; HorizontalResolution = hres;
VirticalResolution = vres; VerticalResolution = vres;
SetScaled (st_scale); SetScaled (st_scale);
} }
@ -282,7 +282,7 @@ void DBaseStatusBar::OnDestroy ()
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
//[BL] Added force argument to have forcescaled mean forcescaled. //[BL] Added force argument to have forcescaled mean forcescaled.
// - Also, if the VirticalResolution is something other than the default (200) // - Also, if the VerticalResolution is something other than the default (200)
// We should always obey the value of scale. // We should always obey the value of scale.
void DBaseStatusBar::SetScaled (bool scale, bool force) void DBaseStatusBar::SetScaled (bool scale, bool force)
{ {
@ -292,10 +292,10 @@ void DBaseStatusBar::SetScaled (bool scale, bool force)
{ {
ST_X = (SCREENWIDTH - HorizontalResolution) / 2; ST_X = (SCREENWIDTH - HorizontalResolution) / 2;
ST_Y = SCREENHEIGHT - RelTop; ST_Y = SCREENHEIGHT - RelTop;
::ST_Y = ST_Y; gST_Y = ST_Y;
if (RelTop > 0) if (RelTop > 0)
{ {
Displacement = double((ST_Y * VirticalResolution / SCREENHEIGHT) - (VirticalResolution - RelTop))/RelTop; Displacement = double((ST_Y * VerticalResolution / SCREENHEIGHT) - (VerticalResolution - RelTop))/RelTop;
} }
else else
{ {
@ -305,20 +305,20 @@ void DBaseStatusBar::SetScaled (bool scale, bool force)
else else
{ {
ST_X = 0; ST_X = 0;
ST_Y = VirticalResolution - RelTop; ST_Y = VerticalResolution - RelTop;
float aspect = ActiveRatio(SCREENWIDTH, SCREENHEIGHT); float aspect = ActiveRatio(SCREENWIDTH, SCREENHEIGHT);
if (!AspectTallerThanWide(aspect)) if (!AspectTallerThanWide(aspect))
{ // Normal resolution { // Normal resolution
::ST_Y = Scale (ST_Y, SCREENHEIGHT, VirticalResolution); gST_Y = Scale (ST_Y, SCREENHEIGHT, VerticalResolution);
} }
else else
{ // 5:4 resolution { // 5:4 resolution
::ST_Y = Scale(ST_Y - VirticalResolution/2, SCREENHEIGHT*3, Scale(VirticalResolution, AspectBaseHeight(aspect), 200)) + SCREENHEIGHT/2 gST_Y = Scale(ST_Y - VerticalResolution/2, SCREENHEIGHT*3, Scale(VerticalResolution, AspectBaseHeight(aspect), 200)) + SCREENHEIGHT/2
+ (SCREENHEIGHT - SCREENHEIGHT * AspectMultiplier(aspect) / 48) / 2; + (SCREENHEIGHT - SCREENHEIGHT * AspectMultiplier(aspect) / 48) / 2;
} }
Displacement = 0; Displacement = 0;
} }
::ST_X = ST_X; gST_X = ST_X;
ST_SetNeedRefresh(); ST_SetNeedRefresh();
} }
@ -535,506 +535,6 @@ void DBaseStatusBar::ShowPlayerName ()
1.5f, 0.92f, 0, 0, color, 2.f, 0.35f), MAKE_ID('P','N','A','M')); 1.5f, 0.92f, 0, 0, color, 2.f, 0.35f), MAKE_ID('P','N','A','M'));
} }
//---------------------------------------------------------------------------
//
// PROC DrawImage
//
// Draws an image with the status bar's upper-left corner as the origin.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrawImage (FTexture *img,
int x, int y, FRemapTable *translation) const
{
if (img != NULL)
{
screen->DrawTexture (img, x + ST_X, y + ST_Y,
DTA_Translation, translation,
DTA_Bottom320x200, Scaled,
TAG_DONE);
}
}
//---------------------------------------------------------------------------
//
// PROC DrawImage
//
// Draws an optionally dimmed image with the status bar's upper-left corner
// as the origin.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrawDimImage (FTexture *img,
int x, int y, bool dimmed) const
{
if (img != NULL)
{
screen->DrawTexture (img, x + ST_X, y + ST_Y,
DTA_ColorOverlay, dimmed ? DIM_OVERLAY : 0,
DTA_Bottom320x200, Scaled,
TAG_DONE);
}
}
//---------------------------------------------------------------------------
//
// PROC DrawPartialImage
//
// Draws a portion of an image with the status bar's upper-left corner as
// the origin. The image should be the same size as the status bar.
// Used for Doom's status bar.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrawPartialImage (FTexture *img, int wx, int ww) const
{
if (img != NULL)
{
screen->DrawTexture (img, ST_X, ST_Y,
DTA_WindowLeft, wx,
DTA_WindowRight, wx + ww,
DTA_Bottom320x200, Scaled,
TAG_DONE);
}
}
//---------------------------------------------------------------------------
//
// PROC DrINumber
//
// Draws a three digit number.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrINumber (signed int val, int x, int y, int imgBase) const
{
int oldval;
if (val > 999)
val = 999;
oldval = val;
if (val < 0)
{
if (val < -9)
{
DrawImage (Images[imgLAME], x+1, y+1);
return;
}
val = -val;
DrawImage (Images[imgBase+val], x+18, y);
DrawImage (Images[imgNEGATIVE], x+9, y);
return;
}
if (val > 99)
{
DrawImage (Images[imgBase+val/100], x, y);
}
val = val % 100;
if (val > 9 || oldval > 99)
{
DrawImage (Images[imgBase+val/10], x+9, y);
}
val = val % 10;
DrawImage (Images[imgBase+val], x+18, y);
}
//---------------------------------------------------------------------------
//
// PROC DrBNumber
//
// Draws an x digit number using the big font.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrBNumber (signed int val, int x, int y, int size) const
{
bool neg;
int i, w;
int power;
FTexture *pic;
pic = Images[imgBNumbers];
w = (pic != NULL) ? pic->GetWidth() : 0;
if (val == 0)
{
if (pic != NULL)
{
DrawImage (pic, x - w, y);
}
return;
}
if ( (neg = val < 0) )
{
val = -val;
size--;
}
for (i = size-1, power = 10; i > 0; i--)
{
power *= 10;
}
if (val >= power)
{
val = power - 1;
}
while (val != 0 && size--)
{
x -= w;
pic = Images[imgBNumbers + val % 10];
val /= 10;
if (pic != NULL)
{
DrawImage (pic, x, y);
}
}
if (neg)
{
pic = Images[imgBNEGATIVE];
if (pic != NULL)
{
DrawImage (pic, x - w, y);
}
}
}
//---------------------------------------------------------------------------
//
// PROC DrSmallNumber
//
// Draws a small three digit number.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrSmallNumber (int val, int x, int y) const
{
int digit = 0;
if (val > 999)
{
val = 999;
}
if (val > 99)
{
digit = val / 100;
DrawImage (Images[imgSmNumbers + digit], x, y);
val -= digit * 100;
}
if (val > 9 || digit)
{
digit = val / 10;
DrawImage (Images[imgSmNumbers + digit], x+4, y);
val -= digit * 10;
}
DrawImage (Images[imgSmNumbers + val], x+8, y);
}
//---------------------------------------------------------------------------
//
// PROC DrINumberOuter
//
// Draws a number outside the status bar, possibly scaled.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrINumberOuter (signed int val, int x, int y, bool center, int w) const
{
bool negative = false;
x += w*2;
if (val < 0)
{
negative = true;
val = -val;
}
else if (val == 0)
{
screen->DrawTexture (Images[imgINumbers], x + 1, y + 1,
DTA_FillColor, 0, DTA_AlphaF, HR_SHADOW,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
screen->DrawTexture (Images[imgINumbers], x, y,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
return;
}
int oval = val;
int ox = x;
// First the shadow
while (val != 0)
{
screen->DrawTexture (Images[imgINumbers + val % 10], x + 1, y + 1,
DTA_FillColor, 0, DTA_AlphaF, HR_SHADOW,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
x -= w;
val /= 10;
}
if (negative)
{
screen->DrawTexture (Images[imgNEGATIVE], x + 1, y + 1,
DTA_FillColor, 0, DTA_AlphaF, HR_SHADOW,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
}
// Then the real deal
val = oval;
x = ox;
while (val != 0)
{
screen->DrawTexture (Images[imgINumbers + val % 10], x, y,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
x -= w;
val /= 10;
}
if (negative)
{
screen->DrawTexture (Images[imgNEGATIVE], x, y,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
}
}
//---------------------------------------------------------------------------
//
// PROC DrBNumberOuter
//
// Draws a three digit number using the big font outside the status bar.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrBNumberOuter (signed int val, int x, int y, int size) const
{
int xpos;
int w;
bool negative = false;
FTexture *pic;
pic = Images[imgBNumbers+3];
if (pic != NULL)
{
w = pic->GetWidth();
}
else
{
w = 0;
}
xpos = x + w/2 + (size-1)*w;
if (val == 0)
{
pic = Images[imgBNumbers];
if (pic != NULL)
{
screen->DrawTexture (pic, xpos - pic->GetWidth()/2 + 2, y + 2,
DTA_HUDRules, HUD_Normal,
DTA_AlphaF, HR_SHADOW,
DTA_FillColor, 0,
TAG_DONE);
screen->DrawTexture (pic, xpos - pic->GetWidth()/2, y,
DTA_HUDRules, HUD_Normal,
TAG_DONE);
}
return;
}
else if (val < 0)
{
negative = true;
val = -val;
}
int oval = val;
int oxpos = xpos;
// Draw shadow first
while (val != 0)
{
pic = Images[val % 10 + imgBNumbers];
if (pic != NULL)
{
screen->DrawTexture (pic, xpos - pic->GetWidth()/2 + 2, y + 2,
DTA_HUDRules, HUD_Normal,
DTA_AlphaF, HR_SHADOW,
DTA_FillColor, 0,
TAG_DONE);
}
val /= 10;
xpos -= w;
}
if (negative)
{
pic = Images[imgBNEGATIVE];
if (pic != NULL)
{
screen->DrawTexture (pic, xpos - pic->GetWidth()/2 + 2, y + 2,
DTA_HUDRules, HUD_Normal,
DTA_AlphaF, HR_SHADOW,
DTA_FillColor, 0,
TAG_DONE);
}
}
// Then draw the real thing
val = oval;
xpos = oxpos;
while (val != 0)
{
pic = Images[val % 10 + imgBNumbers];
if (pic != NULL)
{
screen->DrawTexture (pic, xpos - pic->GetWidth()/2, y,
DTA_HUDRules, HUD_Normal,
TAG_DONE);
}
val /= 10;
xpos -= w;
}
if (negative)
{
pic = Images[imgBNEGATIVE];
if (pic != NULL)
{
screen->DrawTexture (pic, xpos - pic->GetWidth()/2, y,
DTA_HUDRules, HUD_Normal,
TAG_DONE);
}
}
}
//---------------------------------------------------------------------------
//
// PROC DrBNumberOuter
//
// Draws a three digit number using the real big font outside the status bar.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrBNumberOuterFont (signed int val, int x, int y, int size) const
{
int xpos;
int w, v;
bool negative = false;
FTexture *pic;
w = 0;
BigFont->GetChar ('0', &w);
if (w > 1)
{
w--;
}
xpos = x + w/2 + (size-1)*w;
if (val == 0)
{
pic = BigFont->GetChar ('0', &v);
screen->DrawTexture (pic, xpos - v/2 + 2, y + 2,
DTA_HUDRules, HUD_Normal,
DTA_AlphaF, HR_SHADOW,
DTA_FillColor, 0,
DTA_Translation, BigFont->GetColorTranslation (CR_UNTRANSLATED),
TAG_DONE);
screen->DrawTexture (pic, xpos - v/2, y,
DTA_HUDRules, HUD_Normal,
DTA_Translation, BigFont->GetColorTranslation (CR_UNTRANSLATED),
TAG_DONE);
return;
}
else if (val < 0)
{
negative = true;
val = -val;
}
int oval = val;
int oxpos = xpos;
// First the shadow
while (val != 0)
{
pic = BigFont->GetChar ('0' + val % 10, &v);
screen->DrawTexture (pic, xpos - v/2 + 2, y + 2,
DTA_HUDRules, HUD_Normal,
DTA_AlphaF, HR_SHADOW,
DTA_FillColor, 0,
DTA_Translation, BigFont->GetColorTranslation (CR_UNTRANSLATED),
TAG_DONE);
val /= 10;
xpos -= w;
}
if (negative)
{
pic = BigFont->GetChar ('-', &v);
if (pic != NULL)
{
screen->DrawTexture (pic, xpos - v/2 + 2, y + 2,
DTA_HUDRules, HUD_Normal,
DTA_AlphaF, HR_SHADOW,
DTA_FillColor, 0,
DTA_Translation, BigFont->GetColorTranslation (CR_UNTRANSLATED),
TAG_DONE);
}
}
// Then the foreground number
val = oval;
xpos = oxpos;
while (val != 0)
{
pic = BigFont->GetChar ('0' + val % 10, &v);
screen->DrawTexture (pic, xpos - v/2, y,
DTA_HUDRules, HUD_Normal,
DTA_Translation, BigFont->GetColorTranslation (CR_UNTRANSLATED),
TAG_DONE);
val /= 10;
xpos -= w;
}
if (negative)
{
pic = BigFont->GetChar ('-', &v);
if (pic != NULL)
{
screen->DrawTexture (pic, xpos - v/2, y,
DTA_HUDRules, HUD_Normal,
DTA_Translation, BigFont->GetColorTranslation (CR_UNTRANSLATED),
TAG_DONE);
}
}
}
//---------------------------------------------------------------------------
//
// PROC DrSmallNumberOuter
//
// Draws a small three digit number outside the status bar.
//
//---------------------------------------------------------------------------
void DBaseStatusBar::DrSmallNumberOuter (int val, int x, int y, bool center) const
{
int digit = 0;
if (val > 999)
{
val = 999;
}
if (val > 99)
{
digit = val / 100;
screen->DrawTexture (Images[imgSmNumbers + digit], x, y,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
val -= digit * 100;
}
if (val > 9 || digit)
{
digit = val / 10;
screen->DrawTexture (Images[imgSmNumbers + digit], x+4, y,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
val -= digit * 10;
}
screen->DrawTexture (Images[imgSmNumbers + val], x+8, y,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// RefreshBackground // RefreshBackground
@ -1047,7 +547,7 @@ void DBaseStatusBar::RefreshBackground () const
float ratio = ActiveRatio (SCREENWIDTH, SCREENHEIGHT); float ratio = ActiveRatio (SCREENWIDTH, SCREENHEIGHT);
x = (ratio < 1.5f || !Scaled) ? ST_X : SCREENWIDTH*(48-AspectMultiplier(ratio))/(48*2); x = (ratio < 1.5f || !Scaled) ? ST_X : SCREENWIDTH*(48-AspectMultiplier(ratio))/(48*2);
y = x == ST_X && x > 0 ? ST_Y : ::ST_Y; y = x == ST_X && x > 0 ? ST_Y : gST_Y;
if(!CompleteBorder) if(!CompleteBorder)
{ {
@ -1255,21 +755,21 @@ void DBaseStatusBar::Draw (EHudState state)
vwidth = SCREENWIDTH; vwidth = SCREENWIDTH;
vheight = SCREENHEIGHT; vheight = SCREENHEIGHT;
xpos = vwidth - 80; xpos = vwidth - 80;
y = ::ST_Y - height; y = gST_Y - height;
} }
else if (active_con_scaletext() > 1) else if (active_con_scaletext() > 1)
{ {
vwidth = SCREENWIDTH / active_con_scaletext(); vwidth = SCREENWIDTH / active_con_scaletext();
vheight = SCREENHEIGHT / active_con_scaletext(); vheight = SCREENHEIGHT / active_con_scaletext();
xpos = vwidth - SmallFont->StringWidth("X: -00000")-6; xpos = vwidth - SmallFont->StringWidth("X: -00000")-6;
y = ::ST_Y/4 - height; y = gST_Y/4 - height;
} }
else else
{ {
vwidth = SCREENWIDTH/2; vwidth = SCREENWIDTH/2;
vheight = SCREENHEIGHT/2; vheight = SCREENHEIGHT/2;
xpos = vwidth - SmallFont->StringWidth("X: -00000")-6; xpos = vwidth - SmallFont->StringWidth("X: -00000")-6;
y = ::ST_Y/2 - height; y = gST_Y/2 - height;
} }
if (gameinfo.gametype == GAME_Strife) if (gameinfo.gametype == GAME_Strife)
@ -1325,7 +825,7 @@ void DBaseStatusBar::Draw (EHudState state)
} }
// Draw map name // Draw map name
y = ::ST_Y - height; y = gST_Y - height;
if (gameinfo.gametype == GAME_Heretic && SCREENWIDTH > 320 && !Scaled) if (gameinfo.gametype == GAME_Heretic && SCREENWIDTH > 320 && !Scaled)
{ {
y -= 8; y -= 8;
@ -1476,7 +976,7 @@ void DBaseStatusBar::SetMugShotState(const char *stateName, bool waitTillDone, b
void DBaseStatusBar::DrawBottomStuff (EHudState state) void DBaseStatusBar::DrawBottomStuff (EHudState state)
{ {
DrawMessages (HUDMSGLayer_UnderHUD, (state == HUD_StatusBar) ? ::ST_Y : SCREENHEIGHT); DrawMessages (HUDMSGLayer_UnderHUD, (state == HUD_StatusBar) ? gST_Y : SCREENHEIGHT);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -1498,9 +998,9 @@ void DBaseStatusBar::DrawTopStuff (EHudState state)
DrawPowerups (); DrawPowerups ();
if (automapactive && !viewactive) if (automapactive && !viewactive)
{ {
DrawMessages (HUDMSGLayer_OverMap, (state == HUD_StatusBar) ? ::ST_Y : SCREENHEIGHT); DrawMessages (HUDMSGLayer_OverMap, (state == HUD_StatusBar) ? gST_Y : SCREENHEIGHT);
} }
DrawMessages (HUDMSGLayer_OverHUD, (state == HUD_StatusBar) ? ::ST_Y : SCREENHEIGHT); DrawMessages (HUDMSGLayer_OverHUD, (state == HUD_StatusBar) ? gST_Y : SCREENHEIGHT);
DrawConsistancy (); DrawConsistancy ();
DrawWaiting (); DrawWaiting ();
if (ShowLog && MustDrawLog(state)) DrawLog (); if (ShowLog && MustDrawLog(state)) DrawLog ();

View file

@ -840,8 +840,225 @@ private:
int CurrentPop, PendingPop, PopHeight, PopHeightChange; int CurrentPop, PendingPop, PopHeight, PopHeightChange;
int KeyPopPos, KeyPopScroll; int KeyPopPos, KeyPopScroll;
double ItemFlash; double ItemFlash;
void DrINumberOuter(signed int val, int x, int y, bool center = false, int w = 9) const;
void DrBNumberOuterFont(signed int val, int x, int y, int w = 3) const;
void DrawDimImage(FTexture *image, int x, int y, bool dimmed) const;
void DrawImage(FTexture *image, int x, int y, FRemapTable *translation = NULL) const;
}; };
//---------------------------------------------------------------------------
//
// PROC DrINumberOuter
//
// Draws a number outside the status bar, possibly scaled.
//
//---------------------------------------------------------------------------
void DStrifeStatusBar::DrINumberOuter(signed int val, int x, int y, bool center, int w) const
{
bool negative = false;
x += w * 2;
if (val < 0)
{
negative = true;
val = -val;
}
else if (val == 0)
{
screen->DrawTexture(Images[imgINumbers], x + 1, y + 1,
DTA_FillColor, 0, DTA_AlphaF, HR_SHADOW,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
screen->DrawTexture(Images[imgINumbers], x, y,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
return;
}
int oval = val;
int ox = x;
// First the shadow
while (val != 0)
{
screen->DrawTexture(Images[imgINumbers + val % 10], x + 1, y + 1,
DTA_FillColor, 0, DTA_AlphaF, HR_SHADOW,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
x -= w;
val /= 10;
}
if (negative)
{
screen->DrawTexture(Images[imgNEGATIVE], x + 1, y + 1,
DTA_FillColor, 0, DTA_AlphaF, HR_SHADOW,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
}
// Then the real deal
val = oval;
x = ox;
while (val != 0)
{
screen->DrawTexture(Images[imgINumbers + val % 10], x, y,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
x -= w;
val /= 10;
}
if (negative)
{
screen->DrawTexture(Images[imgNEGATIVE], x, y,
DTA_HUDRules, center ? HUD_HorizCenter : HUD_Normal, TAG_DONE);
}
}
//---------------------------------------------------------------------------
//
// PROC DrBNumberOuter
//
// Draws a three digit number using the real big font outside the status bar.
//
//---------------------------------------------------------------------------
void DStrifeStatusBar::DrBNumberOuterFont(signed int val, int x, int y, int size) const
{
int xpos;
int w, v;
bool negative = false;
FTexture *pic;
w = 0;
BigFont->GetChar('0', &w);
if (w > 1)
{
w--;
}
xpos = x + w / 2 + (size - 1)*w;
if (val == 0)
{
pic = BigFont->GetChar('0', &v);
screen->DrawTexture(pic, xpos - v / 2 + 2, y + 2,
DTA_HUDRules, HUD_Normal,
DTA_AlphaF, HR_SHADOW,
DTA_FillColor, 0,
DTA_Translation, BigFont->GetColorTranslation(CR_UNTRANSLATED),
TAG_DONE);
screen->DrawTexture(pic, xpos - v / 2, y,
DTA_HUDRules, HUD_Normal,
DTA_Translation, BigFont->GetColorTranslation(CR_UNTRANSLATED),
TAG_DONE);
return;
}
else if (val < 0)
{
negative = true;
val = -val;
}
int oval = val;
int oxpos = xpos;
// First the shadow
while (val != 0)
{
pic = BigFont->GetChar('0' + val % 10, &v);
screen->DrawTexture(pic, xpos - v / 2 + 2, y + 2,
DTA_HUDRules, HUD_Normal,
DTA_AlphaF, HR_SHADOW,
DTA_FillColor, 0,
DTA_Translation, BigFont->GetColorTranslation(CR_UNTRANSLATED),
TAG_DONE);
val /= 10;
xpos -= w;
}
if (negative)
{
pic = BigFont->GetChar('-', &v);
if (pic != NULL)
{
screen->DrawTexture(pic, xpos - v / 2 + 2, y + 2,
DTA_HUDRules, HUD_Normal,
DTA_AlphaF, HR_SHADOW,
DTA_FillColor, 0,
DTA_Translation, BigFont->GetColorTranslation(CR_UNTRANSLATED),
TAG_DONE);
}
}
// Then the foreground number
val = oval;
xpos = oxpos;
while (val != 0)
{
pic = BigFont->GetChar('0' + val % 10, &v);
screen->DrawTexture(pic, xpos - v / 2, y,
DTA_HUDRules, HUD_Normal,
DTA_Translation, BigFont->GetColorTranslation(CR_UNTRANSLATED),
TAG_DONE);
val /= 10;
xpos -= w;
}
if (negative)
{
pic = BigFont->GetChar('-', &v);
if (pic != NULL)
{
screen->DrawTexture(pic, xpos - v / 2, y,
DTA_HUDRules, HUD_Normal,
DTA_Translation, BigFont->GetColorTranslation(CR_UNTRANSLATED),
TAG_DONE);
}
}
}
//---------------------------------------------------------------------------
//
// PROC DrawImage
//
// Draws an image with the status bar's upper-left corner as the origin.
//
//---------------------------------------------------------------------------
void DStrifeStatusBar::DrawImage(FTexture *img,
int x, int y, FRemapTable *translation) const
{
if (img != NULL)
{
screen->DrawTexture(img, x + ST_X, y + ST_Y,
DTA_Translation, translation,
DTA_Bottom320x200, Scaled,
TAG_DONE);
}
}
//---------------------------------------------------------------------------
//
// PROC DrawImage
//
// Draws an optionally dimmed image with the status bar's upper-left corner
// as the origin.
//
//---------------------------------------------------------------------------
void DStrifeStatusBar::DrawDimImage(FTexture *img,
int x, int y, bool dimmed) const
{
if (img != NULL)
{
screen->DrawTexture(img, x + ST_X, y + ST_Y,
DTA_ColorOverlay, dimmed ? DIM_OVERLAY : 0,
DTA_Bottom320x200, Scaled,
TAG_DONE);
}
}
IMPLEMENT_CLASS(DStrifeStatusBar, false, false); IMPLEMENT_CLASS(DStrifeStatusBar, false, false);
DBaseStatusBar *CreateStrifeStatusBar () DBaseStatusBar *CreateStrifeStatusBar ()

View file

@ -252,7 +252,7 @@ static void HU_DoDrawScores (player_t *player, player_t *sortedplayers[MAXPLAYER
lineheight = MAX(height, maxiconheight * CleanYfac); lineheight = MAX(height, maxiconheight * CleanYfac);
ypadding = (lineheight - height + 1) / 2; ypadding = (lineheight - height + 1) / 2;
bottom = ST_Y; bottom = gST_Y;
y = MAX(48*CleanYfac, (bottom - MAXPLAYERS * (height + CleanYfac + 1)) / 2); y = MAX(48*CleanYfac, (bottom - MAXPLAYERS * (height + CleanYfac + 1)) / 2);
HU_DrawTimeRemaining (bottom - height); HU_DrawTimeRemaining (bottom - height);

View file

@ -160,27 +160,23 @@ bool AStateProvider::CallStateChain (AActor *actor, FState *state)
// we don't care about), we pretend they return true, // we don't care about), we pretend they return true,
// thanks to the values set just above. // thanks to the values set just above.
if (proto->ReturnTypes.Size() == 1) if (proto->ReturnTypes.Size() >= 2 &&
{ proto->ReturnTypes[0] == TypeState &&
if (proto->ReturnTypes[0] == TypeState) (proto->ReturnTypes[1] == TypeSInt32 || proto->ReturnTypes[0] == TypeUInt32 || proto->ReturnTypes[1] == TypeBool))
{ // Function returns a state { // Function returns a state and an int or bool
wantret = &ret[0]; wantret = &ret[0];
retval = false; // this is a jump function which never affects the success state. numret = 2;
}
else if (proto->ReturnTypes[0] == TypeSInt32 || proto->ReturnTypes[0] == TypeBool)
{ // Function returns an int or bool
wantret = &ret[1];
}
numret = 1;
} }
else if (proto->ReturnTypes.Size() == 2) else if (proto->ReturnTypes.Size() == 1 && proto->ReturnTypes[0] == TypeState)
{ { // Function returns a state
if (proto->ReturnTypes[0] == TypeState && wantret = &ret[0];
(proto->ReturnTypes[1] == TypeSInt32 || proto->ReturnTypes[1] == TypeBool)) retval = false; // this is a jump function which never affects the success state.
{ // Function returns a state and an int or bool }
wantret = &ret[0]; else if (proto->ReturnTypes.Size() >= 1 &&
numret = 2; (proto->ReturnTypes[0] == TypeSInt32 || proto->ReturnTypes[0] == TypeUInt32 || proto->ReturnTypes[0] == TypeBool))
} { // Function returns an int or bool
wantret = &ret[1];
numret = 1;
} }
try try
{ {
@ -227,7 +223,7 @@ DEFINE_ACTION_FUNCTION(ACustomInventory, CallStateChain)
{ {
PARAM_SELF_PROLOGUE(AStateProvider); PARAM_SELF_PROLOGUE(AStateProvider);
PARAM_OBJECT(affectee, AActor); PARAM_OBJECT(affectee, AActor);
PARAM_STATE(state); PARAM_POINTER(state, FState);
ACTION_RETURN_BOOL(self->CallStateChain(affectee, state)); ACTION_RETURN_BOOL(self->CallStateChain(affectee, state));
} }
@ -1464,7 +1460,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SpawnProjectile)
int aimmode = flags & CMF_AIMMODE; int aimmode = flags & CMF_AIMMODE;
AActor * targ; AActor * targ;
AActor * missile; AActor * missile = nullptr;
if (ref != NULL || aimmode == 2) if (ref != NULL || aimmode == 2)
{ {
@ -1576,7 +1572,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SpawnProjectile)
if (self->SeeState != NULL && (self->health > 0 || !(self->flags3 & MF3_ISMONSTER))) if (self->SeeState != NULL && (self->health > 0 || !(self->flags3 & MF3_ISMONSTER)))
self->SetState(self->SeeState); self->SetState(self->SeeState);
} }
return 0; ACTION_RETURN_OBJECT(missile);
} }
//========================================================================== //==========================================================================
@ -1990,7 +1986,7 @@ DEFINE_ACTION_FUNCTION(AStateProvider, A_FireProjectile)
PARAM_ANGLE_DEF (pitch); PARAM_ANGLE_DEF (pitch);
if (!self->player) if (!self->player)
return 0; ACTION_RETURN_OBJECT(nullptr);
player_t *player = self->player; player_t *player = self->player;
AWeapon *weapon = player->ReadyWeapon; AWeapon *weapon = player->ReadyWeapon;
@ -2000,7 +1996,7 @@ DEFINE_ACTION_FUNCTION(AStateProvider, A_FireProjectile)
if (useammo && ACTION_CALL_FROM_PSPRITE() && weapon) if (useammo && ACTION_CALL_FROM_PSPRITE() && weapon)
{ {
if (!weapon->DepleteAmmo(weapon->bAltFire, true)) if (!weapon->DepleteAmmo(weapon->bAltFire, true))
return 0; // out of ammo ACTION_RETURN_OBJECT(nullptr); // out of ammo
} }
if (ti) if (ti)
@ -2032,8 +2028,9 @@ DEFINE_ACTION_FUNCTION(AStateProvider, A_FireProjectile)
misl->VelFromAngle(misl->VelXYToSpeed()); misl->VelFromAngle(misl->VelXYToSpeed());
} }
} }
ACTION_RETURN_OBJECT(misl);
} }
return 0; ACTION_RETURN_OBJECT(nullptr);
} }
@ -2861,17 +2858,21 @@ DEFINE_ACTION_FUNCTION(AActor, A_SpawnItem)
PARAM_FLOAT_DEF (distance) PARAM_FLOAT_DEF (distance)
PARAM_FLOAT_DEF (zheight) PARAM_FLOAT_DEF (zheight)
PARAM_BOOL_DEF (useammo) PARAM_BOOL_DEF (useammo)
PARAM_BOOL_DEF (transfer_translation) PARAM_BOOL_DEF (transfer_translation);
if (numret > 1) ret[1].SetPointer(nullptr, ATAG_OBJECT);
if (missile == NULL) if (missile == NULL)
{ {
ACTION_RETURN_BOOL(false); if (numret > 0) ret[0].SetInt(false);
return MIN(numret, 2);
} }
// Don't spawn monsters if this actor has been massacred // Don't spawn monsters if this actor has been massacred
if (self->DamageType == NAME_Massacre && (GetDefaultByType(missile)->flags3 & MF3_ISMONSTER)) if (self->DamageType == NAME_Massacre && (GetDefaultByType(missile)->flags3 & MF3_ISMONSTER))
{ {
ACTION_RETURN_BOOL(true); if (numret > 0) ret[0].SetInt(true);
return MIN(numret, 2);
} }
if (ACTION_CALL_FROM_PSPRITE()) if (ACTION_CALL_FROM_PSPRITE())
@ -2881,18 +2882,24 @@ DEFINE_ACTION_FUNCTION(AActor, A_SpawnItem)
if (weapon == NULL) if (weapon == NULL)
{ {
ACTION_RETURN_BOOL(true); if (numret > 0) ret[0].SetInt(true);
return MIN(numret, 2);
} }
if (useammo && !weapon->DepleteAmmo(weapon->bAltFire)) if (useammo && !weapon->DepleteAmmo(weapon->bAltFire))
{ {
ACTION_RETURN_BOOL(true); if (numret > 0) ret[0].SetInt(true);
return MIN(numret, 2);
} }
} }
AActor *mo = Spawn( missile, self->Vec3Angle(distance, self->Angles.Yaw, -self->Floorclip + self->GetBobOffset() + zheight), ALLOW_REPLACE); AActor *mo = Spawn( missile, self->Vec3Angle(distance, self->Angles.Yaw, -self->Floorclip + self->GetBobOffset() + zheight), ALLOW_REPLACE);
int flags = (transfer_translation ? SIXF_TRANSFERTRANSLATION : 0) + (useammo ? SIXF_SETMASTER : 0); int flags = (transfer_translation ? SIXF_TRANSFERTRANSLATION : 0) + (useammo ? SIXF_SETMASTER : 0);
ACTION_RETURN_BOOL(InitSpawnedItem(self, mo, flags)); // for an inventory item's use state bool res = InitSpawnedItem(self, mo, flags); // for an inventory item's use state
if (numret > 0) ret[0].SetInt(res);
if (numret > 1) ret[1].SetPointer(mo, ATAG_OBJECT);
return MIN(numret, 2);
} }
//=========================================================================== //===========================================================================
@ -2917,18 +2924,23 @@ DEFINE_ACTION_FUNCTION(AActor, A_SpawnItemEx)
PARAM_INT_DEF (chance) PARAM_INT_DEF (chance)
PARAM_INT_DEF (tid) PARAM_INT_DEF (tid)
if (numret > 1) ret[1].SetPointer(nullptr, ATAG_OBJECT);
if (missile == NULL) if (missile == NULL)
{ {
ACTION_RETURN_BOOL(false); if (numret > 0) ret[0].SetInt(false);
return MIN(numret, 2);
} }
if (chance > 0 && pr_spawnitemex() < chance) if (chance > 0 && pr_spawnitemex() < chance)
{ {
ACTION_RETURN_BOOL(true); if (numret > 0) ret[0].SetInt(true);
return MIN(numret, 2);
} }
// Don't spawn monsters if this actor has been massacred // Don't spawn monsters if this actor has been massacred
if (self->DamageType == NAME_Massacre && (GetDefaultByType(missile)->flags3 & MF3_ISMONSTER)) if (self->DamageType == NAME_Massacre && (GetDefaultByType(missile)->flags3 & MF3_ISMONSTER))
{ {
ACTION_RETURN_BOOL(true); if (numret > 0) ret[0].SetInt(true);
return MIN(numret, 2);
} }
DVector2 pos; DVector2 pos;
@ -2976,7 +2988,9 @@ DEFINE_ACTION_FUNCTION(AActor, A_SpawnItemEx)
} }
mo->Angles.Yaw = angle; mo->Angles.Yaw = angle;
} }
ACTION_RETURN_BOOL(res); // for an inventory item's use state if (numret > 0) ret[0].SetInt(res);
if (numret > 1) ret[1].SetPointer(mo, ATAG_OBJECT);
return MIN(numret, 2);
} }
//=========================================================================== //===========================================================================
@ -2995,9 +3009,12 @@ DEFINE_ACTION_FUNCTION(AActor, A_ThrowGrenade)
PARAM_FLOAT_DEF (zvel) PARAM_FLOAT_DEF (zvel)
PARAM_BOOL_DEF (useammo) PARAM_BOOL_DEF (useammo)
if (numret > 1) ret[1].SetPointer(nullptr, ATAG_OBJECT);
if (missile == NULL) if (missile == NULL)
{ {
ACTION_RETURN_BOOL(true); if (numret > 0) ret[0].SetInt(false);
return MIN(numret, 2);
} }
if (ACTION_CALL_FROM_PSPRITE()) if (ACTION_CALL_FROM_PSPRITE())
{ {
@ -3006,11 +3023,13 @@ DEFINE_ACTION_FUNCTION(AActor, A_ThrowGrenade)
if (weapon == NULL) if (weapon == NULL)
{ {
ACTION_RETURN_BOOL(true); if (numret > 0) ret[0].SetInt(true);
return MIN(numret, 2);
} }
if (useammo && !weapon->DepleteAmmo(weapon->bAltFire)) if (useammo && !weapon->DepleteAmmo(weapon->bAltFire))
{ {
ACTION_RETURN_BOOL(true); if (numret > 0) ret[0].SetInt(true);
return MIN(numret, 2);
} }
} }
@ -3049,13 +3068,17 @@ DEFINE_ACTION_FUNCTION(AActor, A_ThrowGrenade)
bo->Vel.Z = xy_velz + z_velz; bo->Vel.Z = xy_velz + z_velz;
bo->target = self; bo->target = self;
P_CheckMissileSpawn (bo, self->radius); if (!P_CheckMissileSpawn(bo, self->radius)) bo = nullptr;
if (numret > 0) ret[0].SetInt(true);
if (numret > 1) ret[1].SetPointer(bo, ATAG_OBJECT);
return MIN(numret, 2);
} }
else else
{ {
ACTION_RETURN_BOOL(false); if (numret > 0) ret[0].SetInt(false);
return MIN(numret, 2);
} }
ACTION_RETURN_BOOL(true);
} }

View file

@ -920,11 +920,11 @@ bool AActor::TakeInventory(PClassActor *itemclass, int amount, bool fromdecorate
DEFINE_ACTION_FUNCTION(AActor, TakeInventory) DEFINE_ACTION_FUNCTION(AActor, TakeInventory)
{ {
PARAM_SELF_PROLOGUE(AActor); PARAM_SELF_PROLOGUE(AActor);
PARAM_OBJECT_NOT_NULL(item, AInventory); PARAM_CLASS_NOT_NULL(item, AInventory);
PARAM_INT(amount); PARAM_INT(amount);
PARAM_BOOL_DEF(fromdecorate); PARAM_BOOL_DEF(fromdecorate);
PARAM_BOOL_DEF(notakeinfinite); PARAM_BOOL_DEF(notakeinfinite);
self->RemoveInventory(item); self->TakeInventory(item, amount, fromdecorate, notakeinfinite);
return 0; return 0;
} }

View file

@ -267,13 +267,13 @@ void R_ExecuteSetViewSize ()
setsizeneeded = false; setsizeneeded = false;
V_SetBorderNeedRefresh(); V_SetBorderNeedRefresh();
R_SetWindow (setblocks, SCREENWIDTH, SCREENHEIGHT, ST_Y); R_SetWindow (setblocks, SCREENWIDTH, SCREENHEIGHT, gST_Y);
// Handle resize, e.g. smaller view windows with border and/or status bar. // Handle resize, e.g. smaller view windows with border and/or status bar.
viewwindowx = (screen->GetWidth() - viewwidth) >> 1; viewwindowx = (screen->GetWidth() - viewwidth) >> 1;
// Same with base row offset. // Same with base row offset.
viewwindowy = (viewwidth == screen->GetWidth()) ? 0 : (ST_Y - viewheight) >> 1; viewwindowy = (viewwidth == screen->GetWidth()) ? 0 : (gST_Y - viewheight) >> 1;
} }
//========================================================================== //==========================================================================

View file

@ -1148,7 +1148,6 @@ struct AFuncDesc
class AActor; class AActor;
#define ACTION_RETURN_STATE(v) do { FState *state = v; if (numret > 0) { assert(ret != NULL); ret->SetPointer(state, ATAG_STATE); return 1; } return 0; } while(0) #define ACTION_RETURN_STATE(v) do { FState *state = v; if (numret > 0) { assert(ret != NULL); ret->SetPointer(state, ATAG_STATE); return 1; } return 0; } while(0)
#define ACTION_RETURN_POINTER(v) do { void *state = v; if (numret > 0) { assert(ret != NULL); ret->SetPointer(state, ATAG_GENERIC); return 1; } return 0; } while(0) #define ACTION_RETURN_POINTER(v) do { void *state = v; if (numret > 0) { assert(ret != NULL); ret->SetPointer(state, ATAG_GENERIC); return 1; } return 0; } while(0)
#define ACTION_RETURN_OBJECT(v) do { auto state = v; if (numret > 0) { assert(ret != NULL); ret->SetPointer(state, ATAG_OBJECT); return 1; } return 0; } while(0) #define ACTION_RETURN_OBJECT(v) do { auto state = v; if (numret > 0) { assert(ret != NULL); ret->SetPointer(state, ATAG_OBJECT); return 1; } return 0; } while(0)

View file

@ -26,8 +26,8 @@
struct event_t; struct event_t;
extern int ST_X; extern int gST_X;
extern int ST_Y; extern int gST_Y;
bool ST_Responder(event_t* ev); bool ST_Responder(event_t* ev);

View file

@ -1716,10 +1716,10 @@ static void V_DrawViewBorder (void)
V_DrawBorder (0, 0, SCREENWIDTH, viewwindowy); V_DrawBorder (0, 0, SCREENWIDTH, viewwindowy);
V_DrawBorder (0, viewwindowy, viewwindowx, viewheight + viewwindowy); V_DrawBorder (0, viewwindowy, viewwindowx, viewheight + viewwindowy);
V_DrawBorder (viewwindowx + viewwidth, viewwindowy, SCREENWIDTH, viewheight + viewwindowy); V_DrawBorder (viewwindowx + viewwidth, viewwindowy, SCREENWIDTH, viewheight + viewwindowy);
V_DrawBorder (0, viewwindowy + viewheight, SCREENWIDTH, ST_Y); V_DrawBorder (0, viewwindowy + viewheight, SCREENWIDTH, gST_Y);
V_DrawFrame (viewwindowx, viewwindowy, viewwidth, viewheight); V_DrawFrame (viewwindowx, viewwindowy, viewwidth, viewheight);
V_MarkRect (0, 0, SCREENWIDTH, ST_Y); V_MarkRect (0, 0, SCREENWIDTH, gST_Y);
} }
//========================================================================== //==========================================================================

View file

@ -757,14 +757,14 @@ class Actor : Thinker native
deprecated native void A_StopSoundEx(name slot); deprecated native void A_StopSoundEx(name slot);
native void A_SeekerMissile(int threshold, int turnmax, int flags = 0, int chance = 50, int distance = 10); native void A_SeekerMissile(int threshold, int turnmax, int flags = 0, int chance = 50, int distance = 10);
native action state A_Jump(int chance, statelabel label, ...); native action state A_Jump(int chance, statelabel label, ...);
native void A_SpawnProjectile(class<Actor> missiletype, double spawnheight = 32, double spawnofs_xy = 0, double angle = 0, int flags = 0, double pitch = 0, int ptr = AAPTR_TARGET); native Actor A_SpawnProjectile(class<Actor> missiletype, double spawnheight = 32, double spawnofs_xy = 0, double angle = 0, int flags = 0, double pitch = 0, int ptr = AAPTR_TARGET);
native void A_CustomBulletAttack(double spread_xy, double spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", double range = 0, int flags = 0, int ptr = AAPTR_TARGET, class<Actor> missile = null, double Spawnheight = 32, double Spawnofs_xy = 0); native void A_CustomBulletAttack(double spread_xy, double spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", double range = 0, int flags = 0, int ptr = AAPTR_TARGET, class<Actor> missile = null, double Spawnheight = 32, double Spawnofs_xy = 0);
native void A_CustomRailgun(int damage, int spawnofs_xy = 0, color color1 = 0, color color2 = 0, int flags = 0, int aim = 0, double maxdiff = 0, class<Actor> pufftype = "BulletPuff", double spread_xy = 0, double spread_z = 0, double range = 0, int duration = 0, double sparsity = 1.0, double driftspeed = 1.0, class<Actor> spawnclass = null, double spawnofs_z = 0, int spiraloffset = 270, int limit = 0, double veleffect = 3); native void A_CustomRailgun(int damage, int spawnofs_xy = 0, color color1 = 0, color color2 = 0, int flags = 0, int aim = 0, double maxdiff = 0, class<Actor> pufftype = "BulletPuff", double spread_xy = 0, double spread_z = 0, double range = 0, int duration = 0, double sparsity = 1.0, double driftspeed = 1.0, class<Actor> spawnclass = null, double spawnofs_z = 0, int spiraloffset = 270, int limit = 0, double veleffect = 3);
native bool A_SetInventory(class<Inventory> itemtype, int amount, int ptr = AAPTR_DEFAULT, bool beyondMax = false); native bool A_SetInventory(class<Inventory> itemtype, int amount, int ptr = AAPTR_DEFAULT, bool beyondMax = false);
native bool A_GiveInventory(class<Inventory> itemtype, int amount = 0, int giveto = AAPTR_DEFAULT); native bool A_GiveInventory(class<Inventory> itemtype, int amount = 0, int giveto = AAPTR_DEFAULT);
native bool A_TakeInventory(class<Inventory> itemtype, int amount = 0, int flags = 0, int giveto = AAPTR_DEFAULT); native bool A_TakeInventory(class<Inventory> itemtype, int amount = 0, int flags = 0, int giveto = AAPTR_DEFAULT);
action native bool A_SpawnItem(class<Actor> itemtype = "Unknown", double distance = 0, double zheight = 0, bool useammo = true, bool transfer_translation = false); action native bool, Actor A_SpawnItem(class<Actor> itemtype = "Unknown", double distance = 0, double zheight = 0, bool useammo = true, bool transfer_translation = false);
native bool A_SpawnItemEx(class<Actor> itemtype, double xofs = 0, double yofs = 0, double zofs = 0, double xvel = 0, double yvel = 0, double zvel = 0, double angle = 0, int flags = 0, int failchance = 0, int tid=0); native bool, Actor A_SpawnItemEx(class<Actor> itemtype, double xofs = 0, double yofs = 0, double zofs = 0, double xvel = 0, double yvel = 0, double zvel = 0, double angle = 0, int flags = 0, int failchance = 0, int tid=0);
native void A_Print(string whattoprint, double time = 0, name fontname = "none"); native void A_Print(string whattoprint, double time = 0, name fontname = "none");
native void A_PrintBold(string whattoprint, double time = 0, name fontname = "none"); native void A_PrintBold(string whattoprint, double time = 0, name fontname = "none");
native void A_Log(string whattoprint, bool local = false); native void A_Log(string whattoprint, bool local = false);
@ -786,7 +786,7 @@ class Actor : Thinker native
native void A_RaiseChildren(bool copy = 0); native void A_RaiseChildren(bool copy = 0);
native void A_RaiseSiblings(bool copy = 0); native void A_RaiseSiblings(bool copy = 0);
deprecated native void A_BasicAttack(int meleedamage, sound meleesound, class<actor> missiletype, double missileheight); deprecated native void A_BasicAttack(int meleedamage, sound meleesound, class<actor> missiletype, double missileheight);
action native bool A_ThrowGrenade(class<Actor> itemtype, double zheight = 0, double xyvel = 0, double zvel = 0, bool useammo = true); action native bool, Actor A_ThrowGrenade(class<Actor> itemtype, double zheight = 0, double xyvel = 0, double zvel = 0, bool useammo = true);
native void A_Weave(int xspeed, int yspeed, double xdist, double ydist); native void A_Weave(int xspeed, int yspeed, double xdist, double ydist);

View file

@ -4,13 +4,18 @@ class StateProvider : Inventory native
action native state A_JumpIfNoAmmo(statelabel label); action native state A_JumpIfNoAmmo(statelabel label);
action native void A_CustomPunch(int damage, bool norandom = false, int flags = CPF_USEAMMO, class<Actor> pufftype = "BulletPuff", double range = 0, double lifesteal = 0, int lifestealmax = 0, class<BasicArmorBonus> armorbonustype = "ArmorBonus", sound MeleeSound = 0, sound MissSound = ""); action native void A_CustomPunch(int damage, bool norandom = false, int flags = CPF_USEAMMO, class<Actor> pufftype = "BulletPuff", double range = 0, double lifesteal = 0, int lifestealmax = 0, class<BasicArmorBonus> armorbonustype = "ArmorBonus", sound MeleeSound = 0, sound MissSound = "");
action native void A_FireBullets(double spread_xy, double spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", int flags = 1, double range = 0, class<Actor> missile = null, double Spawnheight = 32, double Spawnofs_xy = 0); action native void A_FireBullets(double spread_xy, double spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", int flags = 1, double range = 0, class<Actor> missile = null, double Spawnheight = 32, double Spawnofs_xy = 0);
action native void A_FireProjectile(class<Actor> missiletype, double angle = 0, bool useammo = true, double spawnofs_xy = 0, double spawnheight = 0, int flags = 0, double pitch = 0); action native Actor A_FireProjectile(class<Actor> missiletype, double angle = 0, bool useammo = true, double spawnofs_xy = 0, double spawnheight = 0, int flags = 0, double pitch = 0);
action native void A_RailAttack(int damage, int spawnofs_xy = 0, bool useammo = true, color color1 = 0, color color2 = 0, int flags = 0, double maxdiff = 0, class<Actor> pufftype = "BulletPuff", double spread_xy = 0, double spread_z = 0, double range = 0, int duration = 0, double sparsity = 1.0, double driftspeed = 1.0, class<Actor> spawnclass = "none", double spawnofs_z = 0, int spiraloffset = 270, int limit = 0); action native void A_RailAttack(int damage, int spawnofs_xy = 0, bool useammo = true, color color1 = 0, color color2 = 0, int flags = 0, double maxdiff = 0, class<Actor> pufftype = "BulletPuff", double spread_xy = 0, double spread_z = 0, double range = 0, int duration = 0, double sparsity = 1.0, double driftspeed = 1.0, class<Actor> spawnclass = "none", double spawnofs_z = 0, int spiraloffset = 270, int limit = 0);
action native void A_WeaponReady(int flags = 0); action native void A_WeaponReady(int flags = 0);
action native void A_ReFire(statelabel flash = null); action native void A_ReFire(statelabel flash = null);
action native state A_CheckForReload(int counter, statelabel label, bool dontincrement = false); action native state A_CheckForReload(int counter, statelabel label, bool dontincrement = false);
action native void A_ResetReloadCounter(); action native void A_ResetReloadCounter();
action void A_ClearReFire()
{
if (NULL != player) player.refire = 0;
}
} }
class CustomInventory : StateProvider class CustomInventory : StateProvider
@ -25,12 +30,6 @@ class CustomInventory : StateProvider
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
action void A_ClearReFire()
{
if (NULL != player) player.refire = 0;
}
// This is only here, because these functions were originally exported on Inventory, despite only working for weapons, so this is here to satisfy some potential old mods having called it through CustomInventory. // This is only here, because these functions were originally exported on Inventory, despite only working for weapons, so this is here to satisfy some potential old mods having called it through CustomInventory.
deprecated action void A_GunFlash(statelabel flash = null, int flags = 0) {} deprecated action void A_GunFlash(statelabel flash = null, int flags = 0) {}
deprecated action void A_Lower() {} deprecated action void A_Lower() {}
@ -80,5 +79,4 @@ class CustomInventory : StateProvider
} }
return useok; return useok;
} }
} }

View file

@ -479,7 +479,7 @@ object ShortBlueTorch
// Burning barrel // Burning barrel
flickerlight2 FIREBARREL flickerlight2 FIREBARREL
{ {
color 1.0 0.9 0.4 color 0.6 0.6 0.9
size 72 size 72
secondarySize 81 secondarySize 81
interval 0.1 interval 0.1