1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or(at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #include "ags/plugins/ags_snow_rain/ags_snow_rain.h"
24 
25 namespace AGS3 {
26 namespace Plugins {
27 namespace AGSSnowRain {
28 
AGSSnowRain()29 AGSSnowRain::AGSSnowRain() : PluginBase(),
30 	_rain(false, _screenWidth, _screenHeight, _engine),
31 	_snow(true, _screenWidth, _screenHeight, _engine) {
32 }
33 
AGS_GetPluginName()34 const char *AGSSnowRain::AGS_GetPluginName() {
35 	// Return the plugin description
36 	return "Snow/Rain plugin recreation";
37 }
38 
AGS_EngineStartup(IAGSEngine * engine)39 void AGSSnowRain::AGS_EngineStartup(IAGSEngine *engine) {
40 	PluginBase::AGS_EngineStartup(engine);
41 
42 	if (_engine->version < 13)
43 		_engine->AbortGame("Engine interface is too old, need newer version of AGS.");
44 
45 	SCRIPT_METHOD(srSetSnowDriftRange, AGSSnowRain::srSetSnowDriftRange);
46 	SCRIPT_METHOD(srSetSnowDriftSpeed, AGSSnowRain::srSetSnowDriftSpeed);
47 	SCRIPT_METHOD(srSetSnowFallSpeed, AGSSnowRain::srSetSnowFallSpeed);
48 	SCRIPT_METHOD(srChangeSnowAmount, AGSSnowRain::srChangeSnowAmount);
49 	SCRIPT_METHOD(srSetSnowBaseline, AGSSnowRain::srSetSnowBaseline);
50 	SCRIPT_METHOD(srSetSnowTransparency, AGSSnowRain::srSetSnowTransparency);
51 	SCRIPT_METHOD(srSetSnowDefaultView, AGSSnowRain::srSetSnowDefaultView);
52 	SCRIPT_METHOD(srSetSnowWindSpeed, AGSSnowRain::srSetSnowWindSpeed);
53 	SCRIPT_METHOD(srSetSnowAmount, AGSSnowRain::srSetSnowAmount);
54 	SCRIPT_METHOD(srSetSnowView, AGSSnowRain::srSetSnowView);
55 
56 	SCRIPT_METHOD(srSetRainDriftRange, AGSSnowRain::srSetRainDriftRange);
57 	SCRIPT_METHOD(srSetRainDriftSpeed, AGSSnowRain::srSetRainDriftSpeed);
58 	SCRIPT_METHOD(srSetRainFallSpeed, AGSSnowRain::srSetRainFallSpeed);
59 	SCRIPT_METHOD(srChangeRainAmount, AGSSnowRain::srChangeRainAmount);
60 	SCRIPT_METHOD(srSetRainBaseline, AGSSnowRain::srSetRainBaseline);
61 	SCRIPT_METHOD(srSetRainTransparency, AGSSnowRain::srSetRainTransparency);
62 	SCRIPT_METHOD(srSetRainDefaultView, AGSSnowRain::srSetRainDefaultView);
63 	SCRIPT_METHOD(srSetRainWindSpeed, AGSSnowRain::srSetRainWindSpeed);
64 	SCRIPT_METHOD(srSetRainAmount, AGSSnowRain::srSetRainAmount);
65 	SCRIPT_METHOD(srSetRainView, AGSSnowRain::srSetRainView);
66 
67 	SCRIPT_METHOD(srSetWindSpeed, AGSSnowRain::srSetWindSpeed);
68 	SCRIPT_METHOD(srSetBaseline, AGSSnowRain::srSetBaseline);
69 
70 	_engine->RequestEventHook(AGSE_PREGUIDRAW);
71 	_engine->RequestEventHook(AGSE_PRESCREENDRAW);
72 	_engine->RequestEventHook(AGSE_ENTERROOM);
73 	_engine->RequestEventHook(AGSE_SAVEGAME);
74 	_engine->RequestEventHook(AGSE_RESTOREGAME);
75 }
76 
77 
AGS_EngineOnEvent(int event,NumberPtr data)78 int64 AGSSnowRain::AGS_EngineOnEvent(int event, NumberPtr data) {
79 	if (event == AGSE_PREGUIDRAW) {
80 		if (_rain.IsActive())
81 			_rain.Update();
82 
83 		if (_snow.IsActive())
84 			_snow.UpdateWithDrift();
85 	} else if (event == AGSE_ENTERROOM) {
86 		_rain.EnterRoom();
87 		_snow.EnterRoom();
88 	} else if (event == AGSE_RESTOREGAME) {
89 		Serializer s(_engine, data, true);
90 		_rain.syncGame(s);
91 		_snow.syncGame(s);
92 	} else if (event == AGSE_SAVEGAME) {
93 		Serializer s(_engine, data, false);
94 		_rain.syncGame(s);
95 		_snow.syncGame(s);
96 	} else if (event == AGSE_PRESCREENDRAW) {
97 		// Get screen size once here
98 		_engine->GetScreenDimensions(&_screenWidth, &_screenHeight , &_screenColorDepth);
99 		_engine->UnrequestEventHook(AGSE_PRESCREENDRAW);
100 	}
101 
102 	return 0;
103 }
104 
105 
srSetWindSpeed(ScriptMethodParams & params)106 void AGSSnowRain::srSetWindSpeed(ScriptMethodParams &params) {
107 	PARAMS1(int, value);
108 	_snow.SetWindSpeed(value);
109 	_rain.SetWindSpeed(value);
110 }
111 
srSetBaseline(ScriptMethodParams & params)112 void AGSSnowRain::srSetBaseline(ScriptMethodParams &params) {
113 	PARAMS2(int, top, int, bottom);
114 
115 	// FIXME: The original seems to take co-ordinates in 320x200,
116 	// but still displays correctly at 640x400. So doubling must
117 	// occur somewhere. For now, doing it here
118 	if (_screenHeight == 400) {
119 		top *= 2;
120 		bottom *= 2;
121 	}
122 
123 	_snow.SetBaseline(top, bottom);
124 	_rain.SetBaseline(top, bottom);
125 }
126 
srSetSnowDriftRange(ScriptMethodParams & params)127 void AGSSnowRain::srSetSnowDriftRange(ScriptMethodParams &params) {
128 	PARAMS2(int, min_value, int, max_value);
129 	_snow.SetDriftRange(min_value, max_value);
130 }
131 
srSetSnowDriftSpeed(ScriptMethodParams & params)132 void AGSSnowRain::srSetSnowDriftSpeed(ScriptMethodParams &params) {
133 	PARAMS2(int, min_value, int, max_value);
134 	_snow.SetDriftSpeed(min_value, max_value);
135 }
136 
srChangeSnowAmount(ScriptMethodParams & params)137 void AGSSnowRain::srChangeSnowAmount(ScriptMethodParams &params) {
138 	PARAMS1(int, amount);
139 	_snow.ChangeAmount(amount);
140 }
141 
srSetSnowView(ScriptMethodParams & params)142 void AGSSnowRain::srSetSnowView(ScriptMethodParams &params) {
143 	PARAMS4(int, kind_id, int, event, int, view, int, loop);
144 	_snow.SetView(kind_id, event, view, loop);
145 }
146 
srSetSnowDefaultView(ScriptMethodParams & params)147 void AGSSnowRain::srSetSnowDefaultView(ScriptMethodParams &params) {
148 	PARAMS2(int, view, int, loop);
149 	_snow.SetDefaultView(view, loop);
150 }
151 
srSetSnowTransparency(ScriptMethodParams & params)152 void AGSSnowRain::srSetSnowTransparency(ScriptMethodParams &params) {
153 	PARAMS2(int, min_value, int, max_value);
154 	_snow.SetTransparency(min_value, max_value);
155 }
156 
srSetSnowWindSpeed(ScriptMethodParams & params)157 void AGSSnowRain::srSetSnowWindSpeed(ScriptMethodParams &params) {
158 	PARAMS1(int, value);
159 	_snow.SetWindSpeed(value);
160 }
161 
srSetSnowBaseline(ScriptMethodParams & params)162 void AGSSnowRain::srSetSnowBaseline(ScriptMethodParams &params) {
163 	PARAMS2(int, top, int, bottom);
164 	_snow.SetBaseline(top, bottom);
165 }
166 
srSetSnowAmount(ScriptMethodParams & params)167 void AGSSnowRain::srSetSnowAmount(ScriptMethodParams &params) {
168 	PARAMS1(int, amount);
169 	_snow.SetAmount(amount);
170 }
171 
srSetSnowFallSpeed(ScriptMethodParams & params)172 void AGSSnowRain::srSetSnowFallSpeed(ScriptMethodParams &params) {
173 	PARAMS2(int, min_value, int, max_value);
174 	_snow.SetFallSpeed(min_value, max_value);
175 }
176 
srSetRainDriftRange(ScriptMethodParams & params)177 void AGSSnowRain::srSetRainDriftRange(ScriptMethodParams &params) {
178 	PARAMS2(int, min_value, int, max_value);
179 	_rain.SetDriftRange(min_value, max_value);
180 }
181 
srSetRainDriftSpeed(ScriptMethodParams & params)182 void AGSSnowRain::srSetRainDriftSpeed(ScriptMethodParams &params) {
183 	PARAMS2(int, min_value, int, max_value);
184 	_rain.SetDriftSpeed(min_value, max_value);
185 }
186 
srChangeRainAmount(ScriptMethodParams & params)187 void AGSSnowRain::srChangeRainAmount(ScriptMethodParams &params) {
188 	PARAMS1(int, amount);
189 	_rain.ChangeAmount(amount);
190 }
191 
srSetRainView(ScriptMethodParams & params)192 void AGSSnowRain::srSetRainView(ScriptMethodParams &params) {
193 	PARAMS4(int, kind_id, int, event, int, view, int, loop);
194 	_rain.SetView(kind_id, event, view, loop);
195 }
196 
srSetRainDefaultView(ScriptMethodParams & params)197 void AGSSnowRain::srSetRainDefaultView(ScriptMethodParams &params) {
198 	PARAMS2(int, view, int, loop);
199 	_rain.SetDefaultView(view, loop);
200 }
201 
srSetRainTransparency(ScriptMethodParams & params)202 void AGSSnowRain::srSetRainTransparency(ScriptMethodParams &params) {
203 	PARAMS2(int, min_value, int, max_value);
204 	_rain.SetTransparency(min_value, max_value);
205 }
206 
srSetRainWindSpeed(ScriptMethodParams & params)207 void AGSSnowRain::srSetRainWindSpeed(ScriptMethodParams &params) {
208 	PARAMS1(int, value);
209 	_rain.SetWindSpeed(value);
210 }
211 
srSetRainBaseline(ScriptMethodParams & params)212 void AGSSnowRain::srSetRainBaseline(ScriptMethodParams &params) {
213 	PARAMS2(int, top, int, bottom);
214 	_rain.SetBaseline(top, bottom);
215 }
216 
srSetRainAmount(ScriptMethodParams & params)217 void AGSSnowRain::srSetRainAmount(ScriptMethodParams &params) {
218 	PARAMS1(int, amount);
219 	_rain.SetAmount(amount);
220 }
221 
srSetRainFallSpeed(ScriptMethodParams & params)222 void AGSSnowRain::srSetRainFallSpeed(ScriptMethodParams &params) {
223 	PARAMS2(int, min_value, int, max_value);
224 	_rain.SetFallSpeed(min_value, max_value);
225 }
226 
227 } // namespace AGSSnowRain
228 } // namespace Plugins
229 } // namespace AGS3
230