Added reload of levels on F7 (Update levelpack) to ease the test of changes.
[enigmagame.git] / src / WorldProxy.cc
blobf7e4c19142dc4bad019c560d2135f1290d6c7c54
1 /*
2 * Copyright (C) 2007,2008,2009 Ronald Lamprecht
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program 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.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #include "WorldProxy.hh"
21 #include "display.hh"
22 #include "errors.hh"
23 #include "server.hh"
24 #include "world.hh"
25 #include "stones/OxydStone.hh"
27 namespace enigma {
29 WorldProxy *WorldProxy::theSingleton = 0;
31 WorldProxy* WorldProxy::instance() {
32 if (theSingleton == 0) {
33 theSingleton = new WorldProxy();
35 return theSingleton;
38 void WorldProxy::shutdown() {
39 delete theSingleton;
42 WorldProxy::WorldProxy() {
45 std::string WorldProxy::getClass() const {
46 return "WorldProxy";
49 Value WorldProxy::getAttr(const std::string &key) const {
50 if (key == "AllowSingleOxyds") {
51 return server::AllowSingleOxyds;
52 } else if (key == "AllowSuicide") {
53 return server::AllowSuicide;
54 } else if (key == "AutoRespawn") {
55 return server::AutoRespawn;
56 } else if (key == "TogglePlayerOnDeath") {
57 return server::AllowTogglePlayer;
58 } else if (key == "ConserveLevel") {
59 return server::ConserveLevel;
60 } else if (key == "CreatingPreview") {
61 return server::CreatingPreview; // read only
62 } else if (key == "FollowAction") {
63 return server::FollowAction;
64 } else if (key == "FollowGrid") {
65 return server::FollowGrid;
66 } else if (key == "FollowMethod") {
67 return server::FollowMethod;
68 // } else if (key == "FollowRoomSize") { // Enigma 1.2
69 } else if (key == "FollowThreshold") {
70 return server::FollowThreshold;
71 } else if (key == "Height") {
72 return Height();
73 } else if (key == "IsDifficult") {
74 return server::IsDifficult; // read only
75 } else if (key == "LevelTime") {
76 return server::LevelTime; // read only
77 } else if (key == "ProvideExtralifes") {
78 return server::ProvideExtralifes;
79 } else if (key == "InfiniteReincarnation") {
80 return server::InfiniteReincarnation;
81 } else if (key == "ShowMoves") {
82 return server::ShowMoves;
83 } else if (key == "SublevelNumber") {
84 return (int)server::SublevelNumber;
85 } else if (key == "SublevelTitle") {
86 return server::SublevelTitle;
87 } else if (key == "SurviveFinish") {
88 return server::SurviveFinish;
89 } else if (key == "Width") {
90 return Width();
91 } else if (key == "ActorimpulseStrength") {
92 return server::BumperForce;
93 } else if (key == "CrackSpreading") {
94 return server::CrackSpreading;
95 } else if (key == "ElectricStrength") {
96 return server::ElectricForce;
97 } else if (key == "ExtralifeGlasses") {
98 return server::ExtralifeGlasses;
99 } else if (key == "FallenPuzzle") {
100 return server::FallenPuzzle;
101 } else if (key == "Fragility") {
102 return server::Fragility;
103 } else if (key == "FrictionStrength") {
104 return server::FrictionFactor;
105 } else if (key == "GlobalForce") {
106 return server::ConstantForce;
107 } else if (key == "MeditationStrength") {
108 return server::HoleForce;
109 } else if (key == "MagnetStrength") {
110 return server::MagnetForce;
111 } else if (key == "MagnetRange") {
112 return server::MagnetRange;
113 } else if (key == "MaxOxydColor") {
114 return server::MaxOxydColor;
115 } else if (key == "RubberViolationStrength") {
116 return server::RubberViolationStrength;
117 } else if (key == "SlopeStrength") {
118 return server::SlopeForce;
119 } else if (key == "SubSoil") {
120 return server::SubSoil;
121 } else if (key == "SwampSinkTime") {
122 if (server::SwampSinkSpeed > 0) {
123 if (server::SwampSinkSpeed >= 10000)
124 return 0;
125 else
126 return 7.0 / server::SwampSinkSpeed;
127 } else
128 return Value(); // infinite time
129 } else if (key == "WaterSinkTime") {
130 if (server::WaterSinkSpeed > 0) {
131 if (server::WaterSinkSpeed >= 10000)
132 return 0;
133 else
134 return 7.0 / server::WaterSinkSpeed;
135 } else
136 return Value(); // infinite time
137 } else if (key == "WormholeStrength") {
138 return server::WormholeForce;
139 } else if (key == "WormholeRange") {
140 return server::WormholeRange;
142 return Value(Value::DEFAULT);
145 void WorldProxy::setAttr(const std::string &key, const Value &val) {
146 if (key == "AllowSingleOxyds") {
147 server::AllowSingleOxyds = val.to_bool();
148 } else if (key == "AllowSuicide") {
149 server::AllowSuicide = val.to_bool();
150 } else if (key == "AutoRespawn") {
151 server::AutoRespawn = val.to_bool();
152 } else if (key == "TogglePlayerOnDeath") {
153 server::AllowTogglePlayer = val.to_bool();
154 } else if (key == "ConserveLevel") {
155 server::ConserveLevel = val.to_bool();
156 } else if (key == "FollowAction") {
157 server::FollowAction = val;
158 display::UpdateFollowMode();
159 } else if (key == "FollowGrid") {
160 bool wasGrid = server::FollowGrid;
161 server::FollowGrid = val.to_bool();
162 if (wasGrid && !server::FollowGrid) {
163 server::FollowMethod = display::FOLLOW_SCROLL;
164 server::FollowThreshold = 0;
165 server::FollowAction = 0;
166 } else if (!wasGrid && server::FollowGrid) {
167 server::FollowThreshold = 0.5;
168 server::FollowAction = ecl::V2(9.5, 6);
170 display::UpdateFollowMode();
171 } else if (key == "FollowMethod") {
172 int oldMethod = server::FollowMethod;
173 server::FollowMethod = val;
174 if ( oldMethod != server::FollowMethod) {
175 if (server::FollowMethod == display::FOLLOW_FLIP) {
176 server::FollowThreshold = 0.5;
177 server::FollowAction = ecl::V2(19, 12);
178 } else if (server::FollowMethod == display::FOLLOW_SCROLL && server::FollowGrid) {
179 server::FollowThreshold = 0.5;
180 server::FollowAction = ecl::V2(9.5, 6);
182 display::UpdateFollowMode();
184 // } else if (key == "FollowRoomSize") { // Enigma 1.2
185 } else if (key == "FollowThreshold") {
186 server::FollowThreshold = val;
187 display::UpdateFollowMode();
188 } else if (key == "ProvideExtralifes") {
189 bool newFlag = val.to_bool();
190 ASSERT(server::ProvideExtralifes || !newFlag, XLevelRuntime,
191 "Attribute 'ProvideExtralifes': toggling from false to true not allowed");
192 server::ProvideExtralifes = newFlag;
193 } else if (key == "InfiniteReincarnation") {
194 server::InfiniteReincarnation = val.to_bool();
195 } else if (key == "ShowMoves") {
196 server::ShowMoves = val.to_bool();
197 STATUSBAR->show_move_counter (server::ShowMoves);
198 } else if (key == "SublevelTitle") {
199 server::SublevelTitle = val.to_string();
200 } else if (key == "SurviveFinish") {
201 server::SurviveFinish = val.to_bool();
202 } else if (key == "CrackSpreading") {
203 server::CrackSpreading = val;
204 } else if (key == "ActorimpulseStrength") {
205 server::BumperForce = val;
206 } else if (key == "ElectricStrength") {
207 server::ElectricForce = val;
208 } else if (key == "ExtralifeGlasses") {
209 server::ExtralifeGlasses = val;
210 } else if (key == "FallenPuzzle") {
211 server::FallenPuzzle = val.to_string();
212 } else if (key == "Fragility") {
213 server::Fragility = val;
214 } else if (key == "FrictionStrength") {
215 server::FrictionFactor = val;
216 } else if (key == "GlobalForce") {
217 server::ConstantForce = val;
218 } else if (key == "MeditationStrength") {
219 server::HoleForce = val;
220 } else if (key == "MagnetStrength") {
221 server::MagnetForce = val;
222 BroadcastMessage("_updateglobals", "it_magnet", GRID_ITEMS_BIT);
223 } else if (key == "MagnetRange") {
224 server::MagnetRange = val;
225 BroadcastMessage("_updateglobals", "it_magnet", GRID_ITEMS_BIT);
226 } else if (key == "MaxOxydColor") {
227 server::MaxOxydColor = val;
228 ASSERT(server::MaxOxydColor >= 0 && server::MaxOxydColor < OxydStone::COLORCOUNT, XLevelRuntime,
229 "Attribute 'MaxOxydColor' value is out of range.");
230 } else if (key == "RubberViolationStrength") {
231 server::RubberViolationStrength = val;
232 } else if (key == "SlopeStrength") {
233 server::SlopeForce = val;
234 } else if (key == "SubSoil") {
235 server::SubSoil = val;
236 ASSERT(server::SubSoil >= 0 && server::SubSoil <= 2, XLevelRuntime,
237 "Attribute 'SubSoil' value is out of range.");
238 } else if (key == "SwampSinkTime") {
239 if (val.getType() == Value::NIL)
240 server::SwampSinkSpeed = 0;
241 else if ((double)val == 0)
242 server::SwampSinkSpeed = 10000;
243 else {
244 ASSERT((double)val > 0, XLevelRuntime, "SwampSinkTime less zero");
245 server::SwampSinkSpeed = 7.0 / (double)val;
247 } else if (key == "WaterSinkTime") {
248 if (val.getType() == Value::NIL)
249 server::WaterSinkSpeed = 0;
250 else if ((double)val == 0)
251 server::WaterSinkSpeed = 10000;
252 else {
253 ASSERT((double)val > 0, XLevelRuntime, "SwampSinkTime less zero");
254 server::WaterSinkSpeed = 7.0 / (double)val;
256 } else if (key == "WormholeStrength") {
257 server::WormholeForce = val;
258 BroadcastMessage("_updateglobals", "it_wormhole", GRID_ITEMS_BIT);
259 } else if (key == "WormholeRange") {
260 server::WormholeRange = val;
261 BroadcastMessage("_updateglobals", "it_wormhole", GRID_ITEMS_BIT);
262 } else
263 ASSERT(false, XLevelRuntime, ecl::strf("Attempt to set not existing global attribute '%s'.", key.c_str()).c_str());
267 } // namespace enigma