Adonthell 0.4
event_list.cc
Go to the documentation of this file.
00001 /*
00002    $Id: event_list.cc,v 1.8 2003/02/10 20:01:13 ksterker Exp $
00003 
00004    Copyright (C) 2000/2001/2002/2003 Kai Sterker <kaisterker@linuxgames.com>
00005    Part of the Adonthell Project http://adonthell.linuxgames.com
00006 
00007    This program is free software; you can redistribute it and/or modify
00008    it under the terms of the GNU General Public License.
00009    This program is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY.
00011 
00012    See the COPYING file for more details.
00013 */
00014 
00015 
00016 /**
00017  * @file   event_list.cc
00018  * @author Kai Sterker <kaisterker@linuxgames.com>
00019  * 
00020  * @brief  Implements the event_list class.
00021  * 
00022  */
00023 
00024 #include <algorithm>
00025 #include "event_list.h"
00026 #include "event_handler.h"
00027  
00028 // Array with callbacks to return a newly instanciated event
00029 new_event event_list::instanciate_event[MAX_EVENTS];
00030 
00031 // constructor
00032 event_list::event_list ()
00033 {
00034     Paused = false;
00035 }
00036 
00037 // destructor
00038 event_list::~event_list ()
00039 {
00040     clear (); 
00041 }
00042 
00043 // Unregisters and deletes all events.
00044 void event_list::clear () 
00045 {
00046     event *ev;
00047     
00048     while (!Events.empty ())
00049     {
00050         ev = Events.back ();
00051         ev->set_list (NULL);
00052         Events.pop_back ();
00053         delete ev;    
00054     }    
00055 }
00056 
00057 // Adds an event to the list and register it with the event_handler.
00058 void event_list::add_event (event* ev)
00059 {
00060     ev->set_list (this);
00061     Events.push_back (ev);
00062 
00063     // if the event list is paused, also pause new events
00064     if (Paused) ev->pause ();
00065 
00066     // only register event if not paused
00067     else if (!ev->is_paused ()) event_handler::register_event (ev); 
00068 }
00069 
00070 // Remove an event from the list
00071 void event_list::remove_event (event *ev)
00072 {
00073     vector<event*>::iterator i;
00074 
00075     // Search for the event we want to remove
00076     i = find (Events.begin (), Events.end (), ev);
00077 
00078     // found? -> get rid of it :)
00079     if (i != Events.end ()) Events.erase (i);
00080 }
00081 
00082 // retrieve event by its id
00083 event *event_list::get_event (const string & id)
00084 {
00085     vector<event*>::iterator i;
00086 
00087     for (i = Events.begin (); i != Events.end (); i++)
00088          if ((*i)->id () == id) return *i;
00089     
00090     return NULL;   
00091 }
00092 
00093 // disable all events in the list
00094 void event_list::pause ()
00095 {
00096     Paused = true;
00097     for (vector<event*>::iterator i = Events.begin (); i != Events.end (); i++)
00098         (*i)->pause ();
00099 }
00100 
00101 // enable all events in the list
00102 void event_list::resume ()
00103 {
00104     Paused = false;
00105     for (vector<event*>::iterator i = Events.begin (); i != Events.end (); i++)
00106         (*i)->resume ();
00107 }
00108 
00109 // Register an event for loading
00110 void event_list::register_event (u_int8 type, new_event e)
00111 {
00112     if (type < MAX_EVENTS)
00113         instanciate_event[type] = e;
00114 }
00115 
00116 // Save an event_list to file
00117 void event_list::put_state (ogzstream& out) const
00118 {
00119     std::vector <event *>::iterator i;
00120     u_int32 nbr_events = Events.size ();
00121     
00122     nbr_events >> out; 
00123 
00124     for (i = Events.begin (); i != Events.end (); i++)
00125         (*i)->put_state (out); 
00126 }
00127 
00128 // Loads an event_list from file
00129 bool event_list::get_state (igzstream& in)
00130 {
00131     u_int32 nbr_events;
00132     u_int8 type;
00133     event *ev;
00134 
00135     nbr_events << in;
00136     
00137     while (nbr_events--) 
00138     {
00139         ev = NULL;
00140         type << in;
00141         
00142         // Instanciate an event of the given type
00143         if (type < MAX_EVENTS && instanciate_event[type] != NULL)
00144             ev = instanciate_event[type]();
00145  
00146         // try to load it, ...
00147         if (ev != NULL && ev->get_state (in))
00148             add_event (ev);
00149         
00150         // ... otherwise fail.
00151         else
00152         {
00153             fprintf (stderr, "Could not load event #%i. Aborting ...\n", type);
00154             return false;
00155         }    
00156     }
00157     
00158     return true;
00159 }