1 /* ScummVM - Graphic Adventure Engine
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.
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
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.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 // Intro sequence scene procedures
28 #include "saga/saga.h"
31 #include "saga/animation.h"
32 #include "saga/events.h"
33 #include "saga/font.h"
34 #include "saga/sndres.h"
35 #include "saga/palanim.h"
36 #include "saga/music.h"
38 #include "saga/scene.h"
39 #include "saga/resource.h"
43 using Common::UNK_LANG
;
49 #define RID_ITE_INTRO_ANIM_SCENE 1538
50 #define RID_ITE_CAVE_SCENE_1 1542
51 #define RID_ITE_CAVE_SCENE_2 1545
52 #define RID_ITE_CAVE_SCENE_3 1548
53 #define RID_ITE_CAVE_SCENE_4 1551
54 #define RID_ITE_VALLEY_SCENE 1556
55 #define RID_ITE_TREEHOUSE_SCENE 1560
56 #define RID_ITE_FAIREPATH_SCENE 1564
57 #define RID_ITE_FAIRETENT_SCENE 1567
63 LoadSceneParams ITE_IntroList
[] = {
64 {RID_ITE_INTRO_ANIM_SCENE
, kLoadByResourceId
, NULL
, Scene::SC_ITEIntroAnimProc
, false, kTransitionNoFade
, 0, NO_CHAPTER_CHANGE
},
65 {RID_ITE_CAVE_SCENE_1
, kLoadByResourceId
, NULL
, Scene::SC_ITEIntroCave1Proc
, false, kTransitionFade
, 0, NO_CHAPTER_CHANGE
},
66 {RID_ITE_CAVE_SCENE_2
, kLoadByResourceId
, NULL
, Scene::SC_ITEIntroCave2Proc
, false, kTransitionNoFade
, 0, NO_CHAPTER_CHANGE
},
67 {RID_ITE_CAVE_SCENE_3
, kLoadByResourceId
, NULL
, Scene::SC_ITEIntroCave3Proc
, false, kTransitionNoFade
, 0, NO_CHAPTER_CHANGE
},
68 {RID_ITE_CAVE_SCENE_4
, kLoadByResourceId
, NULL
, Scene::SC_ITEIntroCave4Proc
, false, kTransitionNoFade
, 0, NO_CHAPTER_CHANGE
},
69 {RID_ITE_VALLEY_SCENE
, kLoadByResourceId
, NULL
, Scene::SC_ITEIntroValleyProc
, false, kTransitionFade
, 0, NO_CHAPTER_CHANGE
},
70 {RID_ITE_TREEHOUSE_SCENE
, kLoadByResourceId
, NULL
, Scene::SC_ITEIntroTreeHouseProc
, false, kTransitionNoFade
, 0, NO_CHAPTER_CHANGE
},
71 {RID_ITE_FAIREPATH_SCENE
, kLoadByResourceId
, NULL
, Scene::SC_ITEIntroFairePathProc
, false, kTransitionNoFade
, 0, NO_CHAPTER_CHANGE
},
72 {RID_ITE_FAIRETENT_SCENE
, kLoadByResourceId
, NULL
, Scene::SC_ITEIntroFaireTentProc
, false, kTransitionNoFade
, 0, NO_CHAPTER_CHANGE
}
75 int Scene::ITEStartProc() {
79 LoadSceneParams firstScene
;
80 LoadSceneParams tempScene
;
82 scenesCount
= ARRAYSIZE(ITE_IntroList
);
84 for (i
= 0; i
< scenesCount
; i
++) {
85 tempScene
= ITE_IntroList
[i
];
86 tempScene
.sceneDescriptor
= _vm
->_resource
->convertResourceId(tempScene
.sceneDescriptor
);
87 _vm
->_scene
->queueScene(&tempScene
);
91 firstScene
.loadFlag
= kLoadBySceneNumber
;
92 firstScene
.sceneDescriptor
= _vm
->getStartSceneNumber();
93 firstScene
.sceneDescription
= NULL
;
94 firstScene
.sceneSkipTarget
= true;
95 firstScene
.sceneProc
= NULL
;
96 firstScene
.transitionType
= kTransitionFade
;
97 firstScene
.actorsEntrance
= 0;
98 firstScene
.chapter
= -1;
100 _vm
->_scene
->queueScene(&firstScene
);
105 Event
*Scene::ITEQueueDialogue(Event
*q_event
, int n_dialogues
, const IntroDialogue dialogue
[]) {
106 TextListEntry textEntry
;
107 TextListEntry
*entry
;
112 // Queue narrator dialogue list
113 textEntry
.knownColor
= kKnownColorSubtitleTextColor
;
114 textEntry
.effectKnownColor
= kKnownColorTransparent
;
115 textEntry
.useRect
= true;
116 textEntry
.rect
.left
= 0;
117 textEntry
.rect
.right
= _vm
->getDisplayInfo().width
;
118 if (_vm
->getLanguage() == Common::DE_DEU
) {
119 textEntry
.rect
.top
= INTRO_DE_CAPTION_Y
;
120 } else if (_vm
->getLanguage() == Common::IT_ITA
) {
121 textEntry
.rect
.top
= INTRO_IT_CAPTION_Y
;
123 textEntry
.rect
.top
= INTRO_CAPTION_Y
;
125 textEntry
.rect
.bottom
= _vm
->getDisplayInfo().height
;
126 textEntry
.font
= kKnownFontMedium
;
127 textEntry
.flags
= (FontEffectFlags
)(kFontOutline
| kFontCentered
);
129 for (i
= 0; i
< n_dialogues
; i
++) {
130 textEntry
.text
= dialogue
[i
].i_str
;
131 entry
= _vm
->_scene
->_textList
.addEntry(textEntry
);
134 event
.type
= kEvTOneshot
;
135 event
.code
= kTextEvent
;
136 event
.op
= kEventDisplay
;
138 event
.time
= (i
== 0) ? 0 : VOICE_PAD
;
139 q_event
= _vm
->_events
->chain(q_event
, &event
);
142 event
.type
= kEvTOneshot
;
143 event
.code
= kVoiceEvent
;
144 event
.op
= kEventPlay
;
145 event
.param
= dialogue
[i
].i_voice_rn
;
147 q_event
= _vm
->_events
->chain(q_event
, &event
);
149 voice_len
= _vm
->_sndRes
->getVoiceLength(dialogue
[i
].i_voice_rn
);
151 voice_len
= strlen(dialogue
[i
].i_str
) * VOICE_LETTERLEN
;
155 event
.type
= kEvTOneshot
;
156 event
.code
= kTextEvent
;
157 event
.op
= kEventRemove
;
159 event
.time
= voice_len
;
160 q_event
= _vm
->_events
->chain(q_event
, &event
);
175 kITEWyrmKeep
= (1 << 3),
177 kITENotWyrmKeep
= kITEAny
& ~kITEWyrmKeep
180 // Queue a page of credits text. The original interpreter did word-wrapping
181 // automatically. We currently don't.
183 Event
*Scene::ITEQueueCredits(int delta_time
, int duration
, int n_credits
, const IntroCredit credits
[]) {
185 Common::Language lang
;
187 // The assumption here is that all WyrmKeep versions have the same
188 // credits, regardless of which operating system they're for.
190 lang
= _vm
->getLanguage();
192 if (_vm
->getFeatures() & GF_WYRMKEEP
) {
194 } else if (_vm
->getPlatform() == Common::kPlatformMacintosh
) {
196 } else if (_vm
->getFeatures() & GF_EXTRA_ITE_CREDITS
) {
202 int line_spacing
= 0;
203 int paragraph_spacing
;
204 KnownFont font
= kKnownFontSmall
;
207 int n_paragraphs
= 0;
208 int credits_height
= 0;
210 for (i
= 0; i
< n_credits
; i
++) {
211 if (credits
[i
].lang
!= lang
&& credits
[i
].lang
!= UNK_LANG
) {
215 if (!(credits
[i
].game
& game
)) {
219 switch (credits
[i
].type
) {
221 font
= kKnownFontSmall
;
226 font
= kKnownFontMedium
;
230 error("Unknown credit type");
233 credits_height
+= (_vm
->_font
->getHeight(font
) + line_spacing
);
236 paragraph_spacing
= (200 - credits_height
) / (n_paragraphs
+ 3);
237 credits_height
+= (n_paragraphs
* paragraph_spacing
);
239 int y
= paragraph_spacing
;
241 TextListEntry textEntry
;
242 TextListEntry
*entry
;
244 Event
*q_event
= NULL
;
246 textEntry
.knownColor
= kKnownColorSubtitleTextColor
;
247 textEntry
.effectKnownColor
= kKnownColorTransparent
;
248 textEntry
.flags
= (FontEffectFlags
)(kFontOutline
| kFontCentered
);
249 textEntry
.point
.x
= 160;
251 for (i
= 0; i
< n_credits
; i
++) {
252 if (credits
[i
].lang
!= lang
&& credits
[i
].lang
!= UNK_LANG
) {
256 if (!(credits
[i
].game
& game
)) {
260 switch (credits
[i
].type
) {
262 font
= kKnownFontSmall
;
264 y
+= paragraph_spacing
;
267 font
= kKnownFontMedium
;
274 textEntry
.text
= credits
[i
].string
;
275 textEntry
.font
= font
;
276 textEntry
.point
.y
= y
;
278 entry
= _vm
->_scene
->_textList
.addEntry(textEntry
);
281 event
.type
= kEvTOneshot
;
282 event
.code
= kTextEvent
;
283 event
.op
= kEventDisplay
;
285 event
.time
= delta_time
;
286 q_event
= _vm
->_events
->queue(&event
);
289 event
.type
= kEvTOneshot
;
290 event
.code
= kTextEvent
;
291 event
.op
= kEventRemove
;
293 event
.time
= duration
;
294 q_event
= _vm
->_events
->chain(q_event
, &event
);
296 y
+= (_vm
->_font
->getHeight(font
) + line_spacing
);
302 int Scene::SC_ITEIntroAnimProc(int param
, void *refCon
) {
303 return ((Scene
*)refCon
)->ITEIntroAnimProc(param
);
306 // Handles the introductory Dreamer's Guild / NWC logo animation scene.
307 int Scene::ITEIntroAnimProc(int param
) {
313 // Background for intro scene is the first frame of the
314 // intro animation; display it and set the palette
315 event
.type
= kEvTOneshot
;
316 event
.code
= kBgEvent
;
317 event
.op
= kEventDisplay
;
318 event
.param
= kEvPSetPalette
;
320 q_event
= _vm
->_events
->queue(&event
);
322 debug(3, "Intro animation procedure started.");
323 debug(3, "Linking animation resources...");
325 _vm
->_anim
->setFrameTime(0, ITE_INTRO_FRAMETIME
);
327 // Link this scene's animation resources for continuous
331 if (_vm
->getFeatures() & GF_WYRMKEEP
) {
332 if (_vm
->getPlatform() == Common::kPlatformMacintosh
) {
338 if (_vm
->getPlatform() == Common::kPlatformMacintosh
) {
345 for (int i
= 0; i
< lastAnim
; i
++)
346 _vm
->_anim
->link(i
, i
+1);
348 _vm
->_anim
->setFlag(lastAnim
, ANIM_FLAG_ENDSCENE
);
350 debug(3, "Beginning animation playback.");
352 // Begin the animation
353 event
.type
= kEvTOneshot
;
354 event
.code
= kAnimEvent
;
355 event
.op
= kEventPlay
;
358 q_event
= _vm
->_events
->chain(q_event
, &event
);
360 // Queue intro music playback
361 event
.type
= kEvTOneshot
;
362 event
.code
= kMusicEvent
;
363 event
.param
= MUSIC_1
;
364 event
.param2
= MUSIC_LOOP
;
365 event
.op
= kEventPlay
;
367 q_event
= _vm
->_events
->chain(q_event
, &event
);
373 warning("Illegal scene procedure parameter");
380 int Scene::SC_ITEIntroCave1Proc(int param
, void *refCon
) {
381 return ((Scene
*)refCon
)->ITEIntroCave1Proc(param
);
384 // Handles first introductory cave painting scene
385 int Scene::ITEIntroCave1Proc(int param
) {
390 if (_vm
->getLanguage() == Common::DE_DEU
)
392 else if (_vm
->getLanguage() == Common::IT_ITA
)
395 static const IntroDialogue dialogue
[][4] = {
398 "We see the sky, we see the land, we see the water, "
399 "and we wonder: Are we the only ones?"
403 "Long before we came to exist, the humans ruled the "
408 "They made marvelous things, and moved whole "
413 "They knew the Secret of Flight, the Secret of "
414 "Happiness, and other secrets beyond our imagining."
416 // -----------------------------------------------------
419 "Um uns sind der Himmel, das Land und die Seen; und "
420 "wir fragen uns - sind wir die einzigen?"
424 "Lange vor unserer Zeit herrschten die Menschen "
429 "Sie taten wundersame Dinge und versetzten ganze "
434 "Sie kannten das Geheimnis des Fluges, das Geheimnis "
435 "der Fr\224hlichkeit und andere Geheimnisse, die "
436 "unsere Vorstellungskraft \201bersteigen."
438 // -----------------------------------------------------
439 { { // Italian fan translation
441 "Guardiamo il cielo, guardiamo la terra, guardiamo "
442 "l'acqua, e ci chiediamo: Siamo forse soli?"
446 "Molto tempo prima che noi esistessimo, gli Umani "
447 "dominavano la terra."
451 "Fecero cose meravigliose, e mossero intere "
456 "Conoscevano il Segreto del Volo, il Segreto della "
457 "Felicit\205, ed altri segreti oltre ogni nostra "
462 int n_dialogues
= ARRAYSIZE(dialogue
[lang
]);
466 // Begin palette cycling animation for candles
467 event
.type
= kEvTOneshot
;
468 event
.code
= kPalAnimEvent
;
469 event
.op
= kEventCycleStart
;
471 q_event
= _vm
->_events
->queue(&event
);
473 // Queue narrator dialogue list
474 q_event
= ITEQueueDialogue(q_event
, n_dialogues
, dialogue
[lang
]);
476 // End scene after last dialogue over
477 event
.type
= kEvTOneshot
;
478 event
.code
= kSceneEvent
;
479 event
.op
= kEventEnd
;
480 event
.time
= VOICE_PAD
;
481 q_event
= _vm
->_events
->chain(q_event
, &event
);
488 warning("Illegal scene procedure paramater");
495 int Scene::SC_ITEIntroCave2Proc(int param
, void *refCon
) {
496 return ((Scene
*)refCon
)->ITEIntroCave2Proc(param
);
499 // Handles second introductory cave painting scene
500 int Scene::ITEIntroCave2Proc(int param
) {
505 if (_vm
->getLanguage() == Common::DE_DEU
)
507 else if (_vm
->getLanguage() == Common::IT_ITA
)
510 static const IntroDialogue dialogue
[][3] = {
513 "The humans also knew the Secret of Life, and they "
514 "used it to give us the Four Great Gifts:"
518 "Thinking minds, feeling hearts, speaking mouths, and "
523 "We are their children."
525 // -----------------------------------------------------
528 "Au$erdem kannten die Menschen das Geheimnis des "
529 "Lebens. Und sie nutzten es, um uns die vier gro$en "
530 "Geschenke zu geben -"
534 "den denkenden Geist, das f\201hlende Herz, den "
535 "sprechenden Mund und die greifende Hand."
539 "Wir sind ihre Kinder."
541 // -----------------------------------------------------
542 { { // Italian fan translation
544 "Gli Umani conoscevano anche il Segreto della Vita, "
545 "e lo usarono per darci i Quattro Grandi Doni:"
550 "Il pensiero, le emozioni, la parola e la manualit\205."
555 "Siamo i loro figli."
559 int n_dialogues
= ARRAYSIZE(dialogue
[lang
]);
563 // Start 'dissolve' transition to new scene background
564 event
.type
= kEvTContinuous
;
565 event
.code
= kTransitionEvent
;
566 event
.op
= kEventDissolve
;
568 event
.duration
= DISSOLVE_DURATION
;
569 q_event
= _vm
->_events
->queue(&event
);
571 // Begin palette cycling animation for candles
572 event
.type
= kEvTOneshot
;
573 event
.code
= kPalAnimEvent
;
574 event
.op
= kEventCycleStart
;
576 q_event
= _vm
->_events
->chain(q_event
, &event
);
578 // Queue narrator dialogue list
579 q_event
= ITEQueueDialogue(q_event
, n_dialogues
, dialogue
[lang
]);
581 // End scene after last dialogue over
582 event
.type
= kEvTOneshot
;
583 event
.code
= kSceneEvent
;
584 event
.op
= kEventEnd
;
585 event
.time
= VOICE_PAD
;
586 q_event
= _vm
->_events
->chain(q_event
, &event
);
592 warning("Illegal scene procedure paramater");
599 int Scene::SC_ITEIntroCave3Proc(int param
, void *refCon
) {
600 return ((Scene
*)refCon
)->ITEIntroCave3Proc(param
);
603 // Handles third introductory cave painting scene
604 int Scene::ITEIntroCave3Proc(int param
) {
609 if (_vm
->getLanguage() == Common::DE_DEU
)
611 else if (_vm
->getLanguage() == Common::IT_ITA
)
614 static const IntroDialogue dialogue
[][3] = {
617 "They taught us how to use our hands, and how to "
622 "They showed us the joy of using our minds."
626 "They loved us, and when we were ready, they surely "
627 "would have given us the Secret of Happiness."
629 // -----------------------------------------------------
632 "Sie lehrten uns zu sprechen und unsere H\204nde zu "
637 "Sie zeigten uns die Freude am Denken."
641 "Sie liebten uns, und w\204ren wir bereit gewesen, "
642 "h\204tten sie uns sicherlich das Geheimnis der "
643 "Fr\224hlichkeit offenbart."
645 // -----------------------------------------------------
646 { { // Italian fan translation
648 "Ci insegnarono come usare le mani e come parlare. "
653 "Ci mostrarono le gioie che l'uso della mente "
658 "Ci amarono, ed una volta pronti, ci avrebbero "
659 "sicuramente svelato il Segreto della Felicit\205."
664 int n_dialogues
= ARRAYSIZE(dialogue
[lang
]);
668 // Start 'dissolve' transition to new scene background
669 event
.type
= kEvTContinuous
;
670 event
.code
= kTransitionEvent
;
671 event
.op
= kEventDissolve
;
673 event
.duration
= DISSOLVE_DURATION
;
674 q_event
= _vm
->_events
->queue(&event
);
676 // Begin palette cycling animation for candles
677 event
.type
= kEvTOneshot
;
678 event
.code
= kPalAnimEvent
;
679 event
.op
= kEventCycleStart
;
681 q_event
= _vm
->_events
->chain(q_event
, &event
);
683 // Queue narrator dialogue list
684 q_event
= ITEQueueDialogue(q_event
, n_dialogues
, dialogue
[lang
]);
686 // End scene after last dialogue over
687 event
.type
= kEvTOneshot
;
688 event
.code
= kSceneEvent
;
689 event
.op
= kEventEnd
;
690 event
.time
= VOICE_PAD
;
691 q_event
= _vm
->_events
->chain(q_event
, &event
);
697 warning("Illegal scene procedure paramater");
704 int Scene::SC_ITEIntroCave4Proc(int param
, void *refCon
) {
705 return ((Scene
*)refCon
)->ITEIntroCave4Proc(param
);
708 // Handles fourth introductory cave painting scene
709 int Scene::ITEIntroCave4Proc(int param
) {
714 if (_vm
->getLanguage() == Common::DE_DEU
)
716 else if (_vm
->getLanguage() == Common::IT_ITA
)
719 static const IntroDialogue dialogue
[][4] = {
722 "And now we see the sky, the land, and the water that "
723 "we are heirs to, and we wonder: why did they leave?"
727 "Do they live still, in the stars? In the oceans "
728 "depths? In the wind?"
732 "We wonder, was their fate good or evil?"
736 "And will we also share the same fate one day?"
738 // -----------------------------------------------------
741 "Und nun sehen wir den Himmel, das Land und die "
742 "Seen - unser Erbe. Und wir fragen uns - warum "
747 "Leben sie noch in den Sternen? In den Tiefen des "
752 "Wir fragen uns - war ihr Schicksal gut oder b\224se?"
756 "Und wird uns eines Tages das gleiche Schicksal "
759 // -----------------------------------------------------
760 { { // Italian fan translation
762 "Ed ora che guardiamo il cielo, la terra e l'acqua "
763 "che abbiamo ereditato, pensiamo: Perch\202 partirono?"
768 "Vivono ancora, nelle stelle? Nelle profondit\205 "
769 "dell'oceano? Nel vento?"
773 "Ci domandiamo, il loro destino fu felice o nefasto?"
777 "E un giorno, condivideremo anche noi lo stesso "
782 int n_dialogues
= ARRAYSIZE(dialogue
[lang
]);
786 // Start 'dissolve' transition to new scene background
787 event
.type
= kEvTContinuous
;
788 event
.code
= kTransitionEvent
;
789 event
.op
= kEventDissolve
;
791 event
.duration
= DISSOLVE_DURATION
;
792 q_event
= _vm
->_events
->queue(&event
);
794 // Begin palette cycling animation for candles
795 event
.type
= kEvTOneshot
;
796 event
.code
= kPalAnimEvent
;
797 event
.op
= kEventCycleStart
;
799 q_event
= _vm
->_events
->chain(q_event
, &event
);
801 // Queue narrator dialogue list
802 q_event
= ITEQueueDialogue(q_event
, n_dialogues
, dialogue
[lang
]);
804 // End scene after last dialogue over
805 event
.type
= kEvTOneshot
;
806 event
.code
= kSceneEvent
;
807 event
.op
= kEventEnd
;
808 event
.time
= VOICE_PAD
;
809 q_event
= _vm
->_events
->chain(q_event
, &event
);
815 warning("Illegal scene procedure paramater");
822 int Scene::SC_ITEIntroValleyProc(int param
, void *refCon
) {
823 return ((Scene
*)refCon
)->ITEIntroValleyProc(param
);
826 // Handles intro title scene (valley overlook)
827 int Scene::ITEIntroValleyProc(int param
) {
831 static const IntroCredit credits
[] = {
832 {EN_ANY
, kITEAny
, kCHeader
, "Producer"},
833 {DE_DEU
, kITEAny
, kCHeader
, "Produzent"},
834 {IT_ITA
, kITEAny
, kCHeader
, "Produttore"},
835 {UNK_LANG
, kITEAny
, kCText
, "Walter Hochbrueckner"},
836 {EN_ANY
, kITEAny
, kCHeader
, "Executive Producer"},
837 {DE_DEU
, kITEAny
, kCHeader
, "Ausf\201hrender Produzent"},
838 {IT_ITA
, kITEAny
, kCHeader
, "Produttore Esecutivo"},
839 {UNK_LANG
, kITEAny
, kCText
, "Robert McNally"},
840 {UNK_LANG
, kITEWyrmKeep
, kCHeader
, "2nd Executive Producer"},
841 {EN_ANY
, kITENotWyrmKeep
, kCHeader
, "Publisher"},
842 {DE_DEU
, kITENotWyrmKeep
, kCHeader
, "Herausgeber"},
843 {IT_ITA
, kITENotWyrmKeep
, kCHeader
, "Editore"},
844 {UNK_LANG
, kITEAny
, kCText
, "Jon Van Caneghem"}
847 int n_credits
= ARRAYSIZE(credits
);
851 // Begin title screen background animation
852 _vm
->_anim
->setCycles(0, -1);
854 event
.type
= kEvTOneshot
;
855 event
.code
= kAnimEvent
;
856 event
.op
= kEventPlay
;
859 q_event
= _vm
->_events
->queue(&event
);
861 // Begin ITE title theme music
864 event
.type
= kEvTOneshot
;
865 event
.code
= kMusicEvent
;
866 event
.param
= MUSIC_2
;
867 event
.param2
= MUSIC_NORMAL
;
868 event
.op
= kEventPlay
;
870 q_event
= _vm
->_events
->chain(q_event
, &event
);
872 // Pause animation before logo
873 event
.type
= kEvTOneshot
;
874 event
.code
= kAnimEvent
;
875 event
.op
= kEventStop
;
878 q_event
= _vm
->_events
->chain(q_event
, &event
);
881 event
.type
= kEvTContinuous
;
882 event
.code
= kTransitionEvent
;
883 event
.op
= kEventDissolveBGMask
;
885 event
.duration
= LOGO_DISSOLVE_DURATION
;
886 q_event
= _vm
->_events
->chain(q_event
, &event
);
889 event
.type
= kEvTContinuous
;
890 event
.code
= kTransitionEvent
;
891 event
.op
= kEventDissolve
;
893 event
.duration
= LOGO_DISSOLVE_DURATION
;
894 q_event
= _vm
->_events
->chain(q_event
, &event
);
896 // Unpause animation before logo
897 event
.type
= kEvTOneshot
;
898 event
.code
= kAnimEvent
;
899 event
.op
= kEventPlay
;
902 q_event
= _vm
->_events
->chain(q_event
, &event
);
904 // Queue game credits list
905 q_event
= ITEQueueCredits(9000, CREDIT_DURATION1
, n_credits
, credits
);
907 // End scene after credit display
908 event
.type
= kEvTOneshot
;
909 event
.code
= kSceneEvent
;
910 event
.op
= kEventEnd
;
912 q_event
= _vm
->_events
->chain(q_event
, &event
);
918 warning("Illegal scene procedure parameter");
925 int Scene::SC_ITEIntroTreeHouseProc(int param
, void *refCon
) {
926 return ((Scene
*)refCon
)->ITEIntroTreeHouseProc(param
);
929 // Handles second intro credit screen (treehouse view)
930 int Scene::ITEIntroTreeHouseProc(int param
) {
934 static const IntroCredit credits1
[] = {
935 {EN_ANY
, kITEAny
, kCHeader
, "Game Design"},
936 {DE_DEU
, kITEAny
, kCHeader
, "Spielentwurf"},
937 {IT_ITA
, kITEAny
, kCHeader
, "Progetto"},
938 {UNK_LANG
, kITEAny
, kCText
, "Talin, Joe Pearce, Robert McNally"},
939 {EN_ANY
, kITEAny
, kCText
, "and Carolly Hauksdottir"},
940 {DE_DEU
, kITEAny
, kCText
, "und Carolly Hauksdottir"},
941 {IT_ITA
, kITEAny
, kCText
, "e Carolly Hauksdottir"},
942 {EN_ANY
, kITEAny
, kCHeader
, "Screenplay and Dialog"},
943 {EN_ANY
, kITEAny
, kCText
, "Robert Leh, Len Wein, and Bill Rotsler"},
944 {DE_DEU
, kITEAny
, kCHeader
, "Geschichte und Dialoge"},
945 {DE_DEU
, kITEAny
, kCText
, "Robert Leh, Len Wein und Bill Rotsler"},
946 {IT_ITA
, kITEAny
, kCHeader
, "Sceneggiatura e Dialoghi"},
947 {IT_ITA
, kITEAny
, kCText
, "Robert Leh, Len Wein e Bill Rotsler"}
950 int n_credits1
= ARRAYSIZE(credits1
);
952 static const IntroCredit credits2
[] = {
953 {UNK_LANG
, kITEWyrmKeep
, kCHeader
, "Art Direction"},
954 {UNK_LANG
, kITEWyrmKeep
, kCText
, "Allison Hershey"},
955 {EN_ANY
, kITEAny
, kCHeader
, "Art"},
956 {DE_DEU
, kITEAny
, kCHeader
, "Grafiken"},
957 {IT_ITA
, kITEAny
, kCHeader
, "Grafica"},
958 {UNK_LANG
, kITEWyrmKeep
, kCText
, "Ed Lacabanne, Glenn Price, April Lee,"},
959 {UNK_LANG
, kITENotWyrmKeep
, kCText
, "Edward Lacabanne, Glenn Price, April Lee,"},
960 {UNK_LANG
, kITEWyrmKeep
, kCText
, "Lisa Sample, Brian Dowrick, Reed Waller,"},
961 {EN_ANY
, kITEWyrmKeep
, kCText
, "Allison Hershey and Talin"},
962 {DE_DEU
, kITEWyrmKeep
, kCText
, "Allison Hershey und Talin"},
963 {IT_ITA
, kITEWyrmKeep
, kCText
, "Allison Hershey e Talin"},
964 {EN_ANY
, kITENotWyrmKeep
, kCText
, "Lisa Iennaco, Brian Dowrick, Reed"},
965 {EN_ANY
, kITENotWyrmKeep
, kCText
, "Waller, Allison Hershey and Talin"},
966 {DE_DEU
, kITEAny
, kCText
, "Waller, Allison Hershey und Talin"},
967 {IT_ITA
, kITEAny
, kCText
, "Waller, Allison Hershey e Talin"},
968 {EN_ANY
, kITENotWyrmKeep
, kCHeader
, "Art Direction"},
969 {DE_DEU
, kITENotWyrmKeep
, kCHeader
, "Grafische Leitung"},
970 {IT_ITA
, kITENotWyrmKeep
, kCHeader
, "Direzione Grafica"},
971 {UNK_LANG
, kITENotWyrmKeep
, kCText
, "Allison Hershey"}
974 int n_credits2
= ARRAYSIZE(credits2
);
978 // Start 'dissolve' transition to new scene background
979 event
.type
= kEvTContinuous
;
980 event
.code
= kTransitionEvent
;
981 event
.op
= kEventDissolve
;
983 event
.duration
= DISSOLVE_DURATION
;
984 q_event
= _vm
->_events
->queue(&event
);
986 if (_vm
->_anim
->hasAnimation(0)) {
987 // Begin title screen background animation
988 _vm
->_anim
->setFrameTime(0, 100);
990 event
.type
= kEvTOneshot
;
991 event
.code
= kAnimEvent
;
992 event
.op
= kEventPlay
;
995 q_event
= _vm
->_events
->chain(q_event
, &event
);
998 // Queue game credits list
999 q_event
= ITEQueueCredits(DISSOLVE_DURATION
+ 2000, CREDIT_DURATION1
, n_credits1
, credits1
);
1000 q_event
= ITEQueueCredits(DISSOLVE_DURATION
+ 7000, CREDIT_DURATION1
, n_credits2
, credits2
);
1002 // End scene after credit display
1003 event
.type
= kEvTOneshot
;
1004 event
.code
= kSceneEvent
;
1005 event
.op
= kEventEnd
;
1007 q_event
= _vm
->_events
->chain(q_event
, &event
);
1013 warning("Illegal scene procedure parameter");
1020 int Scene::SC_ITEIntroFairePathProc(int param
, void *refCon
) {
1021 return ((Scene
*)refCon
)->ITEIntroFairePathProc(param
);
1024 // Handles third intro credit screen (path to puzzle tent)
1025 int Scene::ITEIntroFairePathProc(int param
) {
1029 static const IntroCredit credits1
[] = {
1030 {EN_ANY
, kITEAny
, kCHeader
, "Programming"},
1031 {DE_DEU
, kITEAny
, kCHeader
, "Programmiert von"},
1032 {IT_ITA
, kITEAny
, kCHeader
, "Programmazione"},
1033 {UNK_LANG
, kITEAny
, kCText
, "Talin, Walter Hochbrueckner,"},
1034 {EN_ANY
, kITEAny
, kCText
, "Joe Burks and Robert Wiggins"},
1035 {DE_DEU
, kITEAny
, kCText
, "Joe Burks und Robert Wiggins"},
1036 {IT_ITA
, kITEAny
, kCText
, "Joe Burks e Robert Wiggins"},
1037 {EN_ANY
, kITEPCCD
| kITEWyrmKeep
, kCHeader
, "Additional Programming"},
1038 {EN_ANY
, kITEPCCD
| kITEWyrmKeep
, kCText
, "John Bolton"},
1039 {UNK_LANG
, kITEMac
, kCHeader
, "Macintosh Version"},
1040 {UNK_LANG
, kITEMac
, kCText
, "Michael McNally and Robert McNally"},
1041 {EN_ANY
, kITEAny
, kCHeader
, "Music and Sound"},
1042 {DE_DEU
, kITEAny
, kCHeader
, "Musik und Sound"},
1043 {IT_ITA
, kITEAny
, kCHeader
, "Musica e Sonoro"},
1044 {UNK_LANG
, kITEAny
, kCText
, "Matt Nathan"}
1047 int n_credits1
= ARRAYSIZE(credits1
);
1049 static const IntroCredit credits2
[] = {
1050 {EN_ANY
, kITEAny
, kCHeader
, "Directed by"},
1051 {DE_DEU
, kITEAny
, kCHeader
, "Regie"},
1052 {IT_ITA
, kITEAny
, kCHeader
, "Regia"},
1053 {UNK_LANG
, kITEAny
, kCText
, "Talin"}
1056 int n_credits2
= ARRAYSIZE(credits2
);
1060 // Start 'dissolve' transition to new scene background
1061 event
.type
= kEvTContinuous
;
1062 event
.code
= kTransitionEvent
;
1063 event
.op
= kEventDissolve
;
1065 event
.duration
= DISSOLVE_DURATION
;
1066 q_event
= _vm
->_events
->queue(&event
);
1068 // Begin title screen background animation
1069 _vm
->_anim
->setCycles(0, -1);
1071 event
.type
= kEvTOneshot
;
1072 event
.code
= kAnimEvent
;
1073 event
.op
= kEventPlay
;
1076 q_event
= _vm
->_events
->chain(q_event
, &event
);
1078 // Queue game credits list
1079 q_event
= ITEQueueCredits(DISSOLVE_DURATION
+ 2000, CREDIT_DURATION1
, n_credits1
, credits1
);
1080 q_event
= ITEQueueCredits(DISSOLVE_DURATION
+ 7000, CREDIT_DURATION1
, n_credits2
, credits2
);
1082 // End scene after credit display
1083 event
.type
= kEvTOneshot
;
1084 event
.code
= kSceneEvent
;
1085 event
.op
= kEventEnd
;
1087 q_event
= _vm
->_events
->chain(q_event
, &event
);
1093 warning("Illegal scene procedure parameter");
1100 int Scene::SC_ITEIntroFaireTentProc(int param
, void *refCon
) {
1101 return ((Scene
*)refCon
)->ITEIntroFaireTentProc(param
);
1104 // Handles fourth intro credit screen (treehouse view)
1105 int Scene::ITEIntroFaireTentProc(int param
) {
1108 Event
*q_event_start
;
1113 // Start 'dissolve' transition to new scene background
1114 event
.type
= kEvTContinuous
;
1115 event
.code
= kTransitionEvent
;
1116 event
.op
= kEventDissolve
;
1118 event
.duration
= DISSOLVE_DURATION
;
1119 q_event_start
= _vm
->_events
->queue(&event
);
1121 // End scene after momentary pause
1122 event
.type
= kEvTOneshot
;
1123 event
.code
= kSceneEvent
;
1124 event
.op
= kEventEnd
;
1126 q_event
= _vm
->_events
->chain(q_event_start
, &event
);
1132 warning("Illegal scene procedure parameter");
1139 } // End of namespace Saga