home *** CD-ROM | disk | FTP | other *** search
/ Superpower (Alt) / SUPERPOWER.iso / q / patch / mbq624 / _observe.qc < prev    next >
Encoding:
Text File  |  1996-08-19  |  10.3 KB  |  317 lines

  1. /*
  2. **
  3. ** _observe.qc (Observer Code, 1.0)
  4. **
  5. ** Copyright (C) 1996 Johannes Plass
  6. ** 
  7. ** This program is free software; you can redistribute it and/or modify
  8. ** it under the terms of the GNU General Public License as published by
  9. ** the Free Software Foundation; either version 2 of the License, or
  10. ** (at your option) any later version.
  11. ** 
  12. ** This program is distributed in the hope that it will be useful,
  13. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. ** GNU General Public License for more details.
  16. **
  17. ** You should have received a copy of the GNU General Public License
  18. ** along with this program; if not, write to the Free Software
  19. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. ** 
  21. ** Author:   Johannes Plass (plass@dipmza.physik.uni-mainz.de)
  22. **
  23. */
  24.  
  25.  
  26. void(entity player) ObserverInfo =
  27. {
  28.    if (!USE_MODULE_OBSERVER) return;
  29.    sprint(player,"# Observer: Allows you to peep.\n");
  30.    sprint(player,"  Type 'help-observer' for help.\n");
  31. };
  32.  
  33. void(entity player) ObserverInit =
  34. {
  35.    if (!USE_MODULE_OBSERVER) return;
  36.    stuffcmd(player,"alias help-observer \"impulse 205\"\n");
  37. };
  38.  
  39. void(entity player) ObserverHelp =
  40. {
  41.    if (!USE_MODULE_OBSERVER) return;
  42.  
  43. //                123456789#123456789#123456789#12345678
  44.    sprint(player,"# Observer: Allows to watch the\n");
  45.    sprint(player,"  ongoing madness.\n");
  46.    sprint(player,"  As observer you can:\n");
  47.    sprint(player,"    - fly around.\n");
  48.    sprint(player,"    - move to another watch-spot by \n");
  49.    sprint(player,"      pressing the jump-button. \n");
  50.    sprint(player,"    - join the game as regular player\n");
  51.    sprint(player,"      by pressing the fire-button. \n");
  52.    sprint(player,"  Press the jump-button to become an\n");
  53.    sprint(player,"  observer when you are dead.\n");
  54. };
  55.  
  56. void(entity player) ObserverSetPlayerPos;
  57.  
  58. void () ObserverThink =
  59. {
  60.    //dprint("ObserverThink: executing\n");//#jp#(debug)
  61.  
  62.    if (!USE_MODULE_OBSERVER) return;
  63.  
  64.    if (self.movetype != MOVETYPE_FLY) {
  65.       // will come here after changing level
  66.       self.observer_status = self.observer_status | OBSERVER_BECOME_OBSERVER;
  67.    }
  68.  
  69. //  local string tmp;
  70. //  local float norm;
  71. //  tmp = ftos(self.speed); dprint(tmp); dprint(" ");
  72. //  tmp = vtos(v_forward); dprint(tmp); dprint(" ");
  73. //  dprint("\n");
  74.  
  75. //  { 
  76.       local float invcos,nv,nvp,nvpmax,nvs,nsp,sp,svz;
  77.       local vector f,vp,vs;
  78.  
  79.       svz = self.velocity_z;
  80.       self.velocity_z = 0;
  81.  
  82.       // v_forward is normalized
  83.       f_x = v_forward_x; 
  84.       f_y = v_forward_y; 
  85.       f_z = 0;
  86.       invcos = vlen(f); if (invcos) invcos= 1/invcos; else invcos=0;
  87.       f = f*invcos; // normalize f
  88.  
  89.       sp = f * self.velocity;
  90.       vp = sp*f;
  91.       nvp = vlen(vp); if (sp<0) nvp = nvp*(-1);
  92.       vs = self.velocity - vp;
  93.  
  94.       vp = v_forward * (nvp * invcos);
  95.       vp_z = vp_z + svz;
  96.       nvp = vlen(vp);
  97.       nvpmax = (320 - 100*(v_forward * '0 0 1'));
  98.       if (nvp > nvpmax) { vp = vp * (nvpmax/nvp); }
  99.  
  100.       self.velocity = vp + vs;
  101.  
  102. //  }
  103.  
  104.  
  105.    self.weaponmodel = "";
  106.    self.weaponframe = 0;
  107.  
  108.    if (self.observer_status & OBSERVER_BECOME_OBSERVER) {
  109.       self.observer_pos_num = 0;
  110.       self.observer_status = self.observer_status - OBSERVER_BECOME_OBSERVER;
  111.       self.observer_pos_num = 1 + random() * 4;
  112.       ObserverBecomeObserver(self);
  113.       ObserverSetPlayerPos(self);
  114. //      bprint(self.netname);
  115. //      bprint(" became an observer.\n");
  116.    }
  117.  
  118.    if (self.observer_status & OBSERVER_NEXTVIEW) {
  119.       self.observer_pos_num = self.observer_pos_num + 1;
  120.       ObserverSetPlayerPos(self);
  121.       self.observer_status = self.observer_status - OBSERVER_NEXTVIEW;
  122.       return;
  123.    }
  124.  
  125.    if (self.observer_status & OBSERVER_PREVVIEW) {
  126.       self.observer_pos_num = self.observer_pos_num - 1;
  127.       ObserverSetPlayerPos(self);
  128.       self.observer_status = self.observer_status - OBSERVER_PREVVIEW;
  129.       return;
  130.    }
  131.  
  132.    if (self.button0) {
  133.       self.observer_status = self.observer_status | OBSERVER_BUTTON0;
  134.    }
  135.    if (self.button1) {
  136.       self.observer_status = self.observer_status | OBSERVER_BUTTON1;
  137.    }
  138.    if (self.button2) {
  139.       self.observer_status = self.observer_status | OBSERVER_BUTTON2;
  140.    }
  141.    if (self.button0 || self.button1 || self.button2) {
  142.       return;
  143.    }
  144.  
  145.    if (self.observer_status & (OBSERVER_BUTTON2 | OBSERVER_BUTTON1)) {
  146.       if (!self.button0 && !self.button1 && !self.button2) {
  147.          self.observer_status = OBSERVER_NEXTVIEW;
  148.          return;
  149.       }
  150.    }
  151.  
  152.    if (self.observer_status & OBSERVER_BUTTON0) {
  153.       if (!self.button0 && !self.button1 && !self.button2) {
  154.          self.observer_status  = OBSERVER_RESPAWN;
  155.          return;
  156.       }
  157.    }
  158.  
  159.    if (self.observer_status & OBSERVER_RESPAWN) {
  160.       if (! self.button0 && ! self.button1 && ! self.button2) {
  161.          respawn();
  162.          // remove flag must be set after respawn()
  163.          PlayerFlagRemoveFlag(self,PLAYER_IS_OBSERVER);
  164.          return;
  165.       }
  166.    }
  167. };
  168.  
  169. float() ObserverDeathThink = 
  170. {
  171.  
  172.    if (!USE_MODULE_OBSERVER) {
  173.       return(0);
  174.    }
  175.  
  176.    if (self.button1) {
  177.       self.observer_status = self.observer_status | OBSERVER_BUTTON1;
  178.       return(1);
  179.    }
  180.    if (self.button2) {
  181.       self.observer_status = self.observer_status | OBSERVER_BUTTON2;
  182.       return(1);
  183.    }
  184.  
  185.    if (self.observer_status & (OBSERVER_BUTTON1 | OBSERVER_BUTTON2)) {
  186.       if (!self.button0 && !self.button1 && !self.button2) {
  187.          // this flag must be set before respawn()
  188.          self.observer_status = OBSERVER_BECOME_OBSERVER;
  189.          respawn();
  190.          // player flag must be set after respawn()
  191.          PlayerFlagSetFlag(self,PLAYER_IS_OBSERVER);
  192.          return(1);
  193.       }
  194.    }
  195.    return(0);
  196. };
  197.  
  198. void(entity player) ObserverBecomeObserver =
  199. {
  200.    //dprint("ObserverBecomeObserver: executing\n");//#jp#(debug)
  201.  
  202.    player.armorvalue    = 0;
  203.    player.items         = 0;
  204.    player.health        = 999;
  205.    player.ammo_shells   = 0;
  206.    player.ammo_nails    = 0;
  207.    player.ammo_rockets  = 0;
  208.    player.ammo_cells    = 0;
  209.    player.weapon        = 0;
  210.    player.currentammo   = 1;
  211.    player.takedamage    = DAMAGE_NO;
  212.    player.solid         = SOLID_NOT;
  213.    player.movetype      = MOVETYPE_FLY;
  214.    player.deadflag      = DEAD_NO;
  215.  
  216.    setmodel (player, string_null);
  217. };
  218.  
  219.  
  220. entity(entity player) ObserverFindPos =
  221. {
  222.    local entity spot;
  223.    local float pos_num_startsearch;
  224.  
  225.    //dprint("ObserverFindPos: executing\n");
  226.    if      (player.observer_pos_num <= 0)  player.observer_pos_num = 1;
  227.    else if (player.observer_pos_num >= 21) player.observer_pos_num = 1;
  228.    pos_num_startsearch = player.observer_pos_num;
  229.  
  230.    if (player.observer_pos_num <= 5) {
  231.                                                      spot = find (world, classname, "info_intermission");
  232.       if (player.observer_pos_num >= 2 && !(!spot))  spot = find (spot,  classname, "info_intermission");
  233.       if (player.observer_pos_num >= 3 && !(!spot))  spot = find (spot,  classname, "info_intermission");
  234.       if (player.observer_pos_num >= 4 && !(!spot))  spot = find (spot,  classname, "info_intermission");
  235.       if (!spot) player.observer_pos_num = 5;
  236.    }
  237.    if (player.observer_pos_num >= 5) {
  238.                                                      spot = find (world, classname, "info_player_deathmatch");
  239.       if (player.observer_pos_num >=  6 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  240.       if (player.observer_pos_num >=  7 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  241.       if (player.observer_pos_num >=  8 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  242.       if (player.observer_pos_num >=  9 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  243.       if (player.observer_pos_num >= 10 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  244.       if (player.observer_pos_num >= 11 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  245.       if (player.observer_pos_num >= 12 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  246.       if (player.observer_pos_num >= 13 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  247.       if (player.observer_pos_num >= 14 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  248.       if (player.observer_pos_num >= 15 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  249.       if (player.observer_pos_num >= 16 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  250.       if (player.observer_pos_num >= 17 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  251.       if (player.observer_pos_num >= 18 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  252.       if (player.observer_pos_num >= 19 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  253.       if (player.observer_pos_num >= 20 && !(!spot)) spot = find (spot,  classname, "info_player_deathmatch");
  254.       if (!spot) player.observer_pos_num = 21;
  255.    }
  256.    if (player.observer_pos_num >= 21) {
  257.          spot = find (world, classname, "info_player_start");
  258.          player.observer_pos_num = 21;
  259.    }
  260.    if (!spot && pos_num_startsearch != 1) {
  261.       player.observer_pos_num = player.observer_pos_num + 1;
  262.       spot=ObserverFindPos(player);
  263.    }
  264.    if (!spot) error ("ObserverFindPos: could not find start pos");
  265.    return spot;
  266. };
  267.  
  268. void(entity player) ObserverSetPlayerPos =
  269. {
  270.    local entity pos;
  271.    local vector posoffset;
  272.  
  273.    //dprint("ObserverSetPlayerPos: executing\n");//#jp#(debug)
  274.  
  275.    pos = ObserverFindPos(player);
  276.  
  277.    player.angles        = player.v_angle = pos.mangle;
  278.    player.fixangle      = TRUE;         // turn this way immediately
  279.    player.view_ofs      = '0 0 12'; // must be != '0 0 0'
  280.    player.velocity      = '0 0 0';
  281.  
  282.    makevectors (self.angles);
  283.    setsize (player, '-12  -12 -12', '12 12 12');
  284.  
  285.  
  286.    // avoid stuck observers for intermission spots 
  287.    if (player.observer_pos_num <=4) setorigin (player, pos.origin + '0 0 -60');
  288.    else                           setorigin (player, pos.origin);
  289.  
  290. //#jp# Hack to provide a decent flying velocity.
  291. //#jp# I'd normally expect the above three lines to be sufficient, but ...
  292. //#jp# Damn it, what a mess this is.
  293. //#jp# Hope this doesn't cause side effects.
  294.  
  295.    player.flags = player.flags | FL_ONGROUND;
  296. };
  297.  
  298. /*
  299. =============
  300. Unused:
  301.    player.view_ofs      = '0 0 22'; // must be != '0 0 0'
  302.    setsize (player, VEC_HULL_MIN, VEC_HULL_MAX);
  303. =============
  304. */
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.