diff --git a/source/core/gamecontrol.cpp b/source/core/gamecontrol.cpp index e656fc93f..c58d202b7 100644 --- a/source/core/gamecontrol.cpp +++ b/source/core/gamecontrol.cpp @@ -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(stbarclass->CreateNew()); - //StatusBar2->SetSize(0, 320, 200); - //StatusBar2->Release(); + stbarclass = PClass::FindClass("NativeSWStatusBar"); + StatusBar2 = static_cast(stbarclass->CreateNew()); + StatusBar2->SetSize(0, 320, 200); + StatusBar2->Release(); } diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index 4bd3a9125..5eb8a4103 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -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]; diff --git a/source/games/sw/src/inv.h b/source/games/sw/src/inv.h index 3147b2518..505486aed 100644 --- a/source/games/sw/src/inv.h +++ b/source/games/sw/src/inv.h @@ -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); diff --git a/source/games/sw/src/namelist.h b/source/games/sw/src/namelist.h index 40809cc19..05bb8760c 100644 --- a/source/games/sw/src/namelist.h +++ b/source/games/sw/src/namelist.h @@ -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) + diff --git a/source/games/sw/src/panel.h b/source/games/sw/src/panel.h index 3a64f3f6f..0ff3c5b03 100644 --- a/source/games/sw/src/panel.h +++ b/source/games/sw/src/panel.h @@ -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 diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index 35b75051a..229ce6f24 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -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 diff --git a/source/games/sw/src/sbar.cpp b/source/games/sw/src/sbar.cpp index 95632864c..0b1ba4eff 100644 --- a/source/games/sw/src/sbar.cpp +++ b/source/games/sw/src/sbar.cpp @@ -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 miniFont, numberFont; @@ -148,7 +148,7 @@ class DSWStatusBar : public DBaseStatusBar public: - DSWStatusBar() + DNativeSWStatusBar() { numberFont = Create( BigFont, 0, Off, 1, 1 ); miniFont = Create(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 diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index 54b93635c..5c3479e0a 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -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" diff --git a/wadsrc/static/zscript/games/sw/swgame.zs b/wadsrc/static/zscript/games/sw/swgame.zs index 3c2f60179..66217368a 100644 --- a/wadsrc/static/zscript/games/sw/swgame.zs +++ b/wadsrc/static/zscript/games/sw/swgame.zs @@ -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 diff --git a/wadsrc/static/zscript/games/sw/ui/sbar.zs b/wadsrc/static/zscript/games/sw/ui/sbar.zs new file mode 100644 index 000000000..214c4ffba --- /dev/null +++ b/wadsrc/static/zscript/games/sw/ui/sbar.zs @@ -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); + } +} + diff --git a/wadsrc/static/zscript/razebase.zs b/wadsrc/static/zscript/razebase.zs index 0ac532c48..fdc9dd082 100644 --- a/wadsrc/static/zscript/razebase.zs +++ b/wadsrc/static/zscript/razebase.zs @@ -250,5 +250,5 @@ class BaseStatusBar : StatusBarCore native {} -class SWStatusBar : BaseStatusBar native +class NativeSWStatusBar : BaseStatusBar native {}