-function intro()
-{
- //initialize
- SUPERTUX.set_action("stand-right");
- RADIO.set_action("quiet");
+function initialize()
+{
+ Tux.add_bonus("grow");
+ RADIO.set_action("quiet");
PENNY.set_action("stand-left");
NOLOK.set_visible(false);
- logo <- FloatingImage("images/objects/logo/logo.sprite");
- Tux.deactivate();
- Tux.set_visible(false);
- Effect.sixteen_to_nine(0);
-
- //begin scrolling sequence
- Effect.fade_in(2);
- Camera.scroll_to(0, 945, 15);
- play_sound("music/intro.ogg");
- wait(3);
- Text.set_text("Somewhere at the shores\nof Antarctica...");
- Text.fade_in(2);
+ LOGO.set_visible(false);
+ LOGO.enable_gravity(false);
+ SIGN.set_visible(false);
+}
+
+function logo_in()
+{
+ local x = LOGO.get_pos_x();
+ local y = LOGO.get_pos_y();
+ local time = 1.5;
+ LOGO.set_pos(x,-120);
+ LOGO.set_visible(true);
+ LOGO.set_velocity(0,(120+y)/time);
+ LOGO.enable_gravity(false);
+ wait(time);
+ LOGO.set_velocity(0,0);
wait(3);
- Text.fade_out(2);
- wait(10);
- SUPERTUX.set_velocity(50,0);
- Camera.scroll_to(3100, 945, 18);
- wait(10);
- logo.set_anchor_point(ANCHOR_TOP);
- logo.set_pos(0, 50);
- logo.set_visible(true);
- wait(5);
- logo.set_visible(false);
- wait(6);
-
+ LOGO.set_visible(false);
+}
+
+function intro_text()
+{
+ Text.set_text(translate ("Somewhere at the shores\nof Antarctica..."));
+ Text.fade_in(1);
+ wait(1);
+ Text.fade_out(1);
+}
+
+function rap_scene()
+{
+ Tux.deactivate();
//begin conversation and Tux rap
- SUPERTUX.set_velocity(0,0);
- play_sound("speech/tux_hello.ogg");
- wait(3);
- play_sound("speech/penny_runt_01.ogg");
+ play_sound("speech/tux_hello.ogg"); // 3.1 seconds
+ Text.set_centered(false);
+ Text.set_text(translate ("Tux: Hello Penny"));
+ Text.fade_in(1);
+ wait(2.5);
+ Text.fade_out(1);
wait(1);
- play_sound("speech/tux_murp_01.ogg");
+ play_sound("speech/penny_runt_01.ogg"); // 1.2 seconds
+ Text.set_text(translate ("Penny: Hey Tux"));
+ Text.fade_in(0.5);
wait(1);
+ Text.fade_out(0.5);
+ wait(0.5);
+ play_sound("speech/tux_murp_01.ogg"); // 1.5 seconds
+ Text.set_text(translate ("Tux: Check out my dance moves."));
+ Text.fade_in(0.5);
+ wait(1);
+ Text.fade_out(0.5);
+ wait(0.5);
RADIO.set_action("loud");
- play_sound("speech/tux_rap.ogg");
- wait(15);
- shake_bush();
- wait(2);
- shake_bush();
- wait(2);
- shake_bush();
- wait(1.3);
-
- //enter Nolok
- NOLOK.set_velocity(-220, 600);
- NOLOK.set_visible(true);
- Effect.fade_out(1.3);
- wait(3);
-
- //darkness
+ play_sound("speech/tux_rap.ogg"); // 24.6 seconds
+ local t = ::newthread(shake_bush_thread);
+ t.call(this); // Nolok's waiting...
+ // meanwhile... Tux dances!
+ // TODO: add some more dance moves besides jumps, ducks, & flips
+ // and fill in the parts where he just stands still
+ wait(6); // music intro - 6 seconds
+ Tux.do_duck();
+ Tux.set_dir(false);
+ wait(0.40625); // all times rounded to nearest 1/64 of a second
+ Tux.do_standup();
+ Tux.kick(); // 0.3 seconds
+ wait(0.40625);
+ Tux.set_dir(true);
+ wait(0.203125);
+ Tux.set_dir(false);
+ wait(0.203125);
+ Tux.set_dir(true);
+ wait(0.09375);
+ Tux.do_duck(); // t=7.3
+ wait(0.5);
+ Tux.set_dir(false);
+ wait(0.203125);
+ Tux.set_dir(true);
+ wait(0.203125);
+ Tux.set_dir(false);
+ wait(0.203125);
+ Tux.set_dir(true);
+ wait(0.203125);
+ Tux.set_dir(false);
+ wait(0.203125);
+ Tux.set_dir(true);
+ Tux.do_standup(); // t=8.8
+ wait(0.203125);
+ Tux.set_dir(false);
+ wait(0.203125);
+ Tux.kick();
+ wait(0.40625);
+ Tux.set_dir(true);
+ Tux.do_jump(-300);
+ wait(0.703125);
+ Tux.do_duck(); // t=10.7
+ wait(0.296875);
+ Tux.set_dir(false);
+ wait(0.59375);
+ Tux.set_dir(true);
+ wait(0.703125);
+ Tux.do_standup(); // t=12.3
+ Tux.kick();
+ wait(0.5);
+ Tux.do_duck();
+ wait(0.5);
+ Tux.do_backflip(); // t=13.3
+ wait(79.0/64);
+ Tux.walk(200);
+ wait(38.0/64);
+ Tux.walk(0);
+ wait(184.0/64);
+ Tux.set_dir(false); //t=18.0
+ wait(0.3)
+ Tux.kick();
+ wait(0.40625);
+ Tux.do_duck();
+ Tux.set_dir(true);
+ wait(0.296875);
+ Tux.set_dir(false); // t=19.0
+ wait(0.5);
+ Tux.do_standup();
+ Tux.do_jump(-800);
+ wait(1.5);
+ Tux.kick(); // t=21
+ wait(0.5);
+ Tux.do_duck();
+ wait(0.5);
+ Tux.do_jump(-400);
+ wait(1.0);
+ Tux.do_standup();
+ wait(0.796875);
+ Tux.set_dir(true); //t=23.8 - Tux sees Nolok!
+ Tux.do_jump(-520);
+ wait(151.0/64);
+ // we have to activate Tux to hurt him
+ Tux.activate();
+ Tux.kill(false);
+ Tux.deactivate();
+ wait(1.5);
+ // song is done
+ // darkness
NOLOK.set_visible(false);
+ NOLOK.set_solid(false);
PENNY.set_visible(false);
- RADIO.set_action("quiet");
- SUPERTUX.set_pos(3550, SUPERTUX.get_pos_y());
-
+ PENNY.set_solid(false);
+ RADIO.set_visible(false);
+ RADIO.set_solid(false);
+ SIGN.set_visible(true);
//wake up, Tux...
- Effect.fade_in(4);
- wait(4);
- play_sound("speech/tux_upset.ogg");
- wait(3);
- tux_upset();
+ Effect.fade_in(3);
+ play_sound("speech/tux_upset.ogg"); // 11 seconds
+ Text.set_text(translate ("Tux: Oww... my head..."));
+ Text.fade_in(1);
+ wait(1.9);
+ Tux.activate();
+ Text.fade_out(0.3);
+ wait(0.5);
+ Text.set_text(translate ("Tux: Wait!")); // t=2.4
+ Text.fade_in(0.5);
wait(1);
- tux_upset();
- wait(4);
- SUPERTUX.set_action("stand-right");
- SUPERTUX.set_velocity(300,0);
+ Text.fade_out(0.5);
+ wait(0.5);
+ Text.set_text(translate ("Tux: Penny!")); // t=3.9
+ Text.fade_in(0.5);
+ wait(1);
+ Text.fade_out(0.5);
+ wait(0.5);
+ Text.set_text(translate ("Tux: Where are you, Penny?!")); // t=4.4
+ Text.fade_in(0.5);
wait(2);
-
- //end intro sequence
- Effect.fade_out(2);
- wait(3);
- Level.finish(true);
+ Text.fade_out(0.5);
+ wait(0.5);
+ Text.set_text(translate ("Tux: Oh no...")); // t=6.9
+ Text.fade_in(0.5);
+ wait(1);
+ Text.fade_out(0.5);
+ wait(0.5);
+ Text.set_text(translate ("Tux: Don't worry, Penny, I'll rescue you!")); // t=8.4
+ Text.fade_in(0.5);
+ wait(2);
+ Text.fade_out(0.5);
+ wait(0.5);
}
function shake_bush()
//play_sound("sounds/rustle.wav");
local bushx = BUSH.get_pos_x();
local bushy = BUSH.get_pos_y();
- for(local i = 0; i < 20; ++i) {
- BUSH.set_pos(bushx + RandomGenerator.rand1i(6) - 3, bushy);
- wait(0.05);
+ for(local i = 0; i < 21; ++i) {
+ BUSH.set_pos(bushx + ( rand() % 6 ) - 3, bushy);
+ wait(0.046875);
}
+ wait(0.015625);
+}
+
+function shake_bush_thread(table)
+{
+ table.wait(8);
+ table.shake_bush(); // each bush shake lasts 1 second
+ table.wait(5);
+ table.shake_bush();
+ table.wait(3);
+ table.shake_bush();
+ table.wait(2);
+ table.shake_bush();
+ table.shake_bush(); // total 23 seconds
+ //enter Nolok
+ table.NOLOK.set_velocity(-220, 600);
+ table.NOLOK.set_visible(true);
+ table.Effect.fade_out(1.3);
}
-function tux_upset()
+function end_level()
{
- SUPERTUX.set_action("stand-right");
- SUPERTUX.set_velocity(200,0);
- wait(0.3);
- SUPERTUX.set_velocity(0,0);
- wait(0.4);
- SUPERTUX.set_action("stand-left");
- SUPERTUX.set_velocity(-200,0);
- wait(0.3);
+ //end intro sequence
+ Effect.fade_out(2);
+ wait(2.1);
+ Level.finish(true);
}
+state_idx <- 0;
+states <- { init=0, start=1, logo_in=2, intro_text=3, rap_scene=4, end_level=5};
+function trigger_state(state) {
+ local idx = states[state];
+ if(!idx || idx <= state_idx)
+ return;
+ state_idx = idx;
+ switch(state) {
+ case "start":
+ initialize();
+ break;
+ case "logo_in":
+ logo_in();
+ break;
+ case "intro_text":
+ intro_text();
+ break;
+ case "rap_scene":
+ rap_scene();
+ break;
+ case "end_level":
+ end_level();
+ break;
+ }
+}
\ No newline at end of file