home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Issue 2 / Freelog_HS_3_Setp_Oct_Nov_2000_CD2.mdx / Arcade / Orbit / src / event.c < prev    next >
C/C++ Source or Header  |  1999-09-27  |  8KB  |  427 lines

  1. /*
  2.  
  3. ORBIT, a freeware space combat simulator
  4. Copyright (C) 1999  Steve Belczyk <steve1@genesis.nred.ma.us>
  5.  
  6. This program is free software; you can redistribute it and/or
  7. modify it under the terms of the GNU General Public License
  8. as published by the Free Software Foundation; either version 2
  9. of the License, or (at your option) any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  19.  
  20. */
  21.  
  22. #include "orbit.h"
  23.  
  24. /*
  25.  *  Stuff to implement events
  26.  */
  27.  
  28. InitEvents ()
  29. /*
  30.  *  Initialize events
  31.  */
  32. {
  33.     int e, a;
  34.  
  35.     for (e=0; e<NEVENTS; e++)
  36.     {
  37.         event[e].name[0] = 0;
  38.         event[e].pending = 0;
  39.         event[e].enabled = 1;
  40.         event[e].trigger = EVENT_NULL;
  41.         event[e].ivalue = 0;
  42.         event[e].fvalue = 0.0;
  43.         event[e].cvalue = NULL;
  44.         event[e].pos[0] = event[e].pos[1] = event[e].pos[2] = 0.0;
  45.  
  46.         for (a=0; a<ACTIONS_PER_EVENT; a++)
  47.         {
  48.             event[e].action[a].active = 0;
  49.             event[e].action[a].action = EVENT_NULL;
  50.             event[e].action[a].ivalue = 0;
  51.             event[e].action[a].fvalue = 0.0;
  52.             event[e].action[a].cvalue = NULL;
  53.         }
  54.     }
  55. }
  56.  
  57. ResetEvents ()
  58. /*
  59.  *  Re-Initialize events
  60.  */
  61. {
  62.     int e, a;
  63.  
  64.     for (e=0; e<NEVENTS; e++)
  65.     {
  66.         event[e].name[0] = 0;
  67.         event[e].pending = 0;
  68.         event[e].enabled = 1;
  69.         event[e].trigger = EVENT_NULL;
  70.         if (event[e].cvalue != NULL) free (event[e].cvalue);
  71.         event[e].cvalue = NULL;
  72.         event[e].ivalue = 0;
  73.         event[e].fvalue = 0.0;
  74.         event[e].pos[0] = event[e].pos[1] = event[e].pos[2] = 0.0;
  75.  
  76.         for (a=0; a<ACTIONS_PER_EVENT; a++)
  77.         {
  78.             event[e].action[a].active = 0;
  79.             event[e].action[a].action = EVENT_NULL;
  80.             event[e].action[a].ivalue = 0;
  81.             event[e].action[a].fvalue = 0.0;
  82.             if (event[e].action[a].cvalue != NULL)
  83.                 free (event[e].action[a].cvalue);
  84.             event[e].action[a].cvalue = NULL;
  85.         }
  86.     }
  87. }
  88.  
  89. int FindEvent()
  90. /*
  91.  *  Find unused event
  92.  */
  93. {
  94.     int e, a;
  95.  
  96.     for (e=0; e<NEVENTS; e++)
  97.     {
  98.         if (!event[e].pending)
  99.         {
  100.             event[e].pending = 1;
  101.             event[e].enabled = 1;
  102.  
  103.             /* Free any memory previously used by this event */
  104.             if (NULL != event[e].cvalue)
  105.             {
  106.                 free (event[e].cvalue);
  107.                 event[e].cvalue = NULL;
  108.             }
  109.  
  110.             for (a=0; a<ACTIONS_PER_EVENT; a++)
  111.             {
  112.                 if (NULL != event[e].action[a].cvalue)
  113.                 {
  114.                     free (event[e].action[a].cvalue);
  115.                     event[e].action[a].cvalue = NULL;
  116.                 }
  117.             }
  118.  
  119.             return (e);
  120.         }
  121.     }
  122.  
  123.     Log ("Out of events!  Increase NEVENTS in orbit.h");
  124.     FinishSound();
  125.     CloseLog();
  126.     exit (0);
  127. }
  128.  
  129. int FindEventByName (name)
  130. char *name;
  131. {
  132.     int e;
  133.  
  134.     for (e=0; e<NEVENTS; e++)
  135.     {
  136.         if (!strcasecmp (name, event[e].name)) return (e);
  137.     }
  138.     return (-1);
  139. }
  140.  
  141. DoEvents()
  142. /*
  143.  *  Process events
  144.  */
  145. {
  146.     int e;
  147.  
  148.     for (e=0; e<NEVENTS; e++)
  149.     {
  150.         if (event[e].pending && event[e].enabled)
  151.         {
  152.             switch (event[e].trigger)
  153.             {
  154.             case EVENT_NULL:
  155.                 break;
  156.  
  157.             case EVENT_TRUE:
  158.                 EventAction (e);
  159.                 break;
  160.  
  161.             case EVENT_APPROACH:
  162.                 EventTrigApproach (e);
  163.                 break;
  164.  
  165.             case EVENT_DEPART:
  166.                 EventTrigDepart (e);
  167.                 break;
  168.  
  169.             case EVENT_DESTROY:
  170.                 EventTrigDestroy (e);
  171.                 break;
  172.  
  173.             case EVENT_SCORE:
  174.                 EventTrigScore (e);
  175.                 break;
  176.  
  177.             case EVENT_ALARM:
  178.                 EventTrigAlarm (e);
  179.                 break;
  180.  
  181.             case EVENT_STOPNEAR:
  182.                 EventTrigStopnear (e);
  183.                 break;
  184.  
  185.             case EVENT_SHIELDS:
  186.                 EventTrigShields (e);
  187.                 break;
  188.  
  189.             default:
  190.                 Log ("Unknown event trigger type: %d, event %d",
  191.                         event[e].trigger, e);
  192.                 FinishSound();
  193.                 CloseLog();
  194.                 exit (0);
  195.                 break;
  196.             }
  197.         }
  198.     }
  199. }
  200.  
  201. EventTrigApproach (e)
  202. int e;
  203. {
  204.     double v[3], r;
  205.  
  206.     /* Find range to destination */
  207.     Vsub (v, event[e].pos, player.pos);
  208.     r = Mag2 (v);
  209.  
  210.     /* There yet? */
  211.     if (r <= event[e].fvalue*event[e].fvalue) EventAction (e);
  212. }
  213.  
  214. EventTrigStopnear (e)
  215. int e;
  216. {
  217.     double v[3], r;
  218.  
  219.     if ( (player.vel[0] != 0.0) ||
  220.          (player.vel[1] != 0.0) ||
  221.          (player.vel[2] != 0.0) ) return;
  222.  
  223.     /* Find range to destination */
  224.     Vsub (v, event[e].pos, player.pos);
  225.     r = Mag2 (v);
  226.  
  227.     /* There yet? */
  228.     if (r <= event[e].fvalue*event[e].fvalue) EventAction (e);
  229. }
  230.  
  231. EventTrigDepart (e)
  232. int e;
  233. {
  234.     double v[3], r;
  235.  
  236.     /* Find range to destination */
  237.     Vsub (v, event[e].pos, player.pos);
  238.     r = Mag2 (v);
  239.  
  240.     /* There yet? */
  241.     if (r > event[e].fvalue*event[e].fvalue)
  242.     {
  243.         Log ("EventTrigDepart: r=%lf, fvalue=%lf",
  244.                 r, event[e].fvalue);
  245.         EventAction (e);
  246.     }
  247. }
  248.  
  249. EventTrigDestroy (e)
  250. int e;
  251. /*
  252.  *  Do nothing here -- destroy triggers are checked by
  253.  *  DestroyTarget in target.c
  254.  */
  255. {}
  256.  
  257. EventTrigShields (e)
  258. int e;
  259. /*
  260.  *  Not checked here -- checked in MissileHitTarget in missile.c
  261.  */
  262. {}
  263.  
  264. EventTrigScore (e)
  265. int e;
  266. {
  267.     if (player.score >= event[e].ivalue) EventAction (e);
  268. }
  269.  
  270. EventTrigAlarm (e)
  271. int e;
  272. {
  273.     event[e].fvalue -= deltaT;
  274.     if (event[e].fvalue <= 0.0) EventAction (e);
  275. }
  276.  
  277. EventAction (e)
  278. int e;
  279. /*
  280.  *  Event e has occurred!
  281.  */
  282. {
  283.     int t, ev, a, p;
  284.  
  285.     event[e].pending = 0;
  286.  
  287.     /* Process all action */
  288.     for (a=0; a<ACTIONS_PER_EVENT; a++)
  289.     {
  290.       if (event[e].action[a].active)
  291.       {
  292.         Log ("EventAction: Event %d.%d has happened, trigger %d action %d",
  293.             e, a, event[e].trigger, event[e].action[a].action);
  294.  
  295.         switch (event[e].action[a].action)
  296.         {
  297.         case EVENT_NULL:
  298.             break;
  299.  
  300.         case EVENT_MESSAGE:
  301.             Mprint (event[e].action[a].cvalue);
  302.             break;
  303.  
  304.         case EVENT_HIDE:
  305.             if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  306.             {
  307.                 target[t].hidden = 1;
  308.             }
  309.             break;
  310.  
  311.         case EVENT_UNHIDE:
  312.             if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  313.             {
  314.                 target[t].hidden = 0;
  315.             }
  316.             break;
  317.  
  318.         case EVENT_DESTROY:
  319.             if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  320.             {
  321.                 DestroyTarget (t);
  322.             }
  323.             break;
  324.  
  325.         case EVENT_SCORE:
  326.             player.score += event[e].action[a].ivalue;
  327.             break;
  328.  
  329.         case EVENT_ENABLE:
  330.             if ((-1) != (ev = FindEventByName (event[e].action[a].cvalue)))
  331.             {
  332.                 event[ev].enabled = 1;
  333.             }
  334.             break;
  335.  
  336.         case EVENT_DISABLE:
  337.             if ((-1) != (ev = FindEventByName (event[e].action[a].cvalue)))
  338.             {
  339.                 event[ev].enabled = 0;
  340.             }
  341.             break;
  342.  
  343.         case EVENT_LOADMISSION:
  344.             Log ("EventAction is calling ReadMission(%s)", event[e].action[a].cvalue);
  345.             ReadMission (event[e].action[a].cvalue);
  346.             return;
  347.  
  348.         case EVENT_STOP:
  349.             player.vel[0] = player.vel[1] = player.vel[2] = 0.0;
  350.             break;
  351.  
  352.         case EVENT_BOOM:
  353.             Boom (event[e].pos, event[e].action[a].fvalue);
  354.             break;
  355.  
  356.         case EVENT_FLASH:
  357.             palette_flash = 1;
  358.             break;
  359.  
  360.         case EVENT_MOVEOBJECT:
  361.             if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  362.             {
  363.                 Vset (target[t].pos, event[e].pos);
  364.             }
  365.             break;
  366.  
  367.         case EVENT_MOVEPLAYER:
  368.             Vset (player.pos, event[e].pos);
  369.             break;
  370.  
  371.         case EVENT_MOVEPLANET:
  372.             if ((-1) != (p = FindPlanetByName (event[e].action[a].cvalue)))
  373.             {
  374.                 Vset (planet[p].pos, event[e].pos);
  375.             }
  376.             break;
  377.  
  378.         case EVENT_HIDEPLANET:
  379.             if ((-1) != (p = FindPlanetByName (event[e].action[a].cvalue)))
  380.             {
  381.                 planet[p].hidden = 1;
  382.             }
  383.             break;
  384.  
  385.         case EVENT_UNHIDEPLANET:
  386.             if ((-1) != (p = FindPlanetByName (event[e].action[a].cvalue)))
  387.             {
  388.                 planet[p].hidden = 0;
  389.             }
  390.             break;
  391.  
  392.         case EVENT_BETRAY:
  393.             if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  394.             {
  395.                 target[t].friendly = !target[t].friendly;
  396.             }
  397.             break;
  398.  
  399.         default:
  400.             Log ("Unknown event action type %d, event %d",
  401.                     event[e].action, e);
  402.             FinishSound();
  403.             CloseLog();
  404.             exit (0);
  405.         }
  406.       }
  407.     }
  408.  
  409.     /* Free memory used by this event */
  410.     if (NULL != event[e].cvalue)
  411.     {
  412.         free (event[e].cvalue);
  413.         event[e].cvalue = NULL;
  414.     }
  415.     for (a=0; a<ACTIONS_PER_EVENT; a++)
  416.     {
  417.         if (NULL != event[e].action[a].cvalue)
  418.         {
  419.             free (event[e].action[a].cvalue);
  420.             event[e].action[a].cvalue = NULL;
  421.         }
  422.     }
  423.  
  424.     /* An event might have an effect on the locked target */
  425.     CheckLock();
  426. }
  427.