openmohaa/code/fgame/scriptslave.h

255 lines
7 KiB
C
Raw Normal View History

2016-03-27 11:49:47 +02:00
/*
===========================================================================
2023-11-01 22:21:09 +01:00
Copyright (C) 2023 the OpenMoHAA team
2016-03-27 11:49:47 +02:00
This file is part of OpenMoHAA source code.
OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// scriptslave.h: Standard scripted objects. Controlled by scriptmaster. These objects
// are bmodel objects created in the editor and controlled by an external
// text based script. Commands are interpretted on by one and executed
// upon a signal from the script master. The base script object can
// perform several different relative and specific rotations and translations
// and can cause other parts of the script to be executed when touched, damaged,
// touched, or used.
2023-11-01 22:21:09 +01:00
//
2016-03-27 11:49:47 +02:00
2023-11-01 22:21:09 +01:00
#pragma once
2016-03-27 11:49:47 +02:00
#include "g_local.h"
#include "entity.h"
#include "trigger.h"
#include "mover.h"
#include "script.h"
#include "scriptmaster.h"
#include "misc.h"
#include "bspline.h"
#include "spline.h"
class ScriptSlave : public Mover
{
2023-11-01 22:21:09 +01:00
protected:
float attack_finished;
int dmg;
int dmg_means_of_death;
public:
qboolean commandswaiting;
Vector TotalRotation;
Vector NewAngles;
Vector NewPos;
Vector ForwardDir;
float speed;
Waypoint *waypoint;
float traveltime;
BSpline *splinePath;
float splineTime;
cSpline<4, 512> *m_pCurPath;
int m_iCurNode;
float m_fCurSpeed;
float m_fIdealSpeed;
Vector m_vIdealPosition;
Vector m_vIdealDir;
float m_fIdealAccel;
float m_fIdealDistance;
float m_fLookAhead;
qboolean splineangles;
qboolean ignoreangles;
qboolean ignorevelocity;
qboolean moving; // is the script object currently moving?
protected:
void CheckNewOrders(void);
void NewMove(void);
CLASS_PROTOTYPE(ScriptSlave);
ScriptSlave();
~ScriptSlave();
void BindEvent(Event *ev);
void EventUnbind(Event *ev);
void DoMove(Event *ev);
void WaitMove(Event *ev);
void MoveEnd(Event *ev);
void SetAnglesEvent(Event *ev);
void SetAngleEvent(Event *ev);
void SetModelEvent(Event *ev);
void TriggerEvent(Event *ev) override;
void GotoNextWaypoint(Event *ev);
void JumpTo(Event *ev);
void MoveToEvent(Event *ev);
void SetSpeed(Event *ev);
void SetTime(Event *ev);
void MoveUp(Event *ev);
void MoveDown(Event *ev);
void MoveNorth(Event *ev);
void MoveSouth(Event *ev);
void MoveEast(Event *ev);
void MoveWest(Event *ev);
void MoveForward(Event *ev);
void MoveBackward(Event *ev);
void MoveLeft(Event *ev);
void MoveRight(Event *ev);
void RotateXdownto(Event *ev);
void RotateYdownto(Event *ev);
void RotateZdownto(Event *ev);
void RotateAxisdownto(Event *ev);
void RotateXupto(Event *ev);
void RotateYupto(Event *ev);
void RotateZupto(Event *ev);
void RotateAxisupto(Event *ev);
void Rotateupto(Event *ev);
void Rotatedownto(Event *ev);
void Rotateto(Event *ev);
void RotateXdown(Event *ev);
void RotateYdown(Event *ev);
void RotateZdown(Event *ev);
void RotateAxisdown(Event *ev);
void RotateXup(Event *ev);
void RotateYup(Event *ev);
void RotateZup(Event *ev);
void RotateAxisup(Event *ev);
void RotateX(Event *ev);
void RotateY(Event *ev);
void RotateZ(Event *ev);
void RotateAxis(Event *ev);
void SetDamage(Event *ev);
void SetMeansOfDeath(Event *ev);
void FollowPath(Event *ev);
void EndPath(Event *ev);
void FollowingPath(Event *ev);
void CreatePath(SplinePath *path, splinetype_t type);
void Explode(Event *ev);
void NotShootable(Event *ev);
void OpenPortal(Event *ev);
void ClosePortal(Event *ev);
void PhysicsOn(Event *ev);
void PhysicsOff(Event *ev);
void PhysicsVelocity(Event *ev);
void DamageFunc(Event *ev);
void EventFlyPath(Event *ev);
void EventModifyFlyPath(Event *ev);
void SetupPath(cSpline<4, 512> *pPath, SimpleEntity *se);
void Archive(Archiver& arc) override;
};
inline void ScriptSlave::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
{
2023-11-01 22:21:09 +01:00
int tempInt;
Mover::Archive(arc);
arc.ArchiveFloat(&attack_finished);
arc.ArchiveInteger(&dmg);
arc.ArchiveInteger(&dmg_means_of_death);
arc.ArchiveBoolean(&commandswaiting);
arc.ArchiveVector(&TotalRotation);
arc.ArchiveVector(&NewAngles);
arc.ArchiveVector(&NewPos);
arc.ArchiveVector(&ForwardDir);
arc.ArchiveFloat(&speed);
arc.ArchiveObjectPointer((Class **)&waypoint);
arc.ArchiveFloat(&traveltime);
if (arc.Saving()) {
// if it exists, archive it, otherwise place a special NULL ptr tag
if (splinePath) {
tempInt = ARCHIVE_POINTER_VALID;
} else {
tempInt = ARCHIVE_POINTER_NULL;
}
arc.ArchiveInteger(&tempInt);
if (tempInt == ARCHIVE_POINTER_VALID) {
splinePath->Archive(arc);
}
} else {
arc.ArchiveInteger(&tempInt);
if (tempInt == ARCHIVE_POINTER_VALID) {
splinePath = new BSpline;
splinePath->Archive(arc);
} else {
splinePath = NULL;
}
}
arc.ArchiveFloat(&splineTime);
arc.ArchiveBoolean(&splineangles);
arc.ArchiveBoolean(&ignoreangles);
arc.ArchiveBoolean(&moving);
if (arc.Saving()) {
// if it exists, archive it, otherwise place a special NULL ptr tag
if (m_pCurPath) {
tempInt = ARCHIVE_POINTER_VALID;
} else {
tempInt = ARCHIVE_POINTER_NULL;
}
arc.ArchiveInteger(&tempInt);
if (tempInt == ARCHIVE_POINTER_VALID) {
m_pCurPath->Archive(arc);
}
} else {
arc.ArchiveInteger(&tempInt);
if (tempInt == ARCHIVE_POINTER_VALID) {
m_pCurPath = new cSpline<4, 512>;
m_pCurPath->Archive(arc);
} else {
m_pCurPath = NULL;
}
}
2016-03-27 11:49:47 +02:00
}
class ScriptModel : public ScriptSlave
2023-11-01 22:21:09 +01:00
{
private:
void GibEvent(Event *ev);
2016-03-27 11:49:47 +02:00
2023-11-01 22:21:09 +01:00
public:
CLASS_PROTOTYPE(ScriptModel);
2016-03-27 11:49:47 +02:00
2023-11-01 22:21:09 +01:00
ScriptModel();
void SetAngleEvent(Event *ev);
void SetModelEvent(Event *ev);
void SetAnimEvent(Event *ev);
void AnimDoneEvent(Event* ev);
void MoveAnimEvent(Event* ev);
void MovingFromAnimEvent(Event* ev);
2023-11-01 22:21:09 +01:00
};
2016-03-27 11:49:47 +02:00
class ScriptOrigin : public ScriptSlave
2023-11-01 22:21:09 +01:00
{
public:
CLASS_PROTOTYPE(ScriptOrigin);
ScriptOrigin();
};
2016-03-27 11:49:47 +02:00
class ScriptSkyOrigin : public ScriptSlave
2023-11-01 22:21:09 +01:00
{
public:
CLASS_PROTOTYPE(ScriptSkyOrigin);
ScriptSkyOrigin();
};