OpenMoHAA 0.82.0
Loading...
Searching...
No Matches
doors.h
1/*
2===========================================================================
3Copyright (C) 2015 the OpenMoHAA team
4
5This file is part of OpenMoHAA source code.
6
7OpenMoHAA source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12OpenMoHAA source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OpenMoHAA source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22
23// doors.h: Doors are environment objects that slide open when activated by triggers
24// or when used by the player.
25//
26
27#pragma once
28
29#include "g_local.h"
30#include "entity.h"
31#include "trigger.h"
32#include "scriptslave.h"
33
34extern Event EV_Door_TryOpen;
35extern Event EV_Door_GoDown;
36extern Event EV_Door_GoUp;
37extern Event EV_Door_HitBottom;
38extern Event EV_Door_HitTop;
39extern Event EV_Door_Fire;
40extern Event EV_Door_Link;
41extern Event EV_Door_SetSpeed;
42extern Event EV_Door_Lock;
43extern Event EV_Door_Unlock;
44
45class Door;
46
47typedef SafePtr<Door> DoorPtr;
48
49class Door : public ScriptSlave
50{
51protected:
52 str sound_open_start;
53 str sound_open_end;
54 str sound_close_start;
55 str sound_close_end;
56 str sound_message;
57 str sound_locked;
58 float lastblocktime;
59 float angle;
60 Vector dir;
61 float diropened;
62 int state;
63 int previous_state;
64 int trigger;
65 int nextdoor;
66 DoorPtr master;
67 float next_locked_time;
68 bool m_bAlwaysAway;
69
70 void SetDir(Event *ev);
71 void OpenEnd(Event *ev);
72 void CloseEnd(Event *ev);
73 void Close(Event *ev);
74 void Open(Event *ev);
75 void DoorUse(Event *ev);
76 void DoorFire(Event *ev);
77 void DoorBlocked(Event *ev);
78 void FieldTouched(Event *ev);
79 void TryOpen(Event *ev);
80 void SpawnTriggerField(Vector fmins, Vector fmaxs);
81 qboolean DoorTouches(Door *e1);
82 void LinkDoors(Event *ev);
83 void SetTime(Event *ev);
84 void LockDoor(Event *ev);
85 void UnlockDoor(Event *ev);
86 void SetOpenStartSound(str sound);
87 void SetOpenStartSound(Event *ev);
88 void SetOpenEndSound(str sound);
89 void SetOpenEndSound(Event *ev);
90 void SetCloseStartSound(Event *ev);
91 void SetCloseStartSound(str sound);
92 void SetCloseEndSound(Event *ev);
93 void SetCloseEndSound(str sound);
94 void SetMessageSound(str sound);
95 void SetMessageSound(Event *ev);
96 void SetLockedSound(str sound);
97 void SetLockedSound(Event *ev);
98 void SetWait(Event *ev);
99 void SetDmg(Event *ev);
100 void EventTrySolid(Event *ev);
101 void EventAlwaysAway(Event *ev);
102 void EventDoorType(Event *ev);
103
104 void SetDoorType(str s);
105 qboolean BlocksAIMovement(void) const override;
106 qboolean AIDontFace(void) const override;
107 void ShowInfo(float fDot, float fDist) override;
108
109 void UpdatePathConnection(void);
110 void SetLocked(qboolean newLocked);
111 void SetState(int newState);
112
113public:
114 CLASS_PROTOTYPE(Door);
115
116 qboolean locked;
117
118 Door();
119 qboolean isOpen(void);
120 qboolean isCompletelyClosed(void);
121 void GetIsOpen(Event *ev); // Added in 2.30
122 qboolean CanBeOpenedBy(Entity *ent);
123 void Archive(Archiver &arc) override;
124};
125
126inline void Door::Archive(Archiver& arc)
127{
128 ScriptSlave::Archive(arc);
129
130 arc.ArchiveString(&sound_open_start);
131 arc.ArchiveString(&sound_open_end);
132 arc.ArchiveString(&sound_close_start);
133 arc.ArchiveString(&sound_close_end);
134 arc.ArchiveString(&sound_message);
135 arc.ArchiveString(&sound_locked);
136 if (arc.Loading()) {
137 SetOpenStartSound(sound_open_start);
138 SetOpenEndSound(sound_open_end);
139 SetCloseStartSound(sound_close_start);
140 SetCloseEndSound(sound_close_end);
141 SetMessageSound(sound_message);
142 SetLockedSound(sound_locked);
143 }
144 arc.ArchiveFloat(&lastblocktime);
145 arc.ArchiveFloat(&angle);
146 arc.ArchiveVector(&dir);
147 arc.ArchiveFloat(&diropened);
148 arc.ArchiveInteger(&state);
149 arc.ArchiveInteger(&previous_state);
150 arc.ArchiveInteger(&trigger);
151 arc.ArchiveInteger(&nextdoor);
152 arc.ArchiveSafePointer(&master);
153 arc.ArchiveFloat(&next_locked_time);
154 arc.ArchiveBoolean(&locked);
155 arc.ArchiveBool(&m_bAlwaysAway);
156}
157
158class RotatingDoor : public Door
159{
160protected:
161 float angle;
162 Vector startangle;
163 int init_door_direction;
164
165public:
166 CLASS_PROTOTYPE(RotatingDoor);
167
168 void DoOpen(Event *ev);
169 void DoClose(Event *ev);
170 void OpenAngle(Event *ev);
171 void Archive(Archiver& arc) override;
172
173 RotatingDoor();
174};
175
176inline void RotatingDoor::Archive(Archiver& arc)
177{
178 Door::Archive(arc);
179
180 arc.ArchiveFloat(&angle);
181 arc.ArchiveVector(&startangle);
182 arc.ArchiveInteger(&init_door_direction);
183}
184
185class SlidingDoor : public Door
186{
187protected:
188 float totalmove;
189 float lip;
190 Vector pos1;
191 Vector pos2;
192 float basespeed;
193 Vector movedir;
194
195public:
196 CLASS_PROTOTYPE(SlidingDoor);
197
198 void SetMoveDir(Event *ev);
199 void Setup(Event *ev);
200 void SetLip(Event *ev);
201 void SetSpeed(Event *ev);
202 void DoOpen(Event *ev);
203 void DoClose(Event *ev);
204 void Archive(Archiver& arc) override;
205
206 SlidingDoor();
207};
208
209inline void SlidingDoor::Archive(Archiver& arc)
210{
211 Door::Archive(arc);
212
213 arc.ArchiveFloat(&totalmove);
214 arc.ArchiveFloat(&lip);
215 arc.ArchiveVector(&pos1);
216 arc.ArchiveVector(&pos2);
217 arc.ArchiveVector(&movedir);
218 arc.ArchiveFloat(&basespeed);
219}
220
221class ScriptDoor : public Door
222{
223protected:
224 ScriptThreadLabel initlabel;
225 ScriptThreadLabel openlabel;
226 ScriptThreadLabel closelabel;
227 float doorsize;
228 Vector startangle;
229 Vector startorigin;
230 Vector movedir;
231
232public:
233 CLASS_PROTOTYPE(ScriptDoor);
234
235 void SetMoveDir(Event *ev);
236 void DoInit(Event *ev);
237 void DoOpen(Event *ev);
238 void DoClose(Event *ev);
239 void SetOpenThread(Event *ev);
240 void SetCloseThread(Event *ev);
241 void SetInitThread(Event *ev);
242 void Archive(Archiver& arc) override;
243 ScriptDoor();
244};
245
246inline void ScriptDoor::Archive(Archiver& arc)
247{
248 Door::Archive(arc);
249
250 arc.ArchiveFloat(&doorsize);
251 arc.ArchiveVector(&startangle);
252 arc.ArchiveVector(&startorigin);
253 arc.ArchiveVector(&movedir);
254}
Definition archive.h:86
Definition doors.h:50
Definition entity.h:203
Definition listener.h:246
Definition safeptr.h:160
Definition gamescript.h:165
Definition vector.h:61
Definition str.h:77