Browse Source

Use pointers instead of references for Devilution exported API

With this change, all exported declarations of Devilution are now
compatible with the C-ABI; that is, all declarations of Source/*.h.

This makes it possible to link against DevilutionX from mods written in
other languages than C++, for instance Rust, Go or Python.

Updates #612.
pull/615/head
Robin Eklind 6 years ago committed by Robin Eklind
parent
commit
27b40436a9
  1. 8
      Source/items.cpp
  2. 2
      Source/items.h
  3. 4
      Source/missiles.cpp
  4. 78
      Source/monster.cpp
  5. 6
      Source/monster.h
  6. 20
      Source/objects.cpp
  7. 2
      Source/objects.h
  8. 2
      Source/player.cpp
  9. 26
      Source/towners.cpp
  10. 2
      Source/towners.h

8
Source/items.cpp

@ -1073,16 +1073,16 @@ void GetSuperItemSpace(int x, int y, char inum)
}
}
void GetSuperItemLoc(int x, int y, int &xx, int &yy)
void GetSuperItemLoc(int x, int y, int *xx, int *yy)
{
int i, j, k;
for (k = 1; k < 50; k++) {
for (j = -k; j <= k; j++) {
yy = y + j;
*yy = y + j;
for (i = -k; i <= k; i++) {
xx = i + x;
if (ItemSpaceOk(xx, yy)) {
*xx = i + x;
if (ItemSpaceOk(*xx, *yy)) {
return;
}
}

2
Source/items.h

@ -35,7 +35,7 @@ void CreatePlrItems(int p);
BOOL ItemSpaceOk(int i, int j);
BOOL GetItemSpace(int x, int y, char inum);
void GetSuperItemSpace(int x, int y, char inum);
void GetSuperItemLoc(int x, int y, int &xx, int &yy);
void GetSuperItemLoc(int x, int y, int *xx, int *yy);
void CalcItemValue(int i);
void GetBookSpell(int i, int lvl);
void GetStaffPower(int i, int lvl, int bs, BOOL onlygood);

4
Source/missiles.cpp

@ -510,7 +510,7 @@ BOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, BOOLEAN shif
hper = 5;
if (hper > 95)
hper = 95;
if (CheckMonsterHit(m, ret)) {
if (CheckMonsterHit(m, &ret)) {
return ret;
}
#ifdef _DEBUG
@ -608,7 +608,7 @@ BOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLE
hper = 95;
if (monster[m]._mmode == MM_STONE)
hit = 0;
if (CheckMonsterHit(m, ret))
if (CheckMonsterHit(m, &ret))
return ret;
#ifdef _DEBUG
if (hit >= hper && !debug_mode_key_inverted_v && !debug_mode_dollar_sign)

78
Source/monster.cpp

@ -1085,14 +1085,14 @@ int AddMonster(int x, int y, int dir, int mtype, BOOL InMap)
return -1;
}
void NewMonsterAnim(int i, AnimStruct &anim, int md)
void NewMonsterAnim(int i, AnimStruct *anim, int md)
{
MonsterStruct *Monst = monster + i;
Monst->_mAnimData = anim.Data[md];
Monst->_mAnimLen = anim.Frames;
Monst->_mAnimData = anim->Data[md];
Monst->_mAnimLen = anim->Frames;
Monst->_mAnimCnt = 0;
Monst->_mAnimFrame = 1;
Monst->_mAnimDelay = anim.Rate;
Monst->_mAnimDelay = anim->Rate;
Monst->_mFlags &= ~(MFLAG_LOCK_ANIMATION | MFLAG_ALLOW_SPECIAL);
Monst->_mdir = md;
}
@ -1236,9 +1236,9 @@ void M_StartStand(int i, int md)
{
ClearMVars(i);
if (monster[i].MType->mtype == MT_GOLEM)
NewMonsterAnim(i, monster[i].MType->Anims[MA_WALK], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_WALK], md);
else
NewMonsterAnim(i, monster[i].MType->Anims[MA_STAND], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_STAND], md);
monster[i]._mVar1 = monster[i]._mmode;
monster[i]._mVar2 = 0;
monster[i]._mmode = MM_STAND;
@ -1267,7 +1267,7 @@ void M_StartDelay(int i, int len)
void M_StartSpStand(int i, int md)
{
NewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], md);
monster[i]._mmode = MM_SPSTAND;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
@ -1296,7 +1296,7 @@ void M_StartWalk(int i, int xvel, int yvel, int xadd, int yadd, int EndDir)
monster[i]._mVar2 = yadd;
monster[i]._mVar3 = EndDir;
monster[i]._mdir = EndDir;
NewMonsterAnim(i, monster[i].MType->Anims[MA_WALK], EndDir);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_WALK], EndDir);
monster[i]._mVar6 = 0;
monster[i]._mVar7 = 0;
monster[i]._mVar8 = 0;
@ -1327,7 +1327,7 @@ void M_StartWalk2(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int y
monster[i]._myvel = yvel;
monster[i]._mVar3 = EndDir;
monster[i]._mdir = EndDir;
NewMonsterAnim(i, monster[i].MType->Anims[MA_WALK], EndDir);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_WALK], EndDir);
monster[i]._mVar6 = 16 * xoff;
monster[i]._mVar7 = 16 * yoff;
monster[i]._mVar8 = 0;
@ -1362,7 +1362,7 @@ void M_StartWalk3(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int y
monster[i]._mVar2 = fy;
monster[i]._mVar3 = EndDir;
monster[i]._mdir = EndDir;
NewMonsterAnim(i, monster[i].MType->Anims[MA_WALK], EndDir);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_WALK], EndDir);
monster[i]._mVar6 = 16 * xoff;
monster[i]._mVar7 = 16 * yoff;
monster[i]._mVar8 = 0;
@ -1372,7 +1372,7 @@ void M_StartWalk3(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int y
void M_StartAttack(int i)
{
int md = M_GetDir(i);
NewMonsterAnim(i, monster[i].MType->Anims[MA_ATTACK], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_ATTACK], md);
monster[i]._mmode = MM_ATTACK;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
@ -1387,7 +1387,7 @@ void M_StartAttack(int i)
void M_StartRAttack(int i, int missile_type, int dam)
{
int md = M_GetDir(i);
NewMonsterAnim(i, monster[i].MType->Anims[MA_ATTACK], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_ATTACK], md);
monster[i]._mmode = MM_RATTACK;
monster[i]._mVar1 = missile_type;
monster[i]._mVar2 = dam;
@ -1404,7 +1404,7 @@ void M_StartRAttack(int i, int missile_type, int dam)
void M_StartRSpAttack(int i, int missile_type, int dam)
{
int md = M_GetDir(i);
NewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], md);
monster[i]._mmode = MM_RSPATTACK;
monster[i]._mVar1 = missile_type;
monster[i]._mVar2 = 0;
@ -1422,7 +1422,7 @@ void M_StartRSpAttack(int i, int missile_type, int dam)
void M_StartSpAttack(int i)
{
int md = M_GetDir(i);
NewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], md);
monster[i]._mmode = MM_SATTACK;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
@ -1436,7 +1436,7 @@ void M_StartSpAttack(int i)
void M_StartEat(int i)
{
NewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], monster[i]._mdir);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], monster[i]._mdir);
monster[i]._mmode = MM_SATTACK;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
@ -1478,7 +1478,7 @@ void M_GetKnockback(int i)
M_ClearSquares(i);
monster[i]._moldx += offset_x[d];
monster[i]._moldy += offset_y[d];
NewMonsterAnim(i, monster[i].MType->Anims[MA_GOTHIT], monster[i]._mdir);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_GOTHIT], monster[i]._mdir);
monster[i]._mmode = MM_GOTHIT;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
@ -1518,7 +1518,7 @@ void M_StartHit(int i, int pnum, int dam)
monster[i]._mgoal = MGOAL_NORMAL;
}
if (monster[i]._mmode != MM_STONE) {
NewMonsterAnim(i, monster[i].MType->Anims[MA_GOTHIT], monster[i]._mdir);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_GOTHIT], monster[i]._mdir);
monster[i]._mmode = MM_GOTHIT;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
@ -1555,7 +1555,7 @@ void M_DiabloDeath(int i, BOOL sendmsg)
continue;
pmonster = monster + k;
NewMonsterAnim(k, pmonster->MType->Anims[MA_DEATH], pmonster->_mdir);
NewMonsterAnim(k, &pmonster->MType->Anims[MA_DEATH], pmonster->_mdir);
monster[k]._mxoff = 0;
monster[k]._myoff = 0;
monster[k]._mVar1 = 0;
@ -1615,7 +1615,7 @@ void M2MStartHit(int mid, int i, int dam)
if (monster[mid]._mmode != MM_STONE) {
if (monster[mid].MType->mtype != MT_GOLEM) {
NewMonsterAnim(mid, monster[mid].MType->Anims[MA_GOTHIT], monster[mid]._mdir);
NewMonsterAnim(mid, &monster[mid].MType->Anims[MA_GOTHIT], monster[mid]._mdir);
monster[mid]._mmode = MM_GOTHIT;
}
@ -1665,7 +1665,7 @@ void MonstStartKill(int i, int pnum, BOOL sendmsg)
else
md = monster[i]._mdir;
monster[i]._mdir = md;
NewMonsterAnim(i, monster[i].MType->Anims[MA_DEATH], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_DEATH], md);
monster[i]._mmode = MM_DEATH;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
@ -1722,7 +1722,7 @@ void M2MStartKill(int i, int mid)
md = 0;
monster[mid]._mdir = md;
NewMonsterAnim(mid, monster[mid].MType->Anims[MA_DEATH], md);
NewMonsterAnim(mid, &monster[mid].MType->Anims[MA_DEATH], md);
monster[mid]._mmode = MM_DEATH;
monster[mid]._mxoff = 0;
monster[mid]._myoff = 0;
@ -1789,7 +1789,7 @@ void M_StartFadein(int i, int md, BOOL backwards)
if (monster[i].MType == NULL)
app_fatal("M_StartFadein: Monster %d \"%s\" MType NULL", i, monster[i].mName);
NewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], md);
monster[i]._mmode = MM_FADEIN;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
@ -1813,7 +1813,7 @@ void M_StartFadeout(int i, int md, BOOL backwards)
if (monster[i].MType == NULL)
app_fatal("M_StartFadeout: Monster %d \"%s\" MType NULL", i, monster[i].mName);
NewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);
NewMonsterAnim(i, &monster[i].MType->Anims[MA_SPECIAL], md);
monster[i]._mmode = MM_FADEOUT;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
@ -2010,7 +2010,7 @@ void M_TryM2MHit(int i, int mid, int hper, int mind, int maxd)
int hit = random_(4, 100);
if (monster[mid]._mmode == MM_STONE)
hit = 0;
if (!CheckMonsterHit(mid, ret) && hit < hper) {
if (!CheckMonsterHit(mid, &ret) && hit < hper) {
int dam = (mind + random_(5, maxd - mind + 1)) << 6;
monster[mid]._mhitpoints -= dam;
if (monster[mid]._mhitpoints >> 6 <= 0) {
@ -2867,11 +2867,11 @@ BOOL M_DumbWalk(int i, int md)
return ok;
}
BOOL M_RoundWalk(int i, int md, int &dir)
BOOL M_RoundWalk(int i, int md, int *dir)
{
int mdtemp;
BOOL ok;
if (dir)
if (*dir)
md = left[left[md]];
else
md = right[right[md]];
@ -2879,7 +2879,7 @@ BOOL M_RoundWalk(int i, int md, int &dir)
ok = DirOK(i, md);
mdtemp = md;
if (!ok) {
if (dir) {
if (*dir) {
md = right[mdtemp];
ok = DirOK(i, md) || (md = right[right[mdtemp]], DirOK(i, md));
} else {
@ -2890,7 +2890,7 @@ BOOL M_RoundWalk(int i, int md, int &dir)
if (ok) {
M_WalkDir(i, md);
} else {
dir = !dir;
*dir = !*dir;
ok = M_CallWalk(i, opposite[mdtemp]);
}
return ok;
@ -3507,7 +3507,7 @@ void MAI_Round(int i, BOOL special)
dist = abs(my);
if (Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md) || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) {
Monst->_mgoal = MGOAL_NORMAL;
} else if (!M_RoundWalk(i, md, Monst->_mgoalvar2)) {
} else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) {
M_StartDelay(i, random_(125, 10) + 10);
}
}
@ -3765,7 +3765,7 @@ void MAI_RoundRanged(int i, int missile_type, BOOL checkdoors, int dam, int less
&& (LineClear(Monst->_mx, Monst->_my, fx, fy))) {
M_StartRSpAttack(i, missile_type, dam);
} else {
M_RoundWalk(i, md, Monst->_mgoalvar2);
M_RoundWalk(i, md, &Monst->_mgoalvar2);
}
}
} else {
@ -3854,7 +3854,7 @@ void MAI_RR2(int i, int mistype, int dam)
}
if (Monst->_mgoalvar1++ < 2 * dist || !DirOK(i, md)) {
if (v < 5 * (Monst->_mint + 16))
M_RoundWalk(i, md, Monst->_mgoalvar2);
M_RoundWalk(i, md, &Monst->_mgoalvar2);
} else
Monst->_mgoal = MGOAL_NORMAL;
}
@ -4004,7 +4004,7 @@ void MAI_SkelKing(int i)
}
if (Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md) || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) {
Monst->_mgoal = MGOAL_NORMAL;
} else if (!M_RoundWalk(i, md, Monst->_mgoalvar2)) {
} else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) {
M_StartDelay(i, random_(125, 10) + 10);
}
}
@ -4072,7 +4072,7 @@ void MAI_Rhino(int i)
}
if (Monst->_mgoalvar1++ >= 2 * dist || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) {
Monst->_mgoal = MGOAL_NORMAL;
} else if (!M_RoundWalk(i, md, Monst->_mgoalvar2)) {
} else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) {
M_StartDelay(i, random_(125, 10) + 10);
}
}
@ -4142,7 +4142,7 @@ void MAI_Counselor(int i)
dist = abs(my);
if ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->_mx][Monst->_my] == dTransVal[fx][fy]) {
if (Monst->_mgoalvar1++ < 2 * dist || !DirOK(i, md)) {
M_RoundWalk(i, md, Monst->_mgoalvar2);
M_RoundWalk(i, md, &Monst->_mgoalvar2);
} else {
Monst->_mgoal = MGOAL_NORMAL;
M_StartFadein(i, md, TRUE);
@ -5444,14 +5444,14 @@ void TalktoMonster(int i)
pnum = Monst->_menemy;
Monst->_mmode = MM_TALK;
if (Monst->_mAi == AI_SNOTSPIL || Monst->_mAi == AI_LACHDAN) {
if (QuestStatus(QTYPE_BOL) && quests[QTYPE_BOL]._qvar1 == 2 && PlrHasItem(pnum, IDI_BANNER, itm)) {
if (QuestStatus(QTYPE_BOL) && quests[QTYPE_BOL]._qvar1 == 2 && PlrHasItem(pnum, IDI_BANNER, &itm) != NULL) {
RemoveInvItem(pnum, itm);
quests[QTYPE_BOL]._qactive = 3;
Monst->mtalkmsg = QUEST_BANNER12;
Monst->_mgoal = MGOAL_INQUIRING;
}
if (QuestStatus(QTYPE_VEIL) && Monst->mtalkmsg >= QUEST_VEIL9) {
if (PlrHasItem(pnum, IDI_GLDNELIX, itm)) {
if (PlrHasItem(pnum, IDI_GLDNELIX, &itm) != NULL) {
RemoveInvItem(pnum, itm);
Monst->mtalkmsg = QUEST_VEIL11;
Monst->_mgoal = MGOAL_INQUIRING;
@ -5506,7 +5506,7 @@ BOOL CanTalkToMonst(int m)
return monster[m]._mgoal == MGOAL_TALKING;
}
BOOL CheckMonsterHit(int m, BOOL &ret)
BOOL CheckMonsterHit(int m, BOOL *ret)
{
if ((DWORD)m >= MAXMONSTERS) {
app_fatal("CheckMonsterHit: Invalid monster %d", m);
@ -5515,14 +5515,14 @@ BOOL CheckMonsterHit(int m, BOOL &ret)
if (monster[m]._mAi == AI_GARG && monster[m]._mFlags & MFLAG_ALLOW_SPECIAL) {
monster[m]._mmode = MM_SATTACK;
monster[m]._mFlags &= ~MFLAG_ALLOW_SPECIAL;
ret = TRUE;
*ret = TRUE;
return TRUE;
}
if (monster[m].MType->mtype < MT_COUNSLR || monster[m].MType->mtype > MT_ADVOCATE || monster[m]._mgoal == MGOAL_NORMAL) {
return FALSE;
} else {
ret = FALSE;
*ret = FALSE;
}
return TRUE;

6
Source/monster.h

@ -33,7 +33,7 @@ void PlaceUniques();
void SetMapMonsters(BYTE *pMap, int startx, int starty);
void DeleteMonster(int i);
int AddMonster(int x, int y, int dir, int mtype, BOOL InMap);
void NewMonsterAnim(int i, AnimStruct &anim, int md);
void NewMonsterAnim(int i, AnimStruct *anim, int md);
BOOL M_Ranged(int i);
BOOL M_Talker(int i);
void M_Enemy(int i);
@ -92,7 +92,7 @@ BOOL M_CallWalk(int i, int md);
BOOL M_PathWalk(int i);
BOOL M_CallWalk2(int i, int md);
BOOL M_DumbWalk(int i, int md);
BOOL M_RoundWalk(int i, int md, int &dir);
BOOL M_RoundWalk(int i, int md, int *dir);
void MAI_Zombie(int i);
void MAI_SkelSd(int i);
BOOL MAI_Path(int i);
@ -156,7 +156,7 @@ int PreSpawnSkeleton();
void TalktoMonster(int i);
void SpawnGolum(int i, int x, int y, int mi);
BOOL CanTalkToMonst(int m);
BOOL CheckMonsterHit(int m, BOOL &ret);
BOOL CheckMonsterHit(int m, BOOL *ret);
int encode_enemy(int m);
void decode_enemy(int m, int enemy);

20
Source/objects.cpp

@ -1274,7 +1274,7 @@ void AddTorturedBody(int i)
object[i]._oPreFlag = TRUE;
}
void GetRndObjLoc(int randarea, int &xx, int &yy)
void GetRndObjLoc(int randarea, int *xx, int *yy)
{
BOOL failed;
int i, j, tries;
@ -1287,12 +1287,12 @@ void GetRndObjLoc(int randarea, int &xx, int &yy)
tries++;
if (tries > 1000 && randarea > 1)
randarea--;
xx = random_(0, MAXDUNX);
yy = random_(0, MAXDUNY);
*xx = random_(0, MAXDUNX);
*yy = random_(0, MAXDUNY);
failed = FALSE;
for (i = 0; i < randarea && !failed; i++) {
for (j = 0; j < randarea && !failed; j++) {
failed = !RndLocOk(i + xx, j + yy);
failed = !RndLocOk(i + *xx, j + *yy);
}
}
if (!failed)
@ -1307,7 +1307,7 @@ void AddMushPatch()
if (nobjects < MAXOBJECTS) {
i = objectavail[0];
GetRndObjLoc(5, x, y);
GetRndObjLoc(5, &x, &y);
dObject[x + 1][y + 1] = -1 - i;
dObject[x + 2][y + 1] = -1 - i;
dObject[x + 1][y + 2] = -1 - i;
@ -1319,7 +1319,7 @@ void AddSlainHero()
{
int x, y;
GetRndObjLoc(5, x, y);
GetRndObjLoc(5, &x, &y);
AddObject(OBJ_SLAINHERO, x + 2, y + 2);
}
@ -2598,7 +2598,7 @@ void OperateMushPatch(int pnum, int i)
object[i]._oSelFlag = 0;
object[i]._oAnimFrame++;
if (!deltaload) {
GetSuperItemLoc(object[i]._ox, object[i]._oy, x, y);
GetSuperItemLoc(object[i]._ox, object[i]._oy, &x, &y);
SpawnQuestItem(IDI_MUSHROOM, x, y, 0, 0);
quests[QTYPE_BLKM]._qvar1 = QS_MUSHSPAWNED;
}
@ -2629,7 +2629,7 @@ void OperateInnSignChest(int pnum, int i)
object[i]._oAnimFrame += 2;
object[i]._oSelFlag = 0;
if (!deltaload) {
GetSuperItemLoc(object[i]._ox, object[i]._oy, x, y);
GetSuperItemLoc(object[i]._ox, object[i]._oy, &x, &y);
SpawnQuestItem(IDI_BANNER, x, y, 0, 0);
}
}
@ -2745,7 +2745,7 @@ void OperatePedistal(int pnum, int i)
int iv;
if (object[i]._oVar6 != 3) {
if (PlrHasItem(pnum, IDI_BLDSTONE, iv)) {
if (PlrHasItem(pnum, IDI_BLDSTONE, &iv) != NULL) {
RemoveInvItem(pnum, iv);
object[i]._oAnimFrame++;
object[i]._oVar6++;
@ -3720,7 +3720,7 @@ void OperateLazStand(int pnum, int i)
if (object[i]._oSelFlag != 0 && !deltaload && !qtextflag && pnum == myplr) {
object[i]._oAnimFrame++;
object[i]._oSelFlag = 0;
GetSuperItemLoc(object[i]._ox, object[i]._oy, xx, yy);
GetSuperItemLoc(object[i]._ox, object[i]._oy, &xx, &yy);
SpawnQuestItem(IDI_LAZSTAFF, xx, yy, 0, 0);
}
}

2
Source/objects.h

@ -75,7 +75,7 @@ void AddPedistal(int i);
void AddStoryBook(int i);
void AddWeaponRack(int i);
void AddTorturedBody(int i);
void GetRndObjLoc(int randarea, int &xx, int &yy);
void GetRndObjLoc(int randarea, int *xx, int *yy);
void AddMushPatch();
void AddSlainHero();
void AddObject(int ot, int ox, int oy);

2
Source/player.cpp

@ -2401,7 +2401,7 @@ BOOL PlrHitMonst(int pnum, int m)
hper = 95;
}
if (CheckMonsterHit(m, ret)) {
if (CheckMonsterHit(m, &ret)) {
return ret;
}
#ifdef _DEBUG

26
Source/towners.cpp

@ -554,11 +554,11 @@ void ProcessTowners()
}
}
ItemStruct *PlrHasItem(int pnum, int item, int &i)
ItemStruct *PlrHasItem(int pnum, int item, int *i)
{
for (i = 0; i < plr[pnum]._pNumInv; i++) {
if (plr[pnum].InvList[i].IDidx == item)
return &plr[pnum].InvList[i];
for (*i = 0; *i < plr[pnum]._pNumInv; (*i)++) {
if (plr[pnum].InvList[*i].IDidx == item)
return &plr[pnum].InvList[*i];
}
return NULL;
@ -647,7 +647,7 @@ void TalkToTowner(int p, int t)
InitQTextMsg(QUEST_BANNER2);
towner[t]._tMsgSaid = TRUE;
}
if (quests[QTYPE_BOL]._qvar2 == 1 && PlrHasItem(p, IDI_BANNER, i) != NULL && !towner[t]._tMsgSaid) {
if (quests[QTYPE_BOL]._qvar2 == 1 && PlrHasItem(p, IDI_BANNER, &i) != NULL && !towner[t]._tMsgSaid) {
quests[QTYPE_BOL]._qactive = 3;
quests[QTYPE_BOL]._qvar1 = 3;
RemoveInvItem(p, i);
@ -711,7 +711,7 @@ void TalkToTowner(int p, int t)
InitQTextMsg(QUEST_INFRA5);
towner[t]._tMsgSaid = TRUE;
}
if (quests[QTYPE_INFRA]._qvar2 == 1 && PlrHasItem(p, IDI_ROCK, i) != NULL && !towner[t]._tMsgSaid) {
if (quests[QTYPE_INFRA]._qvar2 == 1 && PlrHasItem(p, IDI_ROCK, &i) != NULL && !towner[t]._tMsgSaid) {
quests[QTYPE_INFRA]._qactive = 3;
quests[QTYPE_INFRA]._qvar2 = 2;
quests[QTYPE_INFRA]._qvar1 = 2;
@ -738,7 +738,7 @@ void TalkToTowner(int p, int t)
towner[t]._tMsgSaid = TRUE;
}
}
if (quests[QTYPE_ANVIL]._qvar2 == 1 && PlrHasItem(p, IDI_ANVIL, i) != NULL) {
if (quests[QTYPE_ANVIL]._qvar2 == 1 && PlrHasItem(p, IDI_ANVIL, &i) != NULL) {
if (!towner[t]._tMsgSaid) {
quests[QTYPE_ANVIL]._qactive = 3;
quests[QTYPE_ANVIL]._qvar2 = 2;
@ -760,7 +760,7 @@ void TalkToTowner(int p, int t)
}
}
} else if (t == GetActiveTowner(TOWN_WITCH)) {
if (quests[QTYPE_BLKM]._qactive == 1 && PlrHasItem(p, IDI_FUNGALTM, i) != NULL) {
if (quests[QTYPE_BLKM]._qactive == 1 && PlrHasItem(p, IDI_FUNGALTM, &i) != NULL) {
RemoveInvItem(p, i);
quests[QTYPE_BLKM]._qactive = 2;
quests[QTYPE_BLKM]._qlog = TRUE;
@ -771,7 +771,7 @@ void TalkToTowner(int p, int t)
towner[t]._tMsgSaid = TRUE;
} else if (quests[QTYPE_BLKM]._qactive == 2) {
if (quests[QTYPE_BLKM]._qvar1 >= 2 && quests[QTYPE_BLKM]._qvar1 <= 4) {
if (PlrHasItem(p, IDI_MUSHROOM, i) != NULL) {
if (PlrHasItem(p, IDI_MUSHROOM, &i) != NULL) {
RemoveInvItem(p, i);
quests[QTYPE_BLKM]._qvar1 = 5;
Qtalklist[TOWN_HEALER]._qblkm = QUEST_MUSH3;
@ -789,7 +789,7 @@ void TalkToTowner(int p, int t)
towner[t]._tMsgSaid = TRUE;
}
} else {
Item = PlrHasItem(p, IDI_SPECELIX, i);
Item = PlrHasItem(p, IDI_SPECELIX, &i);
if (Item != NULL) {
towner[t]._tbtcnt = 150;
towner[t]._tVar1 = p;
@ -797,7 +797,7 @@ void TalkToTowner(int p, int t)
quests[QTYPE_BLKM]._qactive = 3;
towner[t]._tMsgSaid = TRUE;
AllItemsList[Item->IDidx].iUsable = TRUE;
} else if (PlrHasItem(p, IDI_BRAIN, i) != NULL && quests[QTYPE_BLKM]._qvar2 != QUEST_MUSH11) {
} else if (PlrHasItem(p, IDI_BRAIN, &i) != NULL && quests[QTYPE_BLKM]._qvar2 != QUEST_MUSH11) {
towner[t]._tbtcnt = 150;
towner[t]._tVar1 = p;
quests[QTYPE_BLKM]._qvar2 = QUEST_MUSH11;
@ -847,7 +847,7 @@ void TalkToTowner(int p, int t)
towner[t]._tMsgSaid = TRUE;
}
}
if (quests[QTYPE_BLKM]._qactive == 2 && quests[QTYPE_BLKM]._qmsg == QUEST_MUSH10 && PlrHasItem(p, IDI_BRAIN, i) != NULL) {
if (quests[QTYPE_BLKM]._qactive == 2 && quests[QTYPE_BLKM]._qmsg == QUEST_MUSH10 && PlrHasItem(p, IDI_BRAIN, &i) != NULL) {
RemoveInvItem(p, i);
SpawnQuestItem(IDI_SPECELIX, towner[t]._tx, towner[t]._ty + 1, 0, 0);
InitQTextMsg(QUEST_MUSH4);
@ -870,7 +870,7 @@ void TalkToTowner(int p, int t)
}
} else if (t == GetActiveTowner(TOWN_STORY)) {
if (gbMaxPlayers == 1) {
if (quests[QTYPE_VB]._qactive == 1 && PlrHasItem(p, IDI_LAZSTAFF, i) != NULL) {
if (quests[QTYPE_VB]._qactive == 1 && PlrHasItem(p, IDI_LAZSTAFF, &i) != NULL) {
RemoveInvItem(p, i);
quests[QTYPE_VB]._qvar1 = 2;
towner[t]._tbtcnt = 150;

2
Source/towners.h

@ -33,7 +33,7 @@ void TownWitch();
void TownBarMaid();
void TownCow();
void ProcessTowners();
ItemStruct *PlrHasItem(int pnum, int item, int &i);
ItemStruct *PlrHasItem(int pnum, int item, int *i);
void TownerTalk(int first, int t);
void TalkToTowner(int p, int t);
void CowSFX(int pnum);

Loading…
Cancel
Save