1
0
Fork 0
mirror of https://github.com/galaxyhaxz/devilution synced 2025-02-23 12:44:54 +00:00
devilution/2020_03_31/Source/portal.cpp
PrisonOfMirrors b720183846 initial up
2020-11-28 18:24:54 -06:00

203 lines
3.3 KiB
C++

#include "diablo.h"
PortalStruct portal[MAXPORTAL];
int portalindex;
int WarpDropX[MAXPORTAL] = { 57, 59, 61, 63 };
int WarpDropY[MAXPORTAL] = { 40, 40, 40, 40 };
void InitPortals()
{
int i; // edi
for(i = 0; i < MAXPORTAL; i++)
{
if(delta_portal_inited(i))
portal[i].open = 0;
}
}
void SetPortalStats(int i, int o, int x, int y, int lvl, int lvltype)
{
portal[i].x = x;
portal[i].setlvl = 0;
portal[i].y = y;
portal[i].open = o;
portal[i].level = lvl;
portal[i].ltype = lvltype;
}
void AddWarpMissile(int i, int x, int y)
{
int mi; // eax
missiledata[MIS_TOWN].mlSFX = -1;
dMissile[x][y] = 0;
mi = AddMissile(0, 0, x, y, 0, MIS_TOWN, 0, i, 0, 0);
if ( mi != -1 )
{
SetMissDir(mi, 1);
if ( currlevel )
missile[mi]._mlid = AddLight(missile[mi]._mix, missile[mi]._miy, 15);
missiledata[MIS_TOWN].mlSFX = LS_SENTINEL;
}
}
void SyncPortals()
{
int v0; // edi
int *v1; // esi
int v2; // eax
v0 = 0;
v1 = &portal[0].level;
do
{
if ( *(v1 - 3) )
{
if ( currlevel )
{
v2 = currlevel;
if ( setlevel )
v2 = (unsigned char)setlvlnum;
if ( *v1 == v2 )
AddWarpMissile(v0, *(v1 - 2), *(v1 - 1));
}
else
{
AddWarpMissile(v0, WarpDropX[v0], WarpDropY[v0]);
}
}
v1 += 6;
++v0;
}
while ( (signed int)v1 < (signed int)&portal[MAXPORTAL].level );
}
void AddInTownPortal(int i)
{
AddWarpMissile(i, WarpDropX[i], WarpDropY[i]);
}
void ActivatePortal(int i, int x, int y, int lvl, int lvltype, int sp)
{
portal[i].open = 1;
if ( lvl )
{
portal[i].level = lvl;
portal[i].x = x;
portal[i].ltype = lvltype;
portal[i].y = y;
portal[i].setlvl = sp;
}
}
void DeactivatePortal(int i)
{
portal[i].open = 0;
}
_bool PortalOnLevel(int i)
{
if ( portal[i].level == currlevel )
return 1;
else
return currlevel == 0;
}
void RemovePortalMissile(int id)
{
int i; // esi
int mi; // eax
for ( i = 0; i < nummissiles; ++i )
{
mi = missileactive[i];
if ( missile[mi]._mitype == MIS_TOWN && missile[mi]._misource == id )
{
dFlags[missile[mi]._mix][missile[mi]._miy] &= 0xFE;
dMissile[missile[mi]._mix][missile[mi]._miy] = 0;
if ( portal[id].level )
AddUnLight(missile[mi]._mlid);
DeleteMissile(mi, i);
}
}
}
void SetCurrentPortal(int p)
{
portalindex = p;
}
void GetPortalLevel()
{
if ( currlevel )
{
setlevel = 0;
currlevel = 0;
leveltype = 0;
plr[myplr].plrlevel = 0;
}
else
{
if ( portal[portalindex].setlvl )
{
setlevel = 1;
setlvlnum = portal[portalindex].level;
}
else
{
setlevel = 0;
}
currlevel = portal[portalindex].level;
leveltype = portal[portalindex].ltype;
plr[myplr].plrlevel = portal[portalindex].level;
if ( portalindex == myplr )
{
NetSendCmd(1, CMD_DEACTIVATEPORTAL);
DeactivatePortal(portalindex);
}
}
}
void GetPortalLvlPos()
{
if ( currlevel )
{
ViewX = portal[portalindex].x;
ViewY = portal[portalindex].y;
if ( portalindex != myplr )
{
ViewX++;
ViewY++;
}
}
else
{
ViewX = WarpDropX[portalindex] + 1;
ViewY = WarpDropY[portalindex] + 1;
}
}
_bool PosOkPortal(int lvl, int x, int y)
{
int *v3; // eax
v3 = &portal[0].x;
while ( !*(v3 - 1) || v3[2] != lvl || (*v3 != x || v3[1] != y) && (*v3 != x - 1 || v3[1] != y - 1) )
{
v3 += 6;
if ( (signed int)v3 >= (signed int)&portal[MAXPORTAL].x )
return 0;
}
return 1;
}