by Jonathan » Mon Aug 01, 2005 6:32 pm
Attached is the code for the emulated hud I wrote. It simulates the 320x200 old-style doom hud at the top of the screen, but only when screenblocks <= 10 (ie, the standard original hud is visible). It's buggy, and doesn't provide a perfect emulation of the original, however I believe as a proof of concept it shows pure acs hud drawing is feasible. Graf stated that drawing is the major hit, so it is coded to ensure sections are only redrawn as necessary by caching and comparing health, armor and ammo values.
If you want to try it out, paste it into doombuilder or something and run it on a map. Puke 3 to start it.
Spoiler:
Code: Select all
#include "zcommon.acs"
#define DrawHud 1
#define DrawLightHud 2
#define Start 3
#define HUD_BACKGROUND "STBAR"
#define FACE_NORMAL 1
#define FACE_EVIL 2
#define FACE_ANGRY 3
#define FACE_OUCH 4
#define FACE_DEAD 5
#define ID_FACE 100
#define ID_AMMO1 200
#define ID_AMMO2 201
#define ID_AMMO3 202
#define ID_HEALTH1 300
#define ID_HEALTH2 301
#define ID_HEALTH3 302
#define ID_ARMOR1 400
#define ID_ARMOR2 401
#define ID_ARMOR3 402
#define ID_STBAR 1000
#define ID_MINIAMMO 500
#define ID_MINIAMMO2 550
#define ID_WEAPONS 600
#define AMMO_NUM 4
int faceState = FACE_NORMAL;
int faceAnim = 0;
int faceTimer = 0;
int health = 0;
int healthState = 4;
int loop = 1;
int armor = 0;
int curAmmo = -1;
int ammoCnt = 0;
int newAmmoCnt = 0;
int weapon = -1;
int ammoCounts[4] = { 1000, 1000, 1000, 1000 };
int ammoCapac[4] = { 1000, 1000, 1000, 1000 };
int screenblocks;
bool backPack = false;
bool haveWeapons[9] = { false, false, false, false, false, false, false, false, false };
str weapons[9] = {
"Fist",
"Chainsaw",
"Pistol",
"Shotgun",
"SuperShotgun",
"Chaingun",
"RocketLauncher",
"PlasmaRifle",
"BFG9000"
};
str ammos[4] = {
"Clip",
"Shell",
"RocketAmmo",
"Cell"
};
int weapAmmos[9] = { -1, -1, 0, 1, 1, 0, 2, 3, 3 };
script Start(void) {
screenblocks = getcvar("screenblocks");
do {
if (screenblocks <= 10)
ACS_ExecuteWait(DrawHud, 0, 0, 0, 0);
else if (screenblocks == 11)
ACS_ExecuteWait(DrawLightHud, 0, 0, 0, 0);
else {
Delay(30);
screenblocks = getcvar("screenblocks");
}
} while (loop == 1);
}
script DrawLightHud(void) {
while (screenblocks == 11) {
Delay(30);
screenblocks = getcvar("screenblocks");
}
}
script DrawHud(void) {
health = checkinventory("Health");
armor = checkinventory("Armor");
SetHudSize(320, 200, 1);
SetFont(HUD_BACKGROUND);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_STBAR, CR_UNTRANSLATED, 160.0, 16.0, 0);
SetFont("STARMS");
HudMessage(s:"A"; HUDMSG_PLAIN, ID_STBAR - 1, CR_UNTRANSLATED, 124.0, 16.0, 0);
SetFont("STTPRCNT");
HudMessage(s:"A"; HUDMSG_PLAIN, ID_STBAR - 2, CR_UNTRANSLATED, 97.0, 11.0, 0);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_STBAR - 3, CR_UNTRANSLATED, 228.0, 11.0, 0);
DrawHealth();
DrawArmor();
DrawLittleAmmos();
NoWeapons();
DoWeapons();
while (screenblocks <= 10)
{
screenblocks = getcvar ("screenblocks");
int newHealth = checkinventory("Health");
int newArmor = checkinventory("Armor");
// The status bar is visible
if (newHealth != health) {
int diff = newHealth - health;
if (diff < 0) {
if (diff < -20)
faceState = FACE_OUCH;
else
faceState = FACE_ANGRY;
}
health = newHealth;
if (health < 99) {
healthState = health / 20;
if (health <= 0) {
healthState = 0;
faceState = FACE_DEAD;
}
}
else
healthState = 4;
DrawHealth();
faceTimer = 0;
}
if (newArmor != armor) {
armor = newArmor;
DrawArmor();
}
DoWeapons();
newAmmoCnt = CheckInventory(ammos[curAmmo]);
if (newAmmoCnt != ammoCnt) {
ammoCnt = newAmmoCnt;
DrawAmmo();
}
DrawFace();
DrawLittleAmmos();
Delay(1);
}
SetFont("STTPRCNT");
HudMessage(s:""; HUDMSG_PLAIN, ID_STBAR, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_STBAR - 1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_STBAR - 2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_STBAR - 3, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
}
str facesNormal[5][4] =
{{ "STFST40", "STFST41", "STFST42", "STFST41" },
{ "STFST30", "STFST31", "STFST32", "STFST31" },
{ "STFST20", "STFST21", "STFST22", "STFST21" },
{ "STFST10", "STFST11", "STFST12", "STFST11" },
{ "STFST00", "STFST01", "STFST02", "STFST01" }};
str facesOuch[5] = { "STFOUCH4", "STFOUCH3", "STFOUCH2", "STFOUCH1", "STFOUCH0" };
str facesAngry[5] = { "STFKILL4", "STFKILL3", "STFKILL2", "STFKILL1", "STFKILL0" };
function void DrawFace(void) {
if (faceState == FACE_NORMAL) {
if (faceTimer < 1) {
faceTimer = 30;
SetFont(facesNormal[healthState][faceAnim]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_FACE, CR_UNTRANSLATED, 155.0, 14.0, 0);
faceAnim++;
if (faceAnim > 3) faceAnim = 0;
}
}
else if (faceState == FACE_ANGRY) {
faceTimer = 40;
SetFont(facesAngry[healthState]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_FACE, CR_UNTRANSLATED, 155.0, 14.0, 0);
faceState = FACE_NORMAL;
}
else if (faceState == FACE_OUCH) {
faceTimer = 40;
SetFont(facesOuch[healthState]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_FACE, CR_UNTRANSLATED, 155.0, 15.0, 0);
faceState = FACE_NORMAL;
}
else if (faceState == FACE_DEAD) {
faceTimer = 5000;
SetFont("STFDEAD0");
HudMessage(s:"A"; HUDMSG_PLAIN, ID_FACE, CR_UNTRANSLATED, 155.0, 15.0, 0);
}
faceTimer--;
}
str healthNums[10] = {
"STTNUM0",
"STTNUM1",
"STTNUM2",
"STTNUM3",
"STTNUM4",
"STTNUM5",
"STTNUM6",
"STTNUM7",
"STTNUM8",
"STTNUM9"
};
function void DrawHealth(void) {
int numOn = 0;
int hNum = health;
if (hNum < 0) hNum = 0;
if ((hNum / 100) > 0) {
SetFont(healthNums[hNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_HEALTH1, CR_UNTRANSLATED, 55.0, 11.0, 0);
numOn = 1;
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_HEALTH1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
hNum = health % 100;
if (((hNum / 10) > 0) || numOn) {
SetFont(healthNums[hNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_HEALTH2, CR_UNTRANSLATED, 69.0, 11.0, 0);
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_HEALTH2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
hNum = health % 10;
SetFont(healthNums[hNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_HEALTH3, CR_UNTRANSLATED, 83.0, 11.0, 0);
}
function void DrawArmor(void) {
int numOn = 0;
int aNum = armor;
if (aNum < 0) aNum = 0;
if ((aNum / 100) > 0) {
SetFont(healthNums[aNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_ARMOR1, CR_UNTRANSLATED, 186.0, 11.0, 0);
numOn = 1;
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_ARMOR1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = armor % 100;
if (((aNum / 10) > 0) || numOn) {
SetFont(healthNums[aNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_ARMOR2, CR_UNTRANSLATED, 200.0, 11.0, 0);
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_ARMOR2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = armor % 10;
SetFont(healthNums[aNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_ARMOR3, CR_UNTRANSLATED, 214.0, 11.0, 0);
}
int weap_x[7] = { 113, 125, 125, 137, 113, 125, 137 };
int weap_y[7] = { 7, 7, 7, 7, 17, 17, 17 };
//int weap_c = { 3, 4, 4, 5, 6, 7, 8};
str ammoNums[10] = {
"STYSNUM0", "STYSNUM1", "STYSNUM2",
"STYSNUM3", "STYSNUM4", "STYSNUM5",
"STYSNUM6", "STYSNUM7", "STYSNUM8",
"STYSNUM9"
};
str ammoBlankNums[10] = {
"STGNUM0", "STGNUM1", "STGNUM2",
"STGNUM3", "STGNUM4", "STGNUM5",
"STGNUM6", "STGNUM7", "STGNUM8",
"STGNUM9"
};
int weapIDs[9] = { -1, -1, 2, 3, 3, 4, 5, 6, 7 };
function void DoWeapons(void) {
for(int i = 0; i < 9; i++) {
if (CheckInventory(weapons[i])) {
if (CheckWeapon(weapons[i])) {
if(i != weapon) {
weapon = i;
curAmmo = weapAmmos[i];
}
}
if (haveWeapons[i] == false) {
haveWeapons[i] = true;
if (weapIDs[i] > -1) {
SetFont(ammoNums[weapIDs[i]]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_WEAPONS + weapIDs[i], CR_UNTRANSLATED, weap_x[i - 2] * 1.0, weap_y[i - 2] * 1.0, 0);
}
}
}
}
}
function void NoWeapons(void) {
for(int i = 0; i < 9; i++) {
if (weapIDs[i] > -1) {
SetFont(ammoBlankNums[weapIDs[i]]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_WEAPONS + weapIDs[i], CR_UNTRANSLATED, weap_x[i - 2] * 1.0, weap_y[i - 2] * 1.0, 0);
}
}
}
function void DrawAmmo(void) {
int numOn = 0;
if (curAmmo == -1) {
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO3, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
return;
}
int aNum = ammoCnt;
if (aNum < 0) aNum = 0;
if ((aNum / 100) > 0) {
SetFont(healthNums[aNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_AMMO1, CR_UNTRANSLATED, 10.0, 11.0, 0);
numOn = 1;
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = ammoCnt % 100;
if (((aNum / 10) > 0) || numOn) {
SetFont(healthNums[aNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_AMMO2, CR_UNTRANSLATED, 24.0, 11.0, 0);
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = ammoCnt % 10;
SetFont(healthNums[aNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_AMMO3, CR_UNTRANSLATED, 38.0, 11.0, 0);
}
function void DrawLittleAmmos(void) {
int temp;
int aNum;
int numOn = 0;
for(int i = 0; i < AMMO_NUM; i++) {
temp = CheckInventory(ammos[i]);
if (temp != ammoCounts[i]) {
aNum = temp;
if ((aNum / 100) > 0) {
SetFont(ammoNums[aNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4), CR_UNTRANSLATED, 279.0, 8.0 + (i * 6.0), 0);
numOn = 1;
} else
HudMessage(s:""; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4), CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = temp % 100;
if (((aNum / 10) > 0) || numOn) {
SetFont(ammoNums[aNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4) + 1, CR_UNTRANSLATED, 283.0, 8.0 + (i * 6.0), 0);
} else
HudMessage(s:""; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4) + 1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = temp % 10;
SetFont(ammoNums[aNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4) + 2, CR_UNTRANSLATED, 287.0, 8.0 + (i * 6.0), 0);
ammoCounts[i] = temp;
}
numOn = 0;
temp = GetAmmoCapacity(ammos[i]);
if (temp != ammoCapac[i]) {
aNum = temp;
if ((aNum / 100) > 0) {
SetFont(ammoNums[aNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4), CR_UNTRANSLATED, 304.0, 8.0 + (i * 6.0), 0);
numOn = true;
} else
HudMessage(s:""; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4), CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = temp % 100;
if (((aNum / 10) > 0) || numOn) {
SetFont(ammoNums[aNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4) + 1, CR_UNTRANSLATED, 308.0, 8.0 + (i * 6.0), 0);
} else
HudMessage(s:""; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4) + 1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = temp % 10;
SetFont(ammoNums[aNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4) + 2, CR_UNTRANSLATED, 312.0, 8.0 + (i * 6.0), 0);
ammoCapac[i] = temp;
}
numOn = 0;
}
}
Attached is the code for the emulated hud I wrote. It simulates the 320x200 old-style doom hud at the top of the screen, but only when screenblocks <= 10 (ie, the standard original hud is visible). It's buggy, and doesn't provide a perfect emulation of the original, however I believe as a proof of concept it shows pure acs hud drawing is feasible. Graf stated that drawing is the major hit, so it is coded to ensure sections are only redrawn as necessary by caching and comparing health, armor and ammo values.
If you want to try it out, paste it into doombuilder or something and run it on a map. Puke 3 to start it.
[spoiler][code]
#include "zcommon.acs"
#define DrawHud 1
#define DrawLightHud 2
#define Start 3
#define HUD_BACKGROUND "STBAR"
#define FACE_NORMAL 1
#define FACE_EVIL 2
#define FACE_ANGRY 3
#define FACE_OUCH 4
#define FACE_DEAD 5
#define ID_FACE 100
#define ID_AMMO1 200
#define ID_AMMO2 201
#define ID_AMMO3 202
#define ID_HEALTH1 300
#define ID_HEALTH2 301
#define ID_HEALTH3 302
#define ID_ARMOR1 400
#define ID_ARMOR2 401
#define ID_ARMOR3 402
#define ID_STBAR 1000
#define ID_MINIAMMO 500
#define ID_MINIAMMO2 550
#define ID_WEAPONS 600
#define AMMO_NUM 4
int faceState = FACE_NORMAL;
int faceAnim = 0;
int faceTimer = 0;
int health = 0;
int healthState = 4;
int loop = 1;
int armor = 0;
int curAmmo = -1;
int ammoCnt = 0;
int newAmmoCnt = 0;
int weapon = -1;
int ammoCounts[4] = { 1000, 1000, 1000, 1000 };
int ammoCapac[4] = { 1000, 1000, 1000, 1000 };
int screenblocks;
bool backPack = false;
bool haveWeapons[9] = { false, false, false, false, false, false, false, false, false };
str weapons[9] = {
"Fist",
"Chainsaw",
"Pistol",
"Shotgun",
"SuperShotgun",
"Chaingun",
"RocketLauncher",
"PlasmaRifle",
"BFG9000"
};
str ammos[4] = {
"Clip",
"Shell",
"RocketAmmo",
"Cell"
};
int weapAmmos[9] = { -1, -1, 0, 1, 1, 0, 2, 3, 3 };
script Start(void) {
screenblocks = getcvar("screenblocks");
do {
if (screenblocks <= 10)
ACS_ExecuteWait(DrawHud, 0, 0, 0, 0);
else if (screenblocks == 11)
ACS_ExecuteWait(DrawLightHud, 0, 0, 0, 0);
else {
Delay(30);
screenblocks = getcvar("screenblocks");
}
} while (loop == 1);
}
script DrawLightHud(void) {
while (screenblocks == 11) {
Delay(30);
screenblocks = getcvar("screenblocks");
}
}
script DrawHud(void) {
health = checkinventory("Health");
armor = checkinventory("Armor");
SetHudSize(320, 200, 1);
SetFont(HUD_BACKGROUND);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_STBAR, CR_UNTRANSLATED, 160.0, 16.0, 0);
SetFont("STARMS");
HudMessage(s:"A"; HUDMSG_PLAIN, ID_STBAR - 1, CR_UNTRANSLATED, 124.0, 16.0, 0);
SetFont("STTPRCNT");
HudMessage(s:"A"; HUDMSG_PLAIN, ID_STBAR - 2, CR_UNTRANSLATED, 97.0, 11.0, 0);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_STBAR - 3, CR_UNTRANSLATED, 228.0, 11.0, 0);
DrawHealth();
DrawArmor();
DrawLittleAmmos();
NoWeapons();
DoWeapons();
while (screenblocks <= 10)
{
screenblocks = getcvar ("screenblocks");
int newHealth = checkinventory("Health");
int newArmor = checkinventory("Armor");
// The status bar is visible
if (newHealth != health) {
int diff = newHealth - health;
if (diff < 0) {
if (diff < -20)
faceState = FACE_OUCH;
else
faceState = FACE_ANGRY;
}
health = newHealth;
if (health < 99) {
healthState = health / 20;
if (health <= 0) {
healthState = 0;
faceState = FACE_DEAD;
}
}
else
healthState = 4;
DrawHealth();
faceTimer = 0;
}
if (newArmor != armor) {
armor = newArmor;
DrawArmor();
}
DoWeapons();
newAmmoCnt = CheckInventory(ammos[curAmmo]);
if (newAmmoCnt != ammoCnt) {
ammoCnt = newAmmoCnt;
DrawAmmo();
}
DrawFace();
DrawLittleAmmos();
Delay(1);
}
SetFont("STTPRCNT");
HudMessage(s:""; HUDMSG_PLAIN, ID_STBAR, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_STBAR - 1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_STBAR - 2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_STBAR - 3, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
}
str facesNormal[5][4] =
{{ "STFST40", "STFST41", "STFST42", "STFST41" },
{ "STFST30", "STFST31", "STFST32", "STFST31" },
{ "STFST20", "STFST21", "STFST22", "STFST21" },
{ "STFST10", "STFST11", "STFST12", "STFST11" },
{ "STFST00", "STFST01", "STFST02", "STFST01" }};
str facesOuch[5] = { "STFOUCH4", "STFOUCH3", "STFOUCH2", "STFOUCH1", "STFOUCH0" };
str facesAngry[5] = { "STFKILL4", "STFKILL3", "STFKILL2", "STFKILL1", "STFKILL0" };
function void DrawFace(void) {
if (faceState == FACE_NORMAL) {
if (faceTimer < 1) {
faceTimer = 30;
SetFont(facesNormal[healthState][faceAnim]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_FACE, CR_UNTRANSLATED, 155.0, 14.0, 0);
faceAnim++;
if (faceAnim > 3) faceAnim = 0;
}
}
else if (faceState == FACE_ANGRY) {
faceTimer = 40;
SetFont(facesAngry[healthState]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_FACE, CR_UNTRANSLATED, 155.0, 14.0, 0);
faceState = FACE_NORMAL;
}
else if (faceState == FACE_OUCH) {
faceTimer = 40;
SetFont(facesOuch[healthState]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_FACE, CR_UNTRANSLATED, 155.0, 15.0, 0);
faceState = FACE_NORMAL;
}
else if (faceState == FACE_DEAD) {
faceTimer = 5000;
SetFont("STFDEAD0");
HudMessage(s:"A"; HUDMSG_PLAIN, ID_FACE, CR_UNTRANSLATED, 155.0, 15.0, 0);
}
faceTimer--;
}
str healthNums[10] = {
"STTNUM0",
"STTNUM1",
"STTNUM2",
"STTNUM3",
"STTNUM4",
"STTNUM5",
"STTNUM6",
"STTNUM7",
"STTNUM8",
"STTNUM9"
};
function void DrawHealth(void) {
int numOn = 0;
int hNum = health;
if (hNum < 0) hNum = 0;
if ((hNum / 100) > 0) {
SetFont(healthNums[hNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_HEALTH1, CR_UNTRANSLATED, 55.0, 11.0, 0);
numOn = 1;
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_HEALTH1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
hNum = health % 100;
if (((hNum / 10) > 0) || numOn) {
SetFont(healthNums[hNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_HEALTH2, CR_UNTRANSLATED, 69.0, 11.0, 0);
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_HEALTH2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
hNum = health % 10;
SetFont(healthNums[hNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_HEALTH3, CR_UNTRANSLATED, 83.0, 11.0, 0);
}
function void DrawArmor(void) {
int numOn = 0;
int aNum = armor;
if (aNum < 0) aNum = 0;
if ((aNum / 100) > 0) {
SetFont(healthNums[aNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_ARMOR1, CR_UNTRANSLATED, 186.0, 11.0, 0);
numOn = 1;
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_ARMOR1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = armor % 100;
if (((aNum / 10) > 0) || numOn) {
SetFont(healthNums[aNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_ARMOR2, CR_UNTRANSLATED, 200.0, 11.0, 0);
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_ARMOR2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = armor % 10;
SetFont(healthNums[aNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_ARMOR3, CR_UNTRANSLATED, 214.0, 11.0, 0);
}
int weap_x[7] = { 113, 125, 125, 137, 113, 125, 137 };
int weap_y[7] = { 7, 7, 7, 7, 17, 17, 17 };
//int weap_c = { 3, 4, 4, 5, 6, 7, 8};
str ammoNums[10] = {
"STYSNUM0", "STYSNUM1", "STYSNUM2",
"STYSNUM3", "STYSNUM4", "STYSNUM5",
"STYSNUM6", "STYSNUM7", "STYSNUM8",
"STYSNUM9"
};
str ammoBlankNums[10] = {
"STGNUM0", "STGNUM1", "STGNUM2",
"STGNUM3", "STGNUM4", "STGNUM5",
"STGNUM6", "STGNUM7", "STGNUM8",
"STGNUM9"
};
int weapIDs[9] = { -1, -1, 2, 3, 3, 4, 5, 6, 7 };
function void DoWeapons(void) {
for(int i = 0; i < 9; i++) {
if (CheckInventory(weapons[i])) {
if (CheckWeapon(weapons[i])) {
if(i != weapon) {
weapon = i;
curAmmo = weapAmmos[i];
}
}
if (haveWeapons[i] == false) {
haveWeapons[i] = true;
if (weapIDs[i] > -1) {
SetFont(ammoNums[weapIDs[i]]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_WEAPONS + weapIDs[i], CR_UNTRANSLATED, weap_x[i - 2] * 1.0, weap_y[i - 2] * 1.0, 0);
}
}
}
}
}
function void NoWeapons(void) {
for(int i = 0; i < 9; i++) {
if (weapIDs[i] > -1) {
SetFont(ammoBlankNums[weapIDs[i]]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_WEAPONS + weapIDs[i], CR_UNTRANSLATED, weap_x[i - 2] * 1.0, weap_y[i - 2] * 1.0, 0);
}
}
}
function void DrawAmmo(void) {
int numOn = 0;
if (curAmmo == -1) {
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO3, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
return;
}
int aNum = ammoCnt;
if (aNum < 0) aNum = 0;
if ((aNum / 100) > 0) {
SetFont(healthNums[aNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_AMMO1, CR_UNTRANSLATED, 10.0, 11.0, 0);
numOn = 1;
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = ammoCnt % 100;
if (((aNum / 10) > 0) || numOn) {
SetFont(healthNums[aNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_AMMO2, CR_UNTRANSLATED, 24.0, 11.0, 0);
}
else
HudMessage(s:""; HUDMSG_PLAIN, ID_AMMO2, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = ammoCnt % 10;
SetFont(healthNums[aNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_AMMO3, CR_UNTRANSLATED, 38.0, 11.0, 0);
}
function void DrawLittleAmmos(void) {
int temp;
int aNum;
int numOn = 0;
for(int i = 0; i < AMMO_NUM; i++) {
temp = CheckInventory(ammos[i]);
if (temp != ammoCounts[i]) {
aNum = temp;
if ((aNum / 100) > 0) {
SetFont(ammoNums[aNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4), CR_UNTRANSLATED, 279.0, 8.0 + (i * 6.0), 0);
numOn = 1;
} else
HudMessage(s:""; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4), CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = temp % 100;
if (((aNum / 10) > 0) || numOn) {
SetFont(ammoNums[aNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4) + 1, CR_UNTRANSLATED, 283.0, 8.0 + (i * 6.0), 0);
} else
HudMessage(s:""; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4) + 1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = temp % 10;
SetFont(ammoNums[aNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO + (i * 4) + 2, CR_UNTRANSLATED, 287.0, 8.0 + (i * 6.0), 0);
ammoCounts[i] = temp;
}
numOn = 0;
temp = GetAmmoCapacity(ammos[i]);
if (temp != ammoCapac[i]) {
aNum = temp;
if ((aNum / 100) > 0) {
SetFont(ammoNums[aNum / 100]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4), CR_UNTRANSLATED, 304.0, 8.0 + (i * 6.0), 0);
numOn = true;
} else
HudMessage(s:""; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4), CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = temp % 100;
if (((aNum / 10) > 0) || numOn) {
SetFont(ammoNums[aNum / 10]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4) + 1, CR_UNTRANSLATED, 308.0, 8.0 + (i * 6.0), 0);
} else
HudMessage(s:""; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4) + 1, CR_UNTRANSLATED, 0.0, 0.0, 0.1);
aNum = temp % 10;
SetFont(ammoNums[aNum]);
HudMessage(s:"A"; HUDMSG_PLAIN, ID_MINIAMMO2 + (i * 4) + 2, CR_UNTRANSLATED, 312.0, 8.0 + (i * 6.0), 0);
ammoCapac[i] = temp;
}
numOn = 0;
}
}
[/code][/spoiler]