22 #ifndef TWINE_SHARED_H 23 #define TWINE_SHARED_H 25 #include "common/scummsys.h" 28 #define NUM_GAME_FLAGS 256 29 #define NUM_GAME_FLAGS_LBA1 255 32 #define NUMOFCOLORS 256 34 #define MAX_HOLO_POS 150 35 #define MAX_HOLO_POS_2 334 37 #define NUM_INVENTORY_ITEMS 28 41 #define GAMEFLAG_INVENTORY_DISABLED 70 // Any prison FLAG_CONSIGNE 43 #define GAMEFLAG_VIDEO_BAFFE 200 45 #define GAMEFLAG_VIDEO_BAFFE2 201 47 #define GAMEFLAG_VIDEO_BAFFE3 202 49 #define GAMEFLAG_VIDEO_BATEAU 203 51 #define GAMEFLAG_VIDEO_TEMPLE 204 53 #define GAMEFLAG_VIDEO_FLUTE2 205 55 #define GAMEFLAG_VIDEO_NAVETTE 206 57 #define GAMEFLAG_VIDEO_NEIGE2 207 59 #define GAMEFLAG_VIDEO_SURF 208 64 #define GAMEFLAG_VIDEO_BATEAU2 209 66 #define GAMEFLAG_VIDEO_CAPTURE 210 68 #define GAMEFLAG_VIDEO_VERSER 211 70 #define GAMEFLAG_VIDEO_VERSER2 212 72 #define GAMEFLAG_VIDEO_FORTRESS 213 74 #define GAMEFLAG_VIDEO_SENDEL2 214 76 #define GAMEFLAG_VIDEO_BAFFE5 215 78 #define GAMEFLAG_VIDEO_EXPLODE 216 80 #define GAMEFLAG_VIDEO_GLASS2 217 82 #define GAMEFLAG_VIDEO_SENDEL 218 84 #define GAMEFLAG_VIDEO_EXPLODE2 219 86 #define GAMEFLAG_ESC 249 89 #define GAMEFLAG_MONEY 8 91 #define GAMEFLAG_ARDOISE 28 94 #define OWN_ACTOR_SCENE_INDEX 0 95 #define IS_HERO(x) ((x) == OWN_ACTOR_SCENE_INDEX) 99 #include "common/pack-start.h" 105 #include "common/pack-end.h" 106 static_assert(
sizeof(
I16Vec3) == 6,
"Unexpected pointTab size");
109 constexpr
IVec2() : x(0), y(0) {}
110 constexpr IVec2(int32 _x, int32 _y) : x(_x), y(_y) {}
114 inline IVec2 &operator+=(
const IVec2 &other) {
120 inline IVec2 &operator-=(
const IVec2 &other) {
128 constexpr
IVec3() : x(0), y(0), z(0) {}
129 constexpr IVec3(int32 _x, int32 _y, int32 _z) : x(_x), y(_y), z(_z) {}
134 inline IVec3 &operator=(
const I16Vec3 &other) {
141 inline IVec3 &operator+=(
const IVec3 &other) {
148 inline IVec3 &operator-=(
const IVec3 &other) {
157 return IVec3{lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z};
161 return IVec3{lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z};
164 inline constexpr
IVec3 operator-(
const IVec3 &v) {
165 return IVec3{-v.x, -v.y, -v.z};
175 int32 getDistance2D(int32 x1, int32 z1, int32 x2, int32 z2);
176 int32 getDistance2D(
const IVec3 &v1,
const IVec3 &v2);
187 int32 getDistance3D(int32 x1, int32 y1, int32 z1, int32 x2, int32 y2, int32 z2);
188 int32 getDistance3D(
const IVec3 &v1,
const IVec3 &v2);
197 bool isValid()
const {
198 return mins.x <= maxs.x && mins.y <= maxs.y && mins.z <= maxs.z;
204 bool hasBoundingBox =
false;
207 enum class ActionType : uint8 {
215 ACTION_SAMPLE_FREQ = 7,
216 ACTION_THROW_EXTRA_BONUS = 8,
217 ACTION_THROW_MAGIC_BALL = 9,
218 ACTION_SAMPLE_REPEAT = 10,
219 ACTION_THROW_SEARCH = 11,
220 ACTION_THROW_ALPHA = 12,
221 ACTION_SAMPLE_STOP = 13,
223 ACTION_LEFT_STEP = 15,
224 ACTION_RIGHT_STEP = 16,
225 ACTION_HERO_HITTING = 17,
226 ACTION_THROW_3D = 18,
227 ACTION_THROW_3D_ALPHA = 19,
228 ACTION_THROW_3D_SEARCH = 20,
229 ACTION_THROW_3D_MAGIC = 21,
231 ACTION_SUPER_HIT = 22,
232 ACTION_THROW_OBJ_3D = 23,
236 ACTION_THROW_DART = 27,
238 ACTION_SAMPLE_MAGIC = 29,
239 ACTION_THROW_3D_CONQUE = 30,
240 ACTION_ZV_ANIMIT = 31,
243 ACTION_RENVOYABLE = 34,
244 ACTION_TRANSPARENT = 35,
246 ACTION_LEFT_JUMP = 37,
247 ACTION_RIGHT_JUMP = 38,
248 ACTION_NEW_SAMPLE = 39,
249 ACTION_IMPACT_3D = 40,
250 ACTION_THROW_MAGIC_EXTRA = 41,
251 ACTION_THROW_FOUDRE = 42
254 enum class ShapeType {
259 kStairsBottomLeft = 4,
260 kStairsBottomRight = 5,
261 kDoubleSideStairsTop1 = 6,
262 kDoubleSideStairsBottom1 = 7,
263 kDoubleSideStairsLeft1 = 8,
264 kDoubleSideStairsRight1 = 9,
265 kDoubleSideStairsTop2 = 10,
266 kDoubleSideStairsBottom2 = 11,
267 kDoubleSideStairsLeft2 = 12,
268 kDoubleSideStairsRight2 = 13,
274 enum class ControlMode {
293 enum class AnimationTypes {
323 kCarDrivingBackwards = 305,
329 enum class AnimType {
330 kAnimationTypeRepeat = 0,
334 kAnimationAllThen = 2,
336 kAnimationInsert = 3,
354 enum class HeroBehaviourType {
366 kSCAPH_EXT_NORM = 10,
367 kSCAPH_EXT_SPOR = 11,
375 #define CUBE_INTERIEUR 0 376 #define CUBE_EXTERIEUR 1 387 enum class BodyType {
411 enum class ExtraSpecialType {
417 enum class ZoneType {
432 #define SCENE_CEILING_GRID_FADE_1 (-1) 433 #define SCENE_CEILING_GRID_FADE_2 (-2) 436 Citadel_Island_Prison = 0,
437 Citadel_Island_outside_the_citadel = 1,
438 Citadel_Island_near_the_tavern = 2,
439 Citadel_Island_near_the_pharmacy = 3,
440 Citadel_Island_near_twinsens_house = 4,
441 Citadel_Island_inside_Twinsens_house = 5,
442 Citadel_Island_Harbor = 6,
443 Citadel_Island_Pharmacy = 7,
444 White_Leaf_Desert_Temple_of_Bu_1st_scene = 8,
445 Hamalayi_Mountains_landing_place = 9,
446 Principal_Island_Library = 10,
447 Principal_Island_Harbor = 11,
448 Principal_Island_outside_the_fortress = 12,
449 Principal_Island_Old_Burg = 13,
450 Citadel_Island_Tavern = 14,
451 Hamalayi_Mountains_Rabbibunny_village = 15,
452 Citadel_Island_inside_a_Rabbibunny_house = 16,
453 Principal_Island_Ruins = 17,
454 Principal_Island_outside_the_library = 18,
455 Principal_Island_Militairy_camp = 19,
456 Citadel_Island_Architects_house = 20,
457 Citadel_Island_secret_chamber_in_the_house = 21,
458 Principal_Island_Ticket_office = 22,
459 Principal_Island_Prison = 23,
460 Principal_Island_Port_Belooga = 24,
461 Principal_Island_Peg_Leg_Street = 25,
462 Principal_Island_Shop = 26,
463 Principal_Island_Locksmith = 27,
464 Principal_Island_inside_a_Rabbibunny_house = 28,
465 Principal_Island_Astronimers_House = 29,
466 Principal_Island_Tavern = 30,
467 Principal_Island_Basement_of_the_Astronomer = 31,
468 Principal_Island_Stables = 32,
469 Citadel_Island_Cellar_of_the_Tavern = 33,
470 Citadel_Island_Sewer_of_the_1st_scene = 34,
471 Citadel_Island_Warehouse = 35,
472 White_Leaf_Desert_outside_the_Temple_of_Bu = 36,
473 Principal_Island_outside_the_water_tower = 37,
474 Principal_Island_inside_the_water_tower = 38,
475 White_Leaf_Desert_Militairy_camp = 39,
476 White_Leaf_Desert_Temple_of_Bu_2nd_scene = 40,
477 White_Leaf_Desert_Temple_of_Bu_3rd_scene = 41,
478 Proxima_Island_Proxim_City = 42,
479 Proxima_Island_Museum = 43,
480 Proxima_Island_near_the_Inventors_house = 44,
481 Proxima_Island_upper_rune_stone = 45,
482 Proxima_Island_lower_rune_stone = 46,
483 Proxima_Island_befor_the_upper_rune_stone = 47,
484 Proxima_Island_Forgers_house = 48,
485 Proxima_Island_Prison = 49,
486 Proxima_Island_Shop = 50,
487 Proxima_Island_Sewer = 51,
488 Principal_Island_house_at_Peg_Leg_Street = 52,
489 Proxima_Island_Grobo_house = 53,
490 Proxima_Island_Inventors_house = 54,
491 Citadel_Island_Sewer_secret = 55,
492 Principal_Island_Sewer_secret = 56,
493 White_Leaf_Desert_Maze = 57,
494 Principal_Island_House_with_the_TV = 58,
495 Rebelion_Island_Harbor = 59,
496 Rebelion_Island_Rebel_camp = 60,
497 Some_room_cut_out = 61,
498 Hamalayi_Mountains_1st_fighting_scene = 62,
499 Hamalayi_Mountains_2nd_fighting_scene = 63,
500 Hamalayi_Mountains_Prison = 64,
501 Hamalayi_Mountains_outside_the_transporter = 65,
502 Hamalayi_Mountains_inside_the_transporter = 66,
503 Hamalayi_Mountains_Mutation_centre_1st_scene = 67,
504 Hamalayi_Mountains_Mutation_centre_2nd_scene = 68,
505 Hamalayi_Mountains_3rd_fighting_scene = 69,
506 Hamalayi_Mountains_Entrance_to_the_prison = 70,
507 Hamalayi_Mountains_outside_the_prison = 71,
508 Hamalayi_Mountains_Catamaran_dock = 72,
509 Hamalayi_Mountains_Bunker_near_clear_water = 73,
510 Tippet_Island_Village = 74,
511 Tippet_Island_Secret_passage_scene_2 = 75,
512 Tippet_Island_near_the_bar = 76,
513 Tippet_Island_Secret_passage_scene_1 = 77,
514 Tippet_Island_near_the_Dino_Fly = 78,
515 Tippet_Island_Secret_passage_scene_3 = 79,
516 Tippet_Island_Twinsun_Cafe = 80,
517 Hamalayi_Mountains_Sacret_Carrot = 81,
518 Hamalayi_Mountains_Backdoor_of_the_prison = 82,
519 Fortress_Island_inside_the_fortress = 83,
520 Fortress_Island_outside_the_forstress = 84,
521 Fortress_Island_Secret_passage_scene_1 = 85,
522 Fortress_Island_Secret_in_the_fortress = 86,
523 Fortress_Island_near_Zoes_cell = 87,
524 Fortress_Island_Swimming_pool = 88,
525 Fortress_Island_Cloning_centre = 89,
526 Fortress_Island_Rune_stone = 90,
527 Hamalayi_Mountains_Behind_the_sacret_carrot = 91,
528 Hamalayi_Mountains_Clear_water_lake = 92,
529 Fortress_Island_outside_fortress_destroyed = 93,
530 Brundle_Island_outside_the_teleportation = 94,
531 Brundle_Island_inside_the_teleportation = 95,
532 Hamalayi_Mountains_Ski_resort = 96,
533 Brundle_Island_Docks = 97,
534 Brundle_Island_Secret_room = 98,
535 Brundle_Island_near_the_telepods = 99,
536 Fortress_Island_Docks = 100,
537 Tippet_Island_Shop = 101,
538 Principal_Island_house_in_port_Belooga = 102,
539 Brundle_Island_Painters_house = 103,
540 Citadel_Island_Ticket_Office = 104,
541 Principal_Island_inside_the_fortress = 105,
542 Polar_Island_2nd_scene = 106,
543 Polar_Island_3rd_scene = 107,
544 Polar_Island_Before_the_rocky_peak = 108,
545 Polar_Island_4th_scene = 109,
546 Polar_Island_The_rocky_peak = 110,
547 Polar_Island_on_the_rocky_peak = 111,
548 Polar_Island_Before_the_end_room = 112,
549 Polar_Island_Final_Battle = 113,
550 Polar_Island_end_scene = 114,
551 Polar_Island_1st_scene = 115,
552 Citadel_Island_end_sequence_1 = 116,
553 Citadel_Island_end_sequence_2 = 117,
554 Citadel_Island_Twinsens_house_destroyed = 118,
555 Credits_List_Sequence = 119,
561 enum class TextBankId : int16 {
563 Options_and_menus = 0,
565 Inventory_Intro_and_Holomap = 2,
567 Principal_Island = 4,
568 White_Leaf_Desert = 5,
570 Rebellion_Island = 7,
571 Hamalayi_mountains_southern_range = 8,
572 Hamalayi_mountains_northern_range = 9,
575 Fortress_Island = 12,
580 enum class TextId : int16 {
582 kBehaviourNormal = 0,
583 kBehaviourSporty = 1,
584 kBehaviourAggressiveManual = 2,
585 kBehaviourHiding = 3,
586 kBehaviourAggressiveAuto = 4,
605 kVolumeSettings = 30,
606 kDetailsPolygonsHigh = 31,
607 kDetailsShadowHigh = 32,
609 kCreateNewPlayer = 40,
610 kCreateSaveGame = 41,
612 kPlayerAlreadyExists = 43,
613 kEnterYourNewName = 44,
614 kDeleteSaveGame = 45,
618 kTransferVoices = 49,
619 kPleaseWaitWhileVoicesAreSaved = 50,
620 kRemoveProtoPack = 105,
621 kDetailsPolygonsMiddle = 131,
622 kShadowsFigures = 132,
623 kSceneryZoomOn = 133,
629 kStarWarsFanBoy = 226,
630 kDetailsPolygonsLow = 231,
631 kShadowsDisabled = 232,
632 kNoSceneryZoom = 233,
635 kCustomHighResOptionOn = -2,
636 kCustomHighResOptionOff = -3,
637 kCustomWallCollisionOn = -4,
638 kCustomWallCollisionOff = -5,
639 kCustomLanguageOption = -6,
640 kCustomVoicesNone = -7,
641 kCustomVoicesEnglish = -8,
642 kCustomVoicesFrench = -9,
643 kCustomVoicesGerman = -10,
655 enum InventoryItems {
663 kSendellsMedallion = 6,
664 kFlaskOfClearWater = 7,
685 MaxInventoryItems = 28,
686 MaxInventoryItemsLba2 = 40
693 constexpr
TwineResource(
const char *_hqr, int32 _index) : hqr(_hqr), index(_index) {
701 constexpr
TwineImage(
const char *hqr, int32 index, int32 paletteIndex = -1) : image(hqr, index), palette(hqr, paletteIndex) {
706 static int32 ANGLE_360;
707 static int32 ANGLE_351;
708 static int32 ANGLE_334;
709 static int32 ANGLE_315;
710 static int32 ANGLE_270;
711 static int32 ANGLE_225;
712 static int32 ANGLE_210;
713 static int32 ANGLE_180;
714 static int32 ANGLE_157_5;
715 static int32 ANGLE_140;
716 static int32 ANGLE_135;
717 static int32 ANGLE_90;
718 static int32 ANGLE_70;
719 static int32 ANGLE_63;
720 static int32 ANGLE_45;
721 static int32 ANGLE_22_5;
722 static int32 ANGLE_17;
723 static int32 ANGLE_11_25;
724 static int32 ANGLE_2;
725 static int32 ANGLE_1;
726 static int32 ANGLE_0;
728 static void init(
int factor);
734 #define VIEW_X0 (-50) 735 #define VIEW_Y0 (-30) 736 #define VIEW_X1(engine) ((engine)->width() + 40) 737 #define VIEW_Y1(engine) ((engine)->height() + 100) 739 inline int32 NormalizeAngle(int32 angle) {
740 if (angle < -LBAAngles::ANGLE_180) {
741 angle += LBAAngles::ANGLE_360;
742 }
else if (angle > LBAAngles::ANGLE_180) {
743 angle -= LBAAngles::ANGLE_360;
752 inline constexpr int32 ToAngle(int32 angle) {
761 inline constexpr int32 FromAngle(int32 angle) {
765 inline double AngleToDegree(int32 angle) {
766 return (
double)angle / (double)LBAAngles::ANGLE_360 * 360.0;
769 inline int DegreeToAngle(
double degree) {
770 return (
int)(degree * (double)LBAAngles::ANGLE_360) / 360.0;
773 inline int32 ClampAngle(int32 angle) {
774 return angle & (LBAAngles::ANGLE_360 - 1);
778 inline constexpr T bits(T value, uint8 offset, uint8 bits) {
779 return (((1 << bits) - 1) & (value >> offset));
782 #define COLOR_BLACK 0 783 #define COLOR_BRIGHT_BLUE 4 792 #define COlOR_31 31 // green dark 793 #define COlOR_47 47 // green bright 794 #define COLOR_48 48 // brown dark 795 #define COLOR_63 63 // brown bright 796 #define COLOR_64 64 // blue dark 797 #define COLOR_SELECT_MENU 68 // blue 799 #define COLOR_73 73 // blue 801 #define COLOR_79 79 // blue bright 804 #define COLOR_BRIGHT_BLUE2 69 805 #define COLOR_WHITE 15 806 #define COLOR_GOLD 155 807 #define COLOR_158 158 810 kDebugScriptsMove = 1,
Definition: achievements_tables.h:27
Axis aligned bounding box.
Definition: shared.h:193