Browse Source

Unify a chunk of Hellfire code

pull/982/head
Anders Jenbo 5 years ago
parent
commit
c3b4b5193f
  1. 7
      Source/inv.cpp
  2. 8
      Source/itemdat.cpp
  3. 187
      Source/items.cpp
  4. 6
      Source/msg.cpp
  5. 26
      Source/stores.cpp
  6. 185
      SourceX/DiabloUI/credits_lines.cpp

7
Source/inv.cpp

@ -1765,10 +1765,8 @@ void InvGetItem(int pnum, int ii)
CheckBookLevel(pnum);
CheckItemStats(pnum);
cursor_updated = FALSE;
#ifdef HELLFIRE
if (plr[pnum].HoldItem._itype == ITYPE_GOLD && GoldAutoPlace(pnum))
if (gbIsHellfire && plr[pnum].HoldItem._itype == ITYPE_GOLD && GoldAutoPlace(pnum))
cursor_updated = TRUE;
#endif
dItem[item[ii]._ix][item[ii]._iy] = 0;
if (currlevel == 21 && item[ii]._ix == CornerStone.x && item[ii]._iy == CornerStone.y) {
CornerStone.item.IDidx = -1;
@ -1953,9 +1951,6 @@ void AutoGetItem(int pnum, int ii)
RespawnItem(ii, TRUE);
NetSendCmdPItem(TRUE, CMD_RESPAWNITEM, item[ii]._ix, item[ii]._iy);
plr[pnum].HoldItem._itype = ITYPE_NONE;
#ifdef HELLFIRE
NewCursor(CURSOR_HAND);
#endif
}
}

8
Source/itemdat.cpp

@ -278,7 +278,7 @@ const PLStruct PL_Prefix[] = {
/** Contains the data related to each item suffix. */
const PLStruct PL_Suffix[] = {
// clang-format off
// clang-format off
// PLName, PLPower, PLParam1, PLParam2, PLMinLvl, PLIType, PLGOE, PLDouble, PLOk, PLMinVal, PLMaxVal, PLMultVal
{ "quality", IPL_DAMMOD, 1, 2, 2, PLT_WEAP | PLT_STAFF | PLT_BOW , GOE_ANY, FALSE, TRUE, 100, 200, 2 },
{ "maiming", IPL_DAMMOD, 3, 5, 7, PLT_WEAP | PLT_STAFF | PLT_BOW , GOE_ANY, FALSE, TRUE, 1300, 1500, 3 },
@ -364,15 +364,9 @@ const PLStruct PL_Suffix[] = {
{ "vampires", IPL_STEALMANA, 5, 5, 19, PLT_WEAP , GOE_ANY, FALSE, TRUE, 15000, 15000, 3 },
{ "the leech", IPL_STEALLIFE, 3, 3, 8, PLT_WEAP , GOE_ANY, FALSE, TRUE, 7500, 7500, 3 },
{ "blood", IPL_STEALLIFE, 5, 5, 19, PLT_WEAP , GOE_ANY, FALSE, TRUE, 15000, 15000, 3 },
#ifdef HELLFIRE
{ "piercing", IPL_TARGAC, 1, 1, 1, PLT_WEAP | PLT_BOW , GOE_ANY, FALSE, TRUE, 1000, 1000, 3 },
{ "puncturing", IPL_TARGAC, 2, 2, 9, PLT_WEAP | PLT_BOW , GOE_ANY, FALSE, TRUE, 2000, 2000, 6 },
{ "bashing", IPL_TARGAC, 3, 3, 17, PLT_WEAP , GOE_ANY, FALSE, TRUE, 4000, 4000, 12 },
#else
{ "piercing", IPL_TARGAC, 2, 6, 1, PLT_WEAP | PLT_BOW , GOE_ANY, FALSE, TRUE, 1000, 1000, 3 },
{ "puncturing", IPL_TARGAC, 4, 12, 9, PLT_WEAP | PLT_BOW , GOE_ANY, FALSE, TRUE, 2000, 2000, 6 },
{ "bashing", IPL_TARGAC, 8, 24, 17, PLT_WEAP , GOE_ANY, FALSE, TRUE, 4000, 4000, 12 },
#endif
{ "readiness", IPL_FASTATTACK, 1, 1, 1, PLT_WEAP | PLT_STAFF | PLT_BOW , GOE_ANY, FALSE, TRUE, 2000, 2000, 2 },
{ "swiftness", IPL_FASTATTACK, 2, 2, 10, PLT_WEAP | PLT_STAFF | PLT_BOW , GOE_ANY, FALSE, TRUE, 4000, 4000, 4 },
{ "speed", IPL_FASTATTACK, 3, 3, 19, PLT_WEAP | PLT_STAFF , GOE_ANY, FALSE, TRUE, 8000, 8000, 8 },

187
Source/items.cpp

@ -1820,11 +1820,7 @@ void GetItemAttrs(int i, int idata, int lvl)
item[i]._iMinDam = AllItemsList[idata].iMinDam;
item[i]._iMaxDam = AllItemsList[idata].iMaxDam;
item[i]._iAC = AllItemsList[idata].iMinAC + random_(20, AllItemsList[idata].iMaxAC - AllItemsList[idata].iMinAC + 1);
#ifndef HELLFIRE
item[i]._iFlags = AllItemsList[idata].iFlags;
#else
item[i]._iFlags = 0;
#endif
item[i]._iMiscId = AllItemsList[idata].iMiscId;
item[i]._iSpell = AllItemsList[idata].iSpell;
item[i]._iMagical = ITEM_QUALITY_NORMAL;
@ -2107,27 +2103,19 @@ void SaveItemPower(int i, int power, int param1, int param2, int minval, int max
break;
case IPL_FIRE_ARROWS:
item[i]._iFlags |= ISPL_FIRE_ARROWS;
#ifdef HELLFIRE
item[i]._iFlags &= ~ISPL_LIGHT_ARROWS;
#endif
item[i]._iFMinDam = param1;
item[i]._iFMaxDam = param2;
#ifdef HELLFIRE
item[i]._iLMinDam = 0;
item[i]._iLMaxDam = 0;
#endif
break;
case IPL_LIGHT_ARROWS:
item[i]._iFlags |= ISPL_LIGHT_ARROWS;
#ifdef HELLFIRE
item[i]._iFlags &= ~ISPL_FIRE_ARROWS;
#endif
item[i]._iLMinDam = param1;
item[i]._iLMaxDam = param2;
#ifdef HELLFIRE
item[i]._iFMinDam = 0;
item[i]._iFMaxDam = 0;
#endif
break;
case IPL_FIREBALL:
item[i]._iFlags |= (ISPL_LIGHT_ARROWS | ISPL_FIRE_ARROWS);
@ -2176,11 +2164,10 @@ void SaveItemPower(int i, int power, int param1, int param2, int minval, int max
drawhpflag = TRUE;
break;
case IPL_TARGAC:
#ifdef HELLFIRE
item[i]._iPLEnAc = param1;
#else
item[i]._iPLEnAc += r;
#endif
if (gbIsHellfire)
item[i]._iPLEnAc = param1;
else
item[i]._iPLEnAc += r;
break;
case IPL_FASTATTACK:
if (param1 == 1)
@ -2310,6 +2297,28 @@ void SaveItemPower(int i, int power, int param1, int param2, int minval, int max
}
}
static void SaveItemSuffix(int i, int sufidx)
{
int param1 = PL_Suffix[sufidx].PLParam1;
int param2 = PL_Suffix[sufidx].PLParam1;
if (!gbIsHellfire) {
if (sufidx >= 84 && sufidx <= 86) {
param1 = 2 << param1;
param2 = 6 << param2;
}
}
SaveItemPower(
i,
PL_Suffix[sufidx].PLPower,
param1,
param2,
PL_Suffix[sufidx].PLMinVal,
PL_Suffix[sufidx].PLMaxVal,
PL_Suffix[sufidx].PLMultVal);
}
void GetItemPower(int i, int minlvl, int maxlvl, int flgs, BOOL onlygood)
{
int pre, post, nt, nl, j, preidx, sufidx;
@ -2381,14 +2390,7 @@ void GetItemPower(int i, int minlvl, int maxlvl, int flgs, BOOL onlygood)
sprintf(istr, "%s of %s", item[i]._iIName, PL_Suffix[sufidx].PLName);
strcpy(item[i]._iIName, istr);
item[i]._iMagical = ITEM_QUALITY_MAGIC;
SaveItemPower(
i,
PL_Suffix[sufidx].PLPower,
PL_Suffix[sufidx].PLParam1,
PL_Suffix[sufidx].PLParam2,
PL_Suffix[sufidx].PLMinVal,
PL_Suffix[sufidx].PLMaxVal,
PL_Suffix[sufidx].PLMultVal);
SaveItemSuffix(i, sufidx);
item[i]._iSufPower = PL_Suffix[sufidx].PLPower;
}
}
@ -3885,11 +3887,7 @@ void PrintItemPower(char plidx, ItemStruct *x)
strcpy(tempstr, "hit steals 5% life");
break;
case IPL_TARGAC:
#ifdef HELLFIRE
strcpy(tempstr, "penetrates target's armor");
#else
strcpy(tempstr, "damages target's armor");
#endif
break;
case IPL_FASTATTACK:
if (x->_iFlags & ISPL_QUICKATTACK)
@ -4685,8 +4683,6 @@ static void SpawnOnePremium(int i, int plvl, int myplr)
if (plvl < 1)
plvl = 1;
int maxValue = gbIsHellfire ? 200000 : 140000;
do {
item[0]._iSeed = GetRndSeed();
SetRndSeed(item[0]._iSeed);
@ -4695,7 +4691,7 @@ static void SpawnOnePremium(int i, int plvl, int myplr)
GetItemBonus(0, itype, plvl >> 1, plvl, TRUE, FALSE);
if (!gbIsHellfire) {
if (item[0]._iIvalue > maxValue)
if (item[0]._iIvalue > 140000)
continue;
break;
}
@ -4738,7 +4734,7 @@ static void SpawnOnePremium(int i, int plvl, int myplr)
ivalue *= 0.8;
count++;
} while ((item[0]._iIvalue > maxValue
} while ((item[0]._iIvalue > 200000
|| item[0]._iMinStr > strength
|| item[0]._iMinMag > magic
|| item[0]._iMinDex > dexterity
@ -4917,7 +4913,7 @@ void SpawnWitch(int lvl)
&& lvl >= AllItemsList[i].iMinMLvl) {
item[0]._iSeed = GetRndSeed();
SetRndSeed(item[0]._iSeed);
volatile int junk = random_(0, 1);
random_(0, 1);
GetItemAttrs(0, i, lvl);
witchitem[j] = item[0];
@ -4985,7 +4981,6 @@ void SpawnBoy(int lvl)
{
int itype;
#ifdef HELLFIRE
int ivalue;
int count = 0;
@ -5008,17 +5003,20 @@ void SpawnBoy(int lvl)
magic = plr[myplr]._pMagic;
}
magic *= 1.2;
#endif
if (boylevel < (lvl >> 1) || boyitem._itype == ITYPE_NONE) {
int maxValue = gbIsHellfire ? 200000 : 140000;
do {
item[0]._iSeed = GetRndSeed();
SetRndSeed(item[0]._iSeed);
itype = RndBoyItem(lvl) - 1;
GetItemAttrs(0, itype, lvl);
GetItemBonus(0, itype, lvl, 2 * lvl, TRUE, TRUE);
#ifdef HELLFIRE
if (!gbIsHellfire) {
if (item[0]._iIvalue > 140000)
continue;
break;
}
ivalue = 0;
@ -5090,15 +5088,12 @@ void SpawnBoy(int lvl)
break;
}
}
} while ((item[0]._iIvalue > maxValue
} while ((item[0]._iIvalue > 200000
|| item[0]._iMinStr > strength
|| item[0]._iMinMag > magic
|| item[0]._iMinDex > dexterity
|| item[0]._iIvalue < ivalue)
&& count < 250);
#else
} while (item[0]._iIvalue > maxValue);
#endif
boyitem = item[0];
boyitem._iCreateInfo = lvl | CF_BOY;
boyitem._iIdentified = TRUE;
@ -5109,75 +5104,31 @@ void SpawnBoy(int lvl)
BOOL HealerItemOk(int i)
{
BOOL result;
result = FALSE;
if (AllItemsList[i].itype != ITYPE_MISC)
return FALSE;
if (AllItemsList[i].iMiscId == IMISC_SCROLL && AllItemsList[i].iSpell == SPL_HEAL)
result = TRUE;
if (AllItemsList[i].iMiscId == IMISC_SCROLLT && AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers != 1)
result = FALSE;
if (AllItemsList[i].iMiscId == IMISC_SCROLLT && AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers != 1)
result = TRUE;
if (AllItemsList[i].iMiscId == IMISC_SCROLL)
return AllItemsList[i].iSpell == SPL_HEAL;
if (AllItemsList[i].iMiscId == IMISC_SCROLLT)
return AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers != 1;
if (gbMaxPlayers == 1) {
#ifdef HELLFIRE
if (AllItemsList[i].iMiscId == IMISC_ELIXSTR && plr[myplr]._pBaseStr < MaxStats[plr[myplr]._pClass][ATTRIB_STR])
result = TRUE;
else if (AllItemsList[i].iMiscId == IMISC_ELIXMAG && plr[myplr]._pBaseMag < MaxStats[plr[myplr]._pClass][ATTRIB_MAG])
result = TRUE;
else if (AllItemsList[i].iMiscId == IMISC_ELIXDEX && plr[myplr]._pBaseDex < MaxStats[plr[myplr]._pClass][ATTRIB_DEX])
result = TRUE;
else if (AllItemsList[i].iMiscId == IMISC_ELIXVIT && plr[myplr]._pBaseVit < MaxStats[plr[myplr]._pClass][ATTRIB_VIT])
result = TRUE;
}
if (AllItemsList[i].iMiscId == IMISC_FULLHEAL) // BUGFIX this is a duplicate with the wrong case
result = TRUE;
else if (AllItemsList[i].iMiscId == IMISC_REJUV)
result = TRUE;
else if (AllItemsList[i].iMiscId == IMISC_FULLREJUV)
result = TRUE;
else if (AllItemsList[i].iMiscId == IMISC_HEAL)
result = FALSE;
else if (AllItemsList[i].iMiscId == IMISC_FULLHEAL)
result = FALSE;
else if (AllItemsList[i].iMiscId == IMISC_MANA)
result = FALSE;
else if (AllItemsList[i].iMiscId == IMISC_FULLMANA)
result = FALSE;
#else
if (AllItemsList[i].iMiscId == IMISC_ELIXSTR)
result = TRUE;
return !gbIsHellfire || plr[myplr]._pBaseStr < MaxStats[plr[myplr]._pClass][ATTRIB_STR];
if (AllItemsList[i].iMiscId == IMISC_ELIXMAG)
result = TRUE;
return !gbIsHellfire || plr[myplr]._pBaseMag < MaxStats[plr[myplr]._pClass][ATTRIB_MAG];
if (AllItemsList[i].iMiscId == IMISC_ELIXDEX)
result = TRUE;
return !gbIsHellfire || plr[myplr]._pBaseDex < MaxStats[plr[myplr]._pClass][ATTRIB_DEX];
if (AllItemsList[i].iMiscId == IMISC_ELIXVIT)
result = TRUE;
return !gbIsHellfire || plr[myplr]._pBaseVit < MaxStats[plr[myplr]._pClass][ATTRIB_VIT];
}
if (AllItemsList[i].iMiscId == IMISC_FULLHEAL) // BUGFIX this is a duplicate with the wrong case
result = TRUE;
if (AllItemsList[i].iMiscId == IMISC_REJUV)
result = TRUE;
return TRUE;
if (AllItemsList[i].iMiscId == IMISC_FULLREJUV)
result = TRUE;
if (AllItemsList[i].iMiscId == IMISC_HEAL)
result = FALSE;
if (AllItemsList[i].iMiscId == IMISC_FULLHEAL)
result = FALSE;
if (AllItemsList[i].iMiscId == IMISC_MANA)
result = FALSE;
if (AllItemsList[i].iMiscId == IMISC_FULLMANA)
result = FALSE;
#endif
return TRUE;
return result;
return FALSE;
}
int RndHealerItem(int lvl)
@ -5247,11 +5198,7 @@ void SpawnHealer(int lvl)
} else {
srnd = 2;
}
#ifdef HELLFIRE
nsi = random_(50, 10) + 10;
#else
nsi = random_(50, 8) + 10;
#endif
nsi = random_(50, gbIsHellfire ? 10 : 8) + 10;
for (i = srnd; i < nsi; i++) {
item[0]._iSeed = GetRndSeed();
SetRndSeed(item[0]._iSeed);
@ -5321,28 +5268,22 @@ void RecreateWitchItem(int ii, int idx, int lvl, int iseed)
if (idx == IDI_MANA || idx == IDI_FULLMANA || idx == IDI_PORTAL) {
GetItemAttrs(ii, idx, lvl);
} else if (gbIsHellfire && idx >= 114 && idx <= 117) {
SetRndSeed(iseed);
random_(0, 1);
iblvl = lvl;
GetItemAttrs(ii, idx, iblvl);
} else {
#ifdef HELLFIRE
if (idx >= 114 && idx <= 117) {
SetRndSeed(iseed);
volatile int hi_predelnik = random_(0, 1);
iblvl = lvl;
GetItemAttrs(ii, idx, iblvl);
} else {
#endif
SetRndSeed(iseed);
itype = RndWitchItem(lvl) - 1;
GetItemAttrs(ii, itype, lvl);
iblvl = -1;
if (random_(51, 100) <= 5)
iblvl = 2 * lvl;
if (iblvl == -1 && item[ii]._iMiscId == IMISC_STAFF)
iblvl = 2 * lvl;
if (iblvl != -1)
GetItemBonus(ii, itype, iblvl >> 1, iblvl, TRUE, TRUE);
#ifdef HELLFIRE
}
#endif
SetRndSeed(iseed);
itype = RndWitchItem(lvl) - 1;
GetItemAttrs(ii, itype, lvl);
iblvl = -1;
if (random_(51, 100) <= 5)
iblvl = 2 * lvl;
if (iblvl == -1 && item[ii]._iMiscId == IMISC_STAFF)
iblvl = 2 * lvl;
if (iblvl != -1)
GetItemBonus(ii, itype, iblvl >> 1, iblvl, TRUE, TRUE);
}
item[ii]._iSeed = iseed;

6
Source/msg.cpp

@ -2019,11 +2019,7 @@ static DWORD On_MONSTDAMAGE(TCmd *pCmd, int pnum)
else if (pnum != myplr) {
if (currlevel == plr[pnum].plrlevel) {
monster[p->wMon].mWhoHit |= 1 << pnum;
#ifdef HELLFIRE
if (monster[p->wMon]._mhitpoints >= 0) {
#else
if (monster[p->wMon]._mhitpoints != 0) {
#endif
if (monster[p->wMon]._mhitpoints > 0) {
monster[p->wMon]._mhitpoints -= p->dwDam;
if ((monster[p->wMon]._mhitpoints >> 6) < 1)
monster[p->wMon]._mhitpoints = 1 << 6;

26
Source/stores.cpp

@ -1180,11 +1180,10 @@ void S_StartBBoy()
else
AddSText(20, 10, FALSE, boyitem._iName, iclr, TRUE);
#ifdef HELLFIRE
AddSTextVal(10, boyitem._iIvalue - (boyitem._iIvalue >> 2));
#else
AddSTextVal(10, boyitem._iIvalue + (boyitem._iIvalue >> 1));
#endif
if (gbIsHellfire)
AddSTextVal(10, boyitem._iIvalue - (boyitem._iIvalue >> 2));
else
AddSTextVal(10, boyitem._iIvalue + (boyitem._iIvalue >> 1));
PrintStoreItem(&boyitem, 11, iclr);
AddSText(0, 22, TRUE, "Leave", COL_WHITE, TRUE);
OffsetSTextY(22, 6);
@ -2420,19 +2419,16 @@ void S_BBuyEnter()
stextshold = STORE_BBOY;
stextvhold = stextsval;
stextlhold = 10;
#ifdef HELLFIRE
if (plr[myplr]._pGold < boyitem._iIvalue - (boyitem._iIvalue >> 2)) {
#else
if (plr[myplr]._pGold < boyitem._iIvalue + (boyitem._iIvalue >> 1)) {
#endif
int price = boyitem._iIvalue;
if (gbIsHellfire)
price -= boyitem._iIvalue >> 2;
else
price += boyitem._iIvalue >> 1;
if (plr[myplr]._pGold < price) {
StartStore(STORE_NOMONEY);
} else {
plr[myplr].HoldItem = boyitem;
#ifdef HELLFIRE
plr[myplr].HoldItem._iIvalue -= plr[myplr].HoldItem._iIvalue >> 2;
#else
plr[myplr].HoldItem._iIvalue += plr[myplr].HoldItem._iIvalue >> 1;
#endif
plr[myplr].HoldItem._iIvalue = price;
SetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);
done = FALSE;
for (i = 0; i < NUM_INV_GRID_ELEM && !done; i++) {

185
SourceX/DiabloUI/credits_lines.cpp

@ -3,99 +3,6 @@
namespace dvl {
const char *const CREDITS_LINES[] = {
#ifdef HELLFIRE
" Synergistic Software",
"",
"General Manager",
" Bob Clardy",
"",
"Lead Programmer",
" Donald Tsang",
"",
"Software Engineering",
" Jim Edwards, Gary Powell, D'Andre Pritchett",
"",
"Art Director",
" Kirt Lemons",
"",
"Artists",
" Darren Lamb, Mike McMillen,",
" Jason Robertson, Peter Watje",
"",
"Design",
" Kirt Lemons, Donald Tsang, Peter Watje",
" Jim Edwards, Mike McMillen",
"",
"Additional Design",
" Michael Ormsby",
"",
"Sound Design, SFX & Audio Engineering",
" Craig Utterback",
"",
"Quality Assurance Lead",
" Mona Branham",
"",
"Testers",
" Chris Barker, Steve Chin, Derek Clardy, Conor Durdy,",
" Amy Edwards, Greg Hightower, Tim Jensen, Jeremy Jones,",
" John Lang, Daudi Pritchett, Doug Van Horne, Gordon Wilcox",
"",
"Manual",
" Suzanne David, Linda Westerfield,",
" Ann Dickens Clardy, Kirt Lemons",
"",
"Voices",
" Jim Edwards, Paul Eiding, Eve Forward,",
" Mackenzie Powell, Rodney Sherwood, Craig Utterback",
"",
"",
" Additional Work",
"",
"Quest Text Writing",
" Eve Forward",
"",
"Thanks to",
" Trisha Durdy, Dustin Freeman, D'Andre Pritchett",
"",
"",
"",
" Special Thanks to Blizzard Entertainment",
"",
"",
"",
"",
" Sierra On-Line Inc. Northwest",
"",
"Quality Assurance Manager",
" Gary Stevens",
"",
"Quality Assurance Lead Tester",
" Bernadette Pryor",
"",
"Main Testers",
" Erik Johnson, David Lee, Kristofer Hall",
"",
"Additional Testers",
" Cade Myers, Jeff Ingham, Phil Kuhlmey,",
" Eric Gelfand, Mark Wyman, Torsten Reinl,",
" Erinn Hamilton",
"",
"Product Marketing Manager",
" Eddie Ranchigoda",
"",
"Public Relations Manager",
" Eric Twelker",
"",
"Associate Product Manager",
" Joe Roth",
"",
"Thanks to",
" Cindy Vanous, Joshua Bentley, Robert Zimmerman, Robert Jerauld,",
" Dennis Ham, Andrea Stone, Beth Quintana, Jennifer Keenan, Gary Brown,",
" Ken Eaton, Matt Eslick, Kate Powell, Bryon Mcpherson, David Beetlestone",
"",
""
#else
"Game Design",
" Blizzard North",
"",
@ -299,6 +206,97 @@ const char *const CREDITS_LINES[] = {
" Bob and Jan Davidson",
" Walter Forbes",
"",
" Synergistic Software",
"",
"General Manager",
" Bob Clardy",
"",
"Lead Programmer",
" Donald Tsang",
"",
"Software Engineering",
" Jim Edwards, Gary Powell, D'Andre Pritchett",
"",
"Art Director",
" Kirt Lemons",
"",
"Artists",
" Darren Lamb, Mike McMillen,",
" Jason Robertson, Peter Watje",
"",
"Design",
" Kirt Lemons, Donald Tsang, Peter Watje",
" Jim Edwards, Mike McMillen",
"",
"Additional Design",
" Michael Ormsby",
"",
"Sound Design, SFX & Audio Engineering",
" Craig Utterback",
"",
"Quality Assurance Lead",
" Mona Branham",
"",
"Testers",
" Chris Barker, Steve Chin, Derek Clardy, Conor Durdy,",
" Amy Edwards, Greg Hightower, Tim Jensen, Jeremy Jones,",
" John Lang, Daudi Pritchett, Doug Van Horne, Gordon Wilcox",
"",
"Manual",
" Suzanne David, Linda Westerfield,",
" Ann Dickens Clardy, Kirt Lemons",
"",
"Voices",
" Jim Edwards, Paul Eiding, Eve Forward,",
" Mackenzie Powell, Rodney Sherwood, Craig Utterback",
"",
"",
" Additional Work",
"",
"Quest Text Writing",
" Eve Forward",
"",
"Thanks to",
" Trisha Durdy, Dustin Freeman, D'Andre Pritchett",
"",
"",
"",
" Special Thanks to Blizzard Entertainment",
"",
"",
"",
"",
" Sierra On-Line Inc. Northwest",
"",
"Quality Assurance Manager",
" Gary Stevens",
"",
"Quality Assurance Lead Tester",
" Bernadette Pryor",
"",
"Main Testers",
" Erik Johnson, David Lee, Kristofer Hall",
"",
"Additional Testers",
" Cade Myers, Jeff Ingham, Phil Kuhlmey,",
" Eric Gelfand, Mark Wyman, Torsten Reinl,",
" Erinn Hamilton",
"",
"Product Marketing Manager",
" Eddie Ranchigoda",
"",
"Public Relations Manager",
" Eric Twelker",
"",
"Associate Product Manager",
" Joe Roth",
"",
"Thanks to",
" Cindy Vanous, Joshua Bentley, Robert Zimmerman, Robert Jerauld,",
" Dennis Ham, Andrea Stone, Beth Quintana, Jennifer Keenan, Gary Brown,",
" Ken Eaton, Matt Eslick, Kate Powell, Bryon Mcpherson, David Beetlestone",
"",
"",
"The Ring of One Thousand",
" Andrew Abernathy, Christopher Abramo, David Adams, David ",
" Adcox, Marko Agterberg, Cory Aiken, Judah Altaras, John ",
@ -551,7 +549,6 @@ const char *const CREDITS_LINES[] = {
" ",
" ",
" "
#endif
};
const std::size_t CREDITS_LINES_SIZE = sizeof(CREDITS_LINES) / sizeof(CREDITS_LINES[0]);

Loading…
Cancel
Save