home *** CD-ROM | disk | FTP | other *** search
/ PC Gamer 5.14 / 2000-11_-_Disc_5.14.iso / Goodies / 3DGameStudio / Adeptus / entity.wdl < prev    next >
Text File  |  2000-04-25  |  31KB  |  1,495 lines

  1. //@
  2. # VR GAMES                       WDL-Script                      Project: DEMO ADEPTUS
  3. #
  4. # Auftraggeber   : Conitec GmbH
  5. #
  6. #*********************************************************************
  7. # Module        : entity.wdl - Kundenversion
  8. # Version       : 2.0 (Made with WDL-STUDIO)
  9. # Date          :  19.8.99
  10. # Responsible   : Harald Schmidt
  11. # Description   : Conitec Demo-RPG
  12. # *********************************************************************
  13. //@
  14. //
  15. //ENTITY SKILLS
  16. SYNONYM ent_test {TYPE ENTITY;}
  17.  
  18. SKILL bounce_angle {}
  19.  
  20. SKILL drop_temp {}
  21. SKILL testvar {}
  22. SKILL angles {}
  23. SKILL nav_direction {}
  24. SKILL to_nav_angle {}
  25. SKILL to_slope_angle {}
  26. SKILL follow_grav {X 0;Y 0;Z -10;}
  27. SKILL sc_time_speed {}
  28. SKILL temp_normal {}
  29. SKILL temp_angle {}
  30. SKILL temp_scan {}
  31. SKILL scan_mode {}
  32. SKILL MY_P {}
  33. SKILL MY_A {}
  34. SKILL jump_count {}
  35. SKILL sc_mov_rnd {}
  36.  
  37. SKILL sc_dist {}
  38.  
  39. SKILL sc_height {}
  40. SKILL sc_floor {}
  41. SKILL sc_min_z {}
  42. SKILL show_scan {}
  43.  
  44.  
  45. DEFINE FLOORDIST, SKILL39;
  46. DEFINE SCAN_RESULT, SKILL38; #internal temp
  47. DEFINE CHECKDIST SKILL40;
  48.  
  49.  
  50. SKILL testcycle {}
  51. SKILL woman_stop_count {}
  52.  
  53.  
  54. SKILL chain_temp_move {}
  55. SKILL chain_temp_init {}
  56.  
  57. SKILL create_pos {}
  58.  
  59. SKILL fountain_pos {}
  60. SKILL throw_count {}
  61. SKILL pyra1_skill {}
  62. SKILL pyra2_skill {}
  63. SKILL pyra3_skill {}
  64. SKILL pyra4_skill {}
  65. SKILL pyr_pos {}
  66. SKILL blitz_on {}
  67. SKILL scantest {}
  68. //
  69. SYNONYM TOUCH_STR {TYPE STRING; DEFAULT sword_str;}
  70. //
  71.  
  72. //ENTITY initialisation actions
  73. // These actions are given in WED
  74. // the player
  75. ACTION entity_player
  76. {
  77.     MY.ENT_ID = 0;
  78.     SET MY.FAT,OFF;
  79.     SET MY.NARROW,ON;
  80.     MY.TRIGGER_RANGE = 5;
  81.     MY._MOVEMODE = _MODE_WALKING;
  82.     MY._FORCE = 0.75;
  83.     MY._BANKING = -0.1;
  84.     SET MY.__STRAFE,ON;
  85.     SET MY.__BOB,ON;
  86.     SET MY.__TRIGGER,ON;
  87.     CALL vpst_enable_periodic_update;
  88.     CALL player_move;
  89. }
  90.  
  91. // this is Sinnarah
  92. ACTION entity_angel
  93. {
  94.     MY.ENT_ID = M_ANGEL; // ID
  95.     #    DEBUG_ACT = ME;     // for testing purposes
  96.     MY.AMBIENT = 40;
  97.     MY._DIALOG_STATE = 11; // the actual queste state is used by "vdia_make_talk" in Dialog.WDL
  98.     SET MY.FAT, TRUE;
  99.     SET MY.NARROW, FALSE;
  100.     MY.SKIN = 1;
  101.     MY._STATE = _NPC_WALK;
  102.     MY._SPEED = 1.5;
  103.     MY.TRIGGER_RANGE = 75;
  104.     SET MY.ENABLE_TOUCH,ON;
  105.     SET MY.ENABLE_CLICK, TRUE; //__NPC_COME or _NPC_TALK will be triggered by mouseclick
  106.     SET MY.ENABLE_TRIGGER, TRUE; // will _NPC_STOP when near;
  107.     SET MY.EVENT,woman_event; // this will happen on events
  108.     SET MY.STRING1, angel_str; // used by touch text
  109.     //create at game start an invisible entity that will be followed.
  110.     //This results in smooth random like changes of the NPCs direction
  111.     CREATE <ruby_ov.pcx>, MY.POS, vnpc_random_navigation;
  112.     WAIT 1;
  113.     CALL woman_movement;
  114. }
  115.  
  116. //This is Innanah
  117. // Same_action as before
  118. ACTION entity_cynth
  119. {
  120.     MY.ENT_ID = M_CYNTHIA;
  121.     MY.SKIN = 2;
  122.     MY.AMBIENT = 10;
  123.     MY._DIALOG_STATE = 11;
  124.     SET MY.FAT, TRUE;
  125.     SET MY.NARROW, FALSE;
  126.     MY._STATE = _NPC_WALK;
  127.     MY._SPEED = 1.5;
  128.     MY.TRIGGER_RANGE = 50;
  129.     SET MY.ENABLE_TOUCH,ON;
  130.     SET MY.ENABLE_CLICK, TRUE;
  131.     SET MY.ENABLE_TRIGGER, TRUE;
  132.     SET MY.EVENT, woman_event;
  133.     SET MY.STRING1, priest_str;
  134.     CREATE <ruby_ov.pcx>, MY.POS, vnpc_random_navigation;
  135.     WAIT 1;
  136.     CALL woman_movement;
  137. }
  138.  
  139. // A sorceress throwing fireballs
  140. ACTION entity_sorc
  141. {
  142.     MY.ENT_ID = M_SORC;
  143.     MY.SKIN = 3;
  144.     SET MY.ENABLE_CLICK, TRUE;
  145.     SET MY.ENABLE_TOUCH, TRUE;
  146.     SET MY.ENABLE_RELEASE, TRUE;
  147.     SET MY.STRING1, sorc_str;
  148.     SET MY.STRING2, m_sorc_str;
  149.     SET MY.EVENT, common_items_event;
  150.     CALL sorc_throw_fireball;
  151. }
  152.  
  153. // Desc: sorceress throwing fireball action
  154. ACTION sorc_throw_fireball
  155. {
  156.     WHILE (1)
  157.     {
  158.         MY.CYCLE += TIME;
  159.         IF (MY.CYCLE < 28 || MY.CYCLE > 45)
  160.         {
  161.             MY.CYCLE = 28;
  162.             SET MY.__BUSY, FALSE;
  163.             WAITT 96;
  164.         }
  165.         IF (MY.CYCLE > 36 && MY.__BUSY == FALSE)
  166.         {
  167.            SET MY.__BUSY, TRUE;
  168.             CALL vspl_cast_fireball;
  169.          }
  170.         WAIT 1;
  171.     }
  172. }
  173.  
  174.  
  175. ACTION entity_book
  176. {
  177.     MY.ENT_ID = M_BOOK;
  178.     MY.AMBIENT = 0;
  179.     SET MY.ENABLE_CLICK, TRUE;
  180.     SET MY.ENABLE_TOUCH, TRUE;
  181.     SET MY.ENABLE_RELEASE, TRUE;
  182.     SET MY.STRING1, book_str;
  183.     SET MY.EVENT, common_items_event;
  184. }
  185. ACTION entity_flame
  186. {
  187.     MY.AMBIENT = 0;
  188.     SET MY.ENABLE_CLICK, TRUE;
  189.     SET MY.ENABLE_TOUCH, TRUE;
  190.     SET MY.ENABLE_RELEASE, TRUE;
  191.     SET MY.STRING1, fire_str;
  192.     SET MY.STRING2, m_feuer_str;
  193.     SET MY.EVENT, common_items_event;
  194.     WHILE (1)
  195.     {
  196.         MY.CYCLE += 1;
  197.         IF (MY.CYCLE >= 5)
  198.         {
  199.             MY.CYCLE = 0;
  200.         }
  201.         WAIT 1;
  202.     }
  203. }
  204. ACTION entity_fountain
  205. {
  206.     MY.ENT_ID = M_FOUNTAIN;
  207.     SET MY.AMBIENT, 0;
  208.     #SET MY.TRANSPARENT, TRUE;
  209.     SET MY.ENABLE_CLICK, TRUE;
  210.     SET MY.ENABLE_TOUCH, TRUE;
  211.     SET MY.ENABLE_RELEASE, TRUE;
  212.     SET MY.STRING1, fountain_str;
  213.     SET MY.STRING2, m_statue_str;
  214.     SET MY.EVENT, common_items_event;
  215.     CALL fountain_ani;
  216. }
  217. ACTION entity_chain1
  218. {
  219.     MY.ENT_ID = M_CHAIN1;
  220.     MY.AMBIENT = 40;
  221.     MY._DIALOG_STATE = 0;
  222.     SET MY.ENABLE_TOUCH, TRUE;
  223.     SET MY.ENABLE_RELEASE, TRUE;
  224.     SET MY.ENABLE_CLICK, TRUE;
  225.     SET MY.EVENT, common_items_event;
  226.     SET MY.PASSABLE, TRUE;
  227.     SET MY.STRING1, chain_str;
  228.     chain_temp_init = MY.Z;
  229.     chain_temp_move = MY.Z - 32;
  230. }
  231. ACTION entity_chain2
  232. {
  233.     MY.ENT_ID = M_CHAIN2;
  234.     MY.AMBIENT = 40;
  235.     MY._DIALOG_STATE = 0;
  236.     SET MY.ENABLE_CLICK, TRUE;
  237.     SET MY.ENABLE_TOUCH, TRUE;
  238.     SET MY.ENABLE_RELEASE, TRUE;
  239.     SET MY.EVENT, common_items_event;
  240.     SET MY.PASSABLE, TRUE;
  241.     SET MY.STRING1, chain_str;
  242. }
  243. ACTION entity_chain3
  244. {
  245.     MY.ENT_ID = M_CHAIN3;
  246.     MY.AMBIENT = 40;
  247.     MY._DIALOG_STATE = 0;
  248.     SET MY.ENABLE_CLICK, TRUE;
  249.     SET MY.ENABLE_TOUCH, TRUE;
  250.     SET MY.ENABLE_RELEASE, TRUE;
  251.     SET MY.EVENT, common_items_event;
  252.     SET MY.PASSABLE, TRUE;
  253.     SET MY.STRING1, chain_str;
  254. }
  255. ACTION entity_chain4
  256. {
  257.     MY.ENT_ID = M_CHAIN4;
  258.     MY.AMBIENT = 40;
  259.     MY._DIALOG_STATE = 0;
  260.     SET MY.ENABLE_CLICK, TRUE;
  261.     SET MY.ENABLE_TOUCH, TRUE;
  262.     SET MY.ENABLE_RELEASE, TRUE;
  263.     SET MY.EVENT, common_items_event;
  264.     SET MY.PASSABLE, TRUE;
  265.     SET MY.STRING1, chain_str;
  266. }
  267. ACTION entity_scorpio
  268. {
  269.     MY.ENT_ID = 0;
  270.     MY.AMBIENT = 10;
  271.     MY.ENT_SCALE = 0.3;
  272.     MY._HEALTH = 20;
  273.     MY._STATE = _NPC_WALK;
  274.     MY.CHECKDIST = 50;
  275.     MY._SPEED = 3;
  276.     MY.TRIGGER_RANGE = 50;
  277.     SET MY.STRING1, scorpio_str;
  278.     CALL set_scorpio_event;
  279.     CREATE <ruby_ov.pcx>, MY.POS, vnpc_random_navigation;
  280.     WAIT 1;
  281.     CALL sc_movement;
  282. }
  283. ACTION entity_bigscorpio
  284. {
  285.     MY.ENT_ID = 0;
  286.     MY.AMBIENT = 0;
  287.     MY.ENT_SCALE = 1;
  288.     MY._HEALTH = 30;
  289.     MY._STATE = _NPC_ATTACK;
  290.     MY.CHECKDIST = 50;
  291.     MY._SPEED = 3;
  292.     MY.TRIGGER_RANGE = 60;
  293.     SET MY.STRING1,scorpio_str;
  294.     CALL set_big_scorpio_event;
  295.     WHILE (1)
  296.     {
  297.         CALL big_sc_movement;
  298.         RETURN;
  299.     }
  300. }
  301. ACTION entity_sword
  302. {
  303.     MY.ENT_ID = M_SWORD;
  304.     SET MY.NARROW, FALSE;
  305.     SET MY.FAT, FALSE;
  306.     SET MY.STRING1,sword_str;
  307.     CALL vitm_init_item;
  308. }
  309. ACTION entity_fish
  310. {
  311.     MY.ENT_ID = M_FISH;
  312.     CALL vitm_init_item;
  313. }
  314. ACTION entity_key1
  315. {
  316.     MY.ENT_ID = M_KEY1;
  317.     SET MY.FACING, TRUE;
  318.     MY.ENT_SCALE = 0.1;
  319.     SET MY.STRING1,key_str;
  320.     CALL vitm_init_item;
  321. }
  322. ACTION entity_key2
  323. {
  324.     MY.ENT_ID = M_KEY2; //set the ENT_ID (Skill32)
  325.     SET MY.FACING, TRUE;
  326.     MY.ENT_SCALE = 0.1;
  327.     SET MY.STRING1, key_str;
  328.     CALL vitm_init_item; //will be handled as an inventory item
  329. }
  330. ACTION entity_ruby
  331. {
  332.     MY.ENT_ID = M_RUBY;
  333.     SET MY.FACING, TRUE;
  334.     MY.AMBIENT = 0;
  335.     MY.ENT_SCALE = 0.3;
  336.     CALL vitm_init_item;
  337.     SET MY.STRING1, ruby_str;
  338. }
  339. ACTION entity_blatt
  340. {
  341.     MY.ENT_ID = M_BLATT;
  342.     SET MY.FACING, TRUE;
  343.     MY.ENT_SCALE = 0.25;
  344.     SET MY.STRING1, exoticplant_str;
  345.     CALL vitm_init_item;
  346. }
  347. ACTION entity_plant
  348. {
  349.     MY.ENT_ID = 0;
  350.     SET MY.STRING1, exoticplant_str;
  351. }
  352. ACTION entity_fish_sprite
  353. {
  354.     MY.ENT_ID = M_FISH;
  355.     SET MY.FACING, TRUE;
  356.     MY.ENT_SCALE = 0.3;
  357.     CALL vitm_init_item;
  358. }
  359. ACTION entity_diamond
  360. {
  361.     MY.ENT_ID = M_GEM;
  362.     SET MY.FACING, TRUE;
  363.     MY.ENT_SCALE = 0.3;
  364.     MY.AMBIENT = 20;
  365.     SET MY.STRING1,diam_str;
  366.     CALL vitm_init_item;
  367. }
  368. ACTION entity_sword_arm
  369. {
  370.     MY.ENT_ID = 0;
  371. }
  372. ACTION entity_waterempty
  373. {
  374.     MY.ENT_ID = M_WATEREMPTY;
  375.     MY.AMBIENT = 0;
  376.     MY.ENT_SCALE = 0.1;
  377.     CALL vitm_init_item;
  378.     SET MY.STRING1,waterempty_str;
  379. }
  380. ACTION entity_waterfull
  381. {
  382.     MY.ENT_ID = M_WATERFULL;
  383.     MY.AMBIENT = 0;
  384.     MY.ENT_SCALE = 0.1;
  385.     SET MY.STRING1, waterfull_str;
  386.     CALL vitm_init_item;
  387. }
  388.  
  389. ACTION entity_vase
  390. {
  391.     MY.ENT_ID = 0;
  392.     SET MY.ENABLE_CLICK, TRUE;
  393.     SET MY.ENABLE_TOUCH, TRUE;
  394.     SET MY.ENABLE_RELEASE, TRUE;
  395.     SET MY.STRING1, vase_str;
  396.     SET MY.STRING2, m_vase_str;
  397.     SET MY.EVENT, common_items_event;
  398. }
  399. ACTION entity_tree
  400. {
  401.     SET MY.FAT, FALSE;
  402.     SET MY.NARROW, TRUE;
  403.     MY.MIN_X = MY.MIN_X / 2;
  404.     MY.MIN_Y = MY.MIN_Y / 2;
  405.     MY.MAX_X = MY.MAX_X / 2;
  406.     MY.MAX_Y = MY.MAX_Y / 2;
  407. }
  408. ACTION entity_pyra1
  409. {
  410.     MY.ENT_ID = M_PYR1;
  411.     MY.TILT = 90;
  412.     SET MY.EVENT, pyr_event;
  413.     SET MY.ENABLE_TOUCH, TRUE;
  414.     SET MY.ENABLE_RELEASE, TRUE;
  415.     SET MY.ENABLE_CLICK, TRUE;
  416.     SET MY.STRING1, pyr_str;
  417.     SET MY.STRING2, m_pyra_str1;
  418.     SET MY.PASSABLE, TRUE;
  419.     SET MY.ORIENTED, TRUE;
  420. }
  421. ACTION entity_pyra2
  422. {
  423.     MY.ENT_ID = M_PYR2;
  424.     MY.TILT = 90;
  425.     SET MY.EVENT, pyr_event;
  426.     SET MY.ENABLE_CLICK, TRUE;
  427.     SET MY.ENABLE_TOUCH, TRUE;
  428.     SET MY.ENABLE_RELEASE, TRUE;
  429.     SET MY.PASSABLE, TRUE;
  430.     SET MY.ORIENTED, TRUE;
  431.     SET MY.STRING1, pyr_str;
  432.     SET MY.STRING2, m_pyra_str2;
  433. }
  434. ACTION entity_pyra3
  435. {
  436.     MY.ENT_ID = M_PYR3;
  437.     MY.TILT = 90;
  438.     SET MY.EVENT, pyr_event;
  439.     SET MY.ENABLE_CLICK, TRUE;
  440.     SET MY.ENABLE_TOUCH, TRUE; // set some flags
  441.     SET MY.ENABLE_RELEASE, TRUE;
  442.     SET MY.PASSABLE, TRUE;
  443.     SET MY.ORIENTED, TRUE;
  444.     SET MY.STRING1, pyr_str;
  445.     SET MY.STRING2, m_pyra_str3;
  446. }
  447. ACTION entity_pyra4
  448. {
  449.     MY.ENT_ID = M_PYR4;
  450.     MY.TILT = 90;
  451.     SET MY.EVENT, pyr_event;
  452.     SET MY.ENABLE_CLICK, TRUE;
  453.     SET MY.ENABLE_TOUCH, TRUE; // set some flags
  454.     SET MY.ENABLE_RELEASE, TRUE;
  455.     SET MY.PASSABLE, TRUE;
  456.     SET MY.ORIENTED, TRUE;
  457.     SET MY.STRING1, pyr_str;
  458.     SET MY.STRING2, m_pyra_str4;
  459. }
  460.  
  461. //////////////////////////////////////////////////
  462. // These are the Event Actions
  463. ACTION woman_event
  464. {
  465.     CALL handle_touch;
  466.     //This will happen if you click with the mouse
  467.     IF (EVENT_TYPE == EVENT_CLICK)
  468.     {
  469.         IF (MY._STATE == _NPC_WALK) //walking?
  470.         {
  471.             MY._STATE = _NPC_COME;        //then come
  472.         }
  473.         IF (MY._STATE == _NPC_STOP) //already here and waiting?
  474.         {
  475.             MY._STATE = _NPC_TALK;        //then start dialog
  476.             SET MY.ENABLE_TRIGGER, FALSE; //no double triggers
  477.             NPC_ENTITY = ME;                //used in vdia_make_talk
  478.             CALL vdia_make_talk;
  479.         }
  480.     }
  481.     IF (EVENT_TYPE == EVENT_TRIGGER)
  482.     {
  483.         MY._STATE = _NPC_STOP;        //stop and wait if near
  484.     }
  485. }
  486.  
  487. ACTION woman_movement
  488. {
  489.     WHILE (1)
  490.     {
  491. // NPC follows an invisible navigator entity
  492.         IF (MY._STATE == _NPC_WALK)
  493.         {
  494. // set trigger again to stop before the player
  495.             SET MY.ENABLE_TRIGGER, TRUE;
  496.             ent_test = MY.ENTITY1; //this was declared  in "vnpc_random_navigation"
  497.             nav_direction.X = ent_test.X - MY.X;
  498.             nav_direction.Y = ent_test.Y - MY.Y;
  499.             nav_direction.Z = ent_test.Z - MY.Z;
  500.             TO_ANGLE, to_nav_angle, nav_direction;
  501.             MY.PAN += 0.1 * ANG (to_nav_angle.PAN - MY.PAN);
  502.             sc_time_speed = MY._SPEED * TIME;
  503.             SET YOU,NULL;
  504.             MOVE ME sc_time_speed, follow_grav;
  505.             CALL woman_grav; //add gravity
  506.             CALL woman_walk_anim; //animate it
  507.         }
  508. // NPC walks towards the player
  509.         IF (MY._STATE == _NPC_COME)
  510.         {
  511.             ent_test = player;
  512.             nav_direction.X = ent_test.X - MY.X;
  513.             nav_direction.Y = ent_test.Y - MY.Y;
  514.             nav_direction.Z = ent_test.Z - MY.Z;
  515.             TO_ANGLE, to_nav_angle, nav_direction;
  516.             MY.PAN += 0.3 * ANG (to_nav_angle.PAN - MY.PAN);
  517.             sc_time_speed = MY._SPEED * TIME * 2;
  518.             SET YOU,NULL;
  519.             MOVE ME sc_time_speed, follow_grav;
  520.             CALL woman_grav;
  521.             CALL woman_walk_anim;
  522.         }
  523. // NPC stops and faces the player
  524.         IF (MY._STATE == _NPC_STOP)
  525.         {
  526.             woman_stop_count += TIME;
  527.             ent_test = player;
  528.             nav_direction.X = ent_test.X - MY.X;
  529.             nav_direction.Y = ent_test.Y - MY.Y;
  530.             nav_direction.Z = ent_test.Z - MY.Z;
  531.             TO_ANGLE, to_nav_angle, nav_direction;
  532.             MY.PAN += 0.3 * ANG (to_nav_angle.PAN - MY.PAN);
  533.             sc_time_speed = 0;
  534.             SET YOU,NULL;
  535.             MOVE ME sc_time_speed, follow_grav;
  536.             CALL woman_grav;
  537.             CALL woman_wait_anim;
  538.             IF (woman_stop_count > 80) //just wait some seconds and then walk further
  539.             {
  540.                 MY._STATE = _NPC_WALK;
  541.                 woman_stop_count = 0;
  542.             }
  543.         }
  544.         IF (MY._STATE == _NPC_TALK)
  545.         {
  546.             CALL woman_wait_anim;
  547.         }
  548.         WAIT 1;
  549.     }
  550. }
  551. // a simple gravity action
  552. ACTION woman_grav
  553. {
  554.     WAIT 1;
  555.     SONAR ME, 4000;
  556.     MY.FLOORDIST = RESULT;
  557.     IF (MY.FLOORDIST > 7)
  558.     {
  559.         follow_grav.Z = -10;
  560.     }
  561.     ELSE
  562.     {
  563.         IF (MY.FLOORDIST < 1)
  564.         {
  565.             follow_grav.Z += 3;
  566.         }
  567.         ELSE
  568.         {
  569.             follow_grav.Z = 0;
  570.         }
  571.     }
  572.     // If on a slope, apply gravity to draw him downwards:
  573.     CALL scan_floor;
  574.     IF (my_floornormal.Z < 0.85)
  575.     {
  576.         follow_grav.X = my_floornormal.X * gravity * 2;
  577.         follow_grav.Y = my_floornormal.Y * gravity * 2;
  578.     }
  579.     ELSE
  580.     {
  581.         follow_grav.X = 0;
  582.         follow_grav.Y = 0;
  583.     }
  584. }
  585.  
  586. ACTION woman_wait_anim
  587. {
  588.     MY.CYCLE += TIME * 0.5;
  589.     IF (MY.CYCLE < 0 || MY.CYCLE > 9)
  590.     {
  591.         MY.CYCLE = 0;
  592.     }
  593.     RETURN;
  594. }
  595.  
  596. ACTION woman_walk_anim
  597. {
  598.     sc_dist = SQRT (MY_SPEED.X * MY_SPEED.X + MY_SPEED.Y * MY_SPEED.Y);
  599.     IF (sc_dist == 0)
  600.     {
  601.         #    MY.CYCLE = 1;    // standing
  602.         RETURN;
  603.     }
  604.     MY.CYCLE += 0.32 * sc_dist;
  605.     IF (MY.CYCLE < 10 || MY.CYCLE > 27)
  606.     {
  607.         PLAY_ENTSOUND ME, stein2_snd, 60;
  608.         SET MY.__SOUND, 0;
  609.         MY.CYCLE = 10;
  610.     }
  611.     IF ( (MY.CYCLE > 27 * 0.5) &&  (MY.__SOUND == 0))
  612.     {
  613.         PLAY_ENTSOUND ME, stein2_snd, 60;
  614.         SET MY.__SOUND, 1;
  615.     }
  616.     RETURN;
  617. }
  618.  
  619.  
  620.  
  621. // Desc: Event for common, non inventory, items
  622. ACTION common_items_event
  623. {
  624.     IF (EVENT_TYPE == EVENT_CLICK)
  625.     {
  626.         IF (mouse_object == M_WATEREMPTY && MY.ENT_ID == M_FOUNTAIN)
  627.         {
  628.             SET MY.ENABLE_TOUCH, FALSE;
  629.  
  630.  
  631.  
  632.             mouse_object = M_WATERFULL; //cursor changes to full bottle
  633.  
  634.             PLAY_SOUND bottle_snd, 25;
  635.             WAIT 2;
  636.             SET MY.ENABLE_TOUCH, TRUE;
  637.             RETURN;
  638.         }
  639.           // the book will reveal the quest
  640.         IF (MY.ENT_ID == M_BOOK)
  641.         {
  642.             CALL show_quest;
  643.             RETURN;
  644.         }
  645.         // draw chains
  646.         IF (MY.ENT_ID >= M_CHAIN1 && MY.ENT_ID <= M_CHAIN4)
  647.         {
  648.             IF (MY.__BUSY)
  649.             {
  650.                 RETURN;
  651.             }
  652.             CALL move_chain;
  653.         }
  654.         // the other items like flames and the like will show a short info
  655.         ELSE
  656.         {
  657.             CALL vscr_show_info; //in a4panel.wdl
  658.         }
  659.     }
  660.     //show a touch text
  661.     CALL handle_touch;
  662. }
  663.  
  664.  
  665. /////////////// CHAIN ACTIONS //////////////////////////////////////////
  666.  
  667. //Draw the chains
  668. ACTION chain_event
  669. {
  670.     IF (MY.__BUSY) //no double trigger allowed
  671.     {
  672.         RETURN;
  673.     }
  674.     CALL move_chain;
  675. }
  676.  
  677. ACTION move_chain
  678. {
  679.     CALL count_chain; //the quest relevant action
  680.     SET MY.__BUSY, TRUE;
  681.     PLAY_SOUND open_snd, 66;
  682.     WHILE (MY.Z > chain_temp_move)// move down
  683.     {
  684.         MY.Z -= 1;
  685.         WAIT 1;
  686.     }
  687.     WHILE (MY.Z < chain_temp_init)//then move up again
  688.     {
  689.         MY.Z += 1;
  690.         WAIT 1;
  691.     }
  692.     PLAY_SOUND close_snd, 66;
  693.     SET MY.__BUSY, FALSE;
  694. }
  695. ACTION count_chain
  696. {
  697.     IF (MY.ENT_ID == M_CHAIN1) // which chain was drawn?
  698.     {
  699.         chain1_skill = 1;
  700.     }
  701.     IF (MY.ENT_ID == M_CHAIN2)
  702.     {
  703.         chain2_skill = 2;
  704.     }
  705.     IF (MY.ENT_ID == M_CHAIN3)
  706.     {
  707.         chain3_skill = 3;
  708.     }
  709.     IF (MY.ENT_ID == M_CHAIN4)
  710.     {
  711.         chain4_skill = 4;
  712.     }
  713.     // has already every chain be drawn?
  714.     IF ( (chain1_skill + chain2_skill + chain3_skill + chain4_skill) == 10)
  715.     {
  716.         create_pos.X = 4570; // then give this position
  717.         create_pos.Y = -116;
  718.         create_pos.Z = -470;
  719.         // and create there a huge plate
  720.         CREATE <plate.wmb>, create_pos, give_platename;
  721.         create_pos.X = 4570;
  722.         create_pos.Y = -116;
  723.         create_pos.Z = -300;
  724.         //and a huge scorpio *shudder*
  725.         CREATE <scorpio1.mdl>, create_pos, entity_bigscorpio;
  726.     }
  727. }
  728.  
  729.  
  730.  
  731.  
  732.  
  733. ///////////// PYRAMID ACTIONS //////////////////////////////////////////
  734.  
  735.  
  736. // this is called by the 4 plates around the pyramid
  737. ACTION pyr_event
  738. {
  739.     CALL handle_touch;
  740.  
  741.     IF (EVENT_TYPE == EVENT_CLICK)
  742.     {
  743.         IF (mouse_object <= _EMPTY)    // default info on empty cursor
  744.         {
  745.             CALL vscr_show_info;
  746.             RETURN;
  747.         }
  748.         // right item combined with the right plate?
  749.         IF (MY.ENT_ID == M_PYR1 && mouse_object == M_SWORD)
  750.         {
  751.             pyra1_skill = 1;
  752.             SET PLATE1, ME;
  753.             mouse_object = _EMPTY;  // item is consumed
  754.              BRANCH quest_check;     // activate the plate, create blitz, and
  755.                                             // check for quest completion
  756.         }
  757.         IF (MY.ENT_ID == M_PYR2 && mouse_object == M_RUBY)
  758.         {
  759.             pyra2_skill = 2;
  760.             SET PLATE2, ME;
  761.             mouse_object = _EMPTY;  // item is consumed
  762.             BRANCH quest_check;     // activate the plate, create blitz, and
  763.                                             // check for quest completion
  764.         }
  765.         IF (MY.ENT_ID == M_PYR3 && mouse_object == M_WATERFULL)
  766.         {
  767.             pyra3_skill = 3;
  768.             SET PLATE3, ME;
  769.             mouse_object = _EMPTY;    // item is consumed
  770.             BRANCH quest_check;     // activate the plate, create blitz, and
  771.                                             // check for quest completion
  772.         }
  773.         IF (MY.ENT_ID == M_PYR4 && mouse_object == M_BLATT)
  774.         {
  775.             pyra4_skill = 4;
  776.             SET PLATE4, ME;
  777.             mouse_object = _EMPTY;    // item is consumed
  778.             BRANCH quest_check;     // activate the plate, create blitz, and
  779.                                             // check for quest completion
  780.         }
  781.         //else you should try annother item
  782.         CALL vttx_show_wrong_item_text;
  783.     }
  784. }
  785.  
  786.  
  787. // create a blitz and change the plate
  788. ACTION quest_check
  789. {
  790.     MY.CYCLE += 1;                //give the plate a new surface
  791.     pyr_pos.X = MY.X;
  792.     pyr_pos.Y = MY.Y;
  793.     pyr_pos.Z = MY.Z + 100;
  794.     blitz_on = TRUE;             //this will be needed to remove the stuff
  795.     PLAY_SOUND zisch_snd, 50;
  796.     CREATE <blitz+3.pcx>, pyr_pos, blitz_ani;
  797.     //Now check wether all plates are activated
  798.     IF ( (pyra1_skill + pyra2_skill + pyra3_skill + pyra4_skill) == 10)
  799.     {
  800.         SET MY.EVENT, NULL; //this quest isn't repeatable
  801.         CALL give_mana;      // showdown
  802.     }
  803. }
  804.  
  805. ACTION give_mana
  806. {
  807.     CALL show_quest_ready;
  808.     CALL echosound;
  809.     player_mana = 30;
  810.     WHILE (1)
  811.     {
  812.         player_current_mana += 0.3;            //add "mana" to the player
  813.         IF (player._DIALOG_STATE != 51) {
  814.             SET ME,player;
  815.             CALL player_shake;        // feels like a quake
  816.         }
  817.         IF (player_current_mana >= player_mana)
  818.         {
  819.             player._DIALOG_STATE = 51;        //used for the next talk in dialog.wdl
  820.             SET PLATE1.CYCLE, 0;        //show old surface
  821.             SET PLATE2.CYCLE, 0;
  822.             SET PLATE3.CYCLE, 0;
  823.             SET PLATE4.CYCLE, 0;
  824.             SET blitz_on, FALSE;        //remove all blitzes in blitz_ani
  825.             RETURN;
  826.         }
  827.         WAIT 1;
  828.     }
  829. }
  830.  
  831. //fat echo
  832. ACTION echosound
  833. {
  834.     WHILE (1)
  835.     {
  836.         PLAY_SOUND, ready_snd, 60;
  837.         WAIT 16;
  838.         PLAY_SOUND, ready_snd, 40;
  839.         WAIT 16;
  840.         PLAY_SOUND, ready_snd, 20;
  841.         WAIT 16;
  842.         PLAY_SOUND, ready_snd, 10;
  843.         RETURN;
  844.     }
  845. }
  846.  
  847. ACTION give_platename
  848. {
  849.     PLATE = ME;
  850. }
  851.  
  852. //
  853. ACTION blitz_ani
  854. {
  855.     MY.AMBIENT = 30;
  856.     WHILE (blitz_on)
  857.     {
  858.         MY.CYCLE += 1;
  859.         IF (MY.CYCLE > 2)
  860.         {
  861.             MY.CYCLE = 0;
  862.         }
  863.         WAIT 1;
  864.     }
  865.     REMOVE ME;
  866.     RETURN;
  867. }
  868. //
  869. ACTION tp_ani
  870. {
  871.     SET MY.EVENT tp_event;
  872.     SET MY.ENABLE_IMPACT, TRUE;
  873.     MY.AMBIENT = 30;
  874.     WHILE (1)
  875.     {
  876.         MY.CYCLE += 1;
  877.         IF (MY.CYCLE > 6)
  878.         {
  879.             MY.CYCLE = 0;
  880.         }
  881.         WAIT 1;
  882.     }
  883. }
  884. ACTION tp_event
  885. {
  886.     IF (YOU == PLAYER)
  887.     {
  888.         CALL vmsc_exit;
  889.     }
  890. }
  891. // animation of the fountain with particle effect
  892. ACTION fountain_ani
  893. {
  894.     fountain_pos.X = MY.X;
  895.     fountain_pos.Y = MY.Y;
  896.     WHILE (1)
  897.     {
  898.         MY.CYCLE += 1;
  899.         fountain_pos.Z = MY.Z + RANDOM (48)-24;
  900.         IF (MY.CYCLE > 3)
  901.         {
  902.             MY.CYCLE = 0;
  903.             EMIT 50, fountain_pos, particle_fountain;
  904.         }
  905.         WAIT 1;
  906.     }
  907. }
  908.  
  909.  
  910.  
  911.  
  912. ////////// VENTURE ITEM OVERRIDES ///////////////////////////////////////////
  913.  
  914.  
  915. // Desc: create an item with an attached action depending on the cursor sprite
  916. // NOTE: this action overrides a dummy action in venture.wdl
  917. ACTION vitm_create_item
  918. {
  919.     IF (mouse_object == M_KEY1)
  920.     {
  921.         CREATE <key1_ov.pcx>, MY_POS, throw_key1;
  922.     }
  923.     IF (mouse_object == M_KEY2)
  924.     {
  925.         CREATE <key2_ov.pcx>, MY_POS, throw_key2;
  926.     }
  927.     IF (mouse_object == M_GEM)
  928.     {
  929.         CREATE <diam1_ov.pcx>, MY_POS, throw_diamond;
  930.     }
  931.     IF (mouse_object == M_RUBY)
  932.     {
  933.         CREATE <ruby_ov.pcx>, MY_POS, throw_ruby;
  934.     }
  935.     IF (mouse_object == M_BLATT)
  936.     {
  937.         CREATE <blatt_ov.pcx>, MY_POS, throw_blatt;
  938.     }
  939.     IF (mouse_object == M_FISH)
  940.     {
  941.         CREATE <fish_ov.pcx>, MY_POS, throw_fish;
  942.     }
  943.     IF (mouse_object == M_SWORD)
  944.     {
  945.         CREATE <sword.mdl>, MY_POS, throw_sword;
  946.     }
  947.     IF (mouse_object == M_WATEREMPTY)
  948.     {
  949.         CREATE <flacon.pcx>, MY_POS, throw_waterempty;
  950.     }
  951.     IF (mouse_object == M_WATERFULL)
  952.     {
  953.         CREATE <flacon1.pcx>, MY_POS, throw_waterfull;
  954.     }
  955. }
  956.  
  957.  
  958. //specific throw initialisations
  959. ACTION throw_key1
  960. {
  961.     CALL entity_key1;
  962.     CALL vitm_drop_item;
  963. }
  964. ACTION throw_key2
  965. {
  966.     CALL entity_key2;
  967.     CALL vitm_drop_item;
  968. }
  969. ACTION throw_diamond
  970. {
  971.     CALL entity_diamond;
  972.     CALL vitm_drop_item;
  973. }
  974. ACTION throw_ruby
  975. {
  976.     CALL entity_ruby;
  977.     CALL vitm_drop_item;
  978. }
  979. ACTION throw_blatt
  980. {
  981.     CALL entity_blatt;
  982.     CALL vitm_drop_item;
  983. }
  984. ACTION throw_waterempty
  985. {
  986.     CALL entity_waterempty;
  987.    CALL vitm_drop_item;
  988. }
  989. ACTION throw_waterfull
  990. {
  991.     CALL entity_waterfull;
  992.     CALL vitm_drop_item;
  993. }
  994. ACTION throw_fish
  995. {
  996.     CALL entity_fish_sprite;
  997.     CALL vitm_throw_item;
  998. }
  999. ACTION throw_sword
  1000. {
  1001.     __HAS_SWORD = FALSE;
  1002.     SET ON_SPACE, NULL;
  1003.     CALL entity_sword;
  1004.     CALL vitm_drop_item;
  1005. }
  1006.  
  1007.  
  1008.  
  1009.  
  1010. ////////////Skills Monster ////////////////
  1011. SKILL sc_str {VAL 12;}#scorpio stats
  1012. SKILL sc_gew {VAL 12;}
  1013. SKILL sc_mut {VAL 12;}
  1014. SKILL sc_int {VAL 12;}
  1015.  
  1016.  
  1017.  
  1018. // Desc: Scorpion attacks player.
  1019. //
  1020. //         Set the STR, MUT, and GEW skills to the scorpio stats and call
  1021. //          player_defense.
  1022. ACTION sc_att_probe
  1023. {
  1024.     SET vent_npc_str, sc_str;
  1025.     SET vent_npc_mut, sc_mut;
  1026.     SET vent_npc_gew, sc_gew;
  1027.     CALL vcom_player_defense;
  1028. }
  1029.  
  1030. // Desc: Scorpion gets attacked
  1031. //
  1032. //            Set the INT, MUT, and GEW skills to the scorpio stats and call
  1033. //      player_attack.
  1034. ACTION sc_def_probe
  1035. {
  1036.     IF (YOUR._VWEAPON_TYPE == _VWEAPON_TYPE_DIRECT)
  1037.     { // direct damage
  1038.  
  1039.       // <add sound and animation here>
  1040.  
  1041.       CALL vcom_direct_attack;
  1042.       RETURN;
  1043.     }
  1044.  
  1045.   IF (YOUR._VWEAPON_TYPE == _VWEAPON_TYPE_MELEE)
  1046.     { // melee damage
  1047.         SET vent_npc_int, sc_int;
  1048.          SET vent_npc_mut, sc_mut;
  1049.          SET vent_npc_gew, sc_gew;
  1050.          CALL vcom_player_attack;
  1051.         RETURN;
  1052.     }
  1053. }
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059. // the scorpios movement
  1060. ACTION sc_movement
  1061. {
  1062.     MY.SCALE_X = MY.ENT_SCALE;
  1063.     MY.SCALE_Y = MY.ENT_SCALE * 0.7;
  1064.     MY.SCALE_Z = MY.ENT_SCALE;
  1065.     SET MY.FAT, TRUE;
  1066.     scan_mode.PAN = 360;
  1067.     scan_mode.TILT = 60;
  1068.     scan_mode.Z = 120;
  1069.     CALL drop_sc_shadow; // drop a shadow
  1070.     WHILE (1)
  1071.     {
  1072.         CALL scan_around;
  1073.         // they will attack each entity (thus even each other)
  1074.         IF (MY._STATE == _NPC_ATTACK)
  1075.         {
  1076.             ent_test = MY.ENTITY2;
  1077.             nav_direction.X = ent_test.X - MY.X;
  1078.             nav_direction.Y = ent_test.Y - MY.Y;
  1079.             nav_direction.Z = ent_test.Z - MY.Z;
  1080.             TO_ANGLE, to_nav_angle, nav_direction;
  1081.             MY.PAN += 0.5 * ANG (to_nav_angle.PAN - MY.PAN);
  1082.             sc_time_speed = MY._SPEED * TIME * 4;
  1083.             SET YOU,NULL;
  1084.             MOVE ME sc_time_speed, follow_grav;
  1085.             CALL sc_grav_slope;
  1086.             CALL scorpio_attack_anim;
  1087.         }
  1088.         // if they touch another entity they will jump back
  1089.         IF (MY._STATE == _NPC_RETREAT)
  1090.         {
  1091.             SET MY.ENABLE_TRIGGER, FALSE;
  1092.             sc_time_speed = MY._SPEED * TIME * -4;
  1093.             SET YOU,NULL;
  1094.             MOVE ME sc_time_speed, follow_grav;
  1095.             MY._COUNTER += 1 * TIME;
  1096.             sc_mov_rnd = 3 + RANDOM (40);
  1097.             IF (MY._COUNTER > sc_mov_rnd)
  1098.             {
  1099.                 MY._STATE = _NPC_WALK;
  1100.                 MY._COUNTER = 0;
  1101.                 SET MY.ENABLE_TRIGGER, TRUE;
  1102.             }
  1103.             CALL sc_grav_slope;
  1104.             CALL scorpio_attack_anim;
  1105.         }
  1106.         IF (MY._STATE == _NPC_WALK)
  1107.         {
  1108.             ent_test = MY.ENTITY1;
  1109.             nav_direction.X = ent_test.X - MY.X;
  1110.             nav_direction.Y = ent_test.Y - MY.Y;
  1111.             nav_direction.Z = ent_test.Z - MY.Z;
  1112.             TO_ANGLE, to_nav_angle, nav_direction;
  1113.             MY.PAN += 0.1 * ANG (to_nav_angle.PAN - MY.PAN);
  1114.             sc_time_speed = MY._SPEED * TIME;
  1115.             SET YOU,NULL;
  1116.             MOVE ME sc_time_speed, follow_grav;
  1117.             CALL sc_grav_slope;
  1118.             CALL scorpio_walk_anim;
  1119.         }
  1120.         IF (MY._STATE == _NPC_STOP)
  1121.         {
  1122.             IF (RANDOM (512) > 510)
  1123.             {
  1124.                 MY._STATE = _NPC_WALK;
  1125.             }
  1126.             sc_time_speed = 0;
  1127.             SET YOU,NULL;
  1128.             MOVE ME sc_time_speed, follow_grav;
  1129.             CALL sc_grav_slope;
  1130.             CALL scorpio_walk_anim;
  1131.         }
  1132.         IF (MY._STATE == _NPC_DEAD)
  1133.         {
  1134.             sc_time_speed = 0;
  1135.             SET YOU,NULL;
  1136.             MOVE ME sc_time_speed, follow_grav;
  1137.             CALL sc_grav_slope;
  1138.             CALL scorpio_die_anim;
  1139.             PLAY_SOUND m_sc_dead_snd, 100;
  1140.             RETURN;
  1141.         }
  1142.         WAIT 1;
  1143.     }
  1144. }
  1145.  
  1146. // same as sc_movement
  1147. ACTION big_sc_movement
  1148. {
  1149.     MY.SCALE_X = MY.ENT_SCALE;
  1150.     MY.SCALE_Y = MY.ENT_SCALE * 0.7;
  1151.     MY.SCALE_Z = MY.ENT_SCALE;
  1152.     SET MY.FAT, TRUE;
  1153.     SET MY.NARROW, FALSE;
  1154.     scan_mode.PAN = 360;
  1155.     scan_mode.TILT = 60;
  1156.     scan_mode.Z = 120;
  1157.     CALL drop_sc_shadow;
  1158.     WHILE (1)
  1159.     {
  1160.         CALL scan_around;
  1161.         IF (MY._STATE == _NPC_ATTACK)
  1162.         {
  1163.             ent_test = player;
  1164.             nav_direction.X = ent_test.X - MY.X;
  1165.             nav_direction.Y = ent_test.Y - MY.Y;
  1166.             nav_direction.Z = ent_test.Z - MY.Z;
  1167.             TO_ANGLE, to_nav_angle, nav_direction;
  1168.             MY.PAN += 0.5 * ANG (to_nav_angle.PAN - MY.PAN);
  1169.             sc_time_speed = MY._SPEED * TIME * 4;
  1170.             SET YOU,NULL;
  1171.             MOVE ME sc_time_speed, follow_grav;
  1172.             CALL sc_grav_slope;
  1173.             CALL scorpio_attack_anim;
  1174.         }
  1175.         IF (MY._STATE == _NPC_RETREAT)
  1176.         {
  1177.             SET MY.ENABLE_TRIGGER, FALSE;
  1178.             sc_time_speed = MY._SPEED * TIME * -4;
  1179.             SET YOU,NULL;
  1180.             MOVE ME sc_time_speed, follow_grav;
  1181.             MY._COUNTER += 1 * TIME;
  1182.             sc_mov_rnd = 10 + RANDOM (70);
  1183.             IF (MY._COUNTER > sc_mov_rnd)
  1184.             {
  1185.                 MY._STATE = _NPC_ATTACK;
  1186.                 MY._COUNTER = 0;
  1187.                 SET MY.ENABLE_TRIGGER, TRUE;
  1188.             }
  1189.             CALL sc_grav_slope;
  1190.             CALL scorpio_attack_anim;
  1191.         }
  1192.         IF (MY._STATE == _NPC_WALK)
  1193.         {
  1194.             #    IF (RANDOM (512) > 510)
  1195.             #    {
  1196.             #        MY._STATE = _NPC_STOP;
  1197.             #    }
  1198.             ent_test = MY.ENTITY1;
  1199.             nav_direction.X = ent_test.X - MY.X;
  1200.             nav_direction.Y = ent_test.Y - MY.Y;
  1201.             nav_direction.Z = ent_test.Z - MY.Z;
  1202.             TO_ANGLE, to_nav_angle, nav_direction;
  1203.             MY.PAN += 0.1 * ANG (to_nav_angle.PAN - MY.PAN);
  1204.             sc_time_speed = MY._SPEED * TIME;
  1205.             SET YOU,NULL;
  1206.             MOVE ME sc_time_speed, follow_grav;
  1207.             CALL sc_grav_slope;
  1208.             CALL scorpio_walk_anim;
  1209.         }
  1210.         IF (MY._STATE == _NPC_STOP)
  1211.         {
  1212.             IF (RANDOM (512) > 510)
  1213.             {
  1214.                 MY._STATE = _NPC_WALK;
  1215.             }
  1216.             sc_time_speed = 0;
  1217.             SET YOU,NULL;
  1218.             MOVE ME sc_time_speed, follow_grav;
  1219.             CALL sc_grav_slope;
  1220.             CALL scorpio_walk_anim;
  1221.         }
  1222.         IF (MY._STATE == _NPC_DEAD)
  1223.         {
  1224.             sc_time_speed = 0;
  1225.             SET YOU,NULL;
  1226.             MOVE ME sc_time_speed, follow_grav;
  1227.             CALL sc_grav_slope;
  1228.             CALL big_scorpio_die_anim;
  1229.             PLAY_SOUND m_sc_dead_snd, 100;
  1230.             RETURN;
  1231.         }
  1232.         WAIT 1;
  1233.     }
  1234. }
  1235. ACTION set_scorpio_event
  1236. {
  1237.     SET MY.ENABLE_SCAN, TRUE;
  1238.     SET MY.ENABLE_SHOOT, TRUE;
  1239.     SET MY.ENABLE_ENTITY, TRUE;
  1240.     SET MY.EVENT, scorpio_event;
  1241. }
  1242. ACTION set_big_scorpio_event
  1243. {
  1244.     SET MY.ENABLE_SCAN, TRUE;
  1245.     SET MY.ENABLE_SHOOT, TRUE;
  1246.     SET MY.ENABLE_ENTITY, TRUE;
  1247.     SET MY.EVENT, big_scorpio_event;
  1248. }
  1249. ACTION player_event
  1250. {
  1251.     IF (EVENT_TYPE == EVENT_SCAN)
  1252.     {
  1253.         WHILE (1)
  1254.         {
  1255.             YOUR.ENTITY2 = ME;
  1256.             WAIT 1;
  1257.             YOUR._STATE = _NPC_ATTACK;
  1258.             RETURN;
  1259.         }
  1260.     }
  1261. }
  1262. ACTION scorpio_event
  1263. {
  1264.     IF (EVENT_TYPE == EVENT_ENTITY)
  1265.     {
  1266.         IF (YOU == player)
  1267.         {
  1268.             CALL sc_att_probe;
  1269.         }
  1270.  
  1271.         ELSE
  1272.         {
  1273.             IF (YOU._VWEAPON_TYPE == _VWEAPON_TYPE_DIRECT)
  1274.             {
  1275.                 // direct damage weapon (fireball)
  1276.                 CALL sc_def_probe;
  1277.             }
  1278.         }
  1279.         MY._STATE = _NPC_RETREAT;
  1280.         PLAY_ENTSOUND ME, m_sc_snd, 150;
  1281.     }
  1282.     IF (EVENT_TYPE == EVENT_TRIGGER)
  1283.     {
  1284.         WHILE (1)
  1285.         {
  1286.             MY.ENTITY2 = YOU;
  1287.             WAIT 1;
  1288.             MY._STATE = _NPC_ATTACK;
  1289.             RETURN;
  1290.         }
  1291.     }
  1292.     IF (EVENT_TYPE == EVENT_SHOOT)
  1293.     {
  1294.         WHILE (1)
  1295.         {
  1296.             SET __BLOODY, TRUE;
  1297.             CALL sc_def_probe;
  1298.             WAIT 1;
  1299.             SET __BLOODY, FALSE;
  1300.             RETURN;
  1301.         }
  1302.     }
  1303. }
  1304. ACTION big_scorpio_event
  1305. {
  1306.     IF (EVENT_TYPE == EVENT_ENTITY)
  1307.     {
  1308.         IF (YOU == player)
  1309.         {
  1310.             CALL sc_att_probe;
  1311.         }
  1312.         MY._STATE = _NPC_RETREAT;
  1313.         PLAY_ENTSOUND ME, sc_snd, 150;
  1314.     }
  1315.     IF (EVENT_TYPE == EVENT_TRIGGER)
  1316.     {
  1317.         WHILE (1)
  1318.         {
  1319.             WAIT 1;
  1320.             MY._STATE = _NPC_ATTACK;
  1321.             RETURN;
  1322.         }
  1323.     }
  1324.     IF (EVENT_TYPE == EVENT_SHOOT)
  1325.     {
  1326.         WHILE (1)
  1327.         {
  1328.             SET __BLOODY, TRUE;
  1329.             CALL sc_def_probe;
  1330.             WAIT 1;
  1331.             SET __BLOODY, FALSE;
  1332.             RETURN;
  1333.         }
  1334.     }
  1335. }
  1336.  
  1337.  
  1338.  
  1339. ACTION player_scan
  1340. {
  1341.     WHILE (1)
  1342.     {
  1343.         CALL scan_around;
  1344.         WAIT 1;
  1345.     }
  1346. }
  1347. ACTION scan_around
  1348. {
  1349.     MY_A.TILT = MY.TILT;
  1350.     MY_A.ROLL = MY.ROLL;
  1351.     MY_A.PAN = MY.PAN;
  1352.     MY_P.X = MY.X;
  1353.     MY_P.Y = MY.Y;
  1354.     MY_P.Z = MY.Z;
  1355.     SCAN MY_P, MY_A, scan_mode;
  1356.     MY.SCAN_RESULT = RESULT;
  1357. }
  1358. ACTION sc_grav_slope
  1359. {
  1360.     WAIT 1;
  1361.     SONAR ME, 4000;
  1362.     MY.FLOORDIST = RESULT;
  1363.     IF (MY.FLOORDIST > 7)
  1364.     {
  1365.         follow_grav.Z = -10;
  1366.     }
  1367.     ELSE
  1368.     {
  1369.         IF (MY.FLOORDIST < 1)
  1370.         {
  1371.             follow_grav.Z += 3;
  1372.         }
  1373.         ELSE
  1374.         {
  1375.             follow_grav.Z = 0;
  1376.         }
  1377.     }
  1378.     CALL scan_floor;
  1379.     // Adapt the scorpio angle to the floor slope
  1380.     MY_ANGLE.TILT = 0;
  1381.     MY_ANGLE.ROLL = 0;
  1382.     IF (my_height < 10 &&  (my_floornormal.X! = 0 || my_floornormal.Y! = 0))
  1383.     {
  1384.         // on a slope?
  1385.         // rotate the floor normal relative to the scorpio
  1386.         MY_ANGLE.PAN = -MY.PAN;
  1387.         VECROTATE my_floornormal, MY_ANGLE;
  1388.         // calculate the destination tilt and roll angles
  1389.         MY_ANGLE.TILT = -ASIN (my_floornormal.X);
  1390.         MY_ANGLE.ROLL = -ASIN (my_floornormal.Y);
  1391.     }
  1392.     // change the scorpio angles towards the destination angles
  1393.     MY.TILT += 0.2 * ANG (MY_ANGLE.TILT - MY.TILT);
  1394.     MY.ROLL += 0.2 * ANG (MY_ANGLE.ROLL - MY.ROLL);
  1395. }
  1396. ACTION scorpio_walk_anim
  1397. {
  1398.     sc_dist = SQRT (MY_SPEED.X * MY_SPEED.X + MY_SPEED.Y * MY_SPEED.Y);
  1399.     IF (sc_dist == 0)
  1400.     {
  1401.         #    MY.CYCLE = 1;    // standing
  1402.         RETURN;
  1403.     }
  1404.     MY.CYCLE += 0.32 * sc_dist;
  1405.     IF (MY.CYCLE < 2 || MY.CYCLE > 1 + 15)
  1406.     {
  1407.         PLAY_ENTSOUND ME, stein2_snd, 60;
  1408.         SET MY.__SOUND, 0;
  1409.         MY.CYCLE = 2;
  1410.     }
  1411.     IF ( (MY.CYCLE > 1 + 15 * 0.5) &&  (MY.__SOUND == 0))
  1412.     {
  1413.         PLAY_ENTSOUND ME, stein2_snd, 60;
  1414.         SET MY.__SOUND, 1;
  1415.     }
  1416.     RETURN;
  1417. }
  1418. ACTION scorpio_die_anim
  1419. {
  1420.     MY.CYCLE = 33;
  1421.     WHILE (MY.CYCLE <= 48)
  1422.     {
  1423.         MY.CYCLE += 1;
  1424.         testcycle = MY.CYCLE;
  1425.         WAIT 1;
  1426.     }
  1427.     RETURN;
  1428. }
  1429. ACTION big_scorpio_die_anim
  1430. {
  1431.     MY.CYCLE = 33;
  1432.     WHILE (MY.CYCLE <= 48)
  1433.     {
  1434.         MY.CYCLE += 1;
  1435.         testcycle = MY.CYCLE;
  1436.         WAIT 1;
  1437.     }
  1438.     SET give_exp, 1000;
  1439.     CALL vpst_check_exp;
  1440.     REMOVE PLATE;
  1441.     create_pos.X = 4570;
  1442.     create_pos.Y = -116;
  1443.     create_pos.Z = -400;
  1444.     CREATE <ruby.pcx>, create_pos, entity_ruby;
  1445.     REMOVE ME;
  1446.     RETURN;
  1447. }
  1448. ACTION scorpio_attack_anim
  1449. {
  1450.     IF (MY.CYCLE < 16 || MY.CYCLE > 32)
  1451.     {
  1452.         MY.CYCLE = 16;
  1453.     }
  1454.     MY.CYCLE += TIME;
  1455. }
  1456. ACTION drop_sc_shadow
  1457. {
  1458.     // create a shadow below the scorpio
  1459.     CREATE <sc_shad.pcx>, MY.POS, move_sc_shadow;
  1460. }
  1461. ACTION move_sc_shadow
  1462. {
  1463.     SET MY.AMBIENT, -80;
  1464.     SET MY.SCALE_X, 0.9;
  1465.     SET MY.SCALE_Y, 0.95;
  1466.     SET MY.TRANSPARENT, 1;
  1467.     SET MY.PASSABLE, 1;
  1468.     SET MY.ORIENTED, 1;
  1469.     WHILE (YOUR.INVISIBLE == 0)
  1470.     {
  1471.         MY.TILT = YOUR.TILT + 90; // set it flat onto the floor
  1472.         MY.ROLL = YOUR.ROLL;
  1473.         MY.PAN = YOUR.PAN;
  1474.         MY.X = YOUR.X;
  1475.         MY.Y = YOUR.Y;
  1476.         sc_height = YOUR.Z;
  1477.         sc_floor = YOUR.FLOORDIST;
  1478.         sc_min_z = YOUR.MAX_Z - YOUR.MIN_Z;
  1479.         IF (YOUR.FLOORDIST > 0)
  1480.         {
  1481.             MY.Z = sc_height - sc_floor - sc_min_z - 3;
  1482.         }
  1483.         IF (YOUR._STATE == _NPC_DEAD)
  1484.         {
  1485.             MY.PAN += 180;
  1486.             RETURN;
  1487.         }
  1488.         WAIT 1;
  1489.     }
  1490.     REMOVE ME;
  1491. }
  1492.  
  1493.  
  1494.  
  1495.