Browse Source

No missile golem

Simplify spawning golem, the golem will now spawn in the same tick
instead of next tick
pull/2699/head
Anders Jenbo 5 years ago
parent
commit
9a6820493f
  1. 2
      Source/misdat.cpp
  2. 72
      Source/missiles.cpp
  3. 3
      Source/monster.cpp
  4. 4
      Source/monster.h

2
Source/misdat.cpp

@ -48,7 +48,7 @@ MissileDataStruct MissileData[] = {
{ &AddStone, &MI_Stone, MIS_STONE, false, 1, MISR_MAGIC, MFILE_NONE, LS_SCURIMP, SFX_NONE, MissileMovementDistrubution::Disabled },
{ nullptr, nullptr, MIS_NULL_1F, true, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled },
{ nullptr, nullptr, MIS_INVISIBL, false, 1, MISR_NONE, MFILE_NONE, LS_INVISIBL, SFX_NONE, MissileMovementDistrubution::Disabled },
{ &AddGolem, &MI_Golem, MIS_GOLEM, false, 1, MISR_NONE, MFILE_NONE, LS_GOLUM, SFX_NONE, MissileMovementDistrubution::Disabled },
{ &AddGolem, nullptr, MIS_GOLEM, false, 1, MISR_NONE, MFILE_NONE, LS_GOLUM, SFX_NONE, MissileMovementDistrubution::Disabled },
{ nullptr, nullptr, MIS_ETHEREALIZE, true, 1, MISR_NONE, MFILE_ETHRSHLD, LS_ETHEREAL, SFX_NONE, MissileMovementDistrubution::Disabled },
{ nullptr, nullptr, MIS_BLODBUR, true, 2, MISR_NONE, MFILE_BLODBUR, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled },
{ &AddBoom, &MI_Boom, MIS_BOOM, true, 2, MISR_NONE, MFILE_NEWEXP, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled },

72
Source/missiles.cpp

@ -2429,22 +2429,45 @@ void AddStone(MissileStruct &missile, Point dst, Direction /*midir*/)
void AddGolem(MissileStruct &missile, Point dst, Direction /*midir*/)
{
missile._miDelFlag = true;
int playerId = missile._misource;
for (int i = 0; i < ActiveMissileCount; i++) {
int mx = ActiveMissiles[i];
if (Missiles[mx]._mitype == MIS_GOLEM) {
if ((&Missiles[mx] != &missile) && Missiles[mx]._misource == missile._misource) {
missile._miDelFlag = true;
if ((&Missiles[mx] != &missile) && Missiles[mx]._misource == playerId) {
return;
}
}
}
if (Monsters[playerId].position.tile != GolemHoldingCell && playerId == MyPlayerId)
M_StartKill(playerId, playerId);
UseMana(playerId, SPL_GOLEM);
if (Monsters[playerId].position.tile == GolemHoldingCell) {
for (int i = 0; i < 6; i++) {
int k = CrawlNum[i];
int ck = k + 2;
for (auto j = static_cast<uint8_t>(CrawlTable[k]); j > 0; j--, ck += 2) {
int tx = dst.x + CrawlTable[ck - 1];
int ty = dst.y + CrawlTable[ck];
if (!InDungeonBounds({ tx, ty }))
continue;
if (!LineClearMissile(missile.position.start, { tx, ty }))
continue;
if (dMonster[tx][ty] != 0 || nSolidTable[dPiece[tx][ty]] || dObject[tx][ty] != 0)
continue;
SpawnGolum(playerId, { tx, ty }, missile);
return;
}
}
}
missile._miVar1 = missile.position.start.x;
missile._miVar2 = missile.position.start.y;
missile._miVar4 = dst.x;
missile._miVar5 = dst.y;
if (Monsters[missile._misource].position.tile != GolemHoldingCell && missile._misource == MyPlayerId)
M_StartKill(missile._misource, missile._misource);
UseMana(missile._misource, SPL_GOLEM);
}
void AddBoom(MissileStruct &missile, Point dst, Direction /*midir*/)
@ -2859,37 +2882,6 @@ int AddMissile(Point src, Point dst, Direction midir, missile_id mitype, mienemy
return mi;
}
void MI_Golem(int mi)
{
auto &missile = Missiles[mi];
int src = missile._misource;
if (Monsters[src].position.tile == GolemHoldingCell) {
for (int i = 0; i < 6; i++) {
int k = CrawlNum[i];
int ck = k + 2;
for (auto j = static_cast<uint8_t>(CrawlTable[k]); j > 0; j--, ck += 2) {
const int8_t *ct = &CrawlTable[ck];
int tx = missile._miVar4 + *(ct - 1);
int ty = missile._miVar5 + *ct;
if (!InDungeonBounds({ tx, ty }))
continue;
if (!LineClearMissile({ missile._miVar1, missile._miVar2 }, { tx, ty }))
continue;
if (dMonster[tx][ty] != 0 || nSolidTable[dPiece[tx][ty]] || dObject[tx][ty] != 0)
continue;
SpawnGolum(src, { tx, ty }, mi);
i = 6;
break;
}
}
}
missile._miDelFlag = true;
}
void MI_LArrow(int i)
{
auto &missile = Missiles[i];

3
Source/monster.cpp

@ -4942,9 +4942,8 @@ void TalktoMonster(MonsterStruct &monster)
}
}
void SpawnGolum(int i, Point position, int mi)
void SpawnGolum(int i, Point position, MissileStruct &missile)
{
auto &missile = Missiles[mi];
assert(i >= 0 && i < MAX_PLRS);
auto &player = Players[i];
auto &golem = Monsters[i];

4
Source/monster.h

@ -25,6 +25,8 @@
namespace devilution {
struct MissileStruct;
#define MAXMONSTERS 200
#define MAX_LVLMTYPES 24
@ -280,7 +282,7 @@ bool IsGoat(int mt);
bool SpawnSkeleton(int ii, Point position);
int PreSpawnSkeleton();
void TalktoMonster(MonsterStruct &monster);
void SpawnGolum(int i, Point position, int mi);
void SpawnGolum(int i, Point position, MissileStruct &missile);
bool CanTalkToMonst(const MonsterStruct &monster);
bool CheckMonsterHit(MonsterStruct &monster, bool *ret);
int encode_enemy(MonsterStruct &monster);

Loading…
Cancel
Save