home *** CD-ROM | disk | FTP | other *** search
/ Quaker's Paradise / Quakers_Paradise.iso / div / sacrfce / source / head.qc < prev    next >
Encoding:
Text File  |  1997-06-20  |  22.4 KB  |  566 lines

  1. /* =========================
  2.    ||Headers for functions||
  3.    ========================= */
  4.  
  5. void (vector flame_pos) PlaceFlame;
  6. void (vector reward_pos) SacReward;
  7. void () ModelSelect;
  8.  
  9. /* =======================================
  10.    || Function Called when head touched ||
  11.    ======================================= */
  12.  
  13. void () Head_Touch =
  14. {
  15.         local string text;
  16.  
  17.         if (other.classname == "player")
  18.         {
  19.                 //Checks if the player can carry any more heads...
  20.                 if (other.heads >= 5)
  21.                 {
  22.                         sprint (other , "You cannot carry any more heads\n");
  23.                         return;
  24.                 } else {
  25.                         //Tallies the neccesary heads <sp>
  26.                         if (self.classname == "monster_dog")
  27.                         {
  28.                                 other.dog = other.dog + 1;
  29.                                 CurrentHead = "dog";
  30.                         }
  31.                         else if (self.classname == "monster_ogre")
  32.                         {
  33.                                 other.ogre = other.ogre + 1;
  34.                                 CurrentHead = "ogre";
  35.                         }
  36.                         else if (self.classname == "monster_demon1")
  37.                         {
  38.                                 other.demon = other.demon + 1;
  39.                                 CurrentHead = "demon";
  40.                         }
  41.                         else if (self.classname == "monster_shambler")
  42.                         {
  43.                                 other.shambler = other.shambler + 1;
  44.                                 CurrentHead = "shambler";
  45.                         }
  46.                         else if (self.classname == "monster_knight")
  47.                         {
  48.                                 other.knight = other.knight + 1;
  49.                                 CurrentHead = "knight";
  50.                         }
  51.                         else if (self.classname == "monster_army")
  52.                         {
  53.                                 other.army = other.army + 1;
  54.                                 CurrentHead = "army";
  55.                         }
  56.                         else if (self.classname == "monster_wizard")
  57.                         {
  58.                                 other.wizard = other.wizard + 1;
  59.                                 CurrentHead = "wizard";
  60.                         }
  61.                         else if (self.classname == "monster_zombie")
  62.                         {
  63.                                 other.zombie = other.zombie + 1;
  64.                                 CurrentHead = "zombie";
  65.                         }
  66.                         else if (self.classname == "monster_hell_knight")
  67.                         {
  68.                                 other.hellknight = other.hellknight + 1;
  69.                                 CurrentHead = "hellknight";
  70.                         }
  71.                         else if (self.classname == "monster_shalrath")
  72.                         {
  73.                                 other.shalrath = other.shalrath + 1;
  74.                                 CurrentHead = "shalrath";
  75.                         }
  76.                         else if (self.classname == "monster_enforcer")
  77.                         {
  78.                                 other.enforcer = other.enforcer + 1;
  79.                                 CurrentHead = "enforcer";
  80.                         }
  81.  
  82.                         else other.player = other.player + 1;
  83.                         
  84.                         //Makes grand total more
  85.                         other.heads = other.heads + 1;
  86.                         stuffcmd (other, "bf\n");
  87.                         sprint (other, "You've picked up a head\n");
  88.                         remove(self);
  89.                 }
  90.         }
  91. };
  92.  
  93. /* =============================================
  94.    || Function called when head is sacrificed ||
  95.    ============================================= */
  96.  
  97. void() SacrificeHead =
  98. {
  99.         local vector vel;
  100.  
  101.         //Calls function to place flames in pentagram shape
  102.         PlaceFlame (self.origin + '0 30 16');
  103.         PlaceFlame (self.origin + '28 9 16');
  104.         PlaceFlame (self.origin + '12 -26 16');
  105.         PlaceFlame (self.origin + '-12 -26 16');
  106.         PlaceFlame (self.origin + '-28 9 16');
  107.  
  108.         //Item respawn sound for reward 
  109.         sound (self, CHAN_VOICE, "items/itembk2.wav", 1, ATTN_NORM);
  110.  
  111.         //Decides what reward should be given for sacrifice
  112.         SacReward (self.origin);
  113.  
  114.         //Spawns some blood spray for effect
  115.         vel = '0 0 150';
  116.         particle (self.origin+vel*0.01,vel,69,150);
  117.         vel = '0 0 120';
  118.         particle (self.origin+vel*0.01,vel,73,200);
  119.  
  120.         remove(self);
  121. };
  122.  
  123. /* =========================================
  124.    || Function called when head is thrown ||
  125.    ========================================= */
  126.  
  127. void () TossHead =
  128. {
  129.         //Selects which head model to throw
  130.         ModelSelect();
  131.  
  132.  
  133.         //Checks whether you have any of that specific head available
  134.         if (GotHead == 0) {
  135.                 sprint (self, "You don't have any ");
  136.                 sprint (self, CurrentHead);
  137.                 sprint (self, " heads to sacrifice.\n");
  138.                 return;
  139.         } else { if (GotHead == 1) {
  140.  
  141.                 //If you have, creates new entity of that specific head
  142.                 local entity item;
  143.       
  144.                 item = spawn ();
  145.                 item.owner = self;
  146.                 item.movetype = MOVETYPE_BOUNCE; 
  147.                 item.solid = SOLID_NOT; 
  148.  
  149.                 //Direction and speed of head when thrown
  150.                 if (self.v_angle_x)
  151.                         item.velocity = v_forward*300 + v_up * 100 + crandom()*v_right*10 + crandom()*v_up*10; 
  152.                 else { 
  153.                         item.velocity = aim(self, 10000); 
  154.                         item.velocity = item.velocity * 300; 
  155.                         item.velocity_z = 100; 
  156.                 } 
  157.  
  158.                 item.avelocity = '300 300 300' * crandom() + '10 20 50' * crandom();
  159.  
  160.                 item.angles = vectoangles(item.velocity); 
  161.          
  162.                 //Play chant sound (ripped from Heretic)
  163.                 sound (self, CHAN_VOICE, "wizsit.wav", 1, ATTN_NORM);
  164.                 item.nextthink = time + 3;
  165.                 item.think = SacrificeHead;
  166.  
  167.                 //Sets model of head 
  168.                 setmodel(item, HeadModel);
  169.  
  170.                 setsize (item, '-16 -16 0', '16 16 56');
  171.                 setorigin (item, self.origin); 
  172.  
  173.                 //Makes the amount of heads you have 1 less
  174.                 self.heads = self.heads - 1;
  175.         }
  176.     }
  177. };      
  178. /* ======================================================
  179.    || Fucntion called by impulse command to throw head ||
  180.    ====================================================== */
  181.  
  182. void() W_FireHead = 
  183.         // Checks if you have any heads to sacrifice        
  184.         if (self.heads == 0) {
  185.                 sprint (self, "You have no heads to sacrifice\n");
  186.                 return;
  187.         } else {
  188.                 //Then throws the head
  189.                 TossHead();
  190.         }
  191. };
  192. /* =================================================
  193.    || Function to spawn flame in certian position ||
  194.    ================================================= */
  195.  
  196. void (vector flame_pos) PlaceFlame =
  197. {
  198.         //Spawns a flame entity
  199.         local entity flame;
  200.  
  201.         flame = spawn ();
  202.         flame.owner = self;
  203.         flame.movetype = MOVETYPE_NONE;
  204.         flame.solid = SOLID_NOT;
  205.  
  206.         setmodel (flame, "progs/flame2.mdl"); 
  207.         setsize (flame, '-2 -2 0', '2 2 16');
  208.         setorigin (flame, flame_pos); 
  209.  
  210.         flame.effects = EF_DIMLIGHT;
  211.  
  212.         flame.nextthink = time + 10 + crandom();
  213.         flame.think = SUB_Remove;
  214.  
  215. };
  216. /* ==========================================
  217.    || Function to cycle forward thru heads ||
  218.    ========================================== */
  219.  
  220. void () HeadCycleForward =
  221. {
  222.         //See above for description
  223.         local string Head;
  224.  
  225.         if (self.heads == 0)
  226.         {
  227.                sprint (self, "You have no heads\n");
  228.                return;
  229.         } else {
  230.                 if (CurrentHead == "dog")
  231.                         CurrentHead = "army";
  232.                 else if (CurrentHead == "army")
  233.                         CurrentHead = "enforcer";
  234.                 else if (CurrentHead == "enforcer")
  235.                         CurrentHead = "ogre";
  236.                 else if (CurrentHead == "ogre")
  237.                         CurrentHead = "knight";
  238.                 else if (CurrentHead == "knight")
  239.                         CurrentHead = "wizard";
  240.                 else if (CurrentHead == "wizard")
  241.                         CurrentHead = "zombie";
  242.                 else if (CurrentHead == "zombie")
  243.                         CurrentHead = "demon";
  244.                 else if (CurrentHead == "demon")
  245.                         CurrentHead = "hellknight";
  246.                 else if (CurrentHead == "hellknight")
  247.                         CurrentHead = "shalrath";
  248.                 else if (CurrentHead == "shalrath")
  249.                         CurrentHead = "shambler";
  250.                 else if (CurrentHead == "shambler")
  251.                         CurrentHead = "dog";
  252.         }
  253.         sprint (self, CurrentHead);
  254.         sprint (self, "\n");
  255. };
  256.  
  257. /* ==========================================
  258.    || Function to cycle backward thru heads ||
  259.    ========================================== */
  260.  
  261. void () HeadCycleBack =
  262. {
  263.         //See above for description
  264.         local string Head;
  265.  
  266.         if (self.heads == 0)
  267.         {
  268.                sprint (self, "You have no heads\n");
  269.                return;
  270.         } else {
  271.                 if (CurrentHead == "dog")
  272.                         CurrentHead = "shambler";
  273.                 else if (CurrentHead == "shambler")
  274.                         CurrentHead = "shalrath";
  275.                 else if (CurrentHead == "shalrath")
  276.                         CurrentHead = "hellknight";
  277.                 else if (CurrentHead == "hellknight")
  278.                         CurrentHead = "demon";
  279.                 else if (CurrentHead == "demon")
  280.                         CurrentHead = "zombie";
  281.                 else if (CurrentHead == "zombie")
  282.                         CurrentHead = "wizzard";
  283.                 else if (CurrentHead == "wizzard")
  284.                         CurrentHead = "knight";
  285.                 else if (CurrentHead == "knight")
  286.                         CurrentHead = "ogre";
  287.                 else if (CurrentHead == "ogre")
  288.                         CurrentHead = "enforcer";
  289.                 else if (CurrentHead == "enforcer")
  290.                         CurrentHead = "army";
  291.                 else if (CurrentHead == "army")
  292.                         CurrentHead = "dog";
  293.         }
  294.         sprint (self, CurrentHead);
  295.         sprint (self, "\n");
  296. };
  297.  
  298. /* ======================================================
  299.    || Function that selects the model of head to throw ||
  300.    ====================================================== */
  301.  
  302. void () ModelSelect =
  303. {
  304.         //Checks what current selected head is, and chooses appropriate model
  305.         if (CurrentHead == "dog") {
  306.                 if (self.dog > 0) {
  307.                         GotHead = 1;
  308.                         HeadModel = "progs/h_dog.mdl";
  309.                         self.dog = self.dog - 1;
  310.                         RewardType = 1;
  311.                 } else {
  312.                         GotHead = 0;
  313.                 }
  314.         }
  315.         else if (CurrentHead == "army") {
  316.                 if (self.army > 0) {
  317.                         GotHead = 1;
  318.                         HeadModel = "progs/h_guard.mdl";
  319.                         self.army = self.army - 1;
  320.                         RewardType = 1;
  321.                 } else {
  322.                         GotHead = 0;
  323.                 }
  324.         }
  325.         else if (CurrentHead == "enforcer") {
  326.                 if (self.enforcer > 0) {
  327.                         GotHead = 1;
  328.                         HeadModel = "progs/h_mega.mdl";
  329.                         self.enforcer = self.enforcer - 1;
  330.                         RewardType = 1;
  331.                 } else {
  332.                         GotHead = 0;
  333.                 }
  334.         }
  335.         else if (CurrentHead == "ogre") {
  336.                 if (self.ogre > 0) {
  337.                         GotHead = 1;
  338.                         HeadModel = "progs/h_ogre.mdl";
  339.                         self.ogre = self.ogre - 1;
  340.                         RewardType = 2;
  341.                 } else {
  342.                         GotHead = 0;
  343.                 }
  344.         }
  345.         else if (CurrentHead == "knight") {
  346.                 if (self.knight > 0) {
  347.                         GotHead = 1;
  348.                         HeadModel = "progs/h_knight.mdl";
  349.                         self.knight = self.knight - 1;
  350.                         RewardType = 1;
  351.                 } else {
  352.                         GotHead = 0;
  353.                 }
  354.         }
  355.         else if (CurrentHead == "wizard") {
  356.                 if (self.wizard > 0) {
  357.                         GotHead = 1;
  358.                         HeadModel = "progs/h_wizard.mdl";
  359.                         self.wizard = self.wizard - 1;
  360.                         RewardType = 1;        
  361.                 } else {
  362.                         GotHead = 0;
  363.                 }
  364.         }
  365.         else if (CurrentHead == "zombie") {
  366.                 if (self.zombie > 0) {
  367.                         GotHead = 1;
  368.                         HeadModel = "progs/h_zombie.mdl";
  369.                         self.zombie = self.zombie - 1;
  370.                         RewardType = 1;        
  371.                 } else {
  372.                         GotHead = 0;
  373.                 }
  374.         }
  375.         else if (CurrentHead == "demon") {
  376.                 if (self.demon > 0) {
  377.                         GotHead = 1;
  378.                         HeadModel = "progs/h_demon.mdl";
  379.                         self.demon = self.demon - 1;
  380.                         RewardType = 2;        
  381.                 } else {
  382.                         GotHead = 0;
  383.                 }
  384.         }
  385.         else if (CurrentHead == "hellknight") {
  386.                 if (self.hellknight > 0) {
  387.                         GotHead = 1;
  388.                         HeadModel = "progs/h_hellkn.mdl";
  389.                         self.hellknight = self.hellknight - 1;
  390.                         RewardType = 2;        
  391.                 } else {
  392.                         GotHead = 0;
  393.                 }
  394.         }
  395.         else if (CurrentHead == "shalrath") {
  396.                 if (self.shalrath > 0) {
  397.                         GotHead = 1;
  398.                         HeadModel = "progs/h_shal.mdl";
  399.                         self.shalrath = self.shalrath - 1;
  400.                         RewardType = 3;        
  401.                 } else {
  402.                         GotHead = 0;
  403.                 }
  404.         }
  405.         else if (CurrentHead == "shambler") {
  406.                 if (self.shambler > 0) {
  407.                         GotHead = 1;
  408.                         HeadModel = "progs/h_shams.mdl";
  409.                         self.shambler = self.shambler - 1;
  410.                         RewardType = 3;
  411.                 } else {
  412.                         GotHead = 0;
  413.                 }
  414.         }
  415. };                        
  416. // Blah blah blah, this is sooooo boring commenting code...
  417.  
  418. /* ==============================================================
  419.    || This is the function that decides what reward you get... ||
  420.    ============================================================== */
  421.  
  422. void (vector reward_pos) SacReward =
  423. {
  424.         local entity reward;
  425.         local float randomreward;
  426.  
  427.         //Random number generated to decide on reward...
  428.         randomreward = crandom();
  429.         
  430.         //There are three reward types. 1,2,3 (Doi)
  431.         //1 being least and 3 most. This gives reward accorfin to random
  432.         //number and reward type...
  433.  
  434.         if (RewardType == 1) { //reward 1 = health15 and armor1
  435.                 if (randomreward < 0.5) {
  436.                         reward = spawn (); //health15
  437.                         reward.owner = self;
  438.                         reward.movetype = MOVETYPE_NONE;
  439.                         reward.solid = SOLID_TRIGGER;
  440.                         reward.touch = health_touch;
  441.  
  442.                         setmodel (reward, "maps/b_bh10.bsp");
  443.                         setsize (reward, '-2 -2 0', '2 2 16');
  444.                         setorigin (reward, reward_pos - '14 14 0');
  445.                         reward.noise = "items/r_item1.wav";
  446.                         reward.healamount = 15;
  447.                         reward.healtype = 0;
  448.                 } else if (randomreward < 1) {
  449.                         reward = spawn (); // armor1
  450.                         reward.owner = self;
  451.                         reward.movetype = MOVETYPE_NONE;
  452.                         reward.solid = SOLID_TRIGGER;
  453.                         reward.touch = armor_touch;
  454.                         setsize (reward, '-2 -2 0', '2 2 16');
  455.                         setorigin (reward, reward_pos);
  456.                         reward.classname = "item_armor1";
  457.  
  458.                         setmodel (reward, "progs/armor.mdl");
  459.                         reward.skin = 0;
  460.                 }
  461.         } else if (RewardType == 2) { //reward 2 = health25 and armor2
  462.                 if (randomreward < 0.5) {
  463.                         reward = spawn (); // health25
  464.                         reward.owner = self;
  465.                         reward.movetype = MOVETYPE_NONE;
  466.                         reward.solid = SOLID_TRIGGER;
  467.                         reward.touch = health_touch;
  468.                         setsize (reward, '-2 -2 0', '2 2 16');
  469.                         setorigin (reward, reward_pos - '14 14 0');
  470.         
  471.                         setmodel(reward, "maps/b_bh25.bsp");
  472.                         reward.noise = "items/health1.wav";
  473.                         reward.healamount = 25;
  474.                         reward.healtype = 1;
  475.                 } else if (randomreward < 1) {
  476.                         reward = spawn (); // armor2
  477.                         reward.owner = self;
  478.                         reward.movetype = MOVETYPE_NONE;
  479.                         reward.solid = SOLID_TRIGGER;
  480.                         reward.touch = armor_touch;
  481.                         setsize (reward, '-2 -2 0', '2 2 16');
  482.                         setorigin (reward, reward_pos);
  483.                         reward.classname = "item_armor2";
  484.  
  485.                         setmodel (reward, "progs/armor.mdl");
  486.                         reward.skin = 1;
  487.                 }                                
  488.         } else if (RewardType == 3) { //reward 3 = health100, armorInv,
  489.                                       //Invulnerbality, Invisibility and Quad  
  490.                 if (randomreward < 0.2) {
  491.                         reward.touch = powerup_touch; //Invulnerbality
  492.                         reward = spawn ();
  493.                         reward.owner = self;
  494.                         reward.movetype = MOVETYPE_NONE;
  495.                         reward.solid = SOLID_TRIGGER;
  496.         
  497.                         reward.noise = "items/protect.wav";
  498.                         setmodel (reward, "progs/invulner.mdl");
  499.                         reward.netname = "Pentagram of Protection";
  500.                         reward.items = IT_INVULNERABILITY;
  501.                         setsize (self, '-16 -16 -24', '16 16 32');
  502.                         reward.classname = "item_artifact_invulnerability";
  503.                         setorigin (reward, reward_pos);
  504.                 } else if (randomreward < 0.4) {
  505.                         reward = spawn (); //Invisibility
  506.                         reward.owner = self;
  507.                         reward.movetype = MOVETYPE_NONE;
  508.                         reward.solid = SOLID_TRIGGER;
  509.  
  510.                         reward.touch = powerup_touch; //Invisibility
  511.                         reward.noise = "items/inv1.wav";
  512.                         setmodel (reward, "progs/invisibl.mdl");
  513.                         reward.netname = "Ring of Shadows";
  514.                         reward.items = IT_INVISIBILITY;
  515.                         setsize (reward, '-16 -16 -24', '16 16 32');
  516.                         reward.classname = "item_artifact_invisibility";
  517.                         setorigin (reward, reward_pos);
  518.                 } else if (randomreward < 0.6) {
  519.                         reward = spawn (); //Quaddamage
  520.                         reward.owner = self;
  521.                         reward.movetype = MOVETYPE_NONE;
  522.                         reward.solid = SOLID_TRIGGER;
  523.  
  524.                         reward.touch = powerup_touch; 
  525.                         reward.noise = "items/damage.wav";
  526.                         setmodel (reward, "progs/quaddama.mdl");
  527.                         reward.netname = "Quad Damage";
  528.                         reward.items = IT_QUAD;
  529.                         setsize (reward, '-16 -16 -24', '16 16 32');
  530.                         reward.classname = "item_artifact_super_damage";
  531.                         setorigin (reward, reward_pos);
  532.                 } else if (randomreward < 0.8) {
  533.                         reward = spawn (); // armorInv
  534.                         reward.owner = self;
  535.                         reward.movetype = MOVETYPE_NONE;
  536.                         reward.solid = SOLID_TRIGGER;
  537.                         reward.touch = armor_touch;
  538.                         setsize (reward, '-2 -2 0', '2 2 16');
  539.                         setorigin (reward, reward_pos);
  540.                         reward.classname = "item_armorInv";
  541.  
  542.                         setmodel (reward, "progs/armor.mdl");
  543.                         reward.skin = 2; 
  544.  
  545.                 } else if (randomreward < 1) {
  546.                         reward = spawn (); // megahealth
  547.                         reward.owner = self;
  548.                         reward.movetype = MOVETYPE_NONE;
  549.                         reward.solid = SOLID_TRIGGER;
  550.                         reward.touch = health_touch;
  551.                         setsize (reward, '-2 -2 0', '2 2 16');
  552.                         setorigin (reward, reward_pos - '14 14 0');
  553.         
  554.                         setmodel(reward, "maps/b_bh100.bsp");
  555.                         reward.noise = "items/r_item2.wav";
  556.                         reward.healamount = 100;
  557.                         reward.healtype = 2;
  558.                 }
  559.         }
  560. };
  561.  
  562. // Sacrifice-o-head code, written, concieved and all that mumbo jumbo
  563. // by Broken, aka Ilden Webber, from South Africa. Not that it
  564. // changes anything, but now you know. 
  565.