ScummVM API documentation
types.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 #ifndef PELROCK_TYPES_H
22 #define PELROCK_TYPES_H
23 
24 #include "common/debug.h"
25 #include "common/rect.h"
26 #include "common/scummsys.h"
27 #include "common/system.h"
28 #include "common/types.h"
29 
30 namespace Pelrock {
31 
35 enum Cursor {
36  DEFAULT,
37  HOTSPOT,
38  EXIT,
39  ALFRED,
40  COMBINATION
41 };
42 
46 const byte kActionMaskNone = 0;
47 const byte kActionMaskOpen = 1;
48 const byte kActionMaskClose = 2;
49 const byte kActionMaskUnknown = 4;
50 const byte kActionMaskPickup = 8;
51 const byte kActionMaskTalk = 16;
52 const byte kActionMaskPush = 32;
53 const byte kActionMaskPull = 128;
54 
55 enum VerbIcon {
56  PICKUP,
57  TALK,
58  WALK,
59  LOOK,
60  PUSH,
61  PULL,
62  OPEN,
63  CLOSE,
64  ITEM,
65  UNKNOWN,
66  NO_ACTION
67 };
68 
69 const int kCursorWidth = 16;
70 const int kCursorHeight = 18;
71 const int kCursorSize = 288; // 16 * 18
72 
73 const int kVerbIconWidth = 60;
74 const int kVerbIconHeight = 60;
75 const int kNumVerbIcons = 9;
76 
77 const int kBalloonWidth = 247;
78 const int kBalloonHeight = 112;
79 const int kBalloonFrames = 4;
80 
81 const int kAlfredFrameWidth = 51;
82 const int kAlfredFrameHeight = 102;
83 
84 const int kTalkAnimationSpeed = 2; // Frames per update
85 const int kAlfredAnimationSpeed = 2; // Frames per update
86 
87 const int kAlfredIdleAnimationFrameCount = 300; // comb animation plays every ~16 seconds of idle alfred
88 const int kAlfredIdleScreenSaverFrameCount = 1090; // screen saver shows up after 60 seconds
89 
90 const int kInventoryPageSize = 10;
91 
92 const int kAlfredInitialPosX = 235;
93 const int kAlfredInitialPosY = 279;
94 
95 // Direction flags (bit-packed)
96 const byte kMoveRight = 0x01; // Move right (positive X)
97 const byte kMoveLeft = 0x02; // Move left (negative X)
98 const byte kMoveHoriz = 0x03; // Horizontal movement mask
99 const byte kMoveDown = 0x04; // Move down (positive Y)
100 const byte kMoveUp = 0x08; // Move up (negative Y)
101 const byte kMoveVert = 0x0C; // Vertical movement mask
102 const int kMaxPathLength = 100;
103 const int kMaxMovementSteps = 100; // 500 bytes / 5 bytes per step
104 const byte kPathEnd = 0xFF; // End of path marker
105 
106 const byte kAlfredColor = 0x0D;
107 
108 enum OverlayMode {
109  OVERLAY_NONE = 0,
110  OVERLAY_CHOICES = 1,
111  OVERLAY_PICKUP_ICON = 2,
112  OVERLAY_ACTION = 3
113 };
114 
115 // Passerby direction constants
116 const byte kPasserbyRight = 0;
117 const byte kPasserbyLeft = 1;
118 const byte kPasserbyDown = 2;
119 
120 const byte kIconBlinkPeriod = 4;
121 
122 enum AlfredAnimState {
123  ALFRED_IDLE,
124  ALFRED_WALKING,
125  ALFRED_TALKING,
126  ALFRED_INTERACTING,
127  ALFRED_COMB,
128  ALFRED_SPECIAL_ANIM,
129  ALFRED_SKIP_DRAWING
130 };
131 
132 enum AlfredDirection {
133  ALFRED_RIGHT = 0,
134  ALFRED_LEFT = 1,
135  ALFRED_DOWN = 2,
136  ALFRED_UP = 3
137 };
138 
140  byte *animData = nullptr;
141  int w = 0;
142  int h = 0;
143  int numFrames = 0;
144  int loopCount = 0;
145  uint32 stride = 0;
146  int curFrame = 0;
147  int curLoop = 0;
148  uint32 size = 0;
149  int speed = 2;
150  AlfredSpecialAnim(int nF, int width, int height, int nBudas, uint32 off, int lCount, uint32 sz, int spd = 2)
151  : numFrames(nF), w(width), h(height), loopCount(lCount), size(sz), speed(spd) {
152  stride = w * h;
153  }
154 
155  ~AlfredSpecialAnim() {
156  if (animData) {
157  delete[] animData;
158  animData = nullptr;
159  }
160  }
161 };
162 
164  bool isActive = false;
165  int curFrame = 0;
166  int x = 0;
167  int y = 0;
168  int displayTime = 0;
169  bool isAlfredUnder = false;
170 };
171 
173  bool isActive = false;
174  int invStartingPos = 0;
175  int flashingIconIndex = -1;
176  Common::Rect inventorySelectionArea = Common::Rect(0, 340, 640, 400);
177  Common::Rect ballonInventoryPath = Common::Rect(0, 0, kBalloonWidth, kBalloonHeight);
178  byte *arrows[2] = {nullptr, nullptr};
179 
180  bool posInInventorySelectionArea(int x, int y) {
181  return inventorySelectionArea.contains(x, y);
182  }
183 };
184 
185 struct AlfredState {
186  AlfredAnimState animState = ALFRED_IDLE;
187  AlfredDirection direction = ALFRED_DOWN;
188  int curFrame = 0;
189  uint16 movementSpeedX = 6; // pixels per frame
190  uint16 movementSpeedY = 5; // pixels per frame
191  uint16 x = kAlfredInitialPosX;
192  uint16 y = kAlfredInitialPosY;
193  byte w = kAlfredFrameWidth;
194  byte h = kAlfredFrameHeight;
195  int idleFrameCounter = 0;
196  int screenSaverFrameCounter = 0;
197  bool isWalkingCancelable = true;
198 
199  void setState(AlfredAnimState nextState) {
200  animState = nextState;
201  curFrame = 0;
202  }
203 
204  void resetIdles() {
205  idleFrameCounter = 0;
206  screenSaverFrameCounter = 0;
207  }
208 };
209 
211  bool enabled = false;
212  int shakeX = 0;
213  int shakeY = 0;
214 
215  void enable() {
216  enabled = true;
217  }
218 
219  void disable() {
220  enabled = false;
221  shakeX = 0;
222  shakeY = 0;
223  g_system->setShakePos(0, 0);
224  }
225 };
226 
227 struct MovementStep {
228  byte flags; /* Direction flags (see kMove* constants) */
229  uint16 distanceX; // Horizontal distance to move
230  uint16 distanceY; // Vertical distance to move
231 };
232 
236 struct PathContext {
237  byte *pathBuffer; // Sequence of walkbox indices
238  MovementStep *movementBuffer; // Array of movement steps
239  uint16 pathLength;
240  uint16 movementCount;
241  uint16 compressed_length;
242 };
243 
244 struct ExtraScreen {
245  uint32 offset;
246  uint32 paletteOffset;
247  byte numChunks;
248 };
249 
254  int numFrames;
255  int w;
256  int h;
257  int numBudas;
258  int numAlfred;
259  uint32 offset;
260  int loops;
261  int speed;
262  uint32 size; // 0 = compute from numFrames * w * h
263 };
264 
268 struct Anim {
269  int nframes = 0;
270  int curFrame = 0;
271  int curLoop = 0;
272  byte **animData = nullptr;
273  byte loopCount = 0;
274  byte speed = 0;
275  byte elpapsedFrames = 0;
276  uint16 movementFlags = 0;
277 };
278 
279 struct Exit {
280  byte index;
281  int16 x;
282  int16 y;
283  byte w;
284  byte h;
285  uint16 targetRoom;
286  int16 targetX;
287  int16 targetY;
288  AlfredDirection dir;
289  byte isEnabled;
290 };
291 
292 struct Sprite {
293  byte index; // number of the animation in the rooms
294  int16 x; // 0
295  int16 y; // 2
296  int w; // 4
297  int h; // 5
298  uint16 stride; // 6-7
299  int numAnims; // 8
300  int curAnimIndex = 0;
301  byte zOrder; // byte at file offset 23
302  byte actionFlags; // 34
303  bool isHotspotDisabled; // 38
304  bool disableAfterSequence = false; // 39
305  bool isTalking = false;
306  byte talkingAnimIndex = 0;
307  Anim *animData;
308  int16 extra;
309 };
310 
311 struct HotSpot {
312  byte index = 0;
313  byte innerIndex = 0;
314  int id = 0;
315  int16 x = 0;
316  int16 y = 0;
317  int w = 0;
318  int h = 0;
319  byte actionFlags = 0;
320  int16 extra = 0;
321  bool isEnabled = true;
322  bool isSprite = false;
323  byte zOrder = 0;
324 };
325 
326 struct TalkingAnims {
327  uint32 spritePointer = 0;
328 
329  byte unknown2[3];
330 
331  int8 offsetXAnimA = 0;
332  int8 offsetYAnimA = 0;
333 
334  byte wAnimA = 0;
335  byte hAnimA = 0;
336  byte unknown3[2];
337  byte numFramesAnimA = 0;
338  byte unknown4[4]; // slot 0 data pointer (unused in ScummVM)
339  byte speedByteA = 0; // slot 0 offset 0x12: controls NPC talk render rate (original: 2+speedByte ticks per render)
340 
341  int8 offsetXAnimB = 0;
342  int8 offsetYAnimB = 0;
343 
344  byte wAnimB = 0;
345  byte hAnimB = 0;
346  byte unknown5[2]; // slot 1 stride (unused in ScummVM)
347  byte numFramesAnimB = 0;
348  byte unknown7[4]; // slot 1 data pointer (unused in ScummVM)
349  byte speedByteB = 0; // slot 1 speed byte at file offset 30
350  byte unknown6[24]; // slots 2-3 (unused)
351 
352  // Runtime fields (not read from file)
353  byte currentFrameAnimA = 0;
354  byte currentFrameAnimB = 0;
355 
356  byte **animA = nullptr;
357  byte **animB = nullptr;
358 };
359 
360 struct Description {
361  byte itemId = 0;
362  byte index = 0;
363  bool isAction = false;
364  uint16 actionTrigger = 0;
365  Common::String text;
366 };
367 
368 struct WalkBox {
369  byte index;
370  int16 x;
371  int16 y;
372  int16 w;
373  int16 h;
374  byte flags;
375 };
376 
377 struct QueuedAction {
378  VerbIcon verb;
379  int hotspotIndex;
380  bool isQueued; // Alfred is walking/interacting toward the target
381  bool readyToExecute; // Animation done - execute after the current renderScene
382 };
383 
385  int16 yThreshold;
386  byte scaleDivisor;
387  byte scaleMode;
388 };
389 
391  int scaledWidth;
392  int scaledHeight;
393  int scaleX; // Amount to subtract from width (was scaleUp)
394  int scaleY; // Amount to subtract from height (was scaleDown)
395 };
396 
397 enum GameState {
398  GAME = 100,
399  CREDITS = 101,
400  SETTINGS = 102,
401  INTRO = 103,
402  COMPUTER = 104
403 };
404 
405 struct SpriteChange {
406  byte roomNumber;
407  byte spriteIndex;
408  byte zIndex;
409 };
410 
412  byte roomNumber;
413  byte hotspotIndex;
414  HotSpot hotspot;
415 };
416 
417 struct ExitChange {
418  byte roomNumber;
419  byte exitIndex;
420  bool enabled;
421 };
422 
424  byte roomNumber;
425  byte walkboxIndex;
426  WalkBox walkbox;
427 };
428 
430  byte index;
431  Common::String description;
432  byte iconData[60 * 60];
433 };
434 
436  byte startIndex;
437  byte paletteMode;
438  byte currentR;
439  byte currentG;
440  byte currentB;
441  byte minR;
442  byte minG;
443  byte minB;
444  byte maxR;
445  byte maxG;
446  byte maxB;
447  byte speed;
448  bool downDirection;
449  byte curFrameCount = 0;
450 };
451 
452 struct Sticker {
453  int stickerIndex;
454  uint16 x;
455  uint16 y;
456  byte w;
457  byte h;
458 };
459 
461  byte startIndex = 0;
462  byte paletteMode = 0;
463  byte unknown = 0;
464  byte delay = 0;
465  byte unknownBytes[7] = {0};
466  byte flags = 0;
467  byte curFrameCount = 0;
468 };
469 
470 struct PaletteAnim {
471  byte startIndex = 0;
472  byte paletteMode = 0;
473  byte data[10] = {0}; // Based on mode its a rotate or fade
474  byte curFrame = 0;
475  byte tickCount = 0;
476 };
477 
478 struct PasserByAnim {
479  uint32 frameTrigger = 0x3FF;
480  int16 startX;
481  int16 startY;
482  int16 resetCoord;
483  byte dir;
484  byte spriteIndex;
485  byte targetZIndex;
486 
487  PasserByAnim() = default;
488  PasserByAnim(byte spriteIndex_, int16 startX_, int16 startY_, byte dir_, int16 resetCoord_, byte targetZIndex_, uint32 frameTrigger_)
489  : frameTrigger(frameTrigger_), startX(startX_), startY(startY_), resetCoord(resetCoord_), dir(dir_), spriteIndex(spriteIndex_), targetZIndex(targetZIndex_) {}
490 };
491 
493  byte roomNumber;
494  PasserByAnim passerByAnims[2];
495  byte currentAnimIndex = 0;
496  byte numAnims = 0;
497  bool latch = false;
498  RoomPasserBys(byte roomNum, byte nAnims) : roomNumber(roomNum), numAnims(nAnims) {}
499 };
500 
504 struct ChoiceOption {
505  byte room = -1;
506  int choiceIndex;
507  Common::String text;
508  uint32 dataOffset;
509  bool isDisabled = false;
510  bool shouldDisableOnSelect = false;
511  bool hasConversationEndMarker = false;
512  bool isTerminator = false;
513  uint charOffset = 0;
514 
515  ChoiceOption() : choiceIndex(-1), dataOffset(0) {}
516 };
517 
518 struct ResetEntry {
519  uint16 room = 0;
520  uint16 offset = 0;
521  byte dataSize = 0;
522  byte *data = nullptr;
523 };
524 
525 #define FLAG_BOSS_WIRED_MONEY 0
526 #define FLAG_BOSS_IN_JAIL 1
527 #define FLAG_SPICY_SAUCE_PLACED 2
528 #define FLAG_BROKEN_GLASS 3
529 #define FLAG_FIRST_TIME_IN_SHOP 4
530 #define FLAG_ELECTROSHOCK 5
531 #define FLAG_CABLES_PLACED 6
532 #define FLAG_DOORMAN_BRIBED 7
533 #define FLAG_BOOK_MEMORIZED 8
534 #define FLAG_ALFRED_SMART 9
535 #define FLAG_ALFRED_SPEAKS_EGYPTIAN 10
536 #define FLAG_SALESMAN_LEAVES_ALFRED_ALONE 11
537 #define FLAG_TRAVEL_TO_EGYPT 12
538 #define FLAG_SOLVED_PARADOX 13
539 #define FLAG_CROCODILE_ON 14
540 #define FLAG_LOOKED_SYMBOL_MUSEUM_EXTERIOR 15
541 #define FLAG_SECRET_DOOR_OPEN 16
542 #define FLAG_STOLE_PRINCESS_HAIR 17
543 #define FLAG_TO_JAIL 18
544 #define FLAG_SAFE_COMBINATION 19
545 #define FLAG_DOLL_PLACED 20
546 #define FLAG_GUARD_WATER_DRINKED 21
547 #define FLAG_GUARD_PEEING 22
548 #define FLAG_PYRAMID_COLLAPSED 23
549 #define FLAG_PYRAMID_COLLAPSED2 24
550 #define FLAG_GUARD_HAVINGFUN 25
551 #define FLAG_MAGIC_FORMULA 26
552 #define FLAG_TIME_TRAVEL 27
553 #define FLAG_EUNUCH_APPEARS 28
554 #define FLAG_PHARAOH_VIEWING 29
555 #define FLAG_TO_WORK 30
556 #define FLAG_STONE_GIVEN 31
557 #define FLAG_COLLECTED_STONES 32
558 #define FLAG_DRUNK_GUARDS 33
559 #define FLAG_FAKE_STONE_WET 34
560 #define FLAG_CORRECT_DOOR 35
561 #define FLAG_TRAPDOOR_OPEN 36
562 #define FLAG_PRINCESS_ROOM 37
563 #define FLAG_GET_THE_PRINCESS 38
564 #define FLAG_GAME_RESTART 39
565 #define FLAG_CORRIDORS 40
566 #define FLAG_GODS_STANCES 41
567 #define FLAG_END_OF_GAME 42
568 #define FLAG_FROM_INTRO 43
569 #define FLAG_STONE_THROWN 44
570 #define FLAG_USED_WATER 45
571 #define FLAG_OPEN_SHOP 46
572 #define FLAG_DRINKS_NUMBER 47
573 #define FLAG_COLLECTED_INGREDIENTS 48
574 #define FLAG_GUARD_ASKS_FOR_STUFF 49
575 #define FLAG_GUARD_ID_DELIVERED 50
576 #define FLAG_TRAVELAGENCY_OPEN 51
577 #define FLAG_MERCHANT_SLOGANS 52
578 #define FLAG_HOOKER_250_TIMES 53
579 #define FLAG_CORRECT_ANSWERS 54
580 #define FLAG_CHEAT_CODE_ENABLED 55
581 #define FLAG_RIDDLE_PRESENTED 56
582 #define FLAG_SYMBOLS_PUSHED 57
583 #define FLAG_MERCHANT_GIVENITEMS 58
584 #define FLAG_CORRECT_DOOR_CHOSEN 59
585 #define FLAG_SKELETON_RECOGNIZES 60
586 #define FLAG_PIGEON_DEAD 61
587 #define FLAG_RECIPE_TAKEN 62
588 
589 const int kNumGameFlags = 63;
590 
592  byte flags[kNumGameFlags];
593 
594  GameState stateGame = INTRO;
595 
596  Common::Array<byte> inventoryItems;
597  int16 selectedInventoryItem = -1;
598 
599  int libraryShelf = -1;
600  int selectedBookIndex = -1;
601  char bookLetter = '\0';
608 
609  GameStateData() {
610  clear();
611  }
612 
613  ~GameStateData() {
614  clearBranches();
615  delete[] conversationCurrentRoot;
616  conversationCurrentRoot = nullptr;
617  }
618 
619  void clear() {
620  memset(conversationCurrentRoot, 0xFF, 112); // Initialize all to 0xFF (not set)
621  for (int i = 0; i < kNumGameFlags; i++)
622  flags[i] = 0;
623  flags[FLAG_FIRST_TIME_IN_SHOP] = true;
624  inventoryItems.clear();
625  stickersPerRoom.clear();
626  roomExitChanges.clear();
627  roomWalkBoxChanges.clear();
628  roomHotSpotChanges.clear();
629  spriteChanges.clear();
630  clearBranches();
631  libraryShelf = -1;
632  selectedBookIndex = -1;
633  bookLetter = '\0';
634  stateGame = GAME;
635  }
636 
637  void clearBranches() {
638  for(auto &entry : disabledBranches) {
639  for (ResetEntry &resetEntry : entry._value) {
640  if (resetEntry.data) {
641  delete[] resetEntry.data;
642  resetEntry.data = nullptr;
643  }
644  }
645  }
646  disabledBranches.clear();
647  }
648 
649  void addDisabledBranch(ResetEntry entry) {
650  disabledBranches[entry.room].push_back(entry);
651  }
652 
653  byte getFlag(int flagIndex) const {
654  if (flagIndex < 0 || flagIndex >= kNumGameFlags)
655  return false;
656  return flags[flagIndex];
657  }
658 
659  bool getBoolFlag(int flagIndex) const {
660  return getFlag(flagIndex) != 0;
661  }
662 
663  void setFlag(int flagIndex, byte value) {
664  if (flagIndex < 0 || flagIndex >= kNumGameFlags)
665  return;
666  flags[flagIndex] = value;
667  }
668 
669  void addInventoryItem(int id) {
670  inventoryItems.push_back(id);
671  }
672 
673  void clearInventory() {
674  inventoryItems.clear();
675  selectedInventoryItem = -1;
676  }
677 
678  void removeInventoryItem(int id) {
679  for (uint i = 0; i < inventoryItems.size(); i++) {
680  if (inventoryItems[i] == id) {
681  inventoryItems.remove_at(i);
682  break;
683  }
684  }
685  if (selectedInventoryItem == id) {
686  if (inventoryItems.size() > 0) {
687  selectedInventoryItem = inventoryItems[0];
688  } else {
689  selectedInventoryItem = -1;
690  }
691  }
692  }
693 
694  bool hasInventoryItem(int id) const {
695  for (uint i = 0; i < inventoryItems.size(); i++) {
696  if (inventoryItems[i] == id) {
697  return true;
698  }
699  }
700  return false;
701  }
702 
703  // Store current root index for each room (0xFF = not set, use findRoot logic)
704  byte *conversationCurrentRoot = new byte[112];
705 
706  int getCurrentRoot(byte room, int npc) const {
707  if (room >= 56)
708  return -1;
709  return (conversationCurrentRoot[room * 2 + npc] == 0xFF) ? -1 : conversationCurrentRoot[room * 2 + npc];
710  }
711 
712  void setCurrentRoot(byte room, int root, int npc) {
713  if (room >= 56)
714  return;
715  if (root < 0 || root > 254) {
716  conversationCurrentRoot[room * 2 + npc] = 0xFF; // Reset to auto-select
717  } else {
718  conversationCurrentRoot[room * 2 + npc] = (byte)root;
719  }
720  }
721 
722  int findFirstBookIndex() {
723  for (uint i = 0; i < inventoryItems.size(); i++) {
724  int x = inventoryItems[i];
725  if ((x >= 11) && (x <= 58))
726  return x;
727  }
728  return -1;
729  }
730 
731  int booksInInventory() {
732  int l = inventoryItems.size();
733  int count = 0;
734  for (int i = 0; i < l; i++) {
735  int x = inventoryItems[i];
736  if ((x >= 11) && (x <= 58))
737  count++;
738  }
739  return count;
740  }
741 };
742 
743 struct SaveGameData {
744  byte currentRoom = 0;
745  uint16 alfredX = 0;
746  uint16 alfredY = 0;
747  AlfredDirection alfredDir = ALFRED_DOWN;
748  GameStateData *gameState = nullptr;
749 };
750 
751 struct FightRoomCfg {
752  int roomNumber;
753  int spriteIdx;
754  int appearFrames;
755  int spellFrames;
756  int spellPage;
757 };
758 
759 static const FightRoomCfg kFightRooms[] = {
760  {51, 1, 31, 17, 8}, // room 51
761  {52, 0, 30, 13, 4}, // room 52
762  {53, 1, 30, 13, 0}, // room 53
763  {54, 1, 38, 11, 2}, // room 54
764 };
765 
766 } // End of namespace Pelrock
767 
768 #endif
virtual void setShakePos(int shakeXOffset, int shakeYOffset)=0
Definition: types.h:139
Definition: types.h:268
void clear(bool shrinkArray=0)
Definition: hashmap.h:431
Definition: types.h:384
Definition: types.h:492
Definition: str.h:59
Definition: types.h:518
Definition: types.h:478
Definition: types.h:743
void clear()
Definition: array.h:321
Definition: types.h:163
Definition: types.h:470
Definition: types.h:405
Definition: types.h:227
Definition: types.h:244
Definition: actions.h:27
Definition: rect.h:524
Definition: types.h:591
Definition: types.h:311
Definition: types.h:429
OSystem * g_system
Definition: types.h:423
Definition: types.h:236
void push_back(const T &element)
Definition: array.h:181
Definition: types.h:210
Definition: types.h:253
Definition: types.h:360
Definition: hashmap.h:85
Definition: atari-cursor.h:35
Definition: types.h:185
size_type size() const
Definition: array.h:316
bool contains(T x, T y) const
Definition: rect.h:246
Definition: types.h:452
Definition: types.h:417
T remove_at(size_type idx)
Definition: array.h:261
Definition: types.h:292
Definition: types.h:172
Definition: types.h:390
Definition: types.h:368
Definition: types.h:279
Definition: types.h:504
Definition: types.h:435
Definition: types.h:326
Definition: types.h:411
Definition: types.h:751
Definition: types.h:377
Definition: types.h:460