From 9a6820493fc4ab23dbf831b5cad2c8fccb60d24c Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 25 Aug 2021 03:02:28 +0200 Subject: [PATCH] No missile golem Simplify spawning golem, the golem will now spawn in the same tick instead of next tick --- Source/misdat.cpp | 2 +- Source/missiles.cpp | 72 ++++++++++++++++++++------------------------- Source/monster.cpp | 3 +- Source/monster.h | 4 ++- 4 files changed, 37 insertions(+), 44 deletions(-) diff --git a/Source/misdat.cpp b/Source/misdat.cpp index f0ae3a954..50c7c457c 100644 --- a/Source/misdat.cpp +++ b/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 }, diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 0477f8298..7277ff803 100644 --- a/Source/missiles.cpp +++ b/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(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(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]; diff --git a/Source/monster.cpp b/Source/monster.cpp index 1e285a460..29b2290f3 100644 --- a/Source/monster.cpp +++ b/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]; diff --git a/Source/monster.h b/Source/monster.h index 8f777c18e..83008dacd 100644 --- a/Source/monster.h +++ b/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);