1 ////////////////////////////////////////////////////////////////////////////////
2 //            Copyright (C) 2004-2011 by The Allacrost Project
3 //            Copyright (C) 2012-2016 by Bertram (Valyria Tear)
4 //                         All Rights Reserved
5 //
6 // This code is licensed under the GNU GPL version 2. It is free software
7 // and you may modify it and/or redistribute it under the terms of this license.
8 // See http://www.gnu.org/copyleft/gpl.html for details.
9 ////////////////////////////////////////////////////////////////////////////////
10 
11 #include "global_events.h"
12 
13 using namespace vt_utils;
14 using namespace vt_script;
15 
16 namespace vt_global
17 {
18 
GameEvents()19 GameEvents::GameEvents()
20 {
21 }
22 
~GameEvents()23 GameEvents::~GameEvents()
24 {
25     Clear();
26 }
27 
Clear()28 void GameEvents::Clear()
29 {
30     // Delete all event groups
31     for(std::map<std::string, GlobalEventGroup *>::iterator it = _event_groups.begin(); it != _event_groups.end(); ++it) {
32         delete(it->second);
33     }
34     _event_groups.clear();
35 }
36 
DoesEventExist(const std::string & group_name,const std::string & event_name) const37 bool GameEvents::DoesEventExist(const std::string& group_name, const std::string& event_name) const
38 {
39     std::map<std::string, GlobalEventGroup *>::const_iterator group_iter = _event_groups.find(group_name);
40     if(group_iter == _event_groups.end())
41         return false;
42 
43     std::map<std::string, int32_t>::const_iterator event_iter = group_iter->second->GetEvents().find(event_name);
44     if(event_iter == group_iter->second->GetEvents().end())
45         return false;
46 
47     return true;
48 }
49 
GetEventValue(const std::string & group_name,const std::string & event_name) const50 int32_t GameEvents::GetEventValue(const std::string& group_name, const std::string& event_name) const
51 {
52     std::map<std::string, GlobalEventGroup *>::const_iterator group_iter = _event_groups.find(group_name);
53     if(group_iter == _event_groups.end())
54         return 0;
55 
56     std::map<std::string, int32_t>::const_iterator event_iter = group_iter->second->GetEvents().find(event_name);
57     if(event_iter == group_iter->second->GetEvents().end())
58         return 0;
59 
60     return event_iter->second;
61 }
62 
SetEventValue(const std::string & group_name,const std::string & event_name,int32_t event_value)63 void GameEvents::SetEventValue(const std::string& group_name,
64                                const std::string& event_name,
65                                int32_t event_value)
66 {
67     GlobalEventGroup* geg = nullptr;
68     std::map<std::string, GlobalEventGroup *>::const_iterator group_iter = _event_groups.find(group_name);
69     if(group_iter == _event_groups.end()) {
70         geg = new GlobalEventGroup(group_name);
71         _event_groups.insert(std::make_pair(group_name, geg));
72     } else {
73         geg = group_iter->second;
74     }
75 
76     geg->SetEvent(event_name, event_value);
77 }
78 
SaveEvents(WriteScriptDescriptor & file)79 void GameEvents::SaveEvents(WriteScriptDescriptor& file)
80 {
81     if(file.IsFileOpen() == false) {
82         PRINT_WARNING << "the file provided in the function argument was not open" << std::endl;
83         return;
84     }
85 
86     file.InsertNewLine();
87     file.WriteLine("event_groups = {");
88     for(auto it = _event_groups.begin(); it != _event_groups.end(); ++it) {
89         GlobalEventGroup* event_group = it->second;
90 
91         file.WriteLine("\t" + event_group->GetGroupName() + " = {");
92 
93         uint32_t i = 0;
94         for(auto it = event_group->GetEvents().begin(); it != event_group->GetEvents().end(); ++it) {
95             if(it == event_group->GetEvents().begin())
96                 file.WriteLine("\t\t", false);
97             else
98                 file.WriteLine(", ", false);
99 
100             // Add a new line every 4 entries for better readability and debugging
101             if ((i > 0) && !(i % 4)) {
102                 file.InsertNewLine();
103                 file.WriteLine("\t\t", false);
104             }
105 
106             file.WriteLine("[\"" + it->first + "\"] = " + NumberToString(it->second), false);
107 
108             ++i;
109         }
110         file.WriteLine("\n\t},");
111 
112     }
113 
114     file.WriteLine("},"); // event_groups
115     file.InsertNewLine();
116 
117 }
118 
LoadEvents(ReadScriptDescriptor & file)119 void GameEvents::LoadEvents(ReadScriptDescriptor& file)
120 {
121     if(file.IsFileOpen() == false) {
122         PRINT_WARNING << "The file provided in the function argument was not open" << std::endl;
123         return;
124     }
125 
126     std::vector<std::string> group_names;
127     if (!file.OpenTable("event_groups"))
128         return;
129 
130     file.ReadTableKeys(group_names);
131     for(uint32_t i = 0; i < group_names.size(); i++) {
132         std::string group_name = group_names[i];
133         _AddNewEventGroup(group_name);
134         // new_group is guaranteed not to be nullptr
135         GlobalEventGroup* new_group = _GetEventGroup(group_name);
136 
137         std::vector<std::string> event_names;
138 
139         if (file.OpenTable(group_name)) {
140             file.ReadTableKeys(event_names);
141             for(uint32_t i = 0; i < event_names.size(); i++) {
142                 new_group->AddNewEvent(event_names[i], file.ReadInt(event_names[i]));
143             }
144             file.CloseTable();
145         }
146         else {
147             PRINT_ERROR << "Invalid event group name '" << group_name << " in save file "
148                         << file.GetFilename() << std::endl;
149         }
150     }
151     file.CloseTable(); // event_groups
152 }
153 
_AddNewEventGroup(const std::string & group_name)154 void GameEvents::_AddNewEventGroup(const std::string& group_name)
155 {
156     if(_DoesEventGroupExist(group_name)) {
157         PRINT_WARNING << "failed because there was already an event group that existed for "
158                       << "the requested group name: " << group_name << std::endl;
159         return;
160     }
161 
162     GlobalEventGroup* geg = new GlobalEventGroup(group_name);
163     _event_groups.insert(std::make_pair(group_name, geg));
164 }
165 
_GetEventGroup(const std::string & group_name) const166 GlobalEventGroup* GameEvents::_GetEventGroup(const std::string& group_name) const
167 {
168     std::map<std::string, GlobalEventGroup *>::const_iterator group_iter = _event_groups.find(group_name);
169     if(group_iter == _event_groups.end()) {
170         PRINT_WARNING << "could not find any event group by the requested name: " << group_name << std::endl;
171         return nullptr;
172     }
173     return (group_iter->second);
174 }
175 
176 } // namespace vt_global
177