The original tutorials to add Body Armor have been lost to dead web pages. And as it is a commonly desired addition I thought we should have a tutorial covering all of it.
The most important part of this tutorial comes from Brother Tank's Armor Effectiveness / Take Damage Routine on DHW
@ : http://dhw.wolfenstein3d.com/viewtopic.php?t=1609
From this I just added what I knew of what else was needed, and the rest I filled in with a peak at TFS30 code from Tristan Van Puten.
Then there was just to realize my silly mistake of having my drawarmor routine calling gamestate.health....because I copy and pasted it and forgot to change that part... but now it seems to work.
Also used chatgpt to fix some stuff in the interactive object armor pickup to make it only take the armor if armor is below 90.
Here's a few important notes about implementing body armor, and this tutorial;
1 you may need to change your status bar.
2 on that note some of this tutorials methods may not be right for your mod, ie for the time being I have removed the Face(temporary I hope) to fit other things including objective points, keys, items, and of course Armor, some mods add onto health some have armor with its own count on status bar, some have other ways, in this method it displays on status bar as it's own count.
3 your armor pick up, this also a design question, I will include info on 2 methods ie traditional wolf3d bonus object on floor, and interactive object, but there are others ie interactive walls etc. you can also make enemies drop it but it would be critically damaged irl so....
4 I haven't added helmets or any other armor and I don't know how so if you want to add those maybe peak at some source codes, but it may be as simple as adding a helmet bonus object that gives armor percent.
5 coding is still something I struggle with and I haven't fully tested this yet so this could have problems, but it seems to work with basic testing.
6 I could not get givearmor (); to work so I used gamestat.armor = __;
7 I included in the comments some code that you may or may not need / want by all means just delete if you don't want it, but if you do want it its already there.
____________________________________________________________________________________________________________
Alright now lets add the armor;
Use your IDEs Search All Files function to Search for every instance of :
DrawHealth
Start with WL_Def.h
in the section // player state info
You should see :
void DrawHealth (void);
under that add
Now while we are in Def.h lets define some other things needed
Search for : // gamestate structure
find : typedef struct
add here
Now search for : WL_AGENT DEFINITIONS
under the line for take damage add this line
Now lets add the armor object(s)
most people use bonus objects so lets start there
find where in your static sprites list you want to add the pick up
I recommend adding a new object after your attack frames
Now if your adding a bonus object add that bonus part
search : typedef enum
add this under say bo_firstaid or bo_health
Now in WL_Act1 where your static sprites are set again you need to assign one to the bonus object(s)
and add in the stuff for it with the other bonus items ie
(By All Means if you haven't implemented and or don't want the extra stuff commented out just delete it. ie the cmd use, get message, etc)
In WL_Agent.cpp you in
= GetBonus
you will need something like
or
These bonus item pickups may or may not work I'm only using interactive objects for the armor pickup,
if you have issue chatgpt should be able to fix the pick up code, you may need the code
or if you want an interactive object do this
in WL_Def.h in your relevant section of the static sprites
and under type def enum
and in the static objects area in WL_Act1,c
and add the blocking stuff
and in WL_Agent.cpp
in your cmd_use
of course you will need the interactive object cmd_use function implemented found at link below
http://dhw.wolfenstein3d.com/viewtopic.php?p=73603
In WL_Game.cpp you must add the case numbers for the objects to spawn in the ScanInfoPlane
above one of those spawnstatic things, and don't ask me how those work I don't understand it.
ie
remember to put it on the case number You Need.
And the relevant map editor definitions to your preferred editor(s).
____________________________________________________________________________
Ok Now Back to the main part
Go Back and once again Search All Files for DrawHealth
As a general rule Every Place you find it add below it, this is drawing the armor count numbers to the status bar
DrawArmor
ie
This should be added to The following :
Now DrawHealth should yield a few more results that lead to places we need;
The actual Draw Health routine in WL_Agent.cpp
so in this area we need to add one for Draw Armor
This is telling the engine where on the status bar to display how much body armor the player has.
Remember those LatchNumber positions I put here are just the ones I'm using, you will probably need to adjust them
The First set numbers (22,...) are the position on the horizontal axix, The Second set (..,18,..) are the position on the vertical axis,
The Third set (...,2) is how many digits the armor count has, if you want over 99 percent than you need a 3 not a 2,
or if you want to be obnoxious 1
Now finally in WL_Agent.cpp
after the routine for DrawHealth we will add Brother Tanks special Armor using Take Damage Routine
gotagun is commented out, I don't know if that is vanilla dos code, or vanilla sdl code (I used WSJ's SDL Reloading tut),
or something custom. If you need it uncomment it.
Also you may want to draw the big smile face when the player equips the armor.
Well That's it, its not the best tutorial but I wanted to give something back to the community, as the community is always helping me, and this is something that was partly lost when older Wolf3D sites went down, and it can especially help those new to the code.
If you problems or solutions please share them here.
The most important part of this tutorial comes from Brother Tank's Armor Effectiveness / Take Damage Routine on DHW
@ : http://dhw.wolfenstein3d.com/viewtopic.php?t=1609
From this I just added what I knew of what else was needed, and the rest I filled in with a peak at TFS30 code from Tristan Van Puten.
Then there was just to realize my silly mistake of having my drawarmor routine calling gamestate.health....because I copy and pasted it and forgot to change that part... but now it seems to work.
Also used chatgpt to fix some stuff in the interactive object armor pickup to make it only take the armor if armor is below 90.
Here's a few important notes about implementing body armor, and this tutorial;
1 you may need to change your status bar.
2 on that note some of this tutorials methods may not be right for your mod, ie for the time being I have removed the Face(temporary I hope) to fit other things including objective points, keys, items, and of course Armor, some mods add onto health some have armor with its own count on status bar, some have other ways, in this method it displays on status bar as it's own count.
3 your armor pick up, this also a design question, I will include info on 2 methods ie traditional wolf3d bonus object on floor, and interactive object, but there are others ie interactive walls etc. you can also make enemies drop it but it would be critically damaged irl so....
4 I haven't added helmets or any other armor and I don't know how so if you want to add those maybe peak at some source codes, but it may be as simple as adding a helmet bonus object that gives armor percent.
5 coding is still something I struggle with and I haven't fully tested this yet so this could have problems, but it seems to work with basic testing.
6 I could not get givearmor (); to work so I used gamestat.armor = __;
7 I included in the comments some code that you may or may not need / want by all means just delete if you don't want it, but if you do want it its already there.
____________________________________________________________________________________________________________
Alright now lets add the armor;
Use your IDEs Search All Files function to Search for every instance of :
DrawHealth
Start with WL_Def.h
in the section // player state info
You should see :
void DrawHealth (void);
under that add
- Code:
void DrawArmor (void);
Now while we are in Def.h lets define some other things needed
Search for : // gamestate structure
find : typedef struct
add here
- Code:
short armor;
Now search for : WL_AGENT DEFINITIONS
under the line for take damage add this line
- Code:
void GiveArmor (int points);
Now lets add the armor object(s)
most people use bonus objects so lets start there
find where in your static sprites list you want to add the pick up
I recommend adding a new object after your attack frames
- Code:
SPR_Armor_Vest
- Code:
Armor_Vest_Table,Table_No_Armor
Now if your adding a bonus object add that bonus part
search : typedef enum
add this under say bo_firstaid or bo_health
- Code:
bo_armor,
Now in WL_Act1 where your static sprites are set again you need to assign one to the bonus object(s)
- Code:
{SPR_Armor_Vest,bo_armor},
and add in the stuff for it with the other bonus items ie
- Code:
case bo_armor:
(By All Means if you haven't implemented and or don't want the extra stuff commented out just delete it. ie the cmd use, get message, etc)
In WL_Agent.cpp you in
= GetBonus
you will need something like
- Code:
case bo_Armor:
// SD_PlaySound (ARMOR); // if you have a sound for it uncomment this
// GiveArmor (50); // I cant get that method to work!
// GetMessage("Armor Vest");// if you have the feature implemented you can use it here
gametate.ammo = 99; // how much?
break;
or
- Code:
case bo_Armor:
if(buttonstate[bt_use])
{
if (gamestate.armor == 99) // or whatever your max is
return;
// GiveArmor (99); // I cant get that method to work!
gametate.ammo = 99; // how much?
// SD_PlaySound (ARMOR); // if you have a sound for it uncomment this
// GetMessage("Armor Vest"); // if you have the feature implemented you can use it here
// if (gamestate.mapon == ) // for level specific customizing {}
break;
}
These bonus item pickups may or may not work I'm only using interactive objects for the armor pickup,
if you have issue chatgpt should be able to fix the pick up code, you may need the code
or if you want an interactive object do this
in WL_Def.h in your relevant section of the static sprites
- Code:
// Armor
Armor_Vest_Table,Table_No_Armor,
and under type def enum
- Code:
zip_equip,
and in the static objects area in WL_Act1,c
- Code:
{Armor_Vest_Table,zip_equip},{Table_No_Armor,block},
and add the blocking stuff
- Code:
case zip_equip:
actorat[tilex][tiley] = (objtype *)64; // consider it a blocking tile
break;
and in WL_Agent.cpp
in your cmd_use
- Code:
case Armor_Vest_Table: //Armor Vest Table
// Give ? (Body_Armor_Vest);
if (gamestate.armor <= 90) // Check if armor is less than or equal to 90
{
GetMessage("Body Armor Vest");//experimental Body Armor from Luftwaffe
statptr->shapenum = Table_No_Armor ;
// GiveArmor(72);
gamestate.armor = 72;
StartBonusFlash ();
}
else
{
return; // Don't give armor if it's over 90, simply return from the function
}
break;
of course you will need the interactive object cmd_use function implemented found at link below
http://dhw.wolfenstein3d.com/viewtopic.php?p=73603
In WL_Game.cpp you must add the case numbers for the objects to spawn in the ScanInfoPlane
above one of those spawnstatic things, and don't ask me how those work I don't understand it.
ie
- Code:
case 398: // Table with Armor Vest
remember to put it on the case number You Need.
And the relevant map editor definitions to your preferred editor(s).
____________________________________________________________________________
Ok Now Back to the main part
Go Back and once again Search All Files for DrawHealth
As a general rule Every Place you find it add below it, this is drawing the armor count numbers to the status bar
DrawArmor
ie
- Code:
DrawWeapon ();
DrawHealth ();
DrawKeys ();
DrawAmmo ();
DrawArmor ();
DrawScore ();
This should be added to The following :
- DrawPlayScreens in WL_Game.cpp (and that list of status bar counts is in there twice)
- Died in WL_Game.cpp (toward end of died code)
- QuickLoad in WL_Menu.cpp
- You may also want to add it to
- The main cheat code ie ILM or whatever you have changed it to.
- That is in WL_Play.cpp
- (We've already added what's needed in WL_Def.h)
Now DrawHealth should yield a few more results that lead to places we need;
The actual Draw Health routine in WL_Agent.cpp
so in this area we need to add one for Draw Armor
- Code:
/*
===============
=
= DrawArmor
=
===============
*/
void DrawArmor (void)
{
if(viewsize == 21 && ingame) return;
LatchNumber (21,18,2,gamestate.armor);
}
This is telling the engine where on the status bar to display how much body armor the player has.
Remember those LatchNumber positions I put here are just the ones I'm using, you will probably need to adjust them
The First set numbers (22,...) are the position on the horizontal axix, The Second set (..,18,..) are the position on the vertical axis,
The Third set (...,2) is how many digits the armor count has, if you want over 99 percent than you need a 3 not a 2,
or if you want to be obnoxious 1
Now finally in WL_Agent.cpp
after the routine for DrawHealth we will add Brother Tanks special Armor using Take Damage Routine
- Code:
/*
===============
=
= TakeDamage
=
===============
*/
// with BT's Armor-Damage System
void TakeDamage (int points,objtype *attacker)
{
int hpoints;
LastAttacker = attacker;
if (gamestate.victoryflag) return;
if (gamestate.difficulty==gd_baby) points>>=2;
if (!godmode)
{
if (gamestate.armor >=1)
{
hpoints = (gamestate.armor * points) / 99;
points -= hpoints;
gamestate.armor -=hpoints;
if (gamestate.armor < 0 ) gamestate.armor = 0;
DrawArmor (); // Your routine to update armors value on status bar
}
gamestate.health -= points;
StartDamageFlash (points);
}
if (gamestate.health<=0)
{
gamestate.health = 0;
playstate = ex_died;
killerobj = attacker;
}
// gotgatgun=0; // idk what this is?
DrawHealth ();
DrawFace ();
}
gotagun is commented out, I don't know if that is vanilla dos code, or vanilla sdl code (I used WSJ's SDL Reloading tut),
or something custom. If you need it uncomment it.
Also you may want to draw the big smile face when the player equips the armor.
Well That's it, its not the best tutorial but I wanted to give something back to the community, as the community is always helping me, and this is something that was partly lost when older Wolf3D sites went down, and it can especially help those new to the code.
If you problems or solutions please share them here.