Update to ZDoom r1433:

- Fixed: Untranslated colors in fonts had an alpha value of 0 but need 255.
- Fixed: The Doom status bar's ammo display may not use the INDEXFONT for 
  the alternative HUD. Instead it has to create a separate one out of the
  STYSNUM characters.
- Fixed: skins can not be sorted for binary search because the player class
  code depends on the original indices.
- Fixed: P_StartConversation set the global dialog node variable for all
  players, not just the consoleplayer.
- Fixed: AWeapon::PickupForAmmo assumed that any weapon having a secondary
  ammo type also has a primary one.
- Bumped netgame, demo and min demo version for the weapon slot changes.
- changed weapon slots to be stored per player. Information is now transmitted
  across the network so that all machines know each player's current weapon
  configuration so that it can be used by cheats or HUD display routines.
- fixed: level_info_t::mapbg was not initialized
- Fixed: Player names and chat macros that end with incomplete \c escapes now
  have those escapes stripped before printing so that they do not merge with
  subsequent text.
- Fixed: The CHARFORMAT structure that is used to set the color in a Windows
  Rich Edit control was not fully initialized resulting in incorrect colors
  being set.
- Moved default weapon slot assignments into the player classes.
  Weapon.SlotNumber is now used solely for mods that want to add new weapons
  without completely redoing the player's arsenal. Restored some config-based
  weapon slot customization, though slots are no longer automatically saved
  to the config and section names have changed slightly. However, unlike
  before, config slots are now the definitive word on slot assignments and
  cannot be overridden by any other files loaded.

git-svn-id: http://mancubus.net/svn/hosted/gzdoom/trunk@302 b0f79afe-0144-0410-b225-9a4edf0717df
This commit is contained in:
Christoph Oelckers 2009-02-21 17:07:32 +00:00
parent cacebde16e
commit 64a48e1f4e
49 changed files with 1179 additions and 546 deletions

View file

@ -1,3 +1,41 @@
February 21, 2009 (Changes by Graf Zahl)
- Fixed: Untranslated colors in fonts had an alpha value of 0 but need 255.
- Fixed: The Doom status bar's ammo display may not use the INDEXFONT for
the alternative HUD. Instead it has to create a separate one out of the
STYSNUM characters.
- Fixed: skins can not be sorted for binary search because the player class
code depends on the original indices.
- Fixed: P_StartConversation set the global dialog node variable for all
players, not just the consoleplayer.
- Fixed: AWeapon::PickupForAmmo assumed that any weapon having a secondary
ammo type also has a primary one.
February 20, 2009 (Changes by Graf Zahl)
- Bumped netgame, demo and min demo version for the weapon slot changes.
- changed weapon slots to be stored per player. Information is now transmitted
across the network so that all machines know each player's current weapon
configuration so that it can be used by cheats or HUD display routines.
- fixed: level_info_t::mapbg was not initialized
February 17, 2009
- Fixed: Player names and chat macros that end with incomplete \c escapes now
have those escapes stripped before printing so that they do not merge with
subsequent text.
February 15, 2009 (Changes by Graf Zahl)
- Fixed: The CHARFORMAT structure that is used to set the color in a Windows
Rich Edit control was not fully initialized resulting in incorrect colors
being set.
Feburary 14, 2009
- Moved default weapon slot assignments into the player classes.
Weapon.SlotNumber is now used solely for mods that want to add new weapons
without completely redoing the player's arsenal. Restored some config-based
weapon slot customization, though slots are no longer automatically saved
to the config and section names have changed slightly. However, unlike
before, config slots are now the definitive word on slot assignments and
cannot be overridden by any other files loaded.
February 14, 2009 (Changes by Graf Zahl)
- Added MF5_CANTSEEK flag to prevent seeker missiles from homing in on
certain actors and added an option to APowerInvisibility to set this
@ -17,7 +55,16 @@ February 14, 2009 (Changes by Graf Zahl)
- Fixed: The MAPINFO parser ignored missing terminating braces of the last
block in the file.
February 11, 2009
- Fixed: Several weapons were missing a game filter from their definitions.
- Removed storage of weapon slots in the config so that weapon slots can
be setup in the weapons themselves. Slots are still configurable, since
they need to be for KEYCONF to work; any changes simply won't be saved
when you quit.
- Removed limit on weapon slot sizes.
February 10, 2009
- Fixed: DirectInput8Create() used the wrong calling convention.
- Moved the V_InitFontColors() call earlier in the startup sequence so that
colored error messages appear colored in the startup window. Also lightened
up the "Flat" red to contrast better on the startup background.
@ -31,6 +78,8 @@ February 9, 2009
- Added middle mouse button selection pasting for X systems.
February 8, 2009 (Changes by Graf Zahl)
- Fixed parsing of 'cluster' keyword when format is not yet known.
- Moved CheckCompatibility call so that it is done after setting LEVEL_HEXENFORMAT.
- Fixed parsing for MustConfirm key in skill parser.
- Converted internal MAPINFOs to new syntax.
- Added a range parameter to SNDINFO's $limit.

View file

@ -10,6 +10,8 @@
#include "doomtype.h"
#include "cmdlib.h"
#include "i_system.h"
#include "v_text.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
@ -590,6 +592,35 @@ FString strbin1 (const char *start)
return result;
}
//==========================================================================
//
// CleanseString
//
// Does some mild sanity checking on a string: If it ends with an incomplete
// color escape, the escape is removed.
//
//==========================================================================
void CleanseString(char *str)
{
char *escape = strrchr(str, TEXTCOLOR_ESCAPE);
if (escape != NULL)
{
if (escape[1] == '\0')
{
*escape = '\0';
}
else if (escape[1] == '[')
{
char *close = strchr(escape + 2, ']');
if (close == NULL)
{
*escape = '\0';
}
}
}
}
//==========================================================================
//
// ExpandEnvVars

View file

@ -53,6 +53,7 @@ const char *myasctime ();
int strbin (char *str);
FString strbin1 (const char *start);
void CleanseString (char *str);
void CreatePath(const char * fn);

View file

@ -251,7 +251,8 @@ bool FConfigFile::SetSection (const char *name, bool allowCreate)
//
// FConfigFile :: SetFirstSection
//
// Sets the current section to the first one in the file.
// Sets the current section to the first one in the file. Returns
// false if there are no sections.
//
//====================================================================
@ -270,7 +271,8 @@ bool FConfigFile::SetFirstSection ()
//
// FConfigFile :: SetNextSection
//
// Advances the current section to the next one in the file.
// Advances the current section to the next one in the file. Returns
// false if there are no more sections.
//
//====================================================================
@ -332,6 +334,43 @@ void FConfigFile::ClearCurrentSection ()
}
}
//====================================================================
//
// FConfigFile :: DeleteCurrentSection
//
// Completely removes the current section. The current section is
// advanced to the next section. Returns true if there is still a
// current section.
//
//====================================================================
bool FConfigFile::DeleteCurrentSection()
{
if (CurrentSection != NULL)
{
FConfigSection *sec;
ClearCurrentSection();
// Find the preceding section.
for (sec = Sections; sec != NULL && sec->Next != CurrentSection; sec = sec->Next)
{ }
sec->Next = CurrentSection->Next;
if (LastSectionPtr == &CurrentSection->Next)
{
LastSectionPtr = &sec->Next;
}
CurrentSection->~FConfigSection();
delete[] (char *)CurrentSection;
CurrentSection = sec->Next;
return CurrentSection != NULL;
}
return false;
}
//====================================================================
//
// FConfigFile :: ClearKey

View file

@ -59,6 +59,7 @@ public:
bool SetNextSection ();
const char *GetCurrentSection () const;
void ClearCurrentSection ();
bool DeleteCurrentSection ();
void ClearKey (const char *key);
bool SectionIsEmpty ();

View file

@ -2525,9 +2525,6 @@ void D_DoomMain (void)
FActorInfo::StaticInit ();
// Now that all actors have been defined we can finally set up the weapon slots
GameConfig->DoWeaponSetup (GameNames[gameinfo.gametype]);
// [GRB] Initialize player class list
SetupPlayerClasses ();

View file

@ -1963,15 +1963,16 @@ void Net_DoCommand (int type, BYTE **stream, int player)
BYTE who = ReadByte (stream);
s = ReadString (stream);
CleanseString (s);
if (((who & 1) == 0) || players[player].userinfo.team == TEAM_NONE)
{ // Said to everyone
if (who & 2)
{
Printf (PRINT_CHAT, TEXTCOLOR_BOLD "* %s%s\n", name, s);
Printf (PRINT_CHAT, TEXTCOLOR_BOLD "* %s" TEXTCOLOR_BOLD "%s" TEXTCOLOR_BOLD "\n", name, s);
}
else
{
Printf (PRINT_CHAT, "%s: %s\n", name, s);
Printf (PRINT_CHAT, "%s" TEXTCOLOR_CHAT ": %s" TEXTCOLOR_CHAT "\n", name, s);
}
S_Sound (CHAN_VOICE | CHAN_UI, gameinfo.chatSound, 1, ATTN_NONE);
}
@ -1979,11 +1980,11 @@ void Net_DoCommand (int type, BYTE **stream, int player)
{ // Said only to members of the player's team
if (who & 2)
{
Printf (PRINT_TEAMCHAT, TEXTCOLOR_BOLD "* (%s)%s\n", name, s);
Printf (PRINT_TEAMCHAT, TEXTCOLOR_BOLD "* (%s" TEXTCOLOR_BOLD ")%s" TEXTCOLOR_BOLD "\n", name, s);
}
else
{
Printf (PRINT_TEAMCHAT, "(%s): %s\n", name, s);
Printf (PRINT_TEAMCHAT, "(%s" TEXTCOLOR_TEAMCHAT "): %s" TEXTCOLOR_TEAMCHAT "\n", name, s);
}
S_Sound (CHAN_VOICE | CHAN_UI, gameinfo.chatSound, 1, ATTN_NONE);
}
@ -2377,6 +2378,40 @@ void Net_DoCommand (int type, BYTE **stream, int player)
P_ConversationCommand (player, stream);
break;
case DEM_SETSLOT:
{
BYTE playernum = ReadByte(stream);
BYTE slot = ReadByte(stream);
BYTE count = ReadByte(stream);
TArray<const char *> weapons;
weapons.Resize(count);
for(int i = 0; i < count; i++)
{
weapons[i] = ReadStringConst(stream);
}
players[playernum].weapons.SetSlot(slot, weapons);
}
break;
case DEM_ADDSLOT:
{
BYTE playernum = ReadByte(stream);
BYTE slot = ReadByte(stream);
const char *weap = ReadStringConst(stream);
players[playernum].weapons.AddSlot(slot, weap);
}
break;
case DEM_ADDSLOTDEFAULT:
{
BYTE playernum = ReadByte(stream);
BYTE slot = ReadByte(stream);
const char *weap = ReadStringConst(stream);
players[playernum].weapons.AddSlotDefault(slot, weap);
}
break;
default:
I_Error ("Unknown net command: %d", type);
break;
@ -2495,6 +2530,22 @@ void Net_SkipCommand (int type, BYTE **stream)
}
break;
case DEM_SETSLOT:
{
skip = 3;
for(int numweapons = *(*stream + 2); numweapons > 0; numweapons--)
{
skip += strlen ((char *)(*stream + skip)) + 1;
}
}
break;
case DEM_ADDSLOT:
case DEM_ADDSLOTDEFAULT:
skip = strlen ((char *)(*stream + 2)) + 3;
break;
default:
return;
}

View file

@ -55,6 +55,7 @@
#include "teaminfo.h"
#include "r_translate.h"
#include "templates.h"
#include "cmdlib.h"
static FRandom pr_pickteam ("PickRandomTeam");
@ -698,10 +699,10 @@ void D_ReadUserInfoStrings (int i, BYTE **stream, bool update)
{
char oldname[MAXPLAYERNAME+1];
strncpy (oldname, info->netname, MAXPLAYERNAME);
oldname[MAXPLAYERNAME] = 0;
strcpy (oldname, info->netname);
strncpy (info->netname, value, MAXPLAYERNAME);
info->netname[MAXPLAYERNAME] = 0;
CleanseString(info->netname);
if (update && strcmp (oldname, info->netname) != 0)
{

View file

@ -61,6 +61,16 @@ enum
APMETA_Hexenarmor2,
APMETA_Hexenarmor3,
APMETA_Hexenarmor4,
APMETA_Slot0,
APMETA_Slot1,
APMETA_Slot2,
APMETA_Slot3,
APMETA_Slot4,
APMETA_Slot5,
APMETA_Slot6,
APMETA_Slot7,
APMETA_Slot8,
APMETA_Slot9,
};
class player_t;
@ -354,6 +364,8 @@ public:
fixed_t crouchoffset;
fixed_t crouchviewdelta;
FWeaponSlots weapons;
// [CW] I moved these here for multiplayer conversation support.
TObjPtr<AActor> ConversationNPC, ConversationPC;
angle_t ConversationNPCAngle;

View file

@ -49,6 +49,13 @@ char *ReadString (BYTE **stream)
return copystring (string);
}
const char *ReadStringConst(BYTE **stream)
{
const char *string = *((const char **)stream);
*stream += strlen (string) + 1;
return string;
}
int ReadByte (BYTE **stream)
{
BYTE v = **stream;

View file

@ -151,6 +151,9 @@ enum EDemoCommand
DEM_SUMMON2, // 52 String: Thing to fabricate, WORD: angle offset
DEM_SUMMONFRIEND2, // 53
DEM_SUMMONFOE2, // 54
DEM_ADDSLOTDEFAULT, // 55
DEM_ADDSLOT, // 56
DEM_SETSLOT, // 57
};
// The following are implemented by cht_DoCheat in m_cheat.cpp
@ -226,6 +229,7 @@ int ReadWord (BYTE **stream);
int ReadLong (BYTE **stream);
float ReadFloat (BYTE **stream);
char *ReadString (BYTE **stream);
const char *ReadStringConst(BYTE **stream);
void WriteByte (BYTE val, BYTE **stream);
void WriteWord (short val, BYTE **stream);
void WriteLong (int val, BYTE **stream);

View file

@ -264,7 +264,7 @@ CCMD (slot)
if (slot < NUM_WEAPON_SLOTS)
{
SendItemUse = LocalWeapons.Slots[slot].PickWeapon (&players[consoleplayer]);
SendItemUse = players[consoleplayer].weapons.Slots[slot].PickWeapon (&players[consoleplayer]);
}
}
}
@ -296,12 +296,12 @@ CCMD (turn180)
CCMD (weapnext)
{
SendItemUse = PickNextWeapon (&players[consoleplayer]);
SendItemUse = players[consoleplayer].weapons.PickNextWeapon (&players[consoleplayer]);
}
CCMD (weapprev)
{
SendItemUse = PickPrevWeapon (&players[consoleplayer]);
SendItemUse = players[consoleplayer].weapons.PickPrevWeapon (&players[consoleplayer]);
}
CCMD (invnext)

View file

@ -217,6 +217,7 @@ void P_RemoveDefereds (void)
void level_info_t::Reset()
{
mapname[0] = 0;
mapbg[0] = 0;
levelnum = 0;
pname[0] = 0;
nextmap[0] = 0;

View file

@ -7,7 +7,6 @@
#define MAX_MANA 200
#define MAX_WEAPONS_PER_SLOT 8
#define NUM_WEAPON_SLOTS 10
class player_t;
@ -17,30 +16,39 @@ class AWeapon;
class FWeaponSlot
{
public:
FWeaponSlot ();
void Clear ();
FWeaponSlot &operator= (const FWeaponSlot &other) { Weapons = other.Weapons; return *this; }
void Clear() { Weapons.Clear(); }
bool AddWeapon (const char *type);
bool AddWeapon (const PClass *type);
void AddWeaponList (const char *list, bool clear);
AWeapon *PickWeapon (player_t *player);
int CountWeapons ();
int Size () { return (int)Weapons.Size(); }
int LocateWeapon (const PClass *type);
inline const PClass *GetWeapon (int index) const
{
return Weapons[index];
if ((unsigned)index < Weapons.Size())
{
return Weapons[index].Type;
}
else
{
return NULL;
}
}
friend AWeapon *PickNextWeapon (player_t *player);
friend AWeapon *PickPrevWeapon (player_t *player);
friend struct FWeaponSlots;
private:
const PClass *Weapons[MAX_WEAPONS_PER_SLOT];
struct WeaponInfo
{
const PClass *Type;
fixed_t Position;
};
void SetInitialPositions();
void Sort();
TArray<WeaponInfo> Weapons;
};
AWeapon *PickNextWeapon (player_t *player);
AWeapon *PickPrevWeapon (player_t *player);
// FWeaponSlots::AddDefaultWeapon return codes
enum ESlotDef
{
@ -53,14 +61,26 @@ struct FWeaponSlots
{
FWeaponSlot Slots[NUM_WEAPON_SLOTS];
AWeapon *PickNextWeapon (player_t *player);
AWeapon *PickPrevWeapon (player_t *player);
void Clear ();
bool LocateWeapon (const PClass *type, int *const slot, int *const index);
ESlotDef AddDefaultWeapon (int slot, const PClass *type);
int RestoreSlots (FConfigFile &config);
void SaveSlots (FConfigFile &config);
void AddExtraWeapons();
void SetFromPlayer(const PClass *type);
void CompleteSetup(const PClass *type);
int RestoreSlots (FConfigFile *config, const char *section);
void PrintSettings();
void SetSlot(int slot, TArray<const char *> argv);
void AddSlot(int slot, const char *name);
void AddSlotDefault(int slot, const char *name);
};
extern FWeaponSlots LocalWeapons;
void P_PlaybackKeyConfWeapons();
void P_CompleteWeaponSetup(int playernum, const PClass *type);
/************************************************************************/
/* Class definitions */
@ -202,6 +222,13 @@ public:
};
// A weapon is just that.
enum
{
AWMETA_BASE = 0x72000,
AWMETA_SlotNumber,
AWMETA_SlotPriority,
};
class AWeapon : public AInventory
{
DECLARE_CLASS (AWeapon, AInventory)

File diff suppressed because it is too large Load diff

View file

@ -414,9 +414,9 @@ void DSBarInfo::doCommands(SBarInfoBlock &block, int xOffset, int yOffset, int a
if((cmd.flags & DRAWIMAGE_WEAPONSLOT)) //weaponslots
{
drawAlt = 1; //draw off state until we know we have something.
for (int i = 0; i < MAX_WEAPONS_PER_SLOT; i++)
for (int i = 0; i < CPlayer->weapons.Slots[cmd.value].Size(); i++)
{
const PClass *weap = LocalWeapons.Slots[cmd.value].GetWeapon(i);
const PClass *weap = CPlayer->weapons.Slots[cmd.value].GetWeapon(i);
if(weap == NULL)
{
continue;

View file

@ -506,9 +506,9 @@ static int DrawAmmo(player_t * CPlayer, int x, int y)
// Do not check for actual presence in the inventory!
// We want to show all ammo types that can be used by
// the weapons in the weapon slots.
for (k=0;k<NUM_WEAPON_SLOTS;k++) for(j=0;j<MAX_WEAPONS_PER_SLOT;j++)
for (k = 0; k < NUM_WEAPON_SLOTS; k++) for(j = 0; j < CPlayer->weapons.Slots[k].Size(); j++)
{
const PClass * weap = LocalWeapons.Slots[k].GetWeapon(j);
const PClass *weap = CPlayer->weapons.Slots[k].GetWeapon(j);
if (weap) AddAmmoToList((AWeapon*)GetDefaultByType(weap));
}
@ -628,17 +628,17 @@ static void DrawWeapons(player_t * CPlayer, int x, int y)
// First draw all weapons in the inventory that are not assigned to a weapon slot
for(inv=CPlayer->mo->Inventory;inv;inv=inv->Inventory)
{
int slot, index;
if (inv->IsKindOf(RUNTIME_CLASS(AWeapon)) && !LocalWeapons.LocateWeapon(RUNTIME_TYPE(inv), &slot, &index))
if (inv->IsKindOf(RUNTIME_CLASS(AWeapon)) &&
!CPlayer->weapons.LocateWeapon(RUNTIME_TYPE(inv), NULL, NULL))
{
DrawOneWeapon(CPlayer, x, y, static_cast<AWeapon*>(inv));
}
}
// And now everything in the weapon slots back to front
for (k=NUM_WEAPON_SLOTS-1;k>=0;k--) for(j=MAX_WEAPONS_PER_SLOT-1;j>=0;j--)
for (k = NUM_WEAPON_SLOTS - 1; k >= 0; k--) for(j = CPlayer->weapons.Slots[k].Size() - 1; j >= 0; j--)
{
const PClass * weap = LocalWeapons.Slots[k].GetWeapon(j);
const PClass *weap = CPlayer->weapons.Slots[k].GetWeapon(j);
if (weap)
{
inv=CPlayer->mo->FindInventory(weap);

View file

@ -73,8 +73,6 @@ EXTERN_CVAR (Color, am_cdwallcolor)
EXTERN_CVAR (Float, spc_amp)
EXTERN_CVAR (Bool, wi_percents)
FString WeaponSection;
FGameConfigFile::FGameConfigFile ()
{
FString pathname;
@ -222,16 +220,6 @@ void FGameConfigFile::DoGlobalSetup ()
noblitter->ResetToDefault ();
}
}
if (last < 201)
{
// Be sure the Hexen fourth weapons are assigned to slot 4
// If this section does not already exist, then they will be
// assigned by SetupWeaponList().
if (SetSection ("Hexen.WeaponSlots"))
{
SetValueForKey ("Slot[4]", "FWeapQuietus CWeapWraithverge MWeapBloodscourge");
}
}
if (last < 202)
{
// Make sure the Hexen hotkeys are accessible by default.
@ -271,6 +259,28 @@ void FGameConfigFile::DoGlobalSetup ()
precache->ResetToDefault();
}
}
if (last < 208)
{ // Weapon sections are no longer used, so tidy up the config by deleting them.
const char *name;
size_t namelen;
bool more;
more = SetFirstSection();
while (more)
{
name = GetCurrentSection();
if (name != NULL &&
(namelen = strlen(name)) > 12 &&
strcmp(name + namelen - 12, ".WeaponSlots") == 0)
{
more = DeleteCurrentSection();
}
else
{
more = SetNextSection();
}
}
}
}
}
}
@ -376,17 +386,6 @@ void FGameConfigFile::DoGameSetup (const char *gamename)
}
}
// Separated from DoGameSetup because it needs all the weapons properly defined
void FGameConfigFile::DoWeaponSetup (const char *gamename)
{
strncpy (subsection, "WeaponSlots", sublen);
if (!SetSection (section) || !LocalWeapons.RestoreSlots (*this))
{
SetupWeaponList (gamename);
}
}
void FGameConfigFile::ReadNetVars ()
{
strncpy (subsection, "NetServerInfo", sublen);
@ -460,18 +459,6 @@ void FGameConfigFile::ArchiveGameData (const char *gamename)
strncpy (subsection, "DoubleBindings", sublen);
SetSection (section, true);
C_ArchiveBindings (this, true);
if (WeaponSection.IsEmpty())
{
strncpy (subsection, "WeaponSlots", sublen);
}
else
{
mysnprintf (subsection, sublen, "%s.WeaponSlots", WeaponSection.GetChars());
}
SetSection (section, true);
ClearCurrentSection ();
LocalWeapons.SaveSlots (*this);
}
void FGameConfigFile::ArchiveGlobalData ()
@ -676,79 +663,6 @@ void FGameConfigFile::SetRavenDefaults (bool isHexen)
}
}
void FGameConfigFile::SetupWeaponList (const char *gamename)
{
for (int i = 0; i < NUM_WEAPON_SLOTS; ++i)
{
LocalWeapons.Slots[i].Clear ();
}
if (strcmp (gamename, "Heretic") == 0)
{
LocalWeapons.Slots[1].AddWeapon ("Staff");
LocalWeapons.Slots[1].AddWeapon ("Gauntlets");
LocalWeapons.Slots[2].AddWeapon ("GoldWand");
LocalWeapons.Slots[3].AddWeapon ("Crossbow");
LocalWeapons.Slots[4].AddWeapon ("Blaster");
LocalWeapons.Slots[5].AddWeapon ("SkullRod");
LocalWeapons.Slots[6].AddWeapon ("PhoenixRod");
LocalWeapons.Slots[7].AddWeapon ("Mace");
}
else if (strcmp (gamename, "Hexen") == 0)
{
LocalWeapons.Slots[1].AddWeapon ("FWeapFist");
LocalWeapons.Slots[2].AddWeapon ("FWeapAxe");
LocalWeapons.Slots[3].AddWeapon ("FWeapHammer");
LocalWeapons.Slots[4].AddWeapon ("FWeapQuietus");
LocalWeapons.Slots[1].AddWeapon ("CWeapMace");
LocalWeapons.Slots[2].AddWeapon ("CWeapStaff");
LocalWeapons.Slots[3].AddWeapon ("CWeapFlame");
LocalWeapons.Slots[4].AddWeapon ("CWeapWraithverge");
LocalWeapons.Slots[1].AddWeapon ("MWeapWand");
LocalWeapons.Slots[2].AddWeapon ("MWeapFrost");
LocalWeapons.Slots[3].AddWeapon ("MWeapLightning");
LocalWeapons.Slots[4].AddWeapon ("MWeapBloodscourge");
}
else if (strcmp (gamename, "Strife") == 0)
{
LocalWeapons.Slots[1].AddWeapon ("PunchDagger");
LocalWeapons.Slots[2].AddWeapon ("StrifeCrossbow2");
LocalWeapons.Slots[2].AddWeapon ("StrifeCrossbow");
LocalWeapons.Slots[3].AddWeapon ("AssaultGun");
LocalWeapons.Slots[4].AddWeapon ("MiniMissileLauncher");
LocalWeapons.Slots[5].AddWeapon ("StrifeGrenadeLauncher2");
LocalWeapons.Slots[5].AddWeapon ("StrifeGrenadeLauncher");
LocalWeapons.Slots[6].AddWeapon ("FlameThrower");
LocalWeapons.Slots[7].AddWeapon ("Mauler2");
LocalWeapons.Slots[7].AddWeapon ("Mauler");
LocalWeapons.Slots[8].AddWeapon ("Sigil");
}
else if (strcmp (gamename, "Chex") == 0)
{
LocalWeapons.Slots[1].AddWeapon ("Bootspoon");
LocalWeapons.Slots[1].AddWeapon ("SuperBootspork");
LocalWeapons.Slots[2].AddWeapon ("MiniZorcher");
LocalWeapons.Slots[3].AddWeapon ("LargeZorcher");
LocalWeapons.Slots[3].AddWeapon ("SuperLargeZorcher");
LocalWeapons.Slots[4].AddWeapon ("RapidZorcher");
LocalWeapons.Slots[5].AddWeapon ("ZorchPropulsor");
LocalWeapons.Slots[6].AddWeapon ("PhasingZorcher");
LocalWeapons.Slots[7].AddWeapon ("LAZDevice");
}
else // Doom
{
LocalWeapons.Slots[1].AddWeapon ("Fist");
LocalWeapons.Slots[1].AddWeapon ("Chainsaw");
LocalWeapons.Slots[2].AddWeapon ("Pistol");
LocalWeapons.Slots[3].AddWeapon ("Shotgun");
LocalWeapons.Slots[3].AddWeapon ("SuperShotgun");
LocalWeapons.Slots[4].AddWeapon ("Chaingun");
LocalWeapons.Slots[5].AddWeapon ("RocketLauncher");
LocalWeapons.Slots[6].AddWeapon ("PlasmaRifle");
LocalWeapons.Slots[7].AddWeapon ("BFG9000");
}
}
CCMD (whereisini)
{
FString path = GameConfig->GetConfigPath (false);

View file

@ -47,7 +47,6 @@ public:
void DoGlobalSetup ();
void DoGameSetup (const char *gamename);
void DoWeaponSetup (const char *gamename);
void ArchiveGlobalData ();
void ArchiveGameData (const char *gamename);
void AddAutoexec (DArgs *list, const char *gamename);
@ -64,7 +63,6 @@ private:
void MigrateOldConfig ();
void SetRavenDefaults (bool isHexen);
void ReadCVars (DWORD flags);
void SetupWeaponList (const char *gamename);
bool bMigrating;
@ -73,7 +71,6 @@ private:
size_t sublen;
};
extern FString WeaponSection;
extern FGameConfigFile *GameConfig;
#endif //__GAMECONFIGFILE_H__

View file

@ -735,14 +735,10 @@ void cht_Give (player_t *player, const char *name, int amount)
{
// Give the weapon only if it belongs to the current game or
// is in a weapon slot. Unfortunately this check only works in
// singleplayer games because the weapon slots are stored locally.
// In multiplayer games or demors all weapons must be given because the state of
// the weapon slots is not guaranteed to be the same when recording or playing back.
if (multiplayer || demorecording || demoplayback ||
type->ActorInfo->GameFilter == GAME_Any ||
// is in a weapon slot.
if (type->ActorInfo->GameFilter == GAME_Any ||
(type->ActorInfo->GameFilter & gameinfo.gametype) ||
LocalWeapons.LocateWeapon(type, NULL, NULL))
player->weapons.LocateWeapon(type, NULL, NULL))
{
AWeapon *def = (AWeapon*)GetDefaultByType (type);
if (!(def->WeaponFlags & WIF_CHEATNOTWEAPON))

View file

@ -676,7 +676,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang
pc->player->ConversationPC = pc;
pc->player->ConversationNPC = npc;
CurNode = npc->Conversation;
FStrifeDialogueNode *CurNode = npc->Conversation;
if (pc->player == &players[consoleplayer])
{
@ -717,16 +717,17 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang
}
}
// The rest is only done when the conversation is actually displayed.
if (pc->player == &players[consoleplayer])
{
if (CurNode->SpeakerVoice != 0)
{
I_SetMusicVolume (dlg_musicvolume);
S_Sound (npc, CHAN_VOICE|CHAN_NOPAUSE, CurNode->SpeakerVoice, 1, ATTN_NORM);
}
if (pc->player != &players[consoleplayer])
return;
// Set up the menu
::CurNode = CurNode; // only set the global variaböle for the consoleplayer
ConversationMenu.PreDraw = DrawConversationMenu;
ConversationMenu.EscapeHandler = ConversationMenuEscaped;
@ -800,6 +801,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang
ConversationPauseTic = gametic + 20;
M_SwitchMenu (&ConversationMenu);
}
}
//============================================================================
//

View file

@ -3785,6 +3785,10 @@ APlayerPawn *P_SpawnPlayer (FMapThing *mthing, bool tempplayer)
FBehavior::StaticStartTypedScripts (SCRIPT_Respawn, p->mo, true);
}
}
if (playernum == consoleplayer)
{
P_CompleteWeaponSetup(consoleplayer, mobj->GetClass());
}
return mobj;
}

View file

@ -419,10 +419,12 @@ static const char *skinsoundnames[NUMSKINSOUNDS][2] =
{ "dsjump", "*jump" }
};
/*
static int STACK_ARGS skinsorter (const void *a, const void *b)
{
return stricmp (((FPlayerSkin *)a)->name, ((FPlayerSkin *)b)->name);
}
*/
void R_InitSkins (void)
{
@ -782,6 +784,19 @@ int R_FindSkin (const char *name, int pclass)
return pclass;
}
for (unsigned i = PlayerClasses.Size(); i < numskins; i++)
{
if (strnicmp (skins[i].name, name, 16) == 0)
{
if (PlayerClasses[pclass].CheckSkin (mid))
return i;
else
return pclass;
}
}
/*
min = PlayerClasses.Size ();
max = (int)numskins-1;
@ -805,6 +820,7 @@ int R_FindSkin (const char *name, int pclass)
max = mid - 1;
}
}
*/
return pclass;
}
@ -932,7 +948,7 @@ void R_InitSprites ()
}
// [RH] Sort the skins, but leave base as skin 0
qsort (&skins[PlayerClasses.Size ()], numskins-PlayerClasses.Size (), sizeof(FPlayerSkin), skinsorter);
//qsort (&skins[PlayerClasses.Size ()], numskins-PlayerClasses.Size (), sizeof(FPlayerSkin), skinsorter);
}
void R_DeinitSprites()

View file

@ -3,5 +3,5 @@
// This file was automatically generated by the
// updaterevision tool. Do not edit by hand.
#define ZD_SVN_REVISION_STRING "1424M"
#define ZD_SVN_REVISION_NUMBER 1424
#define ZD_SVN_REVISION_STRING "1433M"
#define ZD_SVN_REVISION_NUMBER 1433

View file

@ -1405,6 +1405,24 @@ DEFINE_CLASS_PROPERTY(yadjust, F, Weapon)
defaults->YAdjust = i;
}
//==========================================================================
//
//==========================================================================
DEFINE_CLASS_PROPERTY(slotnumber, I, Weapon)
{
PROP_INT_PARM(i, 0);
info->Class->Meta.SetMetaInt(AWMETA_SlotNumber, i);
}
//==========================================================================
//
//==========================================================================
DEFINE_CLASS_PROPERTY(slotpriority, F, Weapon)
{
PROP_FIXED_PARM(i, 0);
info->Class->Meta.SetMetaFixed(AWMETA_SlotPriority, i);
}
//==========================================================================
//
//==========================================================================
@ -1823,6 +1841,30 @@ DEFINE_CLASS_PROPERTY_PREFIX(player, hexenarmor, FFFFF, PlayerPawn)
}
}
//==========================================================================
//
//==========================================================================
DEFINE_CLASS_PROPERTY_PREFIX(player, weaponslot, ISsssssssssssssssssssssssssssssssssssssssssss, PlayerPawn)
{
PROP_INT_PARM(slot, 0);
if (slot < 0 || slot > 9)
{
I_Error("Slot must be between 0 and 9.");
}
else
{
FString weapons;
for(int i = 1; i < PROP_PARM_COUNT; ++i)
{
PROP_STRING_PARM(str, i);
weapons << ' ' << str;
}
info->Class->Meta.SetMetaString(APMETA_Slot0 + slot, &weapons[1]);
}
}
//==========================================================================
//
//==========================================================================

View file

@ -215,6 +215,8 @@ static int STACK_ARGS TranslationMapCompare (const void *a, const void *b);
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
extern int PrintColors[];
// PUBLIC DATA DEFINITIONS -------------------------------------------------
FFont *FFont::FirstFont = NULL;
@ -1620,6 +1622,7 @@ FSpecialFont::FSpecialFont (const char *name, int first, int count, FTexture **l
{
remap->Remap[j] = identity[j];
remap->Palette[j] = GPalette.BaseColors[identity[j]];
remap->Palette[j].a = 0xff;
}
}
}
@ -2065,6 +2068,14 @@ EColorRange V_ParseFontColor (const BYTE *&color_value, int normalcolor, int bol
{
newcolor = boldcolor;
}
else if (newcolor == '!') // Team chat
{
newcolor = PrintColors[PRINT_TEAMCHAT];
}
else if (newcolor == '*') // Chat
{
newcolor = PrintColors[PRINT_CHAT];
}
else if (newcolor == '[') // Named
{
const BYTE *namestart = ch;

View file

@ -71,6 +71,9 @@ struct FBrokenLines
#define TEXTCOLOR_NORMAL "\034-"
#define TEXTCOLOR_BOLD "\034+"
#define TEXTCOLOR_CHAT "\034*"
#define TEXTCOLOR_TEAMCHAT "\034!"
FBrokenLines *V_BreakLines (FFont *font, int maxwidth, const BYTE *str);
void V_FreeBrokenLines (FBrokenLines *lines);
inline FBrokenLines *V_BreakLines (FFont *font, int maxwidth, const char *str)

View file

@ -56,21 +56,21 @@
// Version identifier for network games.
// Bump it every time you do a release unless you're certain you
// didn't change anything that will affect sync.
#define NETGAMEVERSION 218
#define NETGAMEVERSION 219
// Version stored in the ini's [LastRun] section.
// Bump it if you made some configuration change that you want to
// be able to migrate in FGameConfigFile::DoGlobalSetup().
#define LASTRUNVERSION "207"
#define LASTRUNVERSION "208"
// Protocol version used in demos.
// Bump it if you change existing DEM_ commands or add new ones.
// Otherwise, it should be safe to leave it alone.
#define DEMOGAMEVERSION 0x20E
#define DEMOGAMEVERSION 0x20F
// Minimum demo version we can play.
// Bump it whenever you change or remove existing DEM_ commands.
#define MINDEMOVERSION 0x207
#define MINDEMOVERSION 0x20F
// SAVEVER is the version of the information stored in level snapshots.
// Note that SAVEVER is not directly comparable to VERSION.

View file

@ -1452,37 +1452,39 @@ bool I_InitInput (void *hwnd)
// Try for DirectInput 8 first, then DirectInput 3 for NT 4's benefit.
hr = CoCreateInstance (CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER, IID_IDirectInput8A, (void**)&g_pdi);
DInputDLL = LoadLibrary("dinput8.dll");
if (DInputDLL != NULL)
{
typedef HRESULT (WINAPI *blah)(HINSTANCE, DWORD, REFIID, LPVOID *, LPUNKNOWN);
blah di8c = (blah)GetProcAddress(DInputDLL, "DirectInput8Create");
if (di8c != NULL)
{
hr = di8c(g_hInst, DIRECTINPUT_VERSION, IID_IDirectInput8A, (void **)&g_pdi, NULL);
if (FAILED(hr))
{
g_pdi = NULL;
Printf(TEXTCOLOR_ORANGE "DirectInput8Create failed: %08lx", hr);
g_pdi = NULL; // Just to be sure DirectInput8Create didn't change it
}
}
else
{
hr = g_pdi->Initialize (g_hInst, 0x0800);
if (FAILED (hr))
{
g_pdi->Release ();
g_pdi = NULL;
Printf(TEXTCOLOR_ORANGE "Could not find DirectInput8Create in dinput8.dll\n");
}
}
if (g_pdi == NULL)
{
hr = CoCreateInstance (CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, IID_IDirectInputA, (void**)&g_pdi3);
if (hr == REGDB_E_CLASSNOTREG)
if (DInputDLL != NULL)
{
// NT 4 has the wrong GUID in the registry for CLSID_DirectInput unless somebody has already
// used "regsvr32 dinput.dll" to properly register the class. This means the only sure way to
// obtain an IDirectInputA interface under NT 4 is to actually load the DLL and use
// the function it provides. Grrr.
FreeLibrary(DInputDLL);
}
DInputDLL = LoadLibrary ("dinput.dll");
if (DInputDLL == NULL)
{
I_FatalError ("Could not load dinput.dll: %08lx", GetLastError());
}
typedef HRESULT (*blah)(HINSTANCE, DWORD, LPDIRECTINPUT*, LPUNKNOWN);
typedef HRESULT (WINAPI *blah)(HINSTANCE, DWORD, LPDIRECTINPUT*, LPUNKNOWN);
blah dic = (blah)GetProcAddress (DInputDLL, "DirectInputCreateA");
if (dic == NULL)
@ -1495,23 +1497,6 @@ bool I_InitInput (void *hwnd)
{
I_FatalError ("DirectInputCreate failed: %08lx", hr);
}
Printf ("Tip for NT 4: \"regsvr32 dinput.dll\"\n");
}
else
{
if (FAILED(hr))
{
I_FatalError ("Could not create DirectInput interface: %08lx", hr);
}
hr = g_pdi3->Initialize (g_hInst, 0x0300);
if (FAILED(hr))
{
g_pdi3->Release ();
g_pdi3 = NULL;
I_FatalError ("Could not initialize DirectInput interface: %08lx", hr);
}
}
}
Printf ("I_StartupMouse\n");

View file

@ -566,6 +566,7 @@ void I_PrintStr (const char *cp)
// Change the color.
format.cbSize = sizeof(format);
format.dwMask = CFM_COLOR;
format.dwEffects = 0;
format.crTextColor = color;
SendMessage (edit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format);
}

View file

@ -9,4 +9,11 @@ actor ChexPlayer : DoomPlayer
player.startitem "Bootspoon"
player.startitem "MiniZorchRecharge", 50
player.damagescreencolor "60 b0 58"
player.WeaponSlot 1, Bootspoon, SuperBootspork
player.WeaponSlot 2, MiniZorcher
player.WeaponSlot 3, LargeZorcher, SuperLargeZorcher
player.WeaponSlot 4, RapidZorcher
player.WeaponSlot 5, ZorchPropulsor
player.WeaponSlot 6, PhasingZorcher
player.WeaponSlot 7, LAZDevice
}

View file

@ -17,6 +17,13 @@ ACTOR DoomPlayer : PlayerPawn
Player.StartItem "Pistol"
Player.StartItem "Fist"
Player.StartItem "Clip", 50
Player.WeaponSlot 1, Fist, Chainsaw
Player.WeaponSlot 2, Pistol
Player.WeaponSlot 3, Shotgun, SuperShotgun
Player.WeaponSlot 4, Chaingun
Player.WeaponSlot 5, RocketLauncher
Player.WeaponSlot 6, PlasmaRifle
Player.WeaponSlot 7, BFG9000
States
{

View file

@ -17,6 +17,7 @@ ACTOR DoomWeapon : Weapon
ACTOR Fist : Weapon
{
Game Doom
Weapon.SelectionOrder 3700
Weapon.Kickback 100
Obituary "$OB_MPFIST"
@ -52,6 +53,7 @@ ACTOR Fist : Weapon
ACTOR Pistol : DoomWeapon 5010
{
Game Doom
Weapon.SelectionOrder 1900
Weapon.AmmoUse 1
Weapon.AmmoGive 20

View file

@ -11,6 +11,14 @@ ACTOR HereticPlayer : PlayerPawn
Player.StartItem "GoldWand"
Player.StartItem "Staff"
Player.StartItem "GoldWandAmmo", 50
Player.WeaponSlot 1, Staff, Gauntlets
Player.WeaponSlot 2, GoldWand
Player.WeaponSlot 3, Crossbow
Player.WeaponSlot 4, Blaster
Player.WeaponSlot 5, SkullRod
Player.WeaponSlot 6, PhoenixRod
Player.WeaponSlot 7, Mace
States
{
Spawn:

View file

@ -9,6 +9,7 @@ ACTOR HereticWeapon : Weapon
ACTOR Staff : HereticWeapon
{
Game Heretic
Weapon.SelectionOrder 3800
+THRUGHOST
+WIMPY_WEAPON
@ -38,6 +39,7 @@ ACTOR Staff : HereticWeapon
ACTOR StaffPowered : Staff
{
Game Heretic
Weapon.sisterweapon "Staff"
Weapon.ReadySound "weapons/staffcrackle"
+WEAPON.POWERED_UP
@ -106,6 +108,7 @@ ACTOR StaffPuff2
ACTOR GoldWand : HereticWeapon
{
Game Heretic
+BLOODSPLATTER
Weapon.SelectionOrder 2000
Weapon.AmmoGive 25
@ -138,6 +141,7 @@ ACTOR GoldWand : HereticWeapon
ACTOR GoldWandPowered : GoldWand
{
Game Heretic
+WEAPON.POWERED_UP
Weapon.AmmoGive 0
Weapon.SisterWeapon "GoldWand"
@ -269,6 +273,7 @@ ACTOR Crossbow : HereticWeapon 2001
ACTOR CrossbowPowered : Crossbow
{
Game Heretic
+WEAPON.POWERED_UP
Weapon.AmmoGive 0
Weapon.SisterWeapon "Crossbow"
@ -388,7 +393,7 @@ ACTOR Gauntlets : Weapon 2005
Weapon.YAdjust 15
Weapon.UpSound "weapons/gauntletsactivate"
Weapon.SisterWeapon "GauntletsPowered"
Inventory.PickupMessage "$TxT_WPNGAUNTLETS"
Inventory.PickupMessage "$TXT_WPNGAUNTLETS"
action native A_GauntletAttack (int power);
@ -420,6 +425,7 @@ ACTOR Gauntlets : Weapon 2005
ACTOR GauntletsPowered : Gauntlets
{
Game Heretic
+POWERED_UP
Weapon.SisterWeapon "Gauntlets"
States
@ -518,6 +524,7 @@ ACTOR Mace : HereticWeapon
ACTOR MacePowered : Mace
{
Game Heretic
+WEAPON.POWERED_UP
Weapon.AmmoUse 5
Weapon.AmmoGive 0
@ -704,6 +711,7 @@ ACTOR Blaster : HereticWeapon 53
ACTOR BlasterPowered : Blaster
{
Game Heretic
+WEAPON.POWERED_UP
Weapon.AmmoUse 5
Weapon.AmmoGive 0
@ -850,6 +858,7 @@ ACTOR SkullRod : HereticWeapon 2004
ACTOR SkullRodPowered : SkullRod
{
Game Heretic
+WEAPON.POWERED_UP
Weapon.AmmoUse1 5
Weapon.AmmoGive1 0
@ -1022,6 +1031,7 @@ ACTOR PhoenixRod : Weapon 2003 native
ACTOR PhoenixRodPowered : PhoenixRod native
{
Game Heretic
+WEAPON.POWERED_UP
Weapon.SisterWeapon "PhoenixRod"
Weapon.AmmoGive 0

View file

@ -71,6 +71,7 @@ ACTOR WraithvergeDrop
ACTOR CWeapWraithverge : ClericWeapon native
{
Game Hexen
Health 3
Weapon.SelectionOrder 3000
+WEAPON.PRIMARY_USES_BOTH

View file

@ -3,6 +3,7 @@
ACTOR CWeapMace : ClericWeapon
{
Game Hexen
Weapon.SelectionOrder 3500
Weapon.KickBack 150
Weapon.YAdjust -8

View file

@ -22,6 +22,11 @@ ACTOR ClericPlayer : PlayerPawn
Player.HealRadiusType "Health"
Player.Hexenarmor 10, 10, 25, 5, 20
Player.StartItem "CWeapMace"
Player.WeaponSlot 1, CWeapMace
Player.WeaponSlot 2, CWeapStaff
Player.WeaponSlot 3, CWeapFlame
Player.WeaponSlot 4, CWeapWraithverge
States
{
Spawn:

View file

@ -3,6 +3,7 @@
ACTOR FWeapFist : FighterWeapon
{
Game Hexen
+BLOODSPLATTER
Weapon.SelectionOrder 3400
+WEAPON.MELEEWEAPON

View file

@ -22,6 +22,11 @@ ACTOR FighterPlayer : PlayerPawn
Player.StartItem "FWeapFist"
Player.ForwardMove 1.08, 1.2
Player.SideMove 1.125, 1.475
Player.WeaponSlot 1, FWeapFist
Player.WeaponSlot 2, FWeapAxe
Player.WeaponSlot 3, FWeapHammer
Player.WeaponSlot 4, FWeapQuietus
States
{
Spawn:

View file

@ -71,6 +71,7 @@ ACTOR QuietusDrop
ACTOR FWeapQuietus : FighterWeapon
{
Game Hexen
Health 3
Weapon.SelectionOrder 2900
+WEAPON.PRIMARY_USES_BOTH

View file

@ -24,6 +24,11 @@ ACTOR MagePlayer : PlayerPawn
Player.StartItem "MWeapWand"
Player.ForwardMove 0.88, 0.92
Player.SideMove 0.875, 0.925
Player.WeaponSlot 1, MWeapWand
Player.WeaponSlot 2, MWeapFrost
Player.WeaponSlot 3, MWeapLightning
Player.WeaponSlot 4, MWeapBloodscourge
States
{
Spawn:

View file

@ -71,6 +71,7 @@ ACTOR BloodscourgeDrop
ACTOR MWeapBloodscourge : MageWeapon native
{
Game Hexen
Health 3
Weapon.SelectionOrder 3100
Weapon.AmmoUse1 15

View file

@ -3,9 +3,11 @@
ACTOR MWeapWand : MageWeapon
{
Game Hexen
Weapon.SelectionOrder 3600
Weapon.KickBack 0
Weapon.YAdjust 9
States
{
Select:

View file

@ -12,6 +12,14 @@ ACTOR StrifePlayer : PlayerPawn
Player.ColorRange 128, 143
Player.DisplayName "Rebel"
Player.StartItem "PunchDagger"
Player.WeaponSlot 1, PunchDagger
Player.WeaponSlot 2, StrifeCrossbow2, StrifeCrossbow
Player.WeaponSlot 3, AssaultGun
Player.WeaponSlot 4, MiniMissileLauncher
Player.WeaponSlot 5, StrifeGrenadeLauncher2, StrifeGrenadeLauncher
Player.WeaponSlot 6, FlameThrower
Player.WeaponSlot 7, Mauler2, Mauler
Player.WeaponSlot 8, Sigil
action native A_ItBurnsItBurns();
action native A_CrispyPlayer();

View file

@ -45,6 +45,7 @@ ACTOR StrifeSpark : StrifePuff
ACTOR PunchDagger : StrifeWeapon
{
Game Strife
Weapon.SelectionOrder 3900
+WEAPON.NOALERT
@ -198,11 +199,13 @@ ACTOR StrifeCrossbow : StrifeWeapon 2001
ACTOR StrifeCrossbow2 : StrifeCrossbow
{
Game Strife
Weapon.SelectionOrder 2700
Weapon.AmmoUse1 1
Weapon.AmmoGive1 0
Weapon.AmmoType1 "PoisonBolts"
Weapon.SisterWeapon "StrifeCrossbow"
States
{
Ready:
@ -362,6 +365,7 @@ ACTOR MiniMissilePuff : StrifePuff
ACTOR MiniMissile
{
Game Strife
ConversationID 99,-1,-1
Speed 20
Radius 10
@ -515,6 +519,7 @@ ACTOR Mauler : StrifeWeapon 2004
ACTOR Mauler2 : Mauler
{
Game Strife
Weapon.SelectionOrder 3300
Weapon.AmmoUse1 30
Weapon.AmmoGive1 0
@ -626,6 +631,7 @@ ACTOR MaulerTorpedoWave
ACTOR HEGrenade
{
Game Strife
ConversationID 106,-1,-1
Speed 15
Radius 13
@ -663,6 +669,7 @@ ACTOR HEGrenade
ACTOR PhosphorousGrenade
{
Game Strife
ConversationID 107,-1,-1
Speed 15
Radius 13
@ -782,6 +789,7 @@ ACTOR StrifeGrenadeLauncher : StrifeWeapon 154
ACTOR StrifeGrenadeLauncher2 : StrifeGrenadeLauncher
{
Game Strife
Weapon.SelectionOrder 3200
Weapon.AmmoUse1 1
Weapon.AmmoGive1 0

View file

@ -46,6 +46,21 @@ INDEXFONT_RAVEN
9 SMALLIN9
}
INDEXFONT_DOOM
{
0 STYSNUM0
1 STYSNUM1
2 STYSNUM2
3 STYSNUM3
4 STYSNUM4
5 STYSNUM5
6 STYSNUM6
7 STYSNUM7
8 STYSNUM8
9 STYSNUM9
}
// Doom and Chex intermissions use special text glyphs. The Raven and Strife
// games just use the standard big font.

View file

@ -81,15 +81,15 @@ statusbar normal // Standard Doom Status bar
drawswitchableimage keyslot 3 && 6, "nullimage", "STKEYS1", "STKEYS4", "STKEYS7", 239, 181;
drawswitchableimage keyslot 1 && 4, "nullimage", "STKEYS2", "STKEYS5", "STKEYS8", 239, 191;
drawnumber 3, INDEXFONT, gold, ammo Clip, 288, 173;
drawnumber 3, INDEXFONT, gold, ammo Shell, 288, 179;
drawnumber 3, INDEXFONT, gold, ammo RocketAmmo, 288, 185;
drawnumber 3, INDEXFONT, gold, ammo Cell, 288, 191;
drawnumber 3, INDEXFONT_DOOM, untranslated, ammo Clip, 288, 173;
drawnumber 3, INDEXFONT_DOOM, untranslated, ammo Shell, 288, 179;
drawnumber 3, INDEXFONT_DOOM, untranslated, ammo RocketAmmo, 288, 185;
drawnumber 3, INDEXFONT_DOOM, untranslated, ammo Cell, 288, 191;
drawnumber 3, INDEXFONT, gold, ammocapacity Clip, 314, 173;
drawnumber 3, INDEXFONT, gold, ammocapacity Shell, 314, 179;
drawnumber 3, INDEXFONT, gold, ammocapacity RocketAmmo, 314, 185;
drawnumber 3, INDEXFONT, gold, ammocapacity Cell, 314, 191;
drawnumber 3, INDEXFONT_DOOM, untranslated, ammocapacity Clip, 314, 173;
drawnumber 3, INDEXFONT_DOOM, untranslated, ammocapacity Shell, 314, 179;
drawnumber 3, INDEXFONT_DOOM, untranslated, ammocapacity RocketAmmo, 314, 185;
drawnumber 3, INDEXFONT_DOOM, untranslated, ammocapacity Cell, 314, 191;
gamemode deathmatch, teamgame
{
drawnumber 2, HUDFONT_DOOM, untranslated, frags, 138, 171;

View file

@ -65,7 +65,7 @@ Console:
#000000 #7F0000 0 127
#FF0000 #FFFEFE 128 256
Flat:
#DD0000
#FF5566
}
Blue