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.
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"
25 #include "stones/OxydStone.hh"
29 WorldProxy
*WorldProxy::theSingleton
= 0;
31 WorldProxy
* WorldProxy::instance() {
32 if (theSingleton
== 0) {
33 theSingleton
= new WorldProxy();
38 void WorldProxy::shutdown() {
42 WorldProxy::WorldProxy() {
45 std::string
WorldProxy::getClass() const {
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") {
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") {
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)
126 return 7.0 / server::SwampSinkSpeed
;
128 return Value(); // infinite time
129 } else if (key
== "WaterSinkTime") {
130 if (server::WaterSinkSpeed
> 0) {
131 if (server::WaterSinkSpeed
>= 10000)
134 return 7.0 / server::WaterSinkSpeed
;
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;
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;
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
);
263 ASSERT(false, XLevelRuntime
, ecl::strf("Attempt to set not existing global attribute '%s'.", key
.c_str()).c_str());
267 } // namespace enigma