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

  1. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  3. //
  4. // global/zonespawner.scr
  5. //
  6. // author: Michael Goodwin
  7. //
  8. // description:
  9. //
  10. // - forthcoming
  11. //
  12. // setup:
  13. //
  14. //   place AI soldiers in level with $targetname set to "zonespawner"
  15. //   assign a group/set number using the #set property
  16. //   at startup, the soldiers are converted into spawners
  17. //   when the soldier is spawned:
  18. //   - if the #playerseek property is non-zero, the soldier will seek the player
  19. //   - if the solider is linked to a pathnode, the soldier will run to the pathnode
  20. //     and continue running the linked pathnodes
  21. //
  22. //   place trigger_multiple entities in level with $targetname set to "zonespawneron"
  23. //   assign a group/set number using the #set property
  24. //   these triggers turn ON the corresponding spawner(s) and any soldier(s) spawned
  25. //
  26. //   place trigger_multiple entities in level with $targetname set to "zonespawneroff"
  27. //   assign a group/set number using the #set property
  28. //   these triggers turn OFF the corresponding spawner(s) and any soldier(s) spawned
  29. //
  30. //   place trigger_multiple entities in level with $targetname set to "zonespawnerkill"
  31. //   assign a group/set number using the #set property
  32. //   these triggers KILL the corresponding spawner(s) and any soldier(s) spawned
  33. //
  34. //   to enable this system, include the following line in the level script file (after prespawn):
  35. //       exec global/zonespawner.scr
  36. //
  37. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  38. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  39. main:
  40.  
  41.     // convert zonespawners into script_object markers
  42.     if ( $zonespawner == NULL )
  43.         level.zonespawners = 0
  44.     else
  45.         level.zonespawners = $zonespawner.size
  46.  
  47.     if ( level.zonespawners > 0 )
  48.     {
  49.         level.zonespawner = exec global/makearray.scr $zonespawner
  50.  
  51.         for ( local.i = 1; local.i < level.zonespawners + 1; local.i++ )
  52.         {
  53.             if ( level.zonespawner[local.i].playerseek == NIL )
  54.                 level.zonespawner[local.i].playerseek = 0
  55.  
  56.             if ( level.zonespawner[local.i].model == NIL )
  57.                 exec global/error.scr ("Error, zonespawner at " + level.zonespawner[local.i].origin + " has no model") 1
  58.  
  59.             if ( level.zonespawner[local.i].set == NIL )
  60.                 exec global/error.scr ("Error, zonespawner at " + level.zonespawner[local.i].origin + " has no #set") 1
  61.  
  62.             // create a generator in place of this soldier
  63.             level.zonespawner[local.i] = waitthread zonespawner_create level.zonespawner[local.i]
  64.  
  65.             // set up for generator operation
  66.             level.zonespawner[local.i].zonestate = 0
  67.             level.zonespawner[local.i].zonesoldier = NULL
  68.             level.zonespawner[local.i].limbosoldier = NULL
  69.             level.zonespawner[local.i] thread zonegenerator
  70.         }
  71.  
  72. //        println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Spawned " + level.zonespawners + " zonespawners")
  73.     }
  74.  
  75.     // convert zonespawneron triggers
  76.     if ( $zonespawneron == NULL )
  77.         level.zonespawnerons = 0
  78.     else
  79.         level.zonespawnerons = $zonespawneron.size
  80.  
  81.     if ( level.zonespawnerons > 0 )
  82.     {
  83.         level.zonespawneron = exec global/makearray.scr $zonespawneron
  84.  
  85.         for ( local.i = 1; local.i < level.zonespawnerons + 1; local.i++ )
  86.         {
  87.             if ( level.zonespawneron[local.i].set == NIL )
  88.                 exec global/error.scr ("Error, zonespawneron trigger at " + level.zonespawneron[local.i].origin + " has no #set") 1
  89.  
  90.             level.zonespawneron[local.i] setthread zonespawnertriggeron
  91.         }
  92.  
  93. //        println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Found " + level.zonespawnerons + " zonespawner ON triggers")
  94.     }
  95.  
  96.     // convert zonespawneroff triggers
  97.     if ( $zonespawneroff == NULL )
  98.         level.zonespawneroffs = 0
  99.     else
  100.         level.zonespawneroffs = $zonespawneroff.size
  101.  
  102.     if ( level.zonespawneroffs > 0 )
  103.     {
  104.         level.zonespawneroff = exec global/makearray.scr $zonespawneroff
  105.  
  106.         for ( local.i = 1; local.i < level.zonespawneroffs + 1; local.i++ )
  107.         {
  108.             if ( level.zonespawneroff[local.i].set == NIL )
  109.                 exec global/error.scr ("Error, zonespawneroff trigger at " + level.zonespawneroff[local.i].origin + " has no #set") 1
  110.  
  111.             level.zonespawneroff[local.i] setthread zonespawnertriggeroff
  112.         }
  113.  
  114. //        println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Found " + level.zonespawneroffs + " zonespawner OFF triggers")
  115.     }
  116.  
  117.     // convert zonespawnerkill triggers
  118.     if ( $zonespawnerkill == NULL )
  119.         level.zonespawnerkills = 0
  120.     else
  121.         level.zonespawnerkills = $zonespawnerkill.size
  122.  
  123.     if ( level.zonespawnerkills > 0 )
  124.     {
  125.         level.zonespawnerkill = exec global/makearray.scr $zonespawnerkill
  126.  
  127.         for ( local.i = 1; local.i < level.zonespawnerkills + 1; local.i++ )
  128.         {
  129.             if ( level.zonespawnerkill[local.i].set == NIL )
  130.                 exec global/error.scr ("Error, zonespawnerkill trigger at " + level.zonespawnerkill[local.i].origin + " has no #set") 1
  131.  
  132.             level.zonespawnerkill[local.i] setthread zonespawnertriggerkill
  133.         }
  134.  
  135. //        println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Found " + level.zonespawnerkills + " zonespawner KILL triggers")
  136.     }
  137.  
  138. end
  139.  
  140.  
  141. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  142. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  143. // this thread runs on the level
  144. //   this replaces the soldier with a script_object
  145. //
  146. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  147. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  148. zonespawner_create local.soldier:
  149.  
  150.     if ( local.soldier )
  151.     {
  152.         local.spawner = spawn script_origin
  153.  
  154.         local.spawner.origin                    = local.soldier.origin
  155.         local.spawner.type_idle                    = local.soldier.type_idle
  156.         local.spawner.type_attack                = local.soldier.type_attack
  157.         local.spawner.type_disguise                = local.soldier.type_disguise
  158.         local.spawner.type_grenade                = local.soldier.type_grenade
  159.         local.spawner.hearing                    = local.soldier.hearing
  160.         local.spawner.sight                        = local.soldier.sight
  161.         local.spawner.fov                        = local.soldier.fov
  162.         local.spawner.leash                        = local.soldier.leash
  163.         local.spawner.mindist                    = local.soldier.mindist
  164.         local.spawner.maxdist                    = local.soldier.maxdist
  165.         local.spawner.health                    = local.soldier.health
  166.         local.spawner.sound_awareness            = local.soldier.sound_awareness
  167.         local.spawner.noticescale                = local.soldier.noticescale
  168.         local.spawner.fixedleash                = local.soldier.fixedleash
  169.         local.spawner.enemysharerange            = local.soldier.enemysharerange
  170.         local.spawner.voicetype                    = local.soldier.voicetype
  171.         local.spawner.accuracy                    = local.soldier.accuracy
  172.         local.spawner.ammo_grenade                = local.soldier.ammo_grenade
  173.         local.spawner.gren_awareness            = local.soldier.gren_awareness
  174.         local.spawner.nosurprise                = local.soldier.nosurprise
  175.         local.spawner.disguise_range            = local.soldier.disguise_range
  176.         local.spawner.disguise_period            = local.soldier.disguise_period
  177.         local.spawner.disguise_accept_thread    = local.soldier.disguise_accept_thread
  178.         local.spawner.disguise_level            = local.soldier.disguise_level
  179.         local.spawner.patrolpath                = local.soldier.patrolpath
  180.         local.spawner.waittrigger                = local.soldier.waittrigger
  181.         local.spawner.turret                    = local.soldier.turret
  182.         local.spawner.alarmnode                    = local.soldier.alarmnode
  183.         local.spawner.alarmthread                = local.soldier.alarmthread
  184.         local.spawner.set                        = local.soldier.set
  185.         local.spawner.group                        = local.soldier.group
  186.         local.spawner.healthchance                = local.soldier.healthchance
  187.         local.spawner.area                        = local.soldier.area
  188.         local.spawner.enemyname                    = local.soldier.enemyname
  189.         local.spawner.playerseek                = local.soldier.playerseek
  190.         local.spawner.fnum                        = local.soldier.fnum
  191.         local.spawner.turndoneerror                = local.soldier.turndoneerror
  192.         local.spawner.threatbias                = local.soldier.threatbias
  193.         local.spawner.radnum                    = local.soldier.radnum
  194.         local.spawner.balconyheight                = local.soldier.balconyheight
  195.         local.spawner.pause                        = local.soldier.pause
  196.  
  197.         local.spawner.spawn_target                = local.soldier.target
  198.         local.spawner.spawn_angle                = local.soldier.angle
  199.         local.spawner.spawn_weapon                = local.soldier.weapon
  200.         local.spawner.spawn_model                = local.soldier.model
  201.         local.spawner.spawn_targetname            = local.soldier.targetname
  202.  
  203.         local.soldier remove
  204.     }
  205.     else
  206.     {
  207.         println "^~^~^ zonespawner_create ERROR:  person does not exist in the level, aborting conversion to spawner!!!"
  208.     }
  209.  
  210. end local.spawner
  211.  
  212.  
  213. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  214. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  215. // this thread runs on the level
  216. //   this returns a soldier from the script_object
  217. //
  218. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  219. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  220. zonespawner_activate local.spawner:
  221.  
  222.     if ( local.spawner )
  223.     {
  224.         local.soldier = spawn local.spawner.spawn_model voicetype local.spawner.voicetype origin local.spawner.origin
  225.  
  226.         local.soldier.type_idle                    = local.spawner.type_idle
  227.         local.soldier.type_attack                = local.spawner.type_attack
  228.         local.soldier.type_disguise                = local.spawner.type_disguise
  229.         local.soldier.type_grenade                = local.spawner.type_grenade
  230.         local.soldier.hearing                    = local.spawner.hearing
  231.         local.soldier.sight                        = local.spawner.sight
  232.         local.soldier.fov                        = local.spawner.fov
  233.         local.soldier.leash                        = local.spawner.leash
  234.         local.soldier.mindist                    = local.spawner.mindist
  235.         local.soldier.maxdist                    = local.spawner.maxdist
  236.         local.soldier.health                    = local.spawner.health
  237.         local.soldier.sound_awareness            = local.spawner.sound_awareness
  238.         local.soldier.noticescale                = local.spawner.noticescale
  239.         local.soldier.fixedleash                = local.spawner.fixedleash
  240.         local.soldier.enemysharerange            = local.spawner.enemysharerange
  241.         local.soldier.accuracy                    = local.spawner.accuracy
  242.         local.soldier.ammo_grenade                = local.spawner.ammo_grenade
  243.         local.soldier.gren_awareness            = local.spawner.gren_awareness
  244.         local.soldier.nosurprise                = local.spawner.nosurprise
  245.         local.soldier.disguise_range            = local.spawner.disguise_range
  246.         local.soldier.disguise_period            = local.spawner.disguise_period
  247.         local.soldier.disguise_accept_thread    = local.spawner.disguise_accept_thread
  248.         local.soldier.disguise_level            = local.spawner.disguise_level
  249.         local.soldier.patrolpath                = local.spawner.patrolpath
  250.         local.soldier.waittrigger                = local.spawner.waittrigger
  251.         local.soldier.turret                    = local.spawner.turret
  252.         local.soldier.alarmnode                    = local.spawner.alarmnode
  253.         local.soldier.alarmthread                = local.spawner.alarmthread
  254.         local.soldier.set                        = local.spawner.set
  255.         local.soldier.group                        = local.spawner.group
  256.         local.soldier.healthchance                = local.spawner.healthchance
  257.         local.soldier.area                        = local.spawner.area
  258.         local.soldier.enemyname                    = local.spawner.enemyname
  259.         local.soldier.playerseek                = local.spawner.playerseek
  260.         local.soldier.fnum                        = local.spawner.fnum
  261.         local.soldier.turndoneerror                = local.spawner.turndoneerror
  262.         local.soldier.threatbias                = local.spawner.threatbias
  263.         local.soldier.radnum                    = local.spawner.radnum
  264.         local.soldier.balconyheight                = local.spawner.balconyheight
  265.         local.soldier.pause                        = local.spawner.pause
  266.  
  267.         local.soldier.target                    = local.spawner.spawn_target
  268.         local.soldier.angle                        = local.spawner.spawn_angle
  269.         local.soldier.weapon                    = local.spawner.spawn_weapon
  270.     }
  271.     else
  272.     {
  273.         println "^~^~^ zonespawner_activate ERROR:  spawner does not exist in the level, aborting activation!!!"
  274.     }
  275.  
  276. end local.soldier
  277.  
  278.  
  279. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  280. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  281. // this thread turns off all generators
  282. //   of the specified set
  283. //
  284. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  285. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  286. zonespawners_off local.set:
  287.  
  288.     if ( level.zonespawners > 0 )
  289.     {
  290.         for ( local.i = 1; local.i < level.zonespawners + 1; local.i++ )
  291.         {
  292.             if ( level.zonespawner[local.i].set == local.set )
  293.             {
  294.                 level.zonespawner[local.i].zonestate = 0
  295.             }
  296.         }
  297.     }
  298.  
  299. end
  300.  
  301.  
  302. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  303. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  304. // this thread turns on all generators
  305. //   of the specified set
  306. //
  307. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  308. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  309. zonespawners_on local.set:
  310.  
  311.     if ( level.zonespawners > 0 )
  312.     {
  313.         for ( local.i = 1; local.i < level.zonespawners + 1; local.i++ )
  314.         {
  315.             if ( level.zonespawner[local.i].set == local.set )
  316.             {
  317.                 level.zonespawner[local.i].zonestate = 1
  318.             }
  319.         }
  320.     }
  321.  
  322. end
  323.  
  324.  
  325. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  326. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  327. // this thread kills all generators
  328. //   of the specified set
  329. //
  330. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  331. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  332. zonespawners_kill local.set:
  333.  
  334.     if ( level.zonespawners > 0 )
  335.     {
  336.         for ( local.i = 1; local.i < level.zonespawners + 1; local.i++ )
  337.         {
  338.             if ( level.zonespawner[local.i].set == local.set )
  339.             {
  340.                 level.zonespawner[local.i].zonestate = 2
  341.             }
  342.         }
  343.     }
  344.  
  345. end
  346.  
  347.  
  348. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  349. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  350. // this thread runs on a zonespawner
  351. //   when it is is "generation" mode
  352. //
  353. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  354. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  355. zonegenerator:
  356.  
  357.     local.running = 1
  358.     local.laststate = self.zonestate
  359.  
  360.     while ( local.running == 1 )
  361.     {
  362.         if ( local.laststate == self.zonestate )
  363.         {
  364.             // status quo
  365.             if ( self.zonestate == 1 )
  366.             {
  367.                 // running
  368.                 if ( (self.zonesoldier == NULL) || (!isAlive self.zonesoldier) )
  369.                 {
  370. //                    println "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` spawning a soldier"
  371.                     local.soldier = waitthread zonespawner_activate self
  372.                     local.soldier waitthread zonespawned
  373.                     local.soldier.health = 1        // TEMP
  374.  
  375.                     self.zonesoldier = local.soldier
  376.                 }
  377.             }
  378.             else
  379.             {
  380.                 // generator off
  381.             }
  382.         }
  383.         else
  384.         {
  385.             // switching states
  386.             if ( self.zonestate == 0 )
  387.             {
  388.                 // switched off
  389. //                println "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` gen switched off"
  390.                 if ( (self.limbosoldier == NULL) && (self.zonesoldier != NULL) )
  391.                 {
  392. //                    println "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` sending to limbo"
  393.                     self.zonesoldier pauseanims 1
  394.                     self.zonesoldier exec global/disable_ai.scr
  395.                     self.zonesoldier notsolid
  396.                     self.zonesoldier hide
  397.                     self.limbosoldier = self.zonesoldier
  398.                 }
  399.             }
  400.             else if ( self.zonestate == 1 )
  401.             {
  402.                 // switched on
  403. //                println "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` gen switched on"
  404.                 if ( (self.limbosoldier != NULL) && (self.zonesoldier != NULL) )
  405.                 {
  406. //                    println "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` returning from limbo"
  407.                     self.zonesoldier pauseanims 0
  408.                     self.zonesoldier exec global/enable_ai.scr
  409.                     self.zonesoldier solid
  410.                     wait 0.1
  411.                     self.zonesoldier show
  412.                     self.limbosoldier = NULL
  413.                 }
  414.             }
  415.             else if ( self.zonestate == 2 )
  416.             {
  417.                 // killed
  418. //                println "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` gen killed"
  419.                 if ( self.zonesoldier != NULL )
  420.                 {
  421.                     self.zonesoldier remove
  422.                 }
  423.                 local.running = 0
  424.             }
  425.         }
  426.  
  427.         local.laststate = self.zonestate
  428.         wait 0.1
  429.     }
  430.  
  431. end
  432.  
  433.  
  434. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  435. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  436. // this thread runs on the soldier that has
  437. //   just been spawned
  438. //
  439. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  440. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  441. zonespawned:
  442.  
  443.     if ( self.playerseek != 0 )
  444.     {
  445.         self.nosuprise = 1
  446.         self runto $player
  447.     }
  448.     else if ( self.target != NIL )
  449.     {
  450.         self runto self.target
  451.         self waittill movedone
  452.     }
  453.  
  454. end
  455.  
  456.  
  457. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  458. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  459. // this thread runs on the zonespawneron trigger
  460. //   when it is tripped
  461. // 
  462. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  463. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  464. zonespawnertriggeron:
  465.  
  466.     thread zonespawners_on self.set
  467.  
  468. end
  469.  
  470.  
  471. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  472. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  473. // this thread runs on the zonespawneroff trigger
  474. //   when it is tripped
  475. //
  476. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  477. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  478. zonespawnertriggeroff:
  479.  
  480.     thread zonespawners_off self.set
  481.  
  482. end
  483.  
  484.  
  485. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  486. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  487. // this thread runs on the zonespawnerkill trigger
  488. //   when it is tripped
  489. //
  490. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  491. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  492. zonespawnertriggerkill:
  493.  
  494.     thread zonespawners_kill self.set
  495.  
  496. end
  497.