Rudimentary approach at water splash effect for badguys
[supertux.git] / data / levels / world1 / intro.nut
index 03c14fd..46fae65 100644 (file)
-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()
@@ -84,21 +192,60 @@ 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