Adonthell 0.4
|
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 }