2022-02-20 23:12:51 +00:00
|
|
|
/*
|
|
|
|
** vmexports.cpp
|
|
|
|
**
|
|
|
|
** global script exports
|
|
|
|
**
|
|
|
|
**---------------------------------------------------------------------------
|
|
|
|
** Copyright 2022 Christoph Oelckers
|
|
|
|
** All rights reserved.
|
|
|
|
**
|
|
|
|
** Redistribution and use in source and binary forms, with or without
|
|
|
|
** modification, are permitted provided that the following conditions
|
|
|
|
** are met:
|
|
|
|
**
|
|
|
|
** 1. Redistributions of source code must retain the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer.
|
|
|
|
** 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer in the
|
|
|
|
** documentation and/or other materials provided with the distribution.
|
|
|
|
** 3. The name of the author may not be used to endorse or promote products
|
|
|
|
** derived from this software without specific prior written permission.
|
|
|
|
**
|
|
|
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
**---------------------------------------------------------------------------
|
|
|
|
**
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "maptypes.h"
|
|
|
|
#include "vm.h"
|
2022-10-31 09:45:47 +00:00
|
|
|
#include "gamefuncs.h"
|
2022-11-20 07:10:15 +00:00
|
|
|
#include "raze_sound.h"
|
2022-12-06 08:49:18 +00:00
|
|
|
#include "texturemanager.h"
|
2022-12-07 16:10:27 +00:00
|
|
|
#include "texinfo.h"
|
2023-10-02 19:03:59 +00:00
|
|
|
#include "coreplayer.h"
|
2022-12-07 16:10:27 +00:00
|
|
|
|
|
|
|
#include "buildtiles.h"
|
2022-02-20 23:12:51 +00:00
|
|
|
|
2023-10-03 20:25:28 +00:00
|
|
|
int Raze_getspawnnum(PClassActor* actor)
|
|
|
|
{
|
|
|
|
return actor->ActorInfo()->TypeNum;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, getspawnnum, Raze_getspawnnum)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_POINTER(p, PClassActor);
|
|
|
|
ACTION_RETURN_INT(Raze_getspawnnum(p));
|
|
|
|
}
|
|
|
|
|
2022-11-17 17:38:25 +00:00
|
|
|
sectortype* Raze_updatesector(double x, double y, sectortype* sec, double dist)
|
|
|
|
{
|
|
|
|
updatesector(DVector2(x, y), &sec, dist);
|
|
|
|
return sec;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, updatesector, Raze_updatesector)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
PARAM_POINTER(s, sectortype);
|
|
|
|
PARAM_FLOAT(dist);
|
|
|
|
ACTION_RETURN_POINTER(Raze_updatesector(x, y, s, dist));
|
|
|
|
}
|
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
DEFINE_ACTION_FUNCTION(_Raze, clipmove)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
PARAM_FLOAT(z);
|
|
|
|
PARAM_POINTER_NOT_NULL(s, sectortype);
|
|
|
|
PARAM_FLOAT(mx);
|
|
|
|
PARAM_FLOAT(my);
|
|
|
|
PARAM_FLOAT(wdist);
|
|
|
|
PARAM_FLOAT(cdist);
|
|
|
|
PARAM_FLOAT(fdist);
|
|
|
|
PARAM_UINT(cliptype);
|
|
|
|
PARAM_POINTER_NOT_NULL(coll, CollisionBase);
|
|
|
|
PARAM_INT(cmtn);
|
|
|
|
DVector3 rpos(x, y, z);
|
|
|
|
clipmove(rpos, &s, DVector2(mx, my), wdist, cdist, fdist, cliptype, *coll, cmtn);
|
|
|
|
if (numret > 0) ret[0].SetPointer(s);
|
|
|
|
if (numret > 1) ret[1].SetVector(rpos);
|
|
|
|
return min(numret, 2);
|
|
|
|
}
|
|
|
|
|
2022-11-28 17:57:50 +00:00
|
|
|
int Raze_cansee(double x, double y, double z, sectortype* sec, double xe, double ye, double ze, sectortype* sece)
|
|
|
|
{
|
|
|
|
return cansee(DVector3(x, y, z), sec, DVector3(xe, ye, ze), sece);
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, cansee, Raze_cansee)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
PARAM_FLOAT(z);
|
|
|
|
PARAM_POINTER(s, sectortype);
|
|
|
|
PARAM_FLOAT(xe);
|
|
|
|
PARAM_FLOAT(ye);
|
|
|
|
PARAM_FLOAT(ze);
|
|
|
|
PARAM_POINTER(se, sectortype);
|
|
|
|
ACTION_RETURN_BOOL(Raze_cansee(x, y, z, s, xe, ye, ze, se));
|
|
|
|
}
|
|
|
|
|
2022-11-29 12:06:42 +00:00
|
|
|
int Raze_hitscan(double x, double y, double z, sectortype* sec, double xe, double ye, double ze, HitInfoBase* hit, unsigned cliptype, double maxrange)
|
|
|
|
{
|
|
|
|
return hitscan(DVector3(x, y, z), sec, DVector3(xe, ye, ze), *hit, cliptype, maxrange);
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, hitscan, Raze_hitscan)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
PARAM_FLOAT(z);
|
|
|
|
PARAM_POINTER(s, sectortype);
|
|
|
|
PARAM_FLOAT(xe);
|
|
|
|
PARAM_FLOAT(ye);
|
|
|
|
PARAM_FLOAT(ze);
|
|
|
|
PARAM_POINTER(se, HitInfoBase);
|
|
|
|
PARAM_UINT(clip);
|
|
|
|
PARAM_FLOAT(maxrange);
|
|
|
|
ACTION_RETURN_INT(Raze_hitscan(x, y, z, s, xe, ye, ze, se, clip, maxrange));
|
|
|
|
}
|
2022-11-27 22:36:39 +00:00
|
|
|
|
|
|
|
|
2022-11-20 07:10:15 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, SoundEnabled, SoundEnabled)
|
|
|
|
{
|
|
|
|
ACTION_RETURN_INT(SoundEnabled());
|
|
|
|
}
|
|
|
|
|
2023-09-26 19:09:35 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, SetReverb, S_SetReverb)
|
2022-11-20 07:10:15 +00:00
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_INT(i);
|
2023-09-26 19:09:35 +00:00
|
|
|
S_SetReverb(i);
|
2022-11-20 07:10:15 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, SetReverbDelay, FX_SetReverbDelay)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_INT(i);
|
|
|
|
FX_SetReverbDelay(i);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-11-26 08:08:58 +00:00
|
|
|
int Raze_FindSoundByResID(int id)
|
|
|
|
{
|
|
|
|
return soundEngine->FindSoundByResID(id).index();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, FindSoundByResID, Raze_FindSoundByResID)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_INT(i);
|
|
|
|
ACTION_RETURN_INT(Raze_FindSoundByResID(i));
|
|
|
|
}
|
|
|
|
|
2022-12-23 16:55:28 +00:00
|
|
|
int raze_tileflags(int tex)
|
|
|
|
{
|
|
|
|
return tileflags(FSetTextureID(tex));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, tileflags, raze_tileflags)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_INT(which);
|
|
|
|
ACTION_RETURN_INT(raze_tileflags(which));
|
|
|
|
}
|
|
|
|
|
2022-12-28 21:46:13 +00:00
|
|
|
int raze_tilesurface(int tex)
|
|
|
|
{
|
|
|
|
return tilesurface(FSetTextureID(tex));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, tilesurface, raze_tilesurface)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_INT(which);
|
|
|
|
ACTION_RETURN_INT(raze_tilesurface(which));
|
|
|
|
}
|
|
|
|
|
2022-12-23 16:55:28 +00:00
|
|
|
|
2022-02-20 23:12:51 +00:00
|
|
|
//=============================================================================
|
|
|
|
//
|
|
|
|
// internal sector struct - no longer identical with on-disk format
|
|
|
|
//
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
DEFINE_FIELD_NAMED_X(sectortype, sectortype, ceilingxpan_, ceilingxpan)
|
|
|
|
DEFINE_FIELD_NAMED_X(sectortype, sectortype, ceilingypan_, ceilingypan)
|
|
|
|
DEFINE_FIELD_NAMED_X(sectortype, sectortype, floorxpan_, floorxpan)
|
|
|
|
DEFINE_FIELD_NAMED_X(sectortype, sectortype, floorypan_, floorypan)
|
2022-11-15 13:53:39 +00:00
|
|
|
DEFINE_FIELD_UNSIZED(sectortype, sectortype, walls)
|
2022-02-20 23:12:51 +00:00
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, ceilingstat)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, floorstat)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, lotag)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, type)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, hitag)
|
2022-11-27 20:00:22 +00:00
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, ceilingheinum)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, floorheinum)
|
2022-12-28 21:46:13 +00:00
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, ceilingtexture)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, floortexture)
|
2022-02-20 23:12:51 +00:00
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, extra)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, ceilingshade)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, ceilingpal)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, floorshade)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, floorpal)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, visibility)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, fogpal)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, exflags)
|
2022-02-03 18:15:46 +00:00
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, floorz)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, ceilingz)
|
2022-02-20 23:12:51 +00:00
|
|
|
|
2023-10-01 16:54:10 +00:00
|
|
|
//Duke specific
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, lockinfo)
|
2022-11-20 12:57:51 +00:00
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, shadedsector)
|
2023-10-01 16:54:10 +00:00
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, hitagactor)
|
|
|
|
|
|
|
|
// Blood specific
|
|
|
|
DEFINE_FIELD_NAMED_X(sectortype, sectortype, _xs, x)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, upperLink)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, lowerLink)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, baseFloor)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, baseCeil)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, velFloor)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, velCeil)
|
|
|
|
DEFINE_FIELD_X(sectortype, sectortype, slopewallofs)
|
2022-11-20 12:57:51 +00:00
|
|
|
|
2022-02-20 23:12:51 +00:00
|
|
|
DEFINE_FIELD_NAMED_X(walltype, walltype, xpan_, xpan)
|
|
|
|
DEFINE_FIELD_NAMED_X(walltype, walltype, ypan_, ypan)
|
2022-12-23 07:55:13 +00:00
|
|
|
DEFINE_FIELD_X(walltype, walltype, walltexture)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, overtexture)
|
2022-02-20 23:12:51 +00:00
|
|
|
DEFINE_FIELD_X(walltype, walltype, pos)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, point2)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, nextwall)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, sector)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, nextsector)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, cstat)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, lotag)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, type)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, hitag)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, extra)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, shade)
|
|
|
|
DEFINE_FIELD_X(walltype, walltype, pal)
|
2022-10-07 22:02:10 +00:00
|
|
|
DEFINE_FIELD_NAMED_X(walltype, walltype, xrepeat, xrepeat)
|
|
|
|
DEFINE_FIELD_NAMED_X(walltype, walltype, yrepeat, yrepeat)
|
2023-10-01 16:54:10 +00:00
|
|
|
DEFINE_FIELD_NAMED_X(walltype, walltype, _xw, x)
|
2022-02-20 23:12:51 +00:00
|
|
|
|
|
|
|
DEFINE_FIELD_NAMED_X(tspritetype, tspritetype, sectp, sector)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, cstat)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, statnum)
|
2022-11-25 12:13:50 +00:00
|
|
|
DEFINE_FIELD_NAMED_X(tspritetype, tspritetype, Angles.Yaw, angle)
|
2022-09-01 15:17:06 +00:00
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, xint)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, yint)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, inittype)
|
2022-02-20 23:12:51 +00:00
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, lotag)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, hitag)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, extra)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, detail)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, shade)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, pal)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, clipdist)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, blend)
|
2022-10-07 21:18:36 +00:00
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, scale)
|
2022-02-20 23:12:51 +00:00
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, xoffset)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, yoffset)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, ownerActor)
|
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, time)
|
2022-11-17 17:38:25 +00:00
|
|
|
DEFINE_FIELD_X(tspritetype, tspritetype, pos)
|
2022-02-20 23:12:51 +00:00
|
|
|
|
2022-11-15 19:08:31 +00:00
|
|
|
DEFINE_GLOBAL_NAMED(wall, walls)
|
|
|
|
DEFINE_GLOBAL_NAMED(sector, sectors)
|
2022-12-01 12:58:18 +00:00
|
|
|
DEFINE_GLOBAL(display_mirror)
|
2022-02-20 23:12:51 +00:00
|
|
|
|
|
|
|
void sector_setfloorz(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-02-03 18:15:46 +00:00
|
|
|
sect->setfloorz(val);
|
2022-02-20 23:12:51 +00:00
|
|
|
}
|
|
|
|
|
2022-02-03 18:15:46 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, setfloorz, sector_setfloorz)
|
2022-02-20 23:12:51 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(z);
|
2022-02-03 18:15:46 +00:00
|
|
|
self->setfloorz(z);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_setceilingz(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-02-03 18:15:46 +00:00
|
|
|
sect->setceilingz(val);
|
2022-02-20 23:12:51 +00:00
|
|
|
}
|
|
|
|
|
2022-02-03 18:15:46 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, setceilingz, sector_setceilingz)
|
2022-02-20 23:12:51 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(z);
|
2022-02-03 18:15:46 +00:00
|
|
|
self->setceilingz(z);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_addfloorz(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-02-03 18:15:46 +00:00
|
|
|
sect->addfloorz(val);
|
2022-02-20 23:12:51 +00:00
|
|
|
}
|
|
|
|
|
2022-02-03 18:15:46 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, addfloorz, sector_addfloorz)
|
2022-02-20 23:12:51 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(z);
|
2022-02-03 18:15:46 +00:00
|
|
|
self->addfloorz(z);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_addceilingz(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-02-03 18:15:46 +00:00
|
|
|
sect->addceilingz(val);
|
2022-02-20 23:12:51 +00:00
|
|
|
}
|
|
|
|
|
2022-02-03 18:15:46 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, addceilingz, sector_addceilingz)
|
2022-02-20 23:12:51 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(z);
|
2022-02-03 18:15:46 +00:00
|
|
|
self->addceilingz(z);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_setfloorxpan(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->setfloorxpan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, setfloorxpan, sector_setfloorxpan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(xpan);
|
2022-10-12 17:00:29 +00:00
|
|
|
sector_setfloorxpan(self, xpan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_setceilingxpan(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->setceilingxpan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, setceilingxpan, sector_setceilingxpan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(xpan);
|
2022-10-12 17:00:29 +00:00
|
|
|
sector_setceilingxpan(self, xpan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_addfloorxpan(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->addfloorxpan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, addfloorxpan, sector_addfloorxpan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(xpan);
|
2022-10-12 17:00:29 +00:00
|
|
|
sector_addfloorxpan(self, xpan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_addceilingxpan(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->addceilingxpan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, addceilingxpan, sector_addceilingxpan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(xpan);
|
2022-10-12 17:00:29 +00:00
|
|
|
sector_addceilingxpan(self, xpan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_setfloorypan(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->setfloorypan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, setfloorypan, sector_setfloorypan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(ypan);
|
2022-10-12 17:00:29 +00:00
|
|
|
sector_setfloorypan(self, ypan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_setceilingypan(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->setceilingypan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, setceilingypan, sector_setceilingypan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(ypan);
|
2022-10-12 17:00:29 +00:00
|
|
|
sector_setceilingypan(self, ypan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_addfloorypan(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->addfloorypan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, addfloorypan, sector_addfloorypan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(ypan);
|
2022-10-12 17:00:29 +00:00
|
|
|
sector_addfloorypan(self, ypan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_addceilingypan(sectortype* sect, double val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->addceilingypan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, addceilingypan, sector_addceilingypan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(ypan);
|
2022-10-12 17:00:29 +00:00
|
|
|
sector_addceilingypan(self, ypan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void sector_setfloorslope(sectortype* sect, int val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->setfloorslope(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, setfloorslope, sector_setfloorslope)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_INT(slope);
|
|
|
|
self->setfloorslope(slope);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sector_setceilingslope(sectortype* sect, int val)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
sect->setceilingslope(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, setceilingslope, sector_setceilingslope)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_INT(slope);
|
|
|
|
self->setceilingslope(slope);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int sector_floorslope(sectortype* sect)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
return sect->getfloorslope();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, floorslope, sector_floorslope)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
ACTION_RETURN_INT(self->getfloorslope());
|
|
|
|
}
|
|
|
|
|
|
|
|
int sector_ceilingslope(sectortype* sect)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
return sect->getceilingslope();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, ceilingslope, sector_ceilingslope)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
ACTION_RETURN_INT(self->getceilingslope());
|
|
|
|
}
|
|
|
|
|
2022-11-22 20:22:26 +00:00
|
|
|
double sector_getslopes(sectortype* sect, double x, double y, double *pf)
|
|
|
|
{
|
|
|
|
if (!sect) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
double pc;
|
|
|
|
calcSlope(sect, x, y, &pc, pf);
|
|
|
|
return pc;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, getslopes, sector_getslopes)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
double c, f;
|
|
|
|
calcSlope(self, x, y, &c, &f);
|
|
|
|
if (numret > 0) ret[0].SetFloat(c);
|
|
|
|
if (numret > 1) ret[1].SetFloat(f);
|
|
|
|
return min(numret, 2);
|
|
|
|
}
|
2022-02-20 23:12:51 +00:00
|
|
|
|
2022-12-02 15:26:31 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, nextsectorneighborz, nextsectorneighborzptr)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_FLOAT(z);
|
|
|
|
PARAM_INT(find);
|
|
|
|
ACTION_RETURN_POINTER(nextsectorneighborzptr(self, z, find));
|
|
|
|
}
|
|
|
|
|
2022-12-02 18:55:28 +00:00
|
|
|
int sector_checktexture(sectortype* sec, int place, int intname)
|
|
|
|
{
|
|
|
|
if (!sec) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
|
2022-12-07 16:10:27 +00:00
|
|
|
auto tex = TexMan.CheckForTexture(FName(ENamedName(intname)).GetChars(), ETextureType::Any, FTextureManager::TEXMAN_TryAny | FTextureManager::TEXMAN_ReturnAll);
|
2022-12-09 09:48:47 +00:00
|
|
|
return tex == (place == 0 ? sec->ceilingtexture : sec->floortexture);
|
2022-12-02 18:55:28 +00:00
|
|
|
}
|
2022-12-04 08:18:57 +00:00
|
|
|
|
2022-12-02 18:55:28 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, checktexture, sector_checktexture)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_INT(place);
|
|
|
|
PARAM_INT(name);
|
|
|
|
ACTION_RETURN_BOOL(sector_checktexture(self, place, name));
|
|
|
|
}
|
|
|
|
|
2022-12-04 08:18:57 +00:00
|
|
|
void sector_settexturename(sectortype* sec, int place, int intname)
|
2022-12-02 18:55:28 +00:00
|
|
|
{
|
|
|
|
if (!sec) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-12-08 21:49:02 +00:00
|
|
|
FTextureID texid = TexMan.CheckForTexture(FName(ENamedName(intname)).GetChars(), ETextureType::Any);
|
|
|
|
if (place == 0) sec->setceilingtexture(texid);
|
|
|
|
else sec->setfloortexture(texid);
|
2022-12-04 08:18:57 +00:00
|
|
|
}
|
2022-12-08 21:49:02 +00:00
|
|
|
|
2022-12-04 08:18:57 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, settexturename, sector_settexturename)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_INT(place);
|
|
|
|
PARAM_INT(name);
|
|
|
|
sector_settexturename(self, place, name);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-12-08 21:49:02 +00:00
|
|
|
void sector_settexture(sectortype* sec, int place, int inttexid)
|
2022-12-04 08:18:57 +00:00
|
|
|
{
|
|
|
|
if (!sec) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-12-08 21:49:02 +00:00
|
|
|
|
|
|
|
FSetTextureID texid(inttexid);
|
|
|
|
if (place == 0) sec->setceilingtexture(texid);
|
|
|
|
else sec->setfloortexture(texid);
|
2022-12-02 18:55:28 +00:00
|
|
|
}
|
2022-12-08 21:49:02 +00:00
|
|
|
|
2022-12-02 18:55:28 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_sectortype, settexture, sector_settexture)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(sectortype);
|
|
|
|
PARAM_INT(place);
|
|
|
|
PARAM_INT(name);
|
|
|
|
sector_settexture(self, place, name);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-12-02 15:26:31 +00:00
|
|
|
|
2022-02-20 23:12:51 +00:00
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
void wall_setxpan(walltype* wal, double val)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
wal->setxpan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, setxpan, wall_setxpan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
PARAM_FLOAT(xpan);
|
2022-10-12 17:00:29 +00:00
|
|
|
wall_setxpan(self, xpan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void wall_addxpan(walltype* wal, double val)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
wal->addxpan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, addxpan, wall_addxpan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
PARAM_FLOAT(xpan);
|
2022-10-12 17:00:29 +00:00
|
|
|
wall_addxpan(self, xpan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void wall_setypan(walltype* wal, double val)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
wal->setypan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, setypan, wall_setypan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
PARAM_FLOAT(ypan);
|
2022-10-12 17:00:29 +00:00
|
|
|
wall_setypan(self, ypan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void wall_addypan(walltype* wal, double val)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
wal->addypan(float(val));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, addypan, wall_addypan)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
PARAM_FLOAT(ypan);
|
2022-10-12 17:00:29 +00:00
|
|
|
wall_addypan(self, ypan);
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
sectortype* wall_nextsector(walltype* wal)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
return wal->nextSector();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, nextsectorp, wall_nextsector)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
ACTION_RETURN_POINTER(self->nextSector());
|
|
|
|
}
|
|
|
|
|
|
|
|
sectortype* wall_sector(walltype* wal)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
return wal->sectorp();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, sectorp, wall_sector)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
ACTION_RETURN_POINTER(self->sectorp());
|
|
|
|
}
|
|
|
|
|
|
|
|
walltype* wall_nextwall(walltype* wal)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
return wal->nextWall();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, nextwallp, wall_nextwall)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
ACTION_RETURN_POINTER(self->nextWall());
|
|
|
|
}
|
|
|
|
|
|
|
|
walltype* wall_lastwall(walltype* wal)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
return wal->lastWall();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, lastwall, wall_lastwall)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
ACTION_RETURN_POINTER(self->lastWall());
|
|
|
|
}
|
|
|
|
|
|
|
|
walltype* wall_point2wall(walltype* wal)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
return wal->point2Wall();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, point2wall, wall_point2wall)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
ACTION_RETURN_POINTER(self->point2Wall());
|
|
|
|
}
|
|
|
|
|
2022-11-27 20:00:22 +00:00
|
|
|
void wall_delta(walltype* wal, DVector2* result)
|
2022-02-20 23:12:51 +00:00
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-11-27 20:00:22 +00:00
|
|
|
*result = wal->delta();
|
2022-02-20 23:12:51 +00:00
|
|
|
}
|
|
|
|
|
2022-11-27 20:00:22 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, delta, wall_delta)
|
2022-02-20 23:12:51 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
2022-11-27 20:00:22 +00:00
|
|
|
ACTION_RETURN_VEC2(self->delta());
|
2022-02-20 23:12:51 +00:00
|
|
|
}
|
|
|
|
|
2022-11-27 20:00:22 +00:00
|
|
|
void wall_center(walltype* wal, DVector2* result)
|
2022-02-20 23:12:51 +00:00
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-11-27 20:00:22 +00:00
|
|
|
*result = wal->center();
|
2022-02-20 23:12:51 +00:00
|
|
|
}
|
|
|
|
|
2022-11-27 20:00:22 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, center, wall_center)
|
2022-02-20 23:12:51 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
2022-11-27 20:00:22 +00:00
|
|
|
ACTION_RETURN_VEC2(self->center());
|
2022-02-20 23:12:51 +00:00
|
|
|
}
|
|
|
|
|
2022-11-27 20:00:22 +00:00
|
|
|
|
2022-02-20 23:12:51 +00:00
|
|
|
double wall_length(walltype* wal)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
return wal->Length();
|
|
|
|
}
|
|
|
|
|
2022-09-17 19:18:04 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, length, wall_length)
|
2022-02-20 23:12:51 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
ACTION_RETURN_FLOAT(self->Length());
|
|
|
|
}
|
|
|
|
|
|
|
|
void wall_move(walltype* wal, double x, double y)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-09-30 03:31:02 +00:00
|
|
|
wal->move(DVector2(x, y));
|
2022-02-20 23:12:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, move, wall_move)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
2022-09-30 03:31:02 +00:00
|
|
|
self->move(DVector2(x, y));
|
2022-02-20 23:12:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-10-31 09:45:47 +00:00
|
|
|
void wall_dragpoint(walltype* wal, double x, double y)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
dragpoint(wal, DVector2(x, y));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, dragpoint, wall_dragpoint)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
wall_dragpoint(self, x, y);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-02-20 23:12:51 +00:00
|
|
|
int wall_twosided(walltype* wal)
|
|
|
|
{
|
|
|
|
if (!wal) ThrowAbortException(X_READ_NIL, nullptr);
|
|
|
|
return wal->twoSided();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, twosided, wall_twosided)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
ACTION_RETURN_BOOL(self->twoSided());
|
|
|
|
}
|
2022-11-16 21:25:40 +00:00
|
|
|
|
2022-12-04 08:18:57 +00:00
|
|
|
void wall_settexturename(walltype* sec, int place, int intname)
|
|
|
|
{
|
|
|
|
if (!sec) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-12-08 21:49:02 +00:00
|
|
|
FTextureID texid = TexMan.CheckForTexture(FName(ENamedName(intname)).GetChars(), ETextureType::Any);
|
|
|
|
if (place == 0) sec->setwalltexture(texid);
|
|
|
|
else sec->setovertexture(texid);
|
2022-12-04 08:18:57 +00:00
|
|
|
}
|
2022-12-08 21:49:02 +00:00
|
|
|
|
2022-12-04 08:18:57 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, settexturename, wall_settexturename)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
PARAM_INT(place);
|
|
|
|
PARAM_INT(name);
|
|
|
|
wall_settexturename(self, place, name);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-12-08 21:49:02 +00:00
|
|
|
void wall_settexture(walltype* sec, int place, int inttexid)
|
2022-12-04 08:18:57 +00:00
|
|
|
{
|
|
|
|
if (!sec) ThrowAbortException(X_READ_NIL, nullptr);
|
2022-12-08 21:49:02 +00:00
|
|
|
|
|
|
|
FSetTextureID texid(inttexid);
|
|
|
|
if (place == 0) sec->setwalltexture(texid);
|
|
|
|
else sec->setovertexture(texid);
|
2022-12-04 08:18:57 +00:00
|
|
|
}
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_walltype, settexture, wall_settexture)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(walltype);
|
|
|
|
PARAM_INT(place);
|
|
|
|
PARAM_INT(name);
|
|
|
|
wall_settexture(self, place, name);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-11-16 21:25:40 +00:00
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
void tspritetype_setSpritePic(tspritetype* targ, DCoreActor* self, unsigned z)
|
|
|
|
{
|
|
|
|
auto& spriteset = static_cast<PClassActor*>(self->GetClass())->ActorInfo()->SpriteSet;
|
|
|
|
if (z < spriteset.Size())
|
|
|
|
{
|
2022-12-31 17:02:24 +00:00
|
|
|
targ->setspritetexture(spriteset[z]);
|
2022-11-16 21:25:40 +00:00
|
|
|
}
|
2023-10-04 08:20:57 +00:00
|
|
|
else if ((signed)z == ~0)
|
2022-12-01 12:58:18 +00:00
|
|
|
{
|
2023-04-23 08:32:58 +00:00
|
|
|
targ->setspritetexture(self->dispictex);
|
2022-12-01 12:58:18 +00:00
|
|
|
}
|
2022-11-16 21:25:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_tspritetype, setSpritePic, tspritetype_setSpritePic)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(tspritetype);
|
|
|
|
PARAM_OBJECT(owner, DCoreActor);
|
|
|
|
PARAM_INT(z);
|
|
|
|
tspritetype_setSpritePic(self, owner, z);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
|
2023-10-02 19:03:59 +00:00
|
|
|
DEFINE_FIELD(DCorePlayer, pnum)
|
|
|
|
|
2022-11-16 21:25:40 +00:00
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.sectp, sector)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.cstat, cstat)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.cstat2, cstat2)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.statnum, statnum)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.intangle, intangle)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.pos, pos)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.xint, xint)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.yint, yint)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.inittype, inittype)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.hitag, hitag)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.lotag, lotag)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.flags, flags) // need to be careful with this!
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.extra, extra)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.detail, detail)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.shade, shade)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.pal, pal)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.clipdist, intclipdist)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, clipdist, clipdist)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.blend, blend)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.scale, scale)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.xoffset, xoffset)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.yoffset, yoffset)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.intowner, intowner)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, sprext.mdanimtims, mdanimtims)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, sprext.mdanimcur, mdanimcur)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, sprext.renderflags, renderflags)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, sprext.alpha, alpha)
|
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, time, spawnindex)
|
|
|
|
DEFINE_FIELD(DCoreActor, spritesetindex)
|
2022-11-25 12:13:50 +00:00
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.Angles.Yaw, angle)
|
2022-11-30 18:39:06 +00:00
|
|
|
DEFINE_FIELD_NAMED(DCoreActor, spr.Angles.Pitch, pitch)
|
2022-11-16 21:25:40 +00:00
|
|
|
DEFINE_FIELD(DCoreActor, vel)
|
2022-11-21 03:53:52 +00:00
|
|
|
DEFINE_FIELD(DCoreActor, viewzoffset)
|
2022-12-11 23:58:04 +00:00
|
|
|
DEFINE_FIELD(DCoreActor, oviewzoffset)
|
2022-11-27 20:00:22 +00:00
|
|
|
DEFINE_FIELD(DCoreActor, opos)
|
2022-11-16 21:25:40 +00:00
|
|
|
|
|
|
|
void coreactor_setpos(DCoreActor* self, double x, double y, double z, int relink)
|
|
|
|
{
|
|
|
|
self->spr.pos = { x, y, z };
|
|
|
|
// todo: SW needs to call updatesectorz here or have a separate function.
|
|
|
|
if (relink) SetActor(self, self->spr.pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, setpos, coreactor_setpos)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
PARAM_FLOAT(z);
|
|
|
|
PARAM_BOOL(relink);
|
|
|
|
coreactor_setpos(self, x, y, z, relink);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void coreactor_copypos(DCoreActor* self, DCoreActor* other, int relink)
|
|
|
|
{
|
|
|
|
if (!other) return;
|
|
|
|
self->spr.pos = other->spr.pos;
|
|
|
|
// todo: SW needs to call updatesectorz here or have a separate function.
|
|
|
|
if (relink) SetActor(self, self->spr.pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, copypos, coreactor_setpos)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
PARAM_POINTER(other, DCoreActor);
|
|
|
|
PARAM_BOOL(relink);
|
|
|
|
coreactor_copypos(self, other, relink);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void coreactor_move(DCoreActor* self, double x, double y, double z, int relink)
|
|
|
|
{
|
|
|
|
self->spr.pos += { x, y, z };
|
|
|
|
// todo: SW needs to call updatesectorz here or have a separate function.
|
|
|
|
if (relink) SetActor(self, self->spr.pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, move, coreactor_move)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
PARAM_FLOAT(z);
|
|
|
|
PARAM_BOOL(relink);
|
|
|
|
coreactor_move(self, x, y, z, relink);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void coreactor_backuppos(DCoreActor* self)
|
|
|
|
{
|
|
|
|
self->backuppos();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, backuppos, coreactor_backuppos)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
coreactor_backuppos(self);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void coreactor_setposition(DCoreActor* self, double x, double y, double z)
|
|
|
|
{
|
|
|
|
SetActor(self, DVector3(x, y, z));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, setposition, coreactor_setposition)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
PARAM_FLOAT(z);
|
|
|
|
coreactor_setposition(self, x, y, z);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void coreactor_setpositionz(DCoreActor* self, double x, double y, double z)
|
|
|
|
{
|
|
|
|
SetActorZ(self, DVector3(x, y, z));
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, setpositionz, coreactor_setpositionz)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
PARAM_FLOAT(x);
|
|
|
|
PARAM_FLOAT(y);
|
|
|
|
PARAM_FLOAT(z);
|
|
|
|
coreactor_setpositionz(self, x, y, z);
|
|
|
|
return 0;
|
|
|
|
}
|
2022-11-27 20:00:22 +00:00
|
|
|
|
|
|
|
static double deltaangleDbl(double a1, double a2)
|
|
|
|
{
|
|
|
|
return deltaangle(DAngle::fromDeg(a1), DAngle::fromDeg(a2)).Degrees();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, deltaangle, deltaangleDbl) // should this be global?
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_FLOAT(a1);
|
|
|
|
PARAM_FLOAT(a2);
|
|
|
|
ACTION_RETURN_FLOAT(deltaangle(DAngle::fromDeg(a1), DAngle::fromDeg(a2)).Degrees());
|
|
|
|
}
|
|
|
|
|
|
|
|
static double absangleDbl(double a1, double a2)
|
|
|
|
{
|
|
|
|
return absangle(DAngle::fromDeg(a1), DAngle::fromDeg(a2)).Degrees();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, absangle, absangleDbl) // should this be global?
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_FLOAT(a1);
|
|
|
|
PARAM_FLOAT(a2);
|
|
|
|
ACTION_RETURN_FLOAT(absangle(DAngle::fromDeg(a1), DAngle::fromDeg(a2)).Degrees());
|
|
|
|
}
|
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
static double Normalize180(double angle)
|
|
|
|
{
|
|
|
|
return DAngle::fromDeg(angle).Normalized180().Degrees();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, Normalize180, Normalize180)
|
|
|
|
{
|
|
|
|
PARAM_PROLOGUE;
|
|
|
|
PARAM_ANGLE(angle);
|
|
|
|
ACTION_RETURN_FLOAT(angle.Normalized180().Degrees());
|
|
|
|
}
|
|
|
|
|
2022-12-01 19:11:38 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, isAwayFromWall, isAwayFromWall)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
PARAM_FLOAT(dist);
|
|
|
|
ACTION_RETURN_INT(isAwayFromWall(self, dist));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-12-02 16:10:50 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, ChangeSector, ChangeActorSect)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
PARAM_POINTER(sec, sectortype);
|
|
|
|
PARAM_INT(tail);
|
|
|
|
ChangeActorSect(self, sec, tail);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, ChangeStat, ChangeActorStat)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
PARAM_INT(stat);
|
|
|
|
PARAM_INT(tail);
|
|
|
|
ChangeActorStat(self, stat, tail);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-12-22 20:42:43 +00:00
|
|
|
static int CoreActor_spritetexture(DCoreActor* self)
|
|
|
|
{
|
|
|
|
return self->spr.spritetexture().GetIndex();
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, spritetexture, CoreActor_spritetexture)
|
|
|
|
{
|
|
|
|
PARAM_SELF_PROLOGUE(DCoreActor);
|
|
|
|
ACTION_RETURN_INT(CoreActor_spritetexture(self));
|
|
|
|
}
|
2022-12-01 19:11:38 +00:00
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
|
2022-11-27 20:00:22 +00:00
|
|
|
|
|
|
|
|
|
|
|
walltype* collision_getwall(CollisionBase* coll)
|
|
|
|
{
|
|
|
|
if (coll->type == kHitWall) return coll->hitWall;
|
|
|
|
else return nullptr;
|
|
|
|
}
|
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_CollisionData, hitwall, collision_getwall)
|
2022-11-27 20:00:22 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(CollisionBase);
|
|
|
|
ACTION_RETURN_POINTER(collision_getwall(self));
|
|
|
|
}
|
|
|
|
|
|
|
|
sectortype* collision_getsector(CollisionBase* coll)
|
|
|
|
{
|
|
|
|
if (coll->type == kHitSector) return coll->hitSector;
|
|
|
|
else return nullptr;
|
|
|
|
}
|
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_CollisionData, hitsector, collision_getsector)
|
2022-11-27 20:00:22 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(CollisionBase);
|
|
|
|
ACTION_RETURN_POINTER(collision_getsector(self));
|
|
|
|
}
|
|
|
|
|
|
|
|
DCoreActor* collision_getactor(CollisionBase* coll)
|
|
|
|
{
|
|
|
|
if (coll->type == kHitSprite) return coll->hitActor;
|
|
|
|
else return nullptr;
|
|
|
|
}
|
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_CollisionData, hitactor, collision_getactor)
|
2022-11-27 20:00:22 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(CollisionBase);
|
|
|
|
ACTION_RETURN_POINTER(collision_getactor(self));
|
|
|
|
}
|
|
|
|
|
|
|
|
/////
|
|
|
|
|
|
|
|
void collision_setwall(CollisionBase* coll, walltype * w)
|
|
|
|
{
|
|
|
|
coll->type = kHitWall;
|
|
|
|
coll->hitWall = w;
|
|
|
|
}
|
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_CollisionData, setwall, collision_setwall)
|
2022-11-27 20:00:22 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(CollisionBase);
|
|
|
|
PARAM_POINTER(p, walltype);
|
|
|
|
collision_setwall(self, p);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void collision_setsector(CollisionBase* coll, sectortype* s)
|
|
|
|
{
|
|
|
|
coll->type = kHitSector;
|
|
|
|
coll->hitSector = s;
|
|
|
|
}
|
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_CollisionData, setsector, collision_setsector)
|
2022-11-27 20:00:22 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(CollisionBase);
|
|
|
|
PARAM_POINTER(p, sectortype);
|
|
|
|
collision_setsector(self, p);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void collision_setactor(CollisionBase* coll, DCoreActor* a)
|
|
|
|
{
|
|
|
|
coll->type = kHitSprite;
|
|
|
|
coll->hitActor = a;
|
|
|
|
}
|
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_CollisionData, setactor, collision_setactor)
|
2022-11-27 20:00:22 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(CollisionBase);
|
|
|
|
PARAM_POINTER(p, DCoreActor);
|
|
|
|
collision_setactor(self, p);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void collision_setvoid(CollisionBase* coll)
|
|
|
|
{
|
|
|
|
coll->type = kHitVoid;
|
|
|
|
coll->hitActor = nullptr;
|
|
|
|
}
|
|
|
|
|
2022-11-27 22:36:39 +00:00
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_CollisionData, setvoid, collision_setvoid)
|
2022-11-27 20:00:22 +00:00
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(CollisionBase);
|
|
|
|
collision_setvoid(self);
|
|
|
|
return 0;
|
|
|
|
}
|
2023-10-02 19:03:59 +00:00
|
|
|
|
2023-10-03 20:25:28 +00:00
|
|
|
void collision_setnone(CollisionBase* coll)
|
|
|
|
{
|
|
|
|
coll->type = kHitNone;
|
|
|
|
coll->hitActor = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINE_ACTION_FUNCTION_NATIVE(_CollisionData, setnone, collision_setnone)
|
|
|
|
{
|
|
|
|
PARAM_SELF_STRUCT_PROLOGUE(CollisionBase);
|
|
|
|
collision_setnone(self);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|