Skip to content

Commit f17640c

Browse files
committed
add new spell (pulse)
1 parent 0237753 commit f17640c

File tree

6 files changed

+93
-0
lines changed

6 files changed

+93
-0
lines changed

Source/debug.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,6 +2032,7 @@ void ValidateData()
20322032
assert(missiledata[MIS_SWAMP].mdPrSpeed == 0); // required by MI_BloodBoilC
20332033
assert(missiledata[MIS_STONE].mdPrSpeed == 0); // required by MI_Rune
20342034
assert(misfiledata[MFILE_LGHNING].mfAnimLen[0] == misfiledata[MFILE_THINLGHT].mfAnimLen[0]); // required by AddLightning
2035+
assert(misfiledata[MFILE_MINILTNG].mfAnimLen[0] == misfiledata[MFILE_LGHNING].mfAnimLen[0]); // required by MI_Pulse
20352036
assert(misfiledata[MFILE_FIREWAL].mfAnimLen[0] < 14 /* lengthof(FireWallLight) */); // required by MI_Firewall
20362037
assert(missiledata[MIS_FIREWALL].mlSFX == LS_WALLLOOP); // required by MI_Firewall
20372038
assert(missiledata[MIS_FIREWALL].mlSFXCnt == 1); // required by MI_Firewall

Source/misdat.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ const MissileData missiledata[] = {
107107
/*MIS_MANASHIELD*/ { &AddManashield, &MI_Dummy, 0, MISR_NONE, MFILE_NONE, LS_MSHIELD, SFX_NONE, 1, 1, 0, 0, ALIGN32 },
108108
/*MIS_INFRA*/ { &AddInfra, &MI_Dummy, 0, MISR_NONE, MFILE_NONE, LS_INFRAVIS, SFX_NONE, 1, 1, 0, 0, ALIGN32 },
109109
/*MIS_RAGE*/ { &AddRage, &MI_Dummy, 0, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, 1, 1, 0, 0, ALIGN32 },
110+
/*MIS_PULSE*/ { &AddPulse, &MI_Pulse, 0, MISR_LIGHTNING, MFILE_LGHNING, SFX_NONE, SFX_NONE, 1, 1, 0, 32, ALIGN32 },
110111
#ifdef HELLFIRE
111112
/*MIS_LIGHTWALLC*/// { &AddWallC, &MI_WallC, 0, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, 1, 1, 0, 0, ALIGN32 },
112113
/*MIS_LIGHTWALL*/// { &AddLightwall, &MI_Lightwall, MIF_AREA | MIF_DOT, MISR_LIGHTNING, MFILE_LGHNING, LS_LMAG, LS_ELECIMP1, 1, 1, 0, 0, ALIGN32 },

Source/misproc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ int AddApocaC2(int mi, int sx, int sy, int dx, int dy, int midir, int micaster,
7979
int AddManashield(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl);
8080
int AddInfra(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl);
8181
int AddRage(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl);
82+
int AddPulse(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl);
8283
void MI_Dummy(int mi);
8384
void MI_Arrow(int mi);
8485
void MI_AsArrow(int mi);
@@ -127,6 +128,7 @@ void MI_InfernoC(int mi);
127128
//void MI_FireTrap(int mi);
128129
void MI_Cbolt(int mi);
129130
void MI_Elemental(int mi);
131+
void MI_Pulse(int mi);
130132

131133
#ifdef __cplusplus
132134
}

Source/missiles.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ void GetSkillDetails(int sn, int sl, SkillDetails* skd)
8080
mind >>= 6;
8181
maxd >>= 6;
8282
break;
83+
case SPL_PULSE:
84+
k = (magic >> 2) + (sl << 2);
85+
mind = k * 3 / 4u;
86+
maxd = k * 5 / 2u;
87+
break;
8388
case SPL_NULL:
8489
case SPL_WALK:
8590
case SPL_BLOCK:
@@ -3336,6 +3341,51 @@ int AddRage(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int
33363341
return MIRES_DELETE;
33373342
}
33383343

3344+
/**
3345+
* Var1: min-damage modifier on hit
3346+
* Var2: max-damage modifier on hit
3347+
*/
3348+
int AddPulse(int mi, int sx, int sy, int dx, int dy, int midir, int micaster, int misource, int spllvl)
3349+
{
3350+
MissileStruct* mis;
3351+
int mindam, maxdam, i, j, tx, ty;
3352+
const int8_t* cr;
3353+
mis = &missile[mi];
3354+
3355+
// (micaster & MST_PLAYER);
3356+
// assert((unsigned)pnum < MAX_PLRS);
3357+
// if (micaster & MST_PLAYER) {
3358+
mindam = 1 << 6;
3359+
maxdam = (plx(misource)._pMagic << (-2 + 6)) + (spllvl << (2 + 6));
3360+
// }
3361+
mis->_miVar1 = mindam / 4u;
3362+
mis->_miVar2 = maxdam / 4u;
3363+
mis->_miMinDam = mindam - mis->_miVar1;
3364+
mis->_miMaxDam = maxdam - mis->_miVar2;
3365+
mis->_miAnimFrame = RandRange(1, misfiledata[MFILE_MINILTNG].mfAnimLen[0]);
3366+
3367+
static_assert(DBORDERX >= 5 && DBORDERY >= 5, "AddPulse expects a large enough border.");
3368+
static_assert(lengthof(CrawlNum) > 5, "AddPulse uses CrawlTable/CrawlNum up to radius 5.");
3369+
for (i = 0; i <= 5; i++) {
3370+
cr = &CrawlTable[CrawlNum[i]];
3371+
for (j = (BYTE)*cr; j > 0; j--) {
3372+
tx = dx + *++cr;
3373+
ty = dy + *++cr;
3374+
assert(IN_DUNGEON_AREA(tx, ty));
3375+
if (PosOkMis2(tx, ty) && LineClear(sx, sy, tx, ty)) {
3376+
mis->_mix = tx;
3377+
mis->_miy = ty;
3378+
//mis->_misx = tx; -- unused
3379+
//mis->_misy = ty;
3380+
static_assert(MAX_LIGHT_RAD >= 4, "AddPulse needs at least light-radius of 4.");
3381+
mis->_miLid = AddLight(tx, ty, 4);
3382+
return MIRES_DONE;
3383+
}
3384+
}
3385+
}
3386+
return MIRES_FAIL_DELETE;
3387+
}
3388+
33393389
int AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, int micaster, int misource, int spllvl)
33403390
{
33413391
MissileStruct* mis;
@@ -4943,6 +4993,42 @@ void MI_Elemental(int mi)
49434993
ConvertMissile(mi, MIS_EXFBALL);
49444994
}
49454995

4996+
void MI_Pulse(int mi)
4997+
{
4998+
MissileStruct* mis;
4999+
int dir, tmp;
5000+
5001+
mis = &missile[mi];
5002+
mis->_miRange--;
5003+
if (mis->_miRange < 0) {
5004+
mis->_miDelFlag = TRUE; // + AddUnLight
5005+
return;
5006+
}
5007+
5008+
dir = mis->_miRange % 8u; // NUM_DIRS
5009+
if (dir == 0) {
5010+
// assert(misfiledata[MFILE_MINILTNG].mfAnimLen[0] == misfiledata[MFILE_LGHNING].mfAnimLen[0]);
5011+
mis->_miAnimFrame = (mis->_miAnimFrame % misfiledata[MFILE_LGHNING].mfAnimLen[0]) + 1;
5012+
if (CheckMissileCol(mi, mis->_mix, mis->_miy, MICM_NONE) != 0) {
5013+
// AddMissile(mis->_mix, mis->_miy, -1, 0, 0, MIS_EXLGHT, MST_NA, 0, 0);
5014+
5015+
mis->_miMinDam += mis->_miVar1;
5016+
mis->_miMaxDam += mis->_miVar2;
5017+
5018+
mis->_miVar1 *= 2;
5019+
mis->_miVar2 *= 2;
5020+
}
5021+
}
5022+
5023+
mis->_miFileNum = dir != 0 ? MFILE_MINILTNG : MFILE_LGHNING;
5024+
tmp = mis->_miAnimFrame;
5025+
SetMissAnim(mi, 0);
5026+
mis->_miAnimFrame = tmp;
5027+
mis->_miPreFlag = dir != 0;
5028+
mis->_miyoff = dir != 0 ? TILE_HEIGHT/2 - ((NUM_DIRS - 1) + dir) * ASSET_MPL : 0;
5029+
PutMissileF(mi, dir != 0 ? BFLAG_MISSILE_PRE : 0);
5030+
}
5031+
49465032
void ProcessMissiles()
49475033
{
49485034
MissileStruct* mis;

Source/spelldat.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ const SpellData spelldata[NUM_SPELLS] = {
7474
/*SPL_WIND*/ { 24, STYPE_MAGIC, 22, "Wind", 10, 18, SPELL_NA, SDFLAG_TARGETED, CURSOR_NONE, CURSOR_NONE, SFLAG_DUNGEON, 44, IS_CAST2, MIS_WIND, 2, 12, 40, 80, 12500, 35, ALIGN64 },
7575
/*SPL_SHROUD*/ { 28, STYPE_MAGIC, 19, "Shroud", 20, 28, 18, SDFLAG_TARGETED, CURSOR_TELEPORT, CURSOR_NONE, SFLAG_DUNGEON, 36, IS_CAST2, MIS_SHROUD, 1, 18, 20, 60, 20500, 80, ALIGN64 },
7676
/*SPL_SWAMP*/ { 21, STYPE_MAGIC, 4, "Swamp", 30, 40, 24, SDFLAG_TARGETED, CURSOR_TELEPORT, CURSOR_NONE, SFLAG_DUNGEON, 36, IS_CAST2, MIS_SWAMPC, 1, 16, 20, 60, 18500, 70, ALIGN64 },
77+
/*SPL_PULSE*/ { 18, STYPE_LIGHTNING, 4, "Pulse", 16, 22, 16, SDFLAG_TARGETED, CURSOR_TELEPORT, CURSOR_NONE, SFLAG_DUNGEON, 66, IS_CAST2, MIS_PULSE, 1, 14, 20, 48, 12000, 50, ALIGN64 },
7778
/*SPL_GUARDIAN*/ { 50, STYPE_FIRE, 18, "Guardian", 9, 16, 12, SDFLAG_TARGETED, CURSOR_TELEPORT, CURSOR_NONE, SFLAG_DUNGEON, 61, IS_CAST2, MIS_GUARDIAN, 4, 30, 16, 32, 14000, 90, ALIGN64 },
7879
/*SPL_GOLEM*/ { 100, STYPE_FIRE, 21, "Golem", 11, 18, 10, SDFLAG_TARGETED, CURSOR_TELEPORT, CURSOR_NONE, SFLAG_DUNGEON, 81, IS_CAST2, MIS_GOLEM, 10, 60, 16, 32, 18000, 200, ALIGN64 },
7980
/*SPL_STONE*/ { 60, STYPE_MAGIC, 8, "Stone Curse", 6, 10, 6, SDFLAG_TARGETED, CURSOR_TELEPORT, CURSOR_NONE, SFLAG_DUNGEON, 51, IS_CAST2, MIS_STONE, 4, 40, 8, 16, 12000, 160, ALIGN64 },

enums.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2034,6 +2034,7 @@ typedef enum missile_id {
20342034
MIS_MANASHIELD,
20352035
MIS_INFRA,
20362036
MIS_RAGE,
2037+
MIS_PULSE,
20372038
#ifdef HELLFIRE
20382039
//MIS_LIGHTWALLC,
20392040
//MIS_LIGHTWALL,
@@ -3852,6 +3853,7 @@ typedef enum spell_id {
38523853
SPL_WIND,
38533854
SPL_SHROUD,
38543855
SPL_SWAMP,
3856+
SPL_PULSE,
38553857
SPL_GUARDIAN,
38563858
SPL_GOLEM,
38573859
SPL_STONE,

0 commit comments

Comments
 (0)