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