intro.nut 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. function initialize()
  2. {
  3. Tux.add_bonus("grow");
  4. RADIO.set_action("quiet");
  5. PENNY.set_action("stand-left");
  6. NOLOK.set_visible(false);
  7. LOGO.set_visible(false);
  8. LOGO.enable_gravity(false);
  9. SIGN.set_visible(false);
  10. }
  11. function logo_in()
  12. {
  13. local x = LOGO.get_pos_x();
  14. local y = LOGO.get_pos_y();
  15. local time = 1.5;
  16. LOGO.set_pos(x,-120);
  17. LOGO.set_visible(true);
  18. LOGO.set_velocity(0,(120+y)/time);
  19. LOGO.enable_gravity(false);
  20. wait(time);
  21. LOGO.set_velocity(0,0);
  22. wait(3);
  23. LOGO.set_visible(false);
  24. }
  25. function intro_text()
  26. {
  27. Text.set_text(_("Somewhere at the shores\nof Antarctica..."));
  28. Text.fade_in(1);
  29. wait(1);
  30. Text.fade_out(1);
  31. }
  32. function rap_scene()
  33. {
  34. Tux.deactivate();
  35. //begin conversation and Tux rap
  36. play_sound("speech/tux_hello.ogg"); // 3.1 seconds
  37. Text.set_centered(false);
  38. Text.set_text(_("Tux: Hello Penny"));
  39. Text.fade_in(1);
  40. wait(2.5);
  41. Text.fade_out(1);
  42. wait(1);
  43. play_sound("speech/penny_runt_01.ogg"); // 1.2 seconds
  44. Text.set_text(_("Penny: Hey Tux"));
  45. Text.fade_in(0.5);
  46. wait(1);
  47. Text.fade_out(0.5);
  48. wait(0.5);
  49. play_sound("speech/tux_murp_01.ogg"); // 1.5 seconds
  50. Text.set_text(_("Tux: Check out my dance moves."));
  51. Text.fade_in(0.5);
  52. wait(1);
  53. Text.fade_out(0.5);
  54. wait(0.5);
  55. RADIO.set_action("loud");
  56. play_sound("speech/tux_rap.ogg"); // 24.6 seconds
  57. local t = ::newthread(shake_bush_thread);
  58. t.call(this); // Nolok's waiting...
  59. // meanwhile... Tux dances!
  60. // TODO: add some more dance moves besides jumps, ducks, & flips
  61. // and fill in the parts where he just stands still
  62. wait(6); // music intro - 6 seconds
  63. Tux.do_duck();
  64. Tux.set_dir(false);
  65. wait(0.40625); // all times rounded to nearest 1/64 of a second
  66. Tux.do_standup();
  67. Tux.kick(); // 0.3 seconds
  68. wait(0.40625);
  69. Tux.set_dir(true);
  70. wait(0.203125);
  71. Tux.set_dir(false);
  72. wait(0.203125);
  73. Tux.set_dir(true);
  74. wait(0.09375);
  75. Tux.do_duck(); // t=7.3
  76. wait(0.5);
  77. Tux.set_dir(false);
  78. wait(0.203125);
  79. Tux.set_dir(true);
  80. wait(0.203125);
  81. Tux.set_dir(false);
  82. wait(0.203125);
  83. Tux.set_dir(true);
  84. wait(0.203125);
  85. Tux.set_dir(false);
  86. wait(0.203125);
  87. Tux.set_dir(true);
  88. Tux.do_standup(); // t=8.8
  89. wait(0.203125);
  90. Tux.set_dir(false);
  91. wait(0.203125);
  92. Tux.kick();
  93. wait(0.40625);
  94. Tux.set_dir(true);
  95. Tux.do_jump(-300);
  96. wait(0.703125);
  97. Tux.do_duck(); // t=10.7
  98. wait(0.296875);
  99. Tux.set_dir(false);
  100. wait(0.59375);
  101. Tux.set_dir(true);
  102. wait(0.703125);
  103. Tux.do_standup(); // t=12.3
  104. Tux.kick();
  105. wait(0.5);
  106. Tux.do_duck();
  107. wait(0.5);
  108. Tux.do_backflip(); // t=13.3
  109. wait(79.0/64);
  110. Tux.walk(200);
  111. wait(38.0/64);
  112. Tux.walk(0);
  113. wait(184.0/64);
  114. Tux.set_dir(false); //t=18.0
  115. wait(0.3)
  116. Tux.kick();
  117. wait(0.40625);
  118. Tux.do_duck();
  119. Tux.set_dir(true);
  120. wait(0.296875);
  121. Tux.set_dir(false); // t=19.0
  122. wait(0.5);
  123. Tux.do_standup();
  124. Tux.do_jump(-800);
  125. wait(1.5);
  126. Tux.kick(); // t=21
  127. wait(0.5);
  128. Tux.do_duck();
  129. wait(0.5);
  130. Tux.do_jump(-400);
  131. wait(1.0);
  132. Tux.do_standup();
  133. wait(0.796875);
  134. Tux.set_dir(true); //t=23.8 - Tux sees Nolok!
  135. Tux.do_jump(-520);
  136. wait(151.0/64);
  137. // we have to activate Tux to hurt him
  138. Tux.activate();
  139. Tux.kill(false);
  140. Tux.deactivate();
  141. wait(1.5);
  142. // song is done
  143. // darkness
  144. NOLOK.set_visible(false);
  145. NOLOK.set_solid(false);
  146. PENNY.set_visible(false);
  147. PENNY.set_solid(false);
  148. RADIO.set_visible(false);
  149. RADIO.set_solid(false);
  150. SIGN.set_visible(true);
  151. //wake up, Tux...
  152. Effect.fade_in(3);
  153. play_sound("speech/tux_upset.ogg"); // 11 seconds
  154. Text.set_text(_("Tux: Oww... my head..."));
  155. Text.fade_in(1);
  156. wait(1.9);
  157. Tux.activate();
  158. Text.fade_out(0.3);
  159. wait(0.5);
  160. Text.set_text(_("Tux: Wait!")); // t=2.4
  161. Text.fade_in(0.5);
  162. wait(1);
  163. Text.fade_out(0.5);
  164. wait(0.5);
  165. Text.set_text(_("Tux: Penny!")); // t=3.9
  166. Text.fade_in(0.5);
  167. wait(1);
  168. Text.fade_out(0.5);
  169. wait(0.5);
  170. Text.set_text(_("Tux: Where are you, Penny?!")); // t=4.4
  171. Text.fade_in(0.5);
  172. wait(2);
  173. Text.fade_out(0.5);
  174. wait(0.5);
  175. Text.set_text(_("Tux: Oh no...")); // t=6.9
  176. Text.fade_in(0.5);
  177. wait(1);
  178. Text.fade_out(0.5);
  179. wait(0.5);
  180. Text.set_text(_("Tux: Don't worry, Penny, I'll rescue you!")); // t=8.4
  181. Text.fade_in(0.5);
  182. wait(2);
  183. Text.fade_out(0.5);
  184. wait(0.5);
  185. }
  186. function shake_bush()
  187. {
  188. //play_sound("sounds/rustle.wav");
  189. local bushx = BUSH.get_pos_x();
  190. local bushy = BUSH.get_pos_y();
  191. for(local i = 0; i < 21; ++i) {
  192. BUSH.set_pos(bushx + ( rand() % 6 ) - 3, bushy);
  193. wait(0.046875);
  194. }
  195. wait(0.015625);
  196. }
  197. function shake_bush_thread(table)
  198. {
  199. table.wait(8);
  200. table.shake_bush(); // each bush shake lasts 1 second
  201. table.wait(5);
  202. table.shake_bush();
  203. table.wait(3);
  204. table.shake_bush();
  205. table.wait(2);
  206. table.shake_bush();
  207. table.shake_bush(); // total 23 seconds
  208. //enter Nolok
  209. table.NOLOK.set_velocity(-220, 600);
  210. table.NOLOK.set_visible(true);
  211. table.Effect.fade_out(1.3);
  212. }
  213. function end_level()
  214. {
  215. //end intro sequence
  216. Effect.fade_out(2);
  217. wait(2.1);
  218. Level.finish(true);
  219. }
  220. state_idx <- 0;
  221. states <- { init=0, start=1, logo_in=2, intro_text=3, rap_scene=4, end_level=5};
  222. function trigger_state(state) {
  223. local idx = states[state];
  224. if(!idx || idx <= state_idx)
  225. return;
  226. state_idx = idx;
  227. switch(state) {
  228. case "start":
  229. initialize();
  230. break;
  231. case "logo_in":
  232. logo_in();
  233. break;
  234. case "intro_text":
  235. intro_text();
  236. break;
  237. case "rap_scene":
  238. rap_scene();
  239. break;
  240. case "end_level":
  241. end_level();
  242. break;
  243. }
  244. }