home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 2003 June / macformat-130.iso / mac / Reviewed⁄Demos / Spearhead Demo / demota / pak1.pk3 / global / bomber.scr < prev    next >
Encoding:
Text File  |  2002-10-21  |  12.1 KB  |  523 lines

  1. //    Plane/bombing system created by Mackey McCandlish.
  2. //
  3. //    Before level waittill spawn "exec global/bomber.scr".
  4. //
  5. //    Used in m3l3, m4l0, m5l1a, m5l1b, m5l3, m3l3, training, and maybe someplace else, who can say? (One of the DM levels too).
  6. //
  7. //    Created a info_splinepath and click model and choose the plane you want to use. Choose one that ends with fly.tik.
  8. //
  9. //    Copy the info_splinepath into a big line of them, of where you want the plane to fly through space.
  10. //
  11. //    Link them all together.
  12. //
  13. //    Give the first one a targetname of "bomberpath"
  14. //
  15. //    Set this one's $mdl value to be equal to its model value.
  16. //
  17. //    Rotate each individual info_splinepath. The way its rotated will determine what position the plane will be in when it flies
  18. //    through that point in space.
  19. //
  20. //    You can set the "speed" key to multiplicably values. This defaults to 1. If you think 1 is too fast, set all the splines
  21. //    to a .speed of 0.5. Or set half of them to 0.5, and for that half the plane will fly at half speed.
  22. //
  23. //    You can make the planes drop bombs by setting up similar paths using the model "ammo/us_bomb.tik", and the first spline
  24. //    on the path has targetname "bomber".
  25. //
  26. //    Both the "bomber" and the "bomberpath" entities are given the same #set value, to associate them. You can give the bombers
  27. //    a $setthread value to make them run a thread in the level.script upon impact. They automatically do an explosion when they
  28. //    reach the end of their path.
  29. //
  30. //    You can make triggers for the bombers with "trigger_multiple"s that have a targetname "bombertrigger" and the same #set 
  31. //    number as the bomberpath, or you can do "thread global/bomber.scr::bomb #" where # is the #set number in question.
  32.  
  33. main:
  34.     println "-- Loading Plane Bombing SCR"
  35.  
  36.     if (level.flyplane == NIL)
  37.         level.flyplane = 1
  38.  
  39.  
  40.  
  41.  
  42. //    if (level.bombsdropped == NULL)
  43.     level.bombsdropped = 0
  44.  
  45.     if ($friend == NULL)
  46.         level.friends = 0
  47.         else
  48.         level.friends = $friend.size
  49.  
  50.     if (level.friends > 0)
  51.         level.friend = exec global/makearray.scr $friend
  52.  
  53.     if ($bomber == NULL)
  54.         level.bombers = 0
  55.         else
  56.         level.bombers = $bomber.size
  57.  
  58.     if (level.bombers > 0)
  59.     {
  60.         level.bomber = exec global/makearray.scr $bomber
  61.  
  62.         for (local.i=1;local.i<level.bombers+1;local.i++)
  63.         {
  64.             if (level.bomber[local.i].loop == NIL)
  65.                 level.bomber[local.i].loop = 0
  66.  
  67.             level.bomber[local.i] hide
  68.             level.bomber[local.i] notsolid
  69.  
  70.             if (level.bomber[local.i].set == NIL)
  71.                 exec global/error.scr "Error, bomber has no #set" 1
  72.                 else
  73.                 println ("Spawned Bomber " + level.bomber[local.i].set)
  74.             local.set = level.bomber[local.i].set
  75.         }
  76.     }
  77.  
  78.     if ($bomberpath == NULL)
  79.         level.bomberpaths = 0
  80.         else
  81.         level.bomberpaths = $bomberpath.size
  82.  
  83.     if (level.bomberpaths > 0)
  84.     {
  85.         level.bomberpath = exec global/makearray.scr $bomberpath
  86.  
  87.         for (local.i=1;local.i<level.bomberpaths+1;local.i++)
  88.         {
  89. //            level.bomberpath[local.i] hide
  90. //            level.bomberpath[local.i] notsolid
  91.  
  92.             if (level.bomberpath[local.i].mdl)
  93.             println ("model is " + level.bomberpath[local.i].mdl)
  94.             else
  95.             println ("model is NONE")
  96.  
  97.  
  98.             if (level.bomberpath[local.i].set == NIL)
  99.                 exec global/error.scr "Error, bomberpath has no #set" 1
  100.                 else
  101.                 println ("Spawned BomberPath " + level.bomberpath[local.i].set)
  102.             local.set = level.bomberpath[local.i].set
  103.         }
  104.     }
  105.  
  106.     if ($bombertrigger == NULL)
  107.         level.bombertriggers = 0
  108.         else
  109.         level.bombertriggers = $bombertrigger.size
  110.  
  111.     if (level.bombertriggers > 0)
  112.     {
  113.         level.bombertrigger = exec global/makearray.scr $bombertrigger
  114.  
  115.         for (local.i=1;local.i<level.bombertriggers+1;local.i++)
  116.         {
  117.             level.bombertriggerset[level.bombertrigger[local.i].set] = 0
  118.             level.bombertrigger[local.i] thread bombertrigger
  119.  
  120.             if (level.bombertrigger[local.i].set == NIL)
  121.                 exec global/error.scr "Error, bombertrigger has no #set" 1
  122.                 else
  123.                 println ("Spawned BomberTrigger " + level.bombertrigger[local.i].set)
  124.             local.set = level.bombertrigger[local.i].set
  125.         }
  126.     }
  127.  
  128.  
  129.     if ($bomberspeaker == NULL)
  130.         level.bomberspeakers = 0
  131.         else
  132.         level.bomberspeakers = $bomberspeaker.size
  133.  
  134.     if (level.bomberspeakers > 0)
  135.     {
  136.         level.bomberspeaker = exec global/makearray.scr $bomberspeaker
  137.  
  138.         for (local.i=1;local.i<level.bomberspeakers+1;local.i++)
  139.         {
  140.             if (level.bomberspeaker[local.i].set == NIL)
  141.                 exec global/error.scr "Error, bomberspeaker has no #set" 1
  142.                 else
  143.                 println ("Spawned bomberspeaker " + level.bomberspeaker[local.i].set)
  144.             local.set = level.bomberspeaker[local.i].set
  145.         }
  146.     }
  147.  
  148.  
  149.  
  150. end
  151.  
  152. repeat:
  153. level waittill spawn
  154. wait 2
  155. level.bomberrepeat = 1
  156. end
  157.  
  158.  
  159. bombertrigger:
  160.     level.bombertimer[self.set] = level.time
  161.     level waittill spawn
  162.     self waittill trigger
  163. //    println AHA
  164.     if (level.bombertriggerset[self.set] == 0)
  165.     if (level.time > level.bombertimer[self.set])
  166.     { 
  167.         level.bombertriggerset[self.set] = 1
  168.         println ("threaded " + self.set)
  169.         level.bombertimer[self.set] = level.time + 6
  170.         thread bomb self.set
  171.     }
  172.     wait 15
  173.  
  174.     if (level.bomberrepeat == 1)
  175.     goto bombertrigger
  176. end
  177.  
  178.  
  179. delayplaysound local.delay local.sound:
  180. wait local.delay
  181. self playsound (local.sound) 0 1 512
  182. end
  183.  
  184. firelight:
  185.     if (self.fire == NIL)
  186.     end
  187.  
  188.     local.r = 0.5 + randomfloat (0.8)
  189.     local.g = 0.4 + randomfloat (0.6)
  190.     
  191.     self lightRed (local.r)
  192.     self lightGreen (local.g)
  193.  
  194.     wait 0.2
  195.     goto firelight
  196. end
  197.  
  198.  
  199. fireoff local.name:
  200.  
  201.     for (local.i=1;local.i<level.exploderfires + 1;local.i++)
  202.     {
  203.         if (level.exploderfire[local.i].set == local.name)
  204.         {
  205.             level.exploderfire[local.i] hide
  206.  
  207.             if (level.exploderfire[local.i].fire != NIL)
  208.             {
  209.                 level.exploderfire[local.i] lightOff
  210.                 level.exploderfire[local.i] stoploopsound
  211.                 level.exploderfire[local.i].thread delete
  212.             }
  213.         }
  214.     }
  215.  
  216.  
  217. end
  218.  
  219.  
  220. fireon local.name:
  221.     for (local.i=1;local.i<level.exploderfires + 1;local.i++)
  222.     {
  223.         if (level.exploderfire[local.i].set == local.name)
  224.         {
  225.             level.exploderfire[local.i] show
  226.             level.exploderfire[local.i] anim start
  227.  
  228.             if (level.exploderfire[local.i].fire != NIL)
  229.             {
  230.                 level.exploderfire[local.i] lightOn    
  231.  
  232. /*
  233.                 if (randomint(100) > 50)
  234.                     level.exploderfire[local.i] loopsound "sound/environment/fire_small.wav" 1.5 256
  235.                 else
  236.                 level.exploderfire[local.i] loopsound "sound/environment/fire_big.wav" 1.5 256    
  237. */
  238.                 level.exploderfire[local.i] thread firelight
  239.                 level.exploderfire[local.i].thread = parm.previousthread
  240.             }
  241.         }
  242.     }
  243.  
  244.  
  245. end
  246.  
  247. fireinit local.name:
  248.     for (local.i=1;local.i<level.exploderfires + 1;local.i++)
  249.     {
  250.         if (level.exploderfire[local.i].set == local.name)
  251.         if (level.exploderfire[local.i].fire != NIL)
  252.         {
  253.             level.exploderfire[local.i] light (1.0 0.8 0.0)
  254.         }
  255.     }
  256.  
  257. end
  258.  
  259. showorg:
  260.     println self.origin
  261.     wait 0.1
  262.     if (self)
  263.     thread showorg
  264. end
  265.  
  266.  
  267. flyplane local.i local.model local.sound local.smoke:
  268.             println ("using model " + local.model)
  269.  
  270.             if (local.smoke)
  271.             {
  272.                 local.ent = spawn emitters/plane_smoke.tik
  273.                 local.ent glue self
  274.             }
  275.  
  276.             self model local.model
  277. //            self model self.model
  278. //            self model "vehicles/tigertank.tik"
  279.             self.origin = level.bomberpath[local.i].origin 
  280.             self scale 0.5
  281. //            wait 1
  282.             if (self.pause != NIL)
  283.             wait self.pause
  284.  
  285.             if (level.flyplane == 0)            
  286.                 self flypath level.bomberpath[local.i] 1500 2000 256
  287.             else
  288.                 self followpath level.bomberpath[local.i]
  289.  
  290.  
  291. //            self thread showorg
  292. //            local.thread = parm.previousthread
  293.  
  294.             if (local.sound != NIL)
  295.             {
  296.                 wait 2
  297.                 self playsound airplane
  298.                 println "playin sound"
  299.             }
  300.  
  301.             self waitmove
  302. //            local.thread delete
  303.             if (local.smoke)
  304.                 local.ent delete
  305.             self delete
  306.  
  307.  
  308. end
  309.  
  310.  
  311. bomberspeaker local.name:
  312.     if (self.pause != NIL)
  313.         wait self.pause
  314.  
  315.     if (self.sound == NIL)
  316.         self.sound = "airplane"
  317.  
  318.     self playsound self.sound
  319.  
  320. end
  321.  
  322.  
  323. bomb local.name local.sound:
  324.  
  325.     if (getcvar(debug) == "1")
  326.         println ("bombed " + local.name)
  327.  
  328.     for (local.i=1;local.i<level.bomberpaths+1;local.i++)
  329.     {
  330.         if (local.name == level.bomberpath[local.i].set)
  331.         {
  332.             spawn script_model "targetname" ("bomberplane" + level.bomberpath[local.i].set) "spawnflags" "2"
  333.  
  334.             if (level.bomberpath[local.i].mdl != NIL)
  335.                 local.model = level.bomberpath[local.i].mdl
  336.                 else
  337.                 local.model = "vehicles/p47fly.tik"
  338.  
  339.             if (level.bomberpath[local.i].smoke != NIL)
  340.                 $("bomberplane" + level.bomberpath[local.i].set) thread flyplane local.i local.model local.sound 1
  341.             else
  342.                 $("bomberplane" + level.bomberpath[local.i].set) thread flyplane local.i local.model local.sound
  343.  
  344.         }
  345.     }
  346.  
  347.  
  348.     for (local.i=1;local.i<level.bomberspeakers+1;local.i++)
  349.     {
  350.         if (level.bomberspeaker[local.i].set == local.name)
  351.         {
  352.             level.bomberspeaker[local.i] thread bomberspeaker local.name
  353. //            local.i = level.bomberspeakers + 5
  354.         }
  355.     }
  356.  
  357.     for (local.i=1;local.i<level.bombers+1;local.i++)
  358.     {
  359.         if (local.name == level.bomber[local.i].set)
  360.         {
  361.             if (level.bomber[local.i].loop == 0)
  362.             {
  363.                 level.bomber[local.i].loop = -1
  364.                 level.bomber[local.i] thread bombdrop local.name local.i
  365.             }
  366.             else
  367.             if (level.bomber[local.i].loop == 1)
  368.                 level.bomber[local.i] thread bombdrop local.name local.i
  369.  
  370.         }
  371.     }
  372. end
  373.  
  374. bombdrop local.name local.num:
  375.     local.range = vector_length (self.origin - $("bomberplane" + local.name).origin) + 100
  376.     local.oldrange = local.range
  377.  
  378. //        println local.range
  379.     local.time = level.time + 1
  380. //    while ((local.range < local.oldrange) || (local.range > 500))
  381.     while (level.time < local.time)
  382.     {
  383.         wait 0.1
  384.     }
  385.      while (local.range > 200)
  386.     {
  387.         local.oldrange = local.range
  388.         local.range = vector_length (self.origin - $("bomberplane" + local.name).origin)
  389.         wait 0.1
  390.     }
  391.  
  392.     local.ent = spawn script_model "spawnflags" "2"
  393.     local.ent playsound drop_bomb
  394.     local.ent.origin = self.origin
  395.  
  396.  
  397.     local.ent playsound drop_bomb
  398.     
  399.     local.ent model "ammo/us_bomb.tik"
  400.     local.ent notsolid
  401.     local.ent scale 1
  402.  
  403.     if (getcvar(bigbomb) == "1")
  404.         local.ent scale 10
  405.  
  406.     local.ent flypath self 2500 2000 256
  407.     // speed accell lookahead
  408.     local.ent waitmove
  409.     
  410.  
  411.     thread spawntankshot local.ent.origin
  412.     if (self.setthread)
  413.     {
  414.         println ("Bomb from set " + local.name + " threading " + self.setthread)
  415.         local.ent thread level.script::self.setthread
  416.     }
  417.     if (self.explode)
  418.     {
  419.         println ("Bomb from set " + local.name + " exploding " + self.explode)
  420.         thread global/exploder.scr::explode self.explode
  421.     }
  422.     local.ent delete
  423.  
  424. end
  425.  
  426. phyvel local.vec:
  427.     self physics_velocity ( local.vec )
  428.     wait 0.2
  429.     self physics_on 1
  430.     self physics_velocity ( local.vec )
  431.     
  432.  
  433. end
  434.  
  435. explodetouch:
  436.     level waittill spawn
  437.  
  438. self waittill touch
  439. //println self.velocity
  440.  
  441. if (parm.other == $world)
  442.     thread moveitout self.velocity[2]
  443. //  println parm.other
  444. //    self hide
  445. end
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452. waitplaysound local.waiter local.sound local.chan local.vol local.range:
  453.     wait local.waiter
  454.     self playsound local.sound local.chan local.vol local.range
  455.     
  456. end
  457.  
  458.  
  459. /*
  460.     models/emitters/mortar_higgins
  461.     models/emitters/explosion_mine.tik
  462.     models/emitters/explosion_tank.tik
  463.     models/emitters/explosion_bombdirt.tik
  464.  
  465. */
  466.  
  467.  
  468. tankkill local.hit local.vec:
  469.     if !(isalive $(local.hit))
  470.     end
  471.  
  472.  
  473.     if ((vector_length (local.vec - local.hit.origin)) < 350)
  474.     {
  475.         local.hit.health = local.hit.health - 10000
  476.  
  477.     local.rand = randomint(4) + 1
  478.         if (local.rand == 1)
  479.         {
  480.         local.hit exec global/setdeathanim.scr "death_mortar_twist"
  481.             local.hit exec global/bullethit.scr local.vec 500 25 1
  482.     
  483.         }
  484.         else
  485.         if (local.rand == 2)
  486.         {
  487.         local.hit exec global/setdeathanim.scr "death_mortar_high"
  488.             local.hit exec global/bullethit.scr local.vec 500 25 1
  489.         }
  490.         else
  491.         if (local.rand == 3)
  492.         {
  493.         local.hit exec global/setdeathanim.scr "death_mortar_medium"
  494.             local.hit exec global/bullethit.scr local.vec 500 25 1
  495.         }
  496.         else
  497.         {
  498.             local.hit exec global/setdeathanim.scr "death_mortar_flip"
  499.             local.hit exec global/bullethit.scr local.vec 500 25 1
  500.         }
  501.     }
  502.  
  503. end
  504.  
  505.  
  506. killwithboom local.vec:
  507.     for (local.i=1;local.i<level.friends+1;local.i++)
  508.     {
  509.         thread tankkill level.friend[local.i] local.vec
  510.     }
  511. end
  512.  
  513.  
  514.  
  515. spawntankshot local.vec:
  516.  
  517.     exec global/model.scr local.vec "models/emitters/explosion_mine.tik"
  518.  
  519.     thread killwithboom local.vec
  520.     radiusdamage local.vec 500 500
  521.  
  522. end
  523.