1 /*
2  *  This file is part of Dune Legacy.
3  *
4  *  Dune Legacy is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation, either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  Dune Legacy is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with Dune Legacy.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef CHANGEEVENTLIST_H
19 #define CHANGEEVENTLIST_H
20 
21 #include <misc/InputStream.h>
22 #include <misc/OutputStream.h>
23 
24 #include <SDL.h>
25 #include <list>
26 
27 class ChangeEventList {
28 public:
29     class ChangeEvent {
30     public:
31         enum class EventType {
32             ChangeHouse,
33             ChangeTeam,
34             ChangePlayer,
35             SetHumanPlayer
36         };
37 
38 
ChangeEvent(EventType eventType,Uint32 slot,Uint32 newValue)39         ChangeEvent(EventType eventType, Uint32 slot, Uint32 newValue)
40          : eventType(eventType), slot(slot), newValue(newValue) {
41 
42         }
43 
ChangeEvent(Uint32 slot,const std::string & newStringValue)44         ChangeEvent(Uint32 slot, const std::string& newStringValue)
45          : eventType(EventType::SetHumanPlayer), slot(slot), newStringValue(newStringValue) {
46         }
47 
ChangeEvent(InputStream & stream)48         explicit ChangeEvent(InputStream& stream) {
49             eventType = static_cast<EventType>(stream.readUint32());
50             slot = stream.readUint32();
51 
52             if(eventType == EventType::SetHumanPlayer) {
53                 newStringValue = stream.readString();
54             } else {
55                 newValue = stream.readUint32();
56             }
57         }
58 
save(OutputStream & stream)59         void save(OutputStream& stream) const {
60             stream.writeUint32(static_cast<Uint32>(eventType));
61             stream.writeUint32(slot);
62             if(eventType == EventType::SetHumanPlayer) {
63                 stream.writeString(newStringValue);
64             } else {
65                 stream.writeUint32(newValue);
66             }
67         }
68 
69         EventType   eventType;
70         Uint32      slot;
71         Uint32      newValue;
72         std::string newStringValue;
73     };
74 
ChangeEventList()75     ChangeEventList() {
76     }
77 
ChangeEventList(InputStream & stream)78     explicit ChangeEventList(InputStream& stream) {
79         Uint32 numChangeEvents = stream.readUint32();
80         for(Uint32 i = 0; i < numChangeEvents; i++) {
81             changeEventList.push_back(ChangeEvent(stream));
82         }
83     }
84 
~ChangeEventList()85     ~ChangeEventList() {
86 
87     }
88 
save(OutputStream & stream)89     void save(OutputStream& stream) const {
90         stream.writeUint32(changeEventList.size());
91         for(const ChangeEvent& changeEvent : changeEventList) {
92             changeEvent.save(stream);
93         }
94     }
95 
96     std::list<ChangeEvent> changeEventList;
97 };
98 
99 #endif //CHANGEEVENTLIST_H
100