ScummVM API documentation
state.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef LASTEXPRESS_STATE_H
23 #define LASTEXPRESS_STATE_H
24 
25 #include "lastexpress/shared.h"
26 
27 #include "common/rect.h"
28 #include "common/serializer.h"
29 #include "common/system.h"
30 #include "common/textconsole.h"
31 
32 namespace LastExpress {
33 
34 class LastExpressEngine;
35 
36 class Inventory;
37 class Objects;
38 class SavePoints;
39 
40 class State {
41 public:
43  uint32 field_0;
44  JacketType jacket;
45  bool eventCorpseMovedFromFloor;
46  uint32 field_C;
47  bool eventCorpseFound;
48  uint32 field_14;
49  uint32 field_18;
50  uint32 portrait;
51  bool eventCorpseThrown;
52  uint32 field_24;
53  uint32 field_28;
54  ChapterIndex chapter;
55  uint32 field_30;
56  bool eventMetAugust;
57  bool isNightTime;
58  uint32 field_3C;
59  uint32 field_40;
60  uint32 field_44;
61  uint32 field_48;
62  uint32 field_4C;
63  bool isTrainRunning;
64  uint32 field_54;
65  uint32 field_58;
66  uint32 field_5C;
67  uint32 field_60;
68  uint32 field_64;
69  uint32 field_68;
70  bool eventMertensAugustWaiting;
71  bool eventMertensKronosInvitation;
72  bool isEggOpen;
73  uint32 field_78; // time?
74  uint32 field_7C;
75  uint32 field_80;
76  uint32 field_84;
77  uint32 field_88;
78  uint32 field_8C;
79  uint32 field_90;
80  uint32 field_94;
81  uint32 field_98;
82  uint32 field_9C;
83  uint32 field_A0;
84  uint32 field_A4;
85  uint32 field_A8;
86  uint32 field_AC;
87  uint32 field_B0;
88  uint32 field_B4;
89  uint32 field_B8;
90  uint32 field_BC;
91  uint32 field_C0;
92  uint32 field_C4;
93  uint32 field_C8;
94  uint32 field_CC;
95  bool eventMetBoutarel;
96  bool eventMetHadija;
97  bool eventMetYasmin;
98  uint32 field_DC;
99  uint32 field_E0;
100  uint32 field_E4;
101  uint32 field_E8;
102  uint32 field_EC;
103  uint32 field_F0;
104  uint32 field_F4;
105  uint32 field_F8;
106  uint32 field_FC;
107  uint32 field_100;
108  uint32 field_104;
109  uint32 field_108;
110  uint32 field_10C;
111  uint32 field_110;
112  uint32 field_114;
113  uint32 field_118;
114  uint32 field_11C;
115  uint32 field_120;
116  uint32 field_124;
117  uint32 field_128;
118  uint32 field_12C;
119  uint32 field_130;
120  uint32 field_134;
121  uint32 field_138;
122  uint32 field_13C;
123  uint32 field_140;
124  uint32 field_144;
125  uint32 field_148;
126  uint32 field_14C;
127  uint32 field_150;
128  uint32 field_154;
129  uint32 field_158;
130  uint32 field_15C;
131  uint32 field_160;
132  uint32 field_164;
133  uint32 field_168;
134  uint32 field_16C;
135  uint32 field_170;
136  uint32 field_174;
137  uint32 field_178;
138  uint32 field_17C;
139  uint32 field_180;
140  uint32 field_184;
141  uint32 field_188;
142  uint32 field_18C;
143  uint32 field_190;
144  uint32 field_194;
145  uint32 field_198;
146  uint32 field_19C;
147  uint32 field_1A0;
148  uint32 field_1A4;
149  uint32 field_1A8;
150  uint32 field_1AC;
151  uint32 field_1B0;
152  uint32 field_1B4;
153  uint32 field_1B8;
154  uint32 field_1BC;
155  uint32 field_1C0;
156  uint32 field_1C4;
157  uint32 field_1C8;
158  uint32 field_1CC;
159  uint32 field_1D0;
160  uint32 field_1D4;
161  uint32 field_1D8;
162  uint32 field_1DC;
163  uint32 field_1E0;
164  uint32 field_1E4;
165  uint32 field_1E8;
166  uint32 field_1EC;
167  uint32 field_1F0;
168  uint32 field_1F4;
169  uint32 field_1F8;
170  uint32 field_1FC;
171 
172  GameProgress() {
173  field_0 = 0;
174  jacket = kJacketOriginal;
175  eventCorpseMovedFromFloor = false;
176  field_C = 0;
177  eventCorpseFound = false;
178  field_14 = 0; // 5
179  field_18 = 0;
180  portrait = _defaultPortrait;
181  eventCorpseThrown = false;
182  field_24 = 0;
183  field_28 = 0; // 10
184  chapter = kChapter1;
185  field_30 = 0;
186  eventMetAugust = false;
187  isNightTime = false;
188  field_3C = 0; // 15
189  field_40 = 0;
190  field_44 = 0;
191  field_48 = 0;
192  field_4C = 0;
193  isTrainRunning = false; // 20
194  field_54 = 0;
195  field_58 = 0;
196  field_5C = 0;
197  field_60 = 0;
198  field_64 = 0; // 25
199  field_68 = 0;
200  eventMertensAugustWaiting = false;
201  eventMertensKronosInvitation = false;
202  isEggOpen = false;
203  field_78 = 0; // 30
204  field_7C = 0;
205  field_80 = 0;
206  field_84 = 0;
207  field_88 = 0;
208  field_8C = 0; // 35
209  field_90 = 0;
210  field_94 = 0;
211  field_98 = 0;
212  field_9C = 0;
213  field_A0 = 0; // 40
214  field_A4 = 0;
215  field_A8 = 0;
216  field_AC = 0;
217  field_B0 = 0;
218  field_B4 = 0; // 45
219  field_B8 = 0;
220  field_BC = 0;
221  field_C0 = 0;
222  field_C4 = 0;
223  field_C8 = 0; // 50
224  field_CC = 0;
225  eventMetBoutarel = false;
226  eventMetHadija = false;
227  eventMetYasmin = false;
228  field_DC = 0; // 55
229  field_E0 = 0;
230  field_E4 = 0;
231  field_E8 = 0;
232  field_EC = 0;
233  field_F0 = 0; // 60
234  field_F4 = 0;
235  field_F8 = 0;
236  field_FC = 0;
237  field_100 = 0;
238  field_104 = 0; // 65
239  field_108 = 0;
240  field_10C = 0;
241  field_110 = 0;
242  field_114 = 0;
243  field_118 = 0; // 70
244  field_11C = 0;
245  field_120 = 0;
246  field_124 = 0;
247  field_128 = 0;
248  field_12C = 0; // 75
249  field_130 = 0;
250  field_134 = 0;
251  field_138 = 0;
252  field_13C = 0;
253  field_140 = 0; // 80
254  field_144 = 0;
255  field_148 = 0;
256  field_14C = 0;
257  field_150 = 0;
258  field_154 = 0; // 85
259  field_158 = 0;
260  field_15C = 0;
261  field_160 = 0;
262  field_164 = 0;
263  field_168 = 0; // 90
264  field_16C = 0;
265  field_170 = 0;
266  field_174 = 0;
267  field_178 = 0;
268  field_17C = 0; // 95
269  field_180 = 0;
270  field_184 = 0;
271  field_188 = 0;
272  field_18C = 0;
273  field_190 = 0; // 100
274  field_194 = 0;
275  field_198 = 0;
276  field_19C = 0;
277  field_1A0 = 0;
278  field_1A4 = 0; // 105
279  field_1A8 = 0;
280  field_1AC = 0;
281  field_1B0 = 0;
282  field_1B4 = 0;
283  field_1B8 = 0; // 110
284  field_1BC = 0;
285  field_1C0 = 0;
286  field_1C4 = 0;
287  field_1C8 = 0;
288  field_1CC = 0; // 115
289  field_1D0 = 0;
290  field_1D4 = 0;
291  field_1D8 = 0;
292  field_1DC = 0;
293  field_1E0 = 0; // 120
294  field_1E4 = 0;
295  field_1E8 = 0;
296  field_1EC = 0;
297  field_1F0 = 0;
298  field_1F4 = 0; // 125
299  field_1F8 = 0;
300  field_1FC = 0;
301  }
302 
314  bool isEqual(uint index, uint val) {
315  return getOrSetValueName(index) == val;
316  }
317 
318  uint32 getOrSetValueName(uint index, Common::String *name = NULL, const uint32* newValue = NULL) {
319  #define EXPOSE_VALUE(idx, entryName, fieldType) \
320  case idx: { \
321  if (name) (*name) = "" #entryName; \
322  if (newValue) {entryName = (fieldType)*newValue;} \
323  return (uint32)entryName; \
324  }
325 
326  switch (index) {
327  default:
328  error("[GameProgress::getValueName] Invalid index value (was: %d, max:127)", index);
329  break;
330 
331  EXPOSE_VALUE(0, field_0, uint32);
332  EXPOSE_VALUE(1, jacket, JacketType);
333  EXPOSE_VALUE(2, eventCorpseMovedFromFloor, bool);
334  EXPOSE_VALUE(3, field_C, uint32);
335  EXPOSE_VALUE(4, eventCorpseFound, bool);
336  EXPOSE_VALUE(5, field_14, uint32);
337  EXPOSE_VALUE(6, field_18, uint32);
338  EXPOSE_VALUE(7, portrait, uint32);
339  EXPOSE_VALUE(8, eventCorpseThrown, bool);
340  EXPOSE_VALUE(9, field_24, uint32);
341  EXPOSE_VALUE(10, field_28, uint32);
342  EXPOSE_VALUE(11, chapter, ChapterIndex);
343  EXPOSE_VALUE(12, field_30, uint32);
344  EXPOSE_VALUE(13, eventMetAugust, bool);
345  EXPOSE_VALUE(14, isNightTime, bool);
346  EXPOSE_VALUE(15, field_3C, uint32);
347  EXPOSE_VALUE(16, field_40, uint32);
348  EXPOSE_VALUE(17, field_44, uint32);
349  EXPOSE_VALUE(18, field_48, uint32);
350  EXPOSE_VALUE(19, field_4C, uint32);
351  EXPOSE_VALUE(20, isTrainRunning, bool);
352  EXPOSE_VALUE(21, field_54, uint32);
353  EXPOSE_VALUE(22, field_58, uint32);
354  EXPOSE_VALUE(23, field_5C, uint32);
355  EXPOSE_VALUE(24, field_60, uint32);
356  EXPOSE_VALUE(25, field_64, uint32);
357  EXPOSE_VALUE(26, field_68, uint32);
358  EXPOSE_VALUE(27, eventMertensAugustWaiting, bool);
359  EXPOSE_VALUE(28, eventMertensKronosInvitation, bool);
360  EXPOSE_VALUE(29, isEggOpen, bool);
361  EXPOSE_VALUE(30, field_78, uint32);
362  EXPOSE_VALUE(31, field_7C, uint32);
363  EXPOSE_VALUE(32, field_80, uint32);
364  EXPOSE_VALUE(33, field_84, uint32);
365  EXPOSE_VALUE(34, field_88, uint32);
366  EXPOSE_VALUE(35, field_8C, uint32);
367  EXPOSE_VALUE(36, field_90, uint32);
368  EXPOSE_VALUE(37, field_94, uint32);
369  EXPOSE_VALUE(38, field_98, uint32);
370  EXPOSE_VALUE(39, field_9C, uint32);
371  EXPOSE_VALUE(40, field_A0, uint32);
372  EXPOSE_VALUE(41, field_A4, uint32);
373  EXPOSE_VALUE(42, field_A8, uint32);
374  EXPOSE_VALUE(43, field_AC, uint32);
375  EXPOSE_VALUE(44, field_B0, uint32);
376  EXPOSE_VALUE(45, field_B4, uint32);
377  EXPOSE_VALUE(46, field_B8, uint32);
378  EXPOSE_VALUE(47, field_BC, uint32);
379  EXPOSE_VALUE(48, field_C0, uint32);
380  EXPOSE_VALUE(49, field_C4, uint32);
381  EXPOSE_VALUE(50, field_C8, uint32);
382  EXPOSE_VALUE(51, field_CC, uint32);
383  EXPOSE_VALUE(52, eventMetBoutarel, bool);
384  EXPOSE_VALUE(53, eventMetHadija, bool);
385  EXPOSE_VALUE(54, eventMetYasmin, bool);
386  EXPOSE_VALUE(55, field_DC, uint32);
387  EXPOSE_VALUE(56, field_E0, uint32);
388  EXPOSE_VALUE(57, field_E4, uint32);
389  EXPOSE_VALUE(58, field_E8, uint32);
390  EXPOSE_VALUE(59, field_EC, uint32);
391  EXPOSE_VALUE(60, field_F0, uint32);
392  EXPOSE_VALUE(61, field_F4, uint32);
393  EXPOSE_VALUE(62, field_F8, uint32);
394  EXPOSE_VALUE(63, field_FC, uint32);
395  EXPOSE_VALUE(64, field_100, uint32);
396  EXPOSE_VALUE(65, field_104, uint32);
397  EXPOSE_VALUE(66, field_108, uint32);
398  EXPOSE_VALUE(67, field_10C, uint32);
399  EXPOSE_VALUE(68, field_110, uint32);
400  EXPOSE_VALUE(69, field_114, uint32);
401  EXPOSE_VALUE(70, field_118, uint32);
402  EXPOSE_VALUE(71, field_11C, uint32);
403  EXPOSE_VALUE(72, field_120, uint32);
404  EXPOSE_VALUE(73, field_124, uint32);
405  EXPOSE_VALUE(74, field_128, uint32);
406  EXPOSE_VALUE(75, field_12C, uint32);
407  EXPOSE_VALUE(76, field_130, uint32);
408  EXPOSE_VALUE(77, field_134, uint32);
409  EXPOSE_VALUE(78, field_138, uint32);
410  EXPOSE_VALUE(79, field_13C, uint32);
411  EXPOSE_VALUE(80, field_140, uint32);
412  EXPOSE_VALUE(81, field_144, uint32);
413  EXPOSE_VALUE(82, field_148, uint32);
414  EXPOSE_VALUE(83, field_14C, uint32);
415  EXPOSE_VALUE(84, field_150, uint32);
416  EXPOSE_VALUE(85, field_154, uint32);
417  EXPOSE_VALUE(86, field_158, uint32);
418  EXPOSE_VALUE(87, field_15C, uint32);
419  EXPOSE_VALUE(88, field_160, uint32);
420  EXPOSE_VALUE(89, field_164, uint32);
421  EXPOSE_VALUE(90, field_168, uint32);
422  EXPOSE_VALUE(91, field_16C, uint32);
423  EXPOSE_VALUE(92, field_170, uint32);
424  EXPOSE_VALUE(93, field_174, uint32);
425  EXPOSE_VALUE(94, field_178, uint32);
426  EXPOSE_VALUE(95, field_17C, uint32);
427  EXPOSE_VALUE(96, field_180, uint32);
428  EXPOSE_VALUE(97, field_184, uint32);
429  EXPOSE_VALUE(98, field_188, uint32);
430  EXPOSE_VALUE(99, field_18C, uint32);
431  EXPOSE_VALUE(100, field_190, uint32);
432  EXPOSE_VALUE(101, field_194, uint32);
433  EXPOSE_VALUE(102, field_198, uint32);
434  EXPOSE_VALUE(103, field_19C, uint32);
435  EXPOSE_VALUE(104, field_1A0, uint32);
436  EXPOSE_VALUE(105, field_1A4, uint32);
437  EXPOSE_VALUE(106, field_1A8, uint32);
438  EXPOSE_VALUE(107, field_1AC, uint32);
439  EXPOSE_VALUE(108, field_1B0, uint32);
440  EXPOSE_VALUE(109, field_1B4, uint32);
441  EXPOSE_VALUE(110, field_1B8, uint32);
442  EXPOSE_VALUE(111, field_1BC, uint32);
443  EXPOSE_VALUE(112, field_1C0, uint32);
444  EXPOSE_VALUE(113, field_1C4, uint32);
445  EXPOSE_VALUE(114, field_1C8, uint32);
446  EXPOSE_VALUE(115, field_1CC, uint32);
447  EXPOSE_VALUE(116, field_1D0, uint32);
448  EXPOSE_VALUE(117, field_1D4, uint32);
449  EXPOSE_VALUE(118, field_1D8, uint32);
450  EXPOSE_VALUE(119, field_1DC, uint32);
451  EXPOSE_VALUE(120, field_1E0, uint32);
452  EXPOSE_VALUE(121, field_1E4, uint32);
453  EXPOSE_VALUE(122, field_1E8, uint32);
454  EXPOSE_VALUE(123, field_1EC, uint32);
455  EXPOSE_VALUE(124, field_1F0, uint32);
456  EXPOSE_VALUE(125, field_1F4, uint32);
457  EXPOSE_VALUE(126, field_1F8, uint32);
458  EXPOSE_VALUE(127, field_1FC, uint32);
459  }
460  }
461 
462  Common::String toString() {
463  Common::String ret = "";
464 
465  for (uint i = 0; i < 128; i++) {
466  Common::String name = "";
467  uint val = getOrSetValueName(i, &name, NULL);
468  ret += Common::String::format("(%03d) %s = %d\n", i, name.c_str(), val);
469  }
470 
471  return ret;
472  }
473 
474  void saveLoadWithSerializer(Common::Serializer &s) override {
475  if (s.isLoading()) {
476  for (uint i = 0; i < 128; i++) {
477  uint32 val = 0;
478  s.syncAsUint32LE(val);
479  getOrSetValueName(i, NULL, &val);
480  }
481  } else {
482  for (uint i = 0; i < 128; i++) {
483  uint32 val = getOrSetValueName(i);
484  s.syncAsUint32LE(val);
485  }
486  }
487  }
488  };
489 
490  struct GameState : public Common::Serializable {
491  // Header
492  uint32 brightness;
493  uint32 volume;
494 
495  // Game data
496  uint32 field_0;
497  TimeValue time;
498  uint32 timeDelta;
499  uint32 timeTicks;
500  bool sceneUseBackup; // byte
501  SceneIndex scene; // uint32
502  SceneIndex sceneBackup; // uint32
503  SceneIndex sceneBackup2; // uin32
504 
505  GameProgress progress;
506  byte events[512];
507 
508  GameState() {
509  brightness = _defaultBrigthness;
510  volume = _defaultVolume;
511 
512  //Game data
513  field_0 = 0;
514  time = kTimeCityParis;
515  timeDelta = _defaultTimeDelta;
516  timeTicks = 0;
517  sceneUseBackup = false;
518  scene = kSceneDefault;
519  sceneBackup = kSceneNone;
520  sceneBackup2 = kSceneNone;
521 
522  // Clear game events
523  memset(events, 0, 512*sizeof(byte));
524  }
525 
532  Common::String ret = "";
533 
534  uint8 hours = 0;
535  uint8 minutes = 0;
536  getHourMinutes(time, &hours, &minutes);
537 
538  ret += Common::String::format("Time: %d (%d:%d) - Time delta: %d - Ticks: %d\n", time, hours, minutes, timeDelta, timeTicks);
539  ret += Common::String::format("Brightness: %d - Volume: %d - UseBackup: %d\n", brightness, volume, sceneUseBackup);
540  ret += Common::String::format("Scene: %d - Scene backup: %d - Scene backup 2: %d\n", scene, sceneBackup, sceneBackup2);
541 
542  return ret;
543  }
544 
545  void saveLoadWithSerializer(Common::Serializer &s) override {
546  s.syncAsUint32LE(time);
547  s.syncAsUint32LE(timeDelta);
548  s.syncAsUint32LE(timeTicks);
549  s.syncAsUint32LE(scene);
550  s.syncAsByte(sceneUseBackup);
551  s.syncAsUint32LE(sceneBackup);
552  s.syncAsUint32LE(sceneBackup2);
553  }
554 
555  void syncEvents(Common::Serializer &s) {
556  for (uint i = 0; i < ARRAYSIZE(events); i++)
557  s.syncAsByte(events[i]);
558  }
559  };
560 
561  struct Flags {
562  bool flag_0;
563  bool flag_3;
564  bool flag_4;
565  bool flag_5;
566 
567  bool frameInterval;
568 
569  bool isGameRunning;
570 
571  // Mouse flags
572  bool mouseLeftClick;
573  bool mouseRightClick;
574 
575  bool mouseLeftPressed;
576  bool mouseRightPressed;
577 
578  bool flag_entities_0;
579  bool flag_entities_1;
580 
581  bool shouldRedraw;
582  bool shouldDrawEggOrHourGlass;
583 
584  int32 nis;
585 
586  Flags() {
587  flag_0 = false;
588  flag_3 = false;
589  flag_4 = false;
590  flag_5 = false;
591 
592  frameInterval = false;
593 
594  isGameRunning = false;
595 
596  mouseRightClick = false;
597  mouseLeftClick = false;
598 
599  mouseLeftPressed = false;
600  mouseRightPressed = false;
601 
602  flag_entities_0 = false;
603  flag_entities_1 = false;
604 
605  shouldRedraw = false;
606  shouldDrawEggOrHourGlass = false;
607 
608  nis = 0;
609  }
610 
617  Common::String ret = "";
618 
619  ret += Common::String::format("Unknown: 0:%02d - 3:%02d - 4:%02d - 5:%02d\n", flag_0, flag_3, flag_4, flag_5);
620  ret += Common::String::format("FrameInterval: %02d - ShouldRedraw:%02d - ShouldDrawEggOrHourGlass:%02d\n", frameInterval, shouldRedraw, shouldDrawEggOrHourGlass);
621  ret += Common::String::format("IsGameRunning: %02d\n", isGameRunning);
622  ret += Common::String::format("Mouse: RightClick:%02d - LeftClick:%02d\n", mouseRightClick, mouseLeftClick);
623  ret += Common::String::format("Entities: 0:%02d - 1:%02d\n", flag_entities_0, flag_entities_1);
624  ret += Common::String::format("NIS: %d\n", nis);
625 
626  return ret;
627  }
628  };
629 
630  State(LastExpressEngine *engine);
631  ~State();
632 
633  void reset();
634 
635  // Accessors
636  Inventory *getGameInventory() { return _inventory; }
637  Objects *getGameObjects() { return _objects; }
638  SavePoints *getGameSavePoints() { return _savepoints; }
639  GameState *getGameState() { return _state; }
640  Flags *getGameFlags() { return _flags; }
641 
642  // Time checks
643  bool isNightTime() const;
644 
645  // Timer
646  int getTimer() { return _timer; }
647  void setTimer(int val) { _timer = val; }
648 
649  // Coordinates
650  void setCoordinates(Common::Point coords) { _coords = coords; }
651  const Common::Point getCoordinates() { return _coords; }
652 
653  // Helpers
654  static uint32 getPowerOfTwo(uint32 x);
655  static void getHourMinutes(uint32 time, uint8 *hours, uint8 *minutes);
656 
657 private:
658  static const uint32 _defaultBrigthness = 3;
659  static const uint32 _defaultVolume = 7;
660  static const uint32 _defaultTimeDelta = 3;
661  static const uint32 _defaultPortrait = 32;
662 
663  LastExpressEngine *_engine;
664 
665  // Timer
666  int _timer;
667 
668  Flags *_flags;
669  Inventory *_inventory;
670  Objects *_objects;
671  SavePoints *_savepoints;
672  GameState *_state;
673  Common::Point _coords;
674 };
675 
676 } // End of namespace LastExpress
677 
678 #endif // LASTEXPRESS_STATE_H
#define ARRAYSIZE(x)
Definition: util.h:91
Common::String toString()
Definition: state.h:531
Definition: str.h:59
static String format(MSVC_PRINTF const char *fmt,...) GCC_PRINTF(1
Definition: savepoint.h:78
Definition: lastexpress.h:69
Definition: animation.h:45
Definition: inventory.h:51
Definition: state.h:40
Definition: serializer.h:79
Definition: state.h:490
bool isEqual(uint index, uint val)
Definition: state.h:314
Common::String toString()
Definition: state.h:616
Definition: rect.h:45
Definition: state.h:42
Definition: serializer.h:308
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: state.h:561
uint32 field_14
EntityIndex (used in Gendarmes)
Definition: state.h:48
Definition: object.h:34