- scriptified SW's status bar.

Not tested yet. This just compiles without errors.
This commit is contained in:
Christoph Oelckers 2021-05-16 09:34:08 +02:00
parent a346c141eb
commit 8d8b3cda46
11 changed files with 1467 additions and 17 deletions

View File

@ -829,10 +829,10 @@ void CreateStatusBar()
StatusBar->SetSize(0, 320, 200);
InitStatusBar();
// this is for comparing the scriptification with the C++ versions
//stbarclass = PClass::FindClass("NativeExhumedStatusBar");
//StatusBar2 = static_cast<DBaseStatusBar*>(stbarclass->CreateNew());
//StatusBar2->SetSize(0, 320, 200);
//StatusBar2->Release();
stbarclass = PClass::FindClass("NativeSWStatusBar");
StatusBar2 = static_cast<DBaseStatusBar*>(stbarclass->CreateNew());
StatusBar2->SetSize(0, 320, 200);
StatusBar2->Release();
}

View File

@ -976,7 +976,7 @@ struct PLAYERstruct
char cookieQuote[256]; // Should be an FString but must be POD for now so that PLAYER remains POD.
int cookieTime;
char WpnReloadState;
uint8_t WpnReloadState;
};
extern PLAYER Player[MAX_SW_PLAYERS_REG+1];

View File

@ -49,9 +49,12 @@ typedef struct
extern INVENTORY_DATA InventoryData[MAX_INVENTORY+1];
#define INVF_AUTO_USE (BIT(0))
#define INVF_TIMED (BIT(1))
#define INVF_COUNT (BIT(2))
enum EInvFlags
{
INVF_AUTO_USE = 1,
INVF_TIMED = 2,
INVF_COUNT = 4
};
void PlayerUpdateInventory(PLAYERp pp,short InventoryNum);
void InventoryKeys(PLAYERp pp);

View File

@ -216,3 +216,85 @@ x(BONUS_GRAB08, 5159)
x(BONUS_GRAB09, 5160)
x(TITLE_PIC, 2324)
x(PanelMedkit, 2396)
x(PanelRepairKit, 2399)
x(PanelCloak, 2397)
x(PanelNightVision, 2398)
x(PanelChemBomb, 2407)
x(PanelFlashBomb, 2408)
x(PanelCaltrops, 2409)
x(PANEL_FONT_G0, 3636)
x(PANEL_FONT_G1, 3637)
x(PANEL_FONT_G2, 3638)
x(PANEL_FONT_G3, 3639)
x(PANEL_FONT_G4, 3640)
x(PANEL_FONT_G5, 3641)
x(PANEL_FONT_G6, 3642)
x(PANEL_FONT_G7, 3643)
x(PANEL_FONT_G8, 3644)
x(PANEL_FONT_G9, 3645)
x(PANEL_SM_FONT_G0, 3601)
x(PANEL_SM_FONT_G1, 3602)
x(PANEL_SM_FONT_G2, 3603)
x(PANEL_SM_FONT_G3, 3604)
x(PANEL_SM_FONT_G4, 3605)
x(PANEL_SM_FONT_G5, 3606)
x(PANEL_SM_FONT_G6, 3607)
x(PANEL_SM_FONT_G7, 3608)
x(PANEL_SM_FONT_G8, 3609)
x(PANEL_SM_FONT_G9, 3610)
x(PANEL_SM_FONT_G10, 3611)
x(PANEL_SM_FONT_G11, 3612)
x(PANEL_SM_FONT_Y0, 3613)
x(PANEL_SM_FONT_Y1, 3614)
x(PANEL_SM_FONT_Y2, 3615)
x(PANEL_SM_FONT_Y3, 3616)
x(PANEL_SM_FONT_Y4, 3617)
x(PANEL_SM_FONT_Y5, 3618)
x(PANEL_SM_FONT_Y6, 3619)
x(PANEL_SM_FONT_Y7, 3620)
x(PANEL_SM_FONT_Y8, 3621)
x(PANEL_SM_FONT_Y9, 3622)
x(PANEL_SM_FONT_Y10, 3623)
x(PANEL_SM_FONT_Y11, 3624)
x(PANEL_SM_FONT_R0, 3625)
x(PANEL_SM_FONT_R1, 3626)
x(PANEL_SM_FONT_R2, 3627)
x(PANEL_SM_FONT_R3, 3628)
x(PANEL_SM_FONT_R4, 3629)
x(PANEL_SM_FONT_R5, 3630)
x(PANEL_SM_FONT_R6, 3631)
x(PANEL_SM_FONT_R7, 3632)
x(PANEL_SM_FONT_R8, 3633)
x(PANEL_SM_FONT_R9, 3634)
x(PANEL_SM_FONT_R10, 3635)
x(PANEL_SM_FONT_R11, 3636)
x(PANEL_KEY_RED, 2392)
x(PANEL_KEY_GREEN, 2393)
x(PANEL_KEY_BLUE, 2394)
x(PANEL_KEY_YELLOW, 2395)
x(PANEL_SKELKEY_GOLD, 2448)
x(PANEL_SKELKEY_SILVER, 2449)
x(PANEL_SKELKEY_BRONZE, 2458)
x(PANEL_SKELKEY_RED, 2459)
x(MINI_BAR_HEALTH_BOX_PIC, 2437)
x(MINI_BAR_AMMO_BOX_PIC, 2437)
x(MINI_BAR_INVENTORY_BOX_PIC, 2438)
x(SelectionBox, 2435)
x(FRAG_BAR, 2920)
x(COMPASS_TIC, 2380)
x(COMPASS_TIC2, 2381)
x(COMPASS_NORTH, 2382)
x(COMPASS_NORTH2, 2383)
x(COMPASS_SOUTH, 2384)
x(COMPASS_SOUTH2, 2385)
x(COMPASS_EAST, 2386)
x(COMPASS_EAST2, 2387)
x(COMPASS_WEST, 2388)
x(COMPASS_WEST2, 2389)
x(COMPASS_MID_TIC, 2390)
x(COMPASS_MID_TIC2, 2391)

View File

@ -33,8 +33,6 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
BEGIN_SW_NS
#define FRAG_BAR 2920
#define PRI_FRONT_MAX 250
#define PRI_FRONT 192
#define PRI_MID 128

View File

@ -55,6 +55,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
#include "raze_music.h"
#include "v_draw.h"
#include "gamestate.h"
#include "vm.h"
BEGIN_SW_NS
@ -7597,4 +7598,174 @@ saveable_module saveable_player =
saveable_player_data,
SIZ(saveable_player_data)
};
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, sop_remote)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, jump_count)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, jump_speed)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, down_speed)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, up_speed)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, z_speed)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, oz_speed)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, climb_ndx)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, hiz)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, loz)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, ceiling_dist)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, floor_dist)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, circle_camera_dist)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, six)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, siy)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, siz)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, siang)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, xvect)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, yvect)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, oxvect)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, oyvect)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, friction)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, slide_xvect)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, slide_yvect)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, slide_ang)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, slide_dec)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, drive_avel)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, view_outside_dang)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, circle_camera_ang)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, camera_check_time_delay)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, cursectnum)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, lastcursectnum)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, turn180_target)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, hvel)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, tilt)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, tilt_dest)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, recoil_amt)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, recoil_speed)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, recoil_ndx)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, recoil_horizoff)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, oldposx)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, oldposy)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, oldposz)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, RevolveX)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, RevolveY)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, RevolveDeltaAng)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, pnum)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, LadderSector)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, lx)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, ly)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, JumpDuration)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WadeDepth)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, bob_amt)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, bob_ndx)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, bcnt)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, bob_z)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, obob_z)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, playerreadyflag)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, Flags)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, Flags2)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, HasKey)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, SwordAng)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnGotOnceFlags)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnFlags)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnAmmo)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnNum)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnRocketType)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnRocketHeat)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnRocketNuke)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnFlameType)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnFirstType)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WeaponType)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, FirePause)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, InventoryNum)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, InventoryBarTics)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, InventoryTics)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, InventoryPercent)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, InventoryAmount)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, InventoryActive)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, DiveTics)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, DiveDamageTics)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, DeathType)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, Kills)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, SecretsFound)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, Armor)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, MaxHealth)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, UziShellLeftAlt)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, UziShellRightAlt)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, TeamColor)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, FadeTics)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, FadeAmt)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, NightVision)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, StartColor)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, IsAI)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, fta)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, ftq)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, NumFootPrints)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnUziType)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnShotgunType)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnShotgunAuto)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnShotgunLastShell)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnRailType)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, Bloody)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, InitingNuke)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, TestNukeInit)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, NukeInitialized)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, FistAng)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnKungFuMove)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, HitBy)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, Reverb)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, Heads)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, PlayerVersion)
DEFINE_FIELD_X(SWPlayer, PLAYERstruct, WpnReloadState)
DEFINE_ACTION_FUNCTION(_SWPlayer, WeaponNum)
{
PARAM_SELF_STRUCT_PROLOGUE(PLAYERstruct);
USERp uu = User[self->PlayerSprite].Data();
ACTION_RETURN_INT(uu->WeaponNum);
}
DEFINE_ACTION_FUNCTION(_SWPlayer, Health)
{
PARAM_SELF_STRUCT_PROLOGUE(PLAYERstruct);
USERp uu = User[self->PlayerSprite].Data();
ACTION_RETURN_INT(uu->Health);
}
DEFINE_ACTION_FUNCTION(_SWPlayer, MaxUserHealth)
{
PARAM_SELF_STRUCT_PROLOGUE(PLAYERstruct);
USERp uu = User[self->PlayerSprite].Data();
ACTION_RETURN_INT(uu->MaxHealth);
}
DEFINE_ACTION_FUNCTION(_SWPlayer, GetBuildAngle)
{
PARAM_SELF_STRUCT_PROLOGUE(PLAYERstruct);
ACTION_RETURN_INT(self->angle.ang.asbuild());
}
DEFINE_ACTION_FUNCTION(_SW, WeaponMaxAmmo)
{
PARAM_PROLOGUE;
PARAM_INT(wp);
ACTION_RETURN_INT(DamageData[wp].max_ammo);
}
DEFINE_ACTION_FUNCTION(_SW, InventoryFlags)
{
PARAM_PROLOGUE;
PARAM_INT(inv);
INVENTORY_DATAp id = &InventoryData[inv];
ACTION_RETURN_INT(id->Flags);
}
DEFINE_ACTION_FUNCTION(_SW, GetViewPlayer)
{
PARAM_PROLOGUE;
ACTION_RETURN_POINTER(&Player[screenpeek]);
}
DEFINE_ACTION_FUNCTION(_SW, RealWeapon)
{
PARAM_PROLOGUE;
PARAM_INT(inv);
ACTION_RETURN_INT(DamageData[inv].with_weapon);
}
END_SW_NS

View File

@ -67,9 +67,9 @@ static const short icons[] = {
ID_PanelCaltrops,
};
class DSWStatusBar : public DBaseStatusBar
class DNativeSWStatusBar : public DBaseStatusBar
{
DECLARE_CLASS(DSWStatusBar, DBaseStatusBar)
DECLARE_CLASS(DNativeSWStatusBar, DBaseStatusBar)
HAS_OBJECT_POINTERS
TObjPtr<DHUDFont*> miniFont, numberFont;
@ -148,7 +148,7 @@ class DSWStatusBar : public DBaseStatusBar
public:
DSWStatusBar()
DNativeSWStatusBar()
{
numberFont = Create<DHUDFont>( BigFont, 0, Off, 1, 1 );
miniFont = Create<DHUDFont>(SmallFont2, 0, Off, 1, 1 );
@ -716,7 +716,7 @@ private:
//
//---------------------------------------------------------------------------
bool DoReloadStatus(char *reloadstate, int ammo)
bool DoReloadStatus(uint8_t *reloadstate, int ammo)
{
bool reloading = ammo == 0 && *reloadstate != 2;
@ -1038,8 +1038,8 @@ public:
};
IMPLEMENT_CLASS(DSWStatusBar, false, true)
IMPLEMENT_POINTERS_START(DSWStatusBar)
IMPLEMENT_CLASS(DNativeSWStatusBar, false, true)
IMPLEMENT_POINTERS_START(DNativeSWStatusBar)
IMPLEMENT_POINTER(miniFont)
IMPLEMENT_POINTER(numberFont)
IMPLEMENT_POINTERS_END

View File

@ -43,6 +43,7 @@ version "4.3"
#include "zscript/games/blood/ui/screens.zs"
#include "zscript/games/sw/swgame.zs"
#include "zscript/games/sw/ui/menu.zs"
#include "zscript/games/sw/ui/sbar.zs"
#include "zscript/games/sw/ui/screens.zs"
#include "zscript/games/exhumed/exhumedgame.zs"
#include "zscript/games/exhumed/ui/menu.zs"

View File

@ -27,6 +27,9 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
struct SW native
{
const MAX_INVENTORY = 7;
const MAX_WEAPONS = 14;
enum ESWSoundFlag
{
v3df_none = 0, // Default, take no action, use all defaults
@ -42,10 +45,86 @@ struct SW native
v3df_nolookup = 128, // don't use ambient table lookup
}
enum EWeaponAndDamage
{
WPN_FIST,
WPN_STAR,
WPN_SHOTGUN,
WPN_UZI,
WPN_MICRO,
WPN_GRENADE,
WPN_MINE,
WPN_RAIL,
WPN_HOTHEAD,
WPN_HEART,
WPN_NAPALM,
WPN_RING,
WPN_ROCKET,
WPN_SWORD,
// extra weapons connected to other
// spell
DMG_NAPALM,
DMG_MIRV_METEOR,
DMG_SERP_METEOR,
// radius damage
DMG_ELECTRO_SHARD,
DMG_SECTOR_EXP,
DMG_BOLT_EXP,
DMG_TANK_SHELL_EXP,
DMG_FIREBALL_EXP,
DMG_NAPALM_EXP,
DMG_SKULL_EXP,
DMG_BASIC_EXP,
DMG_GRENADE_EXP,
DMG_MINE_EXP,
DMG_MINE_SHRAP,
DMG_MICRO_EXP,
DMG_NUCLEAR_EXP,
DMG_RADIATION_CLOUD,
DMG_FLASHBOMB,
DMG_FIREBALL_FLAMES,
// actor
DMG_RIPPER_SLASH,
DMG_SKEL_SLASH,
DMG_COOLG_BASH,
DMG_COOLG_FIRE,
DMG_GORO_CHOP,
DMG_GORO_FIREBALL,
DMG_SERP_SLASH,
DMG_LAVA_BOULDER,
DMG_LAVA_SHARD,
DMG_HORNET_STING,
DMG_EEL_ELECTRO,
// misc
DMG_SPEAR_TRAP,
DMG_VOMIT,
// inanimate objects
DMG_BLADE,
}
enum EInvFlags
{
INVF_AUTO_USE = 1,
INVF_TIMED = 2,
INVF_COUNT = 4
}
native static void PlaySound(int sound, int flags, int channel = CHAN_AUTO, int cflags = 0);
native static void StopSound();
native static bool IsSoundPlaying(int channel); // soundEngine.IsSourcePlayingSomething(SOURCE_None, nullptr, CHAN_VOICE))
native static void PlaySong(int trackid);
native static int WeaponMaxAmmo(int weap);
native static int InventoryFlags(int inv);
native static SWPlayer GetViewPlayer();
native static int RealWeapon(int wp);
//---------------------------------------------------------------------------
//
//
@ -76,6 +155,188 @@ struct SW native
}
struct SWPlayer native
{
// variable that fit in the sprite or user structure
/*
union
{
struct { int32_t posx, posy, posz; };
vec3_t pos;
};
*/
// interpolation
//int oposx, oposy, oposz;
// holds last valid move position
//int16 lv_sectnum;
//int lv_x,lv_y,lv_z;
// can't do the pointers yet.
/*
SPRITEp remote_sprite;
REMOTE_CONTROL remote;
SECTOR_OBJECTp sop_remote;
SECTOR_OBJECTp sop; // will either be sop_remote or sop_control
SECTORp hi_sectp, lo_sectp;
SPRITEp hi_sp, lo_sp;
SPRITEp last_camera_sp;
PlayerHorizon horizon;
PlayerAngle angle;
binangle RevolveAng;
// under vars are for wading and swimming
//int16 PlayerSprite, PlayerUnderSprite;
SPRITEp SpriteP, UnderSpriteP;
PLAYER_ACTION_FUNCp DoPlayerAction;
ESyncBits KeyPressBits;
SECTOR_OBJECTp sop_control; // sector object pointer
SECTOR_OBJECTp sop_riding; // sector object pointer
struct
{
PANEL_SPRITEp Next, Prev;
} PanelSpriteList;
PANEL_SPRITEp CurWpn;
PANEL_SPRITEp Wpn[SW.MAX_WEAPONS];
PANEL_SPRITEp Chops;
*/
native voidptr sop_remote; // the status bar needs to check this - remove once the underlying type can be supported.
native int jump_count, jump_speed; // jumping
native int16 down_speed, up_speed; // diving
native int z_speed,oz_speed; // used for diving and flying instead of down_speed, up_speed
native int climb_ndx;
native int hiz,loz;
native int ceiling_dist,floor_dist;
native int circle_camera_dist;
native int six,siy,siz; // save player interp position for PlayerSprite
native int16 siang;
native int xvect, yvect;
native int oxvect, oyvect;
native int friction;
native int slide_xvect, slide_yvect;
native int16 slide_ang;
native int slide_dec;
native float drive_avel;
native int16 view_outside_dang; // outside view delta ang
native int16 circle_camera_ang;
native int16 camera_check_time_delay;
native int16 cursectnum,lastcursectnum;
native int turn180_target; // 180 degree turn
// variables that do not fit into sprite structure
native int hvel,tilt,tilt_dest;
native int16 recoil_amt;
native int16 recoil_speed;
native int16 recoil_ndx;
native int recoil_horizoff;
native int oldposx,oldposy,oldposz;
native int RevolveX, RevolveY;
native int16 RevolveDeltaAng;
native int16 pnum; // carry along the player number
native int16 LadderSector;
native int lx,ly; // ladder x and y
native int16 JumpDuration;
native int16 WadeDepth;
native int16 bob_amt;
native int16 bob_ndx;
native int16 bcnt; // bob count
native int bob_z, obob_z;
// must start out as 0
native int playerreadyflag;
native int Flags, Flags2;
// Key stuff
native uint8 HasKey[8];
// Weapon stuff
native int16 SwordAng;
native int WpnGotOnceFlags; // for no respawn mode where weapons are allowed grabbed only once
native int WpnFlags;
native int16 WpnAmmo[SW.MAX_WEAPONS];
native int16 WpnNum;
native uint8 WpnRocketType; // rocket type
native uint8 WpnRocketHeat; // 5 to 0 range
native uint8 WpnRocketNuke; // 1, you have it, or you don't
native uint8 WpnFlameType; // Guardian weapons fire
native uint8 WpnFirstType; // First weapon type - Sword/Shuriken
native uint8 WeaponType; // for weapons with secondary functions
native int16 FirePause; // for sector objects - limits rapid firing
//
// Inventory Vars
//
native int16 InventoryNum;
native int16 InventoryBarTics;
native int16 InventoryTics[SW.MAX_INVENTORY];
native int16 InventoryPercent[SW.MAX_INVENTORY];
native int8 InventoryAmount[SW.MAX_INVENTORY];
native bool InventoryActive[SW.MAX_INVENTORY];
native int16 DiveTics;
native int16 DiveDamageTics;
// Death stuff
native uint16 DeathType;
native int16 Kills;
//native int16 Killer; //who killed me
//native int16 KilledPlayer[MAX_SW_PLAYERS_REG];
native int16 SecretsFound;
// Health
native int16 Armor;
native int16 MaxHealth;
//char RocketBarrel;
native uint8 UziShellLeftAlt;
native uint8 UziShellRightAlt;
native uint8 TeamColor; // used in team play and also used in regular mulit-play for show
// palette fading up and down for player hit and get items
native int16 FadeTics; // Tics between each fade cycle
native int16 FadeAmt; // Current intensity of fade
native bool NightVision; // Is player's night vision active?
native uint8 StartColor; // Darkest color in color range being used
//native int16 electro[64];
native bool IsAI; // Is this and AI character?
native int16 fta,ftq; // First time active and first time quote, for talking in multiplayer games
native int16 NumFootPrints; // Number of foot prints left to lay down
native uint8 WpnUziType; // Toggle between single or double uzi's if you own 2.
native uint8 WpnShotgunType; // Shotgun has normal or fully automatic fire
native uint8 WpnShotgunAuto; // 50-0 automatic shotgun rounds
native uint8 WpnShotgunLastShell; // Number of last shell fired
native uint8 WpnRailType; // Normal Rail Gun or EMP Burst Mode
native bool Bloody; // Is player gooey from the slaughter?
native bool InitingNuke;
native bool TestNukeInit;
native bool NukeInitialized; // Nuke already has counted down
native int16 FistAng; // KungFu attack angle
native uint8 WpnKungFuMove; // KungFu special moves
native int16 HitBy; // SpriteNum of whatever player was last hit by
native int16 Reverb; // Player's current reverb setting
native int16 Heads; // Number of Accursed Heads orbiting player
native int PlayerVersion;
native uint8 WpnReloadState;
native int WeaponNum();
native int GetBuildAngle();
native int Health();
native int MaxUserHealth();
}
struct SWSnd native
{
enum ESounds

View File

@ -0,0 +1,934 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
class SWStatusBar : RazeStatusBar
{
static const String icons[] = {
"PanelMedkit",
"PanelRepairKit",
"PanelCloak",
"PanelNightVision",
"PanelChemBomb",
"PanelFlashBomb",
"PanelCaltrops"
};
enum EConstants
{
PANEL_HEALTH_BOX_X = 20,
PANEL_BOX_Y = (174 - 6),
PANEL_HEALTH_XOFF = 2,
PANEL_HEALTH_YOFF = 4,
PANEL_AMMO_BOX_X = 197,
PANEL_AMMO_XOFF = 1,
PANEL_AMMO_YOFF = 4,
WSUM_X = 93,
WSUM_Y = PANEL_BOX_Y + 1,
WSUM_XOFF = 25,
WSUM_YOFF = 6,
PANEL_KEYS_BOX_X = 276,
PANEL_KEYS_XOFF = 0,
PANEL_KEYS_YOFF = 2,
PANEL_ARMOR_BOX_X = 56,
PANEL_ARMOR_XOFF = 2,
PANEL_ARMOR_YOFF = 4,
FRAG_YOFF = 2,
INVENTORY_BOX_X = 231,
INVENTORY_BOX_Y = (176 - 8),
INVENTORY_PIC_XOFF = 1,
INVENTORY_PIC_YOFF = 1,
INVENTORY_PERCENT_XOFF = 19,
INVENTORY_PERCENT_YOFF = 13,
INVENTORY_STATE_XOFF = 19,
INVENTORY_STATE_YOFF = 1,
MINI_BAR_Y = 174,
MINI_BAR_HEALTH_BOX_X = 4,
MINI_BAR_AMMO_BOX_X = 32,
MINI_BAR_INVENTORY_BOX_X = 64,
MINI_BAR_INVENTORY_BOX_Y = MINI_BAR_Y,
}
TextureID PanelFont[10];
TextureID SmallSBFont[3][12];
HUDFont numberFont, miniFont;
override void Init()
{
numberFont = HudFont.Create(BigFont, 0, Mono_Off, 1, 1);
miniFont = HudFont.Create(SmallFont2, 0, Mono_Off, 1, 1);
for (int i = 0; i < 10; i++) PanelFont[i] = TexMan.CheckForTexture(String.Format("PANEL_FONT_G%d", i), TexMan.Type_Any);
for (int i = 0; i < 12; i++)
{
SmallSBFont[0][i] = TexMan.CheckForTexture(String.Format("PANEL_SM_FONT_G%d", i), TexMan.Type_Any);
SmallSBFont[1][i] = TexMan.CheckForTexture(String.Format("PANEL_SM_FONT_Y%d", i), TexMan.Type_Any);
SmallSBFont[2][i] = TexMan.CheckForTexture(String.Format("PANEL_SM_FONT_R%d", i), TexMan.Type_Any);
}
}
int tileHeight(String tex)
{
let img = TexMan.CheckForTexture(tex, TexMan.TYPE_Any);
let siz = TexMan.GetScaledSize(img);
return int(siz.Y);
}
int tileWidth(String tex)
{
let img = TexMan.CheckForTexture(tex, TexMan.TYPE_Any);
let siz = TexMan.GetScaledSize(img);
return int(siz.X);
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DisplayPanelNumber(double x, double y, int number)
{
String buffer;
buffer = String.Format("%03d", number);
for (int i = 0; i < buffer.length(); i++)
{
let c = buffer.ByteAt(i);
if (c < "0" || c > "9")
{
continue;
}
let tex = PanelFont[c - 48];
DrawTexture(tex, (x, y), DI_ITEM_LEFT_TOP);
let siz = TexMan.GetScaledSize(tex);
x += siz.X + 1;
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DisplaySummaryString(double x, double y, int color, int shade, String buffer)
{
for (int i = 0; i < buffer.length(); i++)
{
let ch = buffer.ByteAt(i);
if (ch == " ")
{
x += 4;
continue;
}
else if (ch == 0x5c) ch = 0;
else if (ch == ":") ch = 11;
else ch -= 47;
let font_pic = SmallSBFont[color][ch];
DrawTexture(font_pic, (x, y), DI_ITEM_LEFT_TOP, col:Raze.shadeToLight(shade));
let siz = TexMan.GetScaledSize(font_pic);
x += siz.X + 1;
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DisplayTimeLimit(SWPlayer pp)
{
int seconds = 0;// gNet.TimeLimitClock / 120;
let ds = String.Format("%03d:%02d", seconds / 60, seconds % 60);
DisplaySummaryString(PANEL_KEYS_BOX_X + 1, PANEL_BOX_Y + 6, 0, 0, ds);
}
//---------------------------------------------------------------------------
//
// todo: migrate to FFont to support localization
//
//---------------------------------------------------------------------------
void DisplayTinyString(double xs, double ys, String buffer, int pal)
{
DrawString(miniFont, buffer, (xs, ys), DI_ITEM_LEFT_TOP);
}
void DisplayFragString(SWPlayer pp, double xs, double ys, String buffer)
{
DisplayTinyString(xs, ys, buffer, 0/*pp.DisplayColor()*/);
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DisplayFragNumbers()
{
for (int pnum = 0; pnum < 4; pnum++)
{
String buffer;
int xs, ys;
int frag_bar;
static const int xoffs[] =
{
69, 147, 225, 303
};
ys = FRAG_YOFF;
// frag bar 0 or 1
frag_bar = ((pnum) / 4);
// move y down according to frag bar number
ys = ys + (tileHeight("FRAG_BAR") - 2) * frag_bar;
// move x over according to the number of players
xs = xoffs[pnum];
buffer.Format("%03d", Raze.PlayerFrags(pnum, -1));
DisplayFragString(null/*&Player[pnum]*/, xs, ys, buffer);
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DisplayFragNames()
{
for (int pnum = 0; pnum < 4; pnum++)
{
int xs, ys;
int frag_bar;
static const int xoffs[] =
{
7, 85, 163, 241
};
ys = FRAG_YOFF;
// frag bar 0 or 1
frag_bar = ((pnum) / 4);
// move y down according to frag bar number
ys = ys + (tileHeight("FRAG_BAR") - 2) * frag_bar;
// move x over according to the number of players
xs = xoffs[pnum];
DisplayFragString(null/*&Player[pnum]*/, xs, ys, Raze.PlayerName(pnum));
}
}
//---------------------------------------------------------------------------
//
// This cannot remain as it is.
//
//---------------------------------------------------------------------------
void DisplayFragBar(SWPlayer pp)
{
// must draw this in HUD mode and align to the top center
int i, num_frag_bars;
int y;
int numplayers = 1;
if (numplayers <= 1) return;
//if (gNet.MultiGameType == MULTI_GAME_COOPERATIVE) return;
num_frag_bars = ((numplayers-1)/4)+1;
for (i = 0, y = 0; i < num_frag_bars; i++)
{
DrawImage("FRAG_BAR", (0, y), DI_ITEM_LEFT_TOP);
y += tileHeight("FRAG_BAR") - 2;
}
DisplayFragNames();
DisplayFragNumbers();
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void PlayerUpdateWeaponSummary(SWPlayer pp, int UpdateWeaponNum)
{
int x, y;
int pos;
int column;
int WeaponNum, wpntmp;
int colr, shade;
String ds;
WeaponNum = SW.RealWeapon(UpdateWeaponNum);
static const int wsum_xoff[] = { 0,36,66 };
static const String wsum_fmt2[] = { "%3d/%-3d", "%2d/%-2d", "%2d/%-2d" };
pos = WeaponNum - 1;
column = pos / 3;
if (column > 2) column = 2;
x = WSUM_X + wsum_xoff[column];
y = WSUM_Y + (WSUM_YOFF * (pos % 3));
if (UpdateWeaponNum == pp.WeaponNum())
{
shade = 0;
colr = 0;
}
else
{
shade = 11;
colr = 0;
}
wpntmp = WeaponNum + 1;
if (wpntmp > 9)
wpntmp = 0;
ds = String.Format("%d:", wpntmp);
if (pp.WpnFlags & (1 << WeaponNum))
DisplaySummaryString(x, y, 1, shade, ds);
else
DisplaySummaryString(x, y, 2, shade + 6, ds);
ds = String.Format(wsum_fmt2[column], pp.WpnAmmo[WeaponNum], SW.WeaponMaxAmmo(WeaponNum));
DisplaySummaryString(x + 6, y, colr, shade, ds);
}
void PlayerUpdateWeaponSummaryAll(SWPlayer pp)
{
for (int i = SW.WPN_STAR; i <= SW.WPN_HEART; i++)
{
PlayerUpdateWeaponSummary(pp, i);
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DisplayKeys(SWPlayer pp, double xs, double ys, double scalex = 1, double scaley = 1)
{
double x, y;
int row, col;
int i;
static const String StatusKeyPics[] =
{
"PANEL_KEY_RED",
"PANEL_KEY_BLUE",
"PANEL_KEY_GREEN",
"PANEL_KEY_YELLOW",
"PANEL_SKELKEY_GOLD",
"PANEL_SKELKEY_SILVER",
"PANEL_SKELKEY_BRONZE",
"PANEL_SKELKEY_RED"
};
let tex = TexMan.CheckForTexture("PANEL_KEY_RED", TexMan.Type_Any);
let size = TexMan.GetScaledSize(tex);
i = 0;
for (row = 0; row < 2; row++)
{
for (col = 0; col < 2; col++)
{
if (pp.HasKey[i])
{
x = xs + PANEL_KEYS_XOFF + (row * size.X);
y = ys + PANEL_KEYS_YOFF + (col * size.Y);
DrawImage(StatusKeyPics[i], (x, y), DI_ITEM_LEFT_TOP, scale:(scalex, scaley));
}
i++;
}
}
// Check for skeleton keys
i = 0;
for (row = 0; row < 2; row++)
{
for (col = 0; col < 2; col++)
{
if (pp.HasKey[i + 4])
{
x = xs + PANEL_KEYS_XOFF + (row * size.X);
y = ys + PANEL_KEYS_YOFF + (col * size.Y);
DrawImage(StatusKeyPics[i + 4], (x, y), DI_ITEM_LEFT_TOP, scale:(scalex, scaley));
}
i++;
}
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void PlayerUpdateInventoryPercent(SWPlayer pp, int InventoryBoxX, int InventoryBoxY, int InventoryXoff, int InventoryYoff)
{
String ds;
int x = InventoryBoxX + INVENTORY_PERCENT_XOFF + InventoryXoff;
int y = InventoryBoxY + INVENTORY_PERCENT_YOFF + InventoryYoff;
if (SW.InventoryFlags(pp.InventoryNum) & SW.INVF_COUNT)
{
ds = String.Format("%d", pp.InventoryAmount[pp.InventoryNum]);
}
else
{
ds = String.Format("%d%%", pp.InventoryPercent[pp.InventoryNum]);
}
DisplayTinyString(x, y, ds, 0);
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void PlayerUpdateInventoryPic(SWPlayer pp, int InventoryBoxX, int InventoryBoxY, int InventoryXoff, int InventoryYoff)
{
int x = InventoryBoxX + INVENTORY_PIC_XOFF + InventoryXoff;
int y = InventoryBoxY + INVENTORY_PIC_YOFF + InventoryYoff;
DrawImage(icons[pp.InventoryNum], (x, y), DI_ITEM_LEFT_TOP);
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void PlayerUpdateInventoryState(SWPlayer pp, double InventoryBoxX, double InventoryBoxY, int InventoryXoff, int InventoryYoff)
{
double x = InventoryBoxX + INVENTORY_STATE_XOFF + InventoryXoff;
double y = InventoryBoxY + INVENTORY_STATE_YOFF + InventoryYoff;
let flags = SW.InventoryFlags(pp.InventoryNum);
if (flags & SW.INVF_AUTO_USE)
{
DisplayTinyString(x, y, "AUTO", 0);
}
else if (flags & SW.INVF_TIMED)
{
DisplayTinyString(x, y, pp.InventoryActive[pp.InventoryNum] ? "ON" : "OFF", 0);
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DisplayBarInventory(SWPlayer pp)
{
int InventoryBoxX = INVENTORY_BOX_X;
int InventoryBoxY = INVENTORY_BOX_Y;
int InventoryXoff = -1;
int InventoryYoff = 0;
// put pic
if (pp.InventoryAmount[pp.InventoryNum])
{
PlayerUpdateInventoryPic(pp, InventoryBoxX, InventoryBoxY, 0, InventoryYoff);
// Auto/On/Off
PlayerUpdateInventoryState(pp, InventoryBoxX, InventoryBoxY, InventoryXoff, InventoryYoff);
// Percent count/Item count
PlayerUpdateInventoryPercent(pp, InventoryBoxX, InventoryBoxY, InventoryXoff, InventoryYoff);
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
int NORM_CANG(int ang)
{
return (((ang)+32) & 31);
}
enum EXY
{
COMPASS_X = 140,
COMPASS_Y = (162 - 5),
};
void DrawCompass(SWPlayer pp)
{
int start_ang, ang;
int x_size = tileWidth("COMPASS_NORTH");
int x;
int i;
static const String CompassPic[] =
{
"COMPASS_EAST", "COMPASS_EAST2",
"COMPASS_TIC", "COMPASS_TIC2",
"COMPASS_MID_TIC", "COMPASS_MID_TIC2",
"COMPASS_TIC", "COMPASS_TIC2",
"COMPASS_SOUTH", "COMPASS_SOUTH2",
"COMPASS_TIC", "COMPASS_TIC2",
"COMPASS_MID_TIC", "COMPASS_MID_TIC2",
"COMPASS_TIC", "COMPASS_TIC2",
"COMPASS_WEST", "COMPASS_WEST2",
"COMPASS_TIC", "COMPASS_TIC2",
"COMPASS_MID_TIC", "COMPASS_MID_TIC2",
"COMPASS_TIC", "COMPASS_TIC2",
"COMPASS_NORTH", "COMPASS_NORTH2",
"COMPASS_TIC", "COMPASS_TIC2",
"COMPASS_MID_TIC", "COMPASS_MID_TIC2",
"COMPASS_TIC", "COMPASS_TIC2"
};
static const int CompassShade[] =
{
//20, 16, 11, 6, 1, 1, 6, 11, 16, 20
25, 19, 15, 9, 1, 1, 9, 15, 19, 25
};
ang = pp.GetBuildAngle();
if (pp.sop_remote)
ang = 0;
start_ang = (ang + 32) >> 6;
start_ang = NORM_CANG(start_ang - 4);
for (i = 0, x = COMPASS_X; i < 10; i++)
{
DrawImage(CompassPic[NORM_CANG(start_ang + i)], (x, COMPASS_Y), DI_ITEM_LEFT_TOP, col:Raze.shadeToLight(CompassShade[i]));
x += x_size;
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DrawStatusBar(SWPlayer pp)
{
let wnum = pp.WeaponNum();
BeginStatusBar(false, 320, 200, tileHeight("STATUS_BAR"));
if (hud_size == Hud_StbarOverlay) Set43ClipRect();
DrawImage("STATUS_BAR", (160, 200), DI_ITEM_CENTER_BOTTOM);
screen.ClearClipRect();
DisplayPanelNumber(PANEL_HEALTH_BOX_X + PANEL_HEALTH_XOFF, PANEL_BOX_Y + PANEL_HEALTH_YOFF, pp.Health());
DisplayPanelNumber(PANEL_ARMOR_BOX_X + PANEL_ARMOR_XOFF, PANEL_BOX_Y + PANEL_ARMOR_YOFF, pp.Armor);
if (wnum != SW.WPN_FIST && wnum != SW.WPN_SWORD) DisplayPanelNumber(PANEL_AMMO_BOX_X + PANEL_AMMO_XOFF, PANEL_BOX_Y + PANEL_AMMO_YOFF, pp.WpnAmmo[wnum]);
PlayerUpdateWeaponSummaryAll(pp);
/*
if (gNet.MultiGameType != MULTI_GAME_COMMBAT)
DisplayKeys(pp, PANEL_KEYS_BOX_X, PANEL_BOX_Y);
else if (gNet.TimeLimit)
DisplayTimeLimit(pp);
*/
DisplayKeys(pp, PANEL_KEYS_BOX_X, PANEL_BOX_Y);
DisplayBarInventory(pp);
DrawCompass(pp);
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DisplayMinibarInventory(SWPlayer pp)
{
int InventoryBoxX = MINI_BAR_INVENTORY_BOX_X;
int InventoryBoxY = MINI_BAR_INVENTORY_BOX_Y - 200;
int InventoryXoff = 0;
int InventoryYoff = 1;
if (pp.InventoryAmount[pp.InventoryNum])
{
PlayerUpdateInventoryPic(pp, InventoryBoxX, InventoryBoxY, InventoryXoff + 1, InventoryYoff);
// Auto/On/Off
PlayerUpdateInventoryState(pp, InventoryBoxX, InventoryBoxY, InventoryXoff, InventoryYoff);
// Percent count/Item count
PlayerUpdateInventoryPercent(pp, InventoryBoxX, InventoryBoxY, InventoryXoff, InventoryYoff);
}
}
//---------------------------------------------------------------------------
//
// Used in DrawHUD2() for determining whether a reloadable weapon is reloading.
//
//---------------------------------------------------------------------------
bool, int DoReloadStatus(int reloadstate, int ammo)
{
bool reloading = ammo == 0 && reloadstate != 2;
if (ammo == 0 && reloadstate == 0)
{
reloadstate = 1;
}
else if (ammo)
{
reloadstate = 0;
}
return reloading, reloadstate;
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DrawHUD1(SWPlayer pp)
{
BeginHUD(1, false, 320, 200);
int x = MINI_BAR_HEALTH_BOX_X;
int y = -26;
DrawImage("MINI_BAR_HEALTH_BOX_PIC", (x, y), DI_ITEM_LEFT_TOP);
x = MINI_BAR_HEALTH_BOX_X + 3;
DisplayPanelNumber(x, y + 5, pp.Health());
let wnum = pp.WeaponNum();
if (wnum != SW.WPN_SWORD && wnum != SW.WPN_FIST)
{
x = MINI_BAR_AMMO_BOX_X;
DrawImage("MINI_BAR_AMMO_BOX_PIC", (x, y), DI_ITEM_LEFT_TOP);
x = MINI_BAR_AMMO_BOX_X + 3;
DisplayPanelNumber(x, y + 5, pp.WpnAmmo[wnum]);
}
if (!pp.InventoryAmount[pp.InventoryNum])
return;
// Inventory Box
x = MINI_BAR_INVENTORY_BOX_X;
DrawImage("MINI_BAR_INVENTORY_BOX_PIC", (x, y), DI_ITEM_LEFT_TOP);
DisplayMinibarInventory(pp);
}
//==========================================================================
//
// Fullscreen HUD variant #1
//
//==========================================================================
void DrawHUD2(SWPlayer pp, SummaryInfo info)
{
BeginHUD(1, false, 320, 200);
String format;
double imgScale;
double baseScale = numberFont.mFont.GetHeight() * 0.83125;
//
// Health
//
let img = TexMan.CheckForTexture("ICON_SM_MEDKIT", TexMan.Type_Any);
let siz = TexMan.GetScaledSize(img);
imgScale = baseScale / siz.Y;
DrawTexture(img, (1.5, -1), DI_ITEM_LEFT_BOTTOM, scale:(imgScale, imgScale));
let Health = pp.Health();
let MaxHealth = pp.MaxUserHealth();
if (!hud_flashing || Health > (MaxHealth >> 2) || (PlayClock & 32))
{
int s = -8;
if (hud_flashing && Health > MaxHealth)
s += Raze.bsin(PlayClock << 5, -10);
int intens = clamp(255 - 4 * s, 0, 255);
let pe = Color(255, intens, intens, intens);
format = String.Format("%d", Health);
DrawString(numberFont, format, (24.25, -numberFont.mFont.GetHeight() + 2), DI_TEXT_ALIGN_LEFT);
}
//
// Armor
//
img = TexMan.CheckForTexture("ICON_ARMOR", TexMan.Type_Any);
siz = TexMan.GetScaledSize(img);
imgScale = baseScale / siz.Y;
DrawTexture(img, (80.75, -1), DI_ITEM_LEFT_BOTTOM, scale:(imgScale, imgScale));
format = String.Format("%d", pp.Armor);
DrawString(numberFont, format, (108.5, -numberFont.mFont.GetHeight() + 2), DI_TEXT_ALIGN_LEFT);
//
// Weapon
//
static const String ammo_sprites[] = { "", "ICON_STAR", "ICON_LG_SHOTSHELL", "ICON_LG_UZI_AMMO", "ICON_MICRO_BATTERY", "ICON_LG_GRENADE", "ICON_LG_MINE", "ICON_RAIL_AMMO",
"ICON_FIREBALL_LG_AMMO", "ICON_HEART_LG_AMMO", "ICON_FIREBALL_LG_AMMO", "ICON_FIREBALL_LG_AMMO", "ICON_MICRO_BATTERY", "" };
int weapon = pp.WeaponNum();
String wicon = ammo_sprites[weapon];
if (wicon.length() > 0)
{
int ammo = pp.WpnAmmo[weapon];
bool reloadableWeapon = weapon == SW.WPN_SHOTGUN || weapon == SW.WPN_UZI;
if (!reloadableWeapon || (reloadableWeapon && !cl_showmagamt))
{
format = String.Format("%d", ammo);
}
else
{
int capacity;
switch (weapon)
{
case SW.WPN_SHOTGUN:
capacity = 4;
break;
case SW.WPN_UZI:
capacity = pp.WpnUziType ? 50 : 100;
break;
}
bool reload;
[reload, pp.WpnReloadState] = DoReloadStatus(pp.WpnReloadState, ammo % capacity);
int clip = CalcMagazineAmount(ammo, capacity, reload);
format = String.Format("%d/%d", clip, ammo - clip);
}
img = TexMan.CheckForTexture(wicon, TexMan.Type_Any);
siz = TexMan.GetScaledSize(img);
imgScale = baseScale / siz.Y;
let imgX = 21.125;
let strlen = format.Length();
if (strlen > 1)
{
imgX += (imgX * 0.855) * (strlen - 1);
}
if ((!hud_flashing || PlayClock & 32 || ammo > (SW.WeaponMaxAmmo(weapon) / 10)))
{
DrawString(numberFont, format, (-1.5, -numberFont.mFont.GetHeight() + 2), DI_TEXT_ALIGN_RIGHT);
}
DrawTexture(img, (-imgX, -1), DI_ITEM_RIGHT_BOTTOM, scale:(imgScale, imgScale));
}
//
// Selected inventory item
//
img = TexMan.CheckForTexture(icons[pp.InventoryNum], TexMan.Type_Any);
siz = TexMan.GetScaledSize(img);
imgScale = baseScale / siz.Y;
int x = 165;
DrawTexture(img, (x, -1), DI_ITEM_LEFT_BOTTOM, scale:(imgScale, imgScale));
PlayerUpdateInventoryState(pp, x + 3.0, -18.0, 1, 1);
//PlayerUpdateInventoryPercent(pp, x + 3.5, -20.5, 1, 1); // function takes integer coordinates.
PlayerUpdateInventoryPercent(pp, x + 3, -20, 1, 1);
//
// keys
//
DisplayKeys(pp, -25, -38, 0.8625, 0.8625);
DoLevelStats(int(baseScale + 4), info);
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DrawInventoryIcon(double xs, double ys, int align, int InventoryNum, int amount, bool selected)
{
double x, y;
int INVENTORY_ICON_WIDTH = 28;
x = xs + (InventoryNum * INVENTORY_ICON_WIDTH);
y = ys;
let tex = icons[InventoryNum];
DrawImage(tex, (x, y), align | DI_ITEM_LEFT_TOP, amount ? 1. : 0.333);
if (selected)
{
DrawImage("SelectionBox", (x - 5, y - 5), align | DI_ITEM_LEFT_TOP);
}
}
//////////////////////////////////////////////////////////////////////
//
// INVENTORY BAR
//
//////////////////////////////////////////////////////////////////////
void DrawInventory(SWPlayer pp, double xs, double ys, int align)
{
if (!pp.InventoryBarTics)
{
return;
}
for (int i = 0; i < pp.InventoryAmount.size(); i++)
{
DrawInventoryIcon(xs, ys, align, i, pp.InventoryAmount[i], i == pp.InventoryNum);
}
}
//==========================================================================
//
// Statistics output
//
//==========================================================================
void DoLevelStats(int bottomy, SummaryInfo info)
{
StatsPrintInfo stats;
stats.fontscale = 1;
stats.spacing = 7;
stats.screenbottomspace = bottomy;
stats.statfont = SmallFont;
if (automapMode == am_full)
{
stats.letterColor = Font.TEXTCOLOR_SAPPHIRE;
stats.standardColor = Font.TEXTCOLOR_UNTRANSLATED;
bool textfont = am_textfont;
if (!am_textfont)
{
// For non-English languages force use of the text font. The tiny one is simply too small to ever add localized characters to it.
let p = StringTable.Localize("$REQUIRED_CHARACTERS");
if (p.length() > 0) textfont = true;
}
if (!textfont)
{
stats.statfont = SmallFont2;
stats.spacing = 6;
}
else stats.spacing = SmallFont.GetHeight() + 1;
PrintAutomapInfo(stats, textfont);
}
// JBF 20040124: display level stats in screen corner
else if (hud_stats && !(netgame /*|| numplayers > 1*/))
{
stats.letterColor = Font.TEXTCOLOR_RED;
stats.standardColor = Font.TEXTCOLOR_TAN;
stats.completeColor = Font.TEXTCOLOR_FIRE;
PrintLevelStats(stats, info);
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
override void UpdateStatusBar(SummaryInfo info)
{
let pp = SW.GetViewPlayer();
int nPalette = 0;
double inv_x, inv_y;
int align;
if (hud_size == Hud_Nothing)
{
align = DI_SCREEN_RIGHT_BOTTOM;
inv_x = -210;
inv_y = -28;
DoLevelStats(2, info);
}
else if (hud_size == Hud_full)
{
align = DI_SCREEN_CENTER_BOTTOM;
inv_x = -80;
inv_y = -40;
DrawHUD2(pp, info);
}
else if (hud_size == Hud_Mini)
{
align = DI_SCREEN_RIGHT_BOTTOM;
inv_x = -210;
inv_y = -28;
DrawHUD1(pp);
DoLevelStats(30, info);
}
else
{
align = 0;
inv_x = 80;
inv_y = 130;
DrawStatusBar(pp);
DoLevelStats(-3, info);
}
DrawInventory(pp, inv_x, inv_y, align);
}
}

View File

@ -250,5 +250,5 @@ class BaseStatusBar : StatusBarCore native
{}
class SWStatusBar : BaseStatusBar native
class NativeSWStatusBar : BaseStatusBar native
{}