OpenClonk
C4Weather.cpp
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 1998-2000, Matthes Bender
5  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
6  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
7  *
8  * Distributed under the terms of the ISC license; see accompanying file
9  * "COPYING" for details.
10  *
11  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
12  * See accompanying file "TRADEMARK" for details.
13  *
14  * To redistribute this file separately, substitute the full license texts
15  * for the above references.
16  */
17 
18 /* Controls temperature, wind, and natural disasters */
19 
20 #include "C4Include.h"
21 #include "landscape/C4Weather.h"
22 
23 #include "game/C4GraphicsSystem.h"
24 #include "graphics/C4Draw.h"
25 #include "lib/C4Random.h"
26 #include "object/C4Object.h"
27 #include "platform/C4SoundSystem.h"
28 
30 {
31  Default();
32 }
33 
35 {
36  Clear();
37 }
38 
39 void C4Weather::Init(bool fScenario)
40 {
41  if (fScenario)
42  {
43  // Season
46  // Temperature
49  // Wind
51  // gamma?
53  }
54  // set gamma
56 }
57 
59 {
60  // Season
61  if (!::Game.iTick35)
62  {
64  if (SeasonDelay>=200)
65  {
66  SeasonDelay=0;
67  Season++;
71  }
72  }
73  // Temperature
74  if (!::Game.iTick35)
75  {
76  int32_t iTemperature = Climate - fixtoi(Cos(itofix(36 * Season, 10)), TemperatureRange);
77  if (Temperature<iTemperature) Temperature++;
78  else if (Temperature>iTemperature) Temperature--;
79  }
80  // Wind
81  if (!::Game.iTick1000)
83  if (!::Game.iTick10)
84  Wind=Clamp<int32_t>(Wind+Sign(TargetWind-Wind),
87 }
88 
90 {
91 
92 }
93 
94 int32_t C4Weather::GetWind(int32_t x, int32_t y)
95 {
96  if (Landscape.GetBackPix(x,y) != 0) return 0;
97  return Wind;
98 }
99 
101 {
102  return Temperature;
103 }
104 
106 {
107  Season=0; YearSpeed=0; SeasonDelay=0;
108  Wind=TargetWind=0;
110  TemperatureRange=30;
111  NoGamma=true;
112 }
113 
114 void C4Weather::SetWind(int32_t iWind)
115 {
116  Wind=Clamp<int32_t>(iWind,-100,+100);
117  TargetWind=Clamp<int32_t>(iWind,-100,+100);
118 }
119 
120 void C4Weather::SetTemperature(int32_t iTemperature)
121 {
122  Temperature = Clamp<int32_t>(iTemperature,-100,100);
123  SetSeasonGamma();
124 }
125 
126 void C4Weather::SetSeason(int32_t iSeason)
127 {
128  Season = Clamp<int32_t>(iSeason,0,100);
129  SetSeasonGamma();
130 }
131 
133 {
134  return Season;
135 }
136 
137 void C4Weather::SetClimate(int32_t iClimate)
138 {
139  Climate = Clamp<int32_t>(iClimate,-50,+50);
140  SetSeasonGamma();
141 }
142 
144 {
145  return Climate;
146 }
147 
148 static float SeasonColors[4][3] =
149 {
150  { 0.90f, 0.90f, 1.00f }, // winter: slightly blue; blued out by temperature
151  { 1.00f, 1.05f, 0.90f }, // spring: green to yellow
152  { 1.00f, 1.00f, 1.00f }, // summer: regular ramp
153  { 1.00f, 0.95f, 0.90f } // fall: dark, brown ramp
154 };
155 
157 {
158  if (NoGamma) return;
159  // get season num and offset
160  int32_t iSeason1=(Season/25)%4; int32_t iSeason2=(iSeason1+1)%4;
161  int32_t iSeasonOff1=Clamp(Season%25, 5, 19)-5; int32_t iSeasonOff2=15-iSeasonOff1;
162  float gamma[3] = { 0.0f, 0.0f, 0.0f };
163  // interpolate between season colors
164  for (int32_t iChan=0; iChan<3; iChan+=8)
165  {
166  float c1 = SeasonColors[iSeason1][iChan],
167  c2 = SeasonColors[iSeason2][iChan];
168  gamma[iChan] = (c1*iSeasonOff2 + c2*iSeasonOff1) / 15;
169  }
170  // apply gamma ramp
171  pDraw->SetGamma(gamma[0], gamma[1], gamma[2], C4GRI_SEASON);
172 }
173 
175 {
176  pComp->Value(mkNamingAdapt(Season, "Season", 0));
177  pComp->Value(mkNamingAdapt(YearSpeed, "YearSpeed", 0));
178  pComp->Value(mkNamingAdapt(SeasonDelay, "SeasonDelay", 0));
179  pComp->Value(mkNamingAdapt(Wind, "Wind", 0));
180  pComp->Value(mkNamingAdapt(TargetWind, "TargetWind", 0));
181  pComp->Value(mkNamingAdapt(Temperature, "Temperature", 0));
182  pComp->Value(mkNamingAdapt(TemperatureRange, "TemperatureRange", 30));
183  pComp->Value(mkNamingAdapt(Climate, "Climate", 0));
184  pComp->Value(mkNamingAdapt(NoGamma, "NoGamma", 0));
185 
186  int32_t gamma[C4MaxGammaRamps*3],
187  gammaDefaults[C4MaxGammaRamps*3];
188  for (int32_t i=0; i<C4MaxGammaRamps; ++i)
189  {
190  gammaDefaults[i*3+0] = 100;
191  gammaDefaults[i*3+1] = 100;
192  gammaDefaults[i*3+2] = 100;
193  gamma[i*3+0] = int(pDraw->gamma[i][0] * 100.0f);
194  gamma[i*3+1] = int(pDraw->gamma[i][1] * 100.0f);
195  gamma[i*3+2] = int(pDraw->gamma[i][2] * 100.0f);
196  }
197  pComp->Value(mkNamingAdapt(mkArrayAdaptM(gamma), "Gamma", gammaDefaults));
198  for (int32_t i=0; i<C4MaxGammaRamps; ++i)
199  {
200  pDraw->gamma[i][0] = float(gamma[i*3+0]) / 100.0f;
201  pDraw->gamma[i][1] = float(gamma[i*3+1]) / 100.0f;
202  pDraw->gamma[i][2] = float(gamma[i*3+2]) / 100.0f;
203  }
204 }
205 
#define C4GRI_SEASON
Definition: C4Constants.h:39
const int C4MaxGammaRamps
Definition: C4Constants.h:35
C4Draw * pDraw
Definition: C4Draw.cpp:42
C4Game Game
Definition: C4Globals.cpp:52
C4Landscape Landscape
C4Fixed itofix(int32_t x)
Definition: C4Real.h:261
C4Real Cos(const C4Real &fAngle)
Definition: C4Real.h:266
int fixtoi(const C4Fixed &x)
Definition: C4Real.h:259
C4Weather Weather
Definition: C4Weather.cpp:206
int Sign(T val)
Definition: Standard.h:45
T Clamp(T bval, T lbound, T rbound)
Definition: Standard.h:44
StdArrayAdapt< T > mkArrayAdaptM(T(&array)[size])
Definition: StdAdaptors.h:338
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
Definition: StdAdaptors.h:92
void SetGamma(float r, float g, float b, int32_t iRampIndex)
Definition: C4Draw.cpp:738
float gamma[C4MaxGammaRamps][3]
Definition: C4Draw.h:97
C4Scenario C4S
Definition: C4Game.h:74
int32_t iTick35
Definition: C4Game.h:130
int32_t iTick10
Definition: C4Game.h:130
int32_t iTick1000
Definition: C4Game.h:130
BYTE GetBackPix(int32_t x, int32_t y) const
int32_t Evaluate()
Definition: C4Scenario.cpp:50
int32_t Max
Definition: C4Scenario.h:31
int32_t Min
Definition: C4Scenario.h:31
bool NoGamma
Definition: C4Scenario.h:202
C4SVal YearSpeed
Definition: C4Scenario.h:200
C4SVal Wind
Definition: C4Scenario.h:201
C4SVal Climate
Definition: C4Scenario.h:199
C4SVal StartSeason
Definition: C4Scenario.h:200
C4SWeather Weather
Definition: C4Scenario.h:238
int32_t GetTemperature()
Definition: C4Weather.cpp:100
void Clear()
Definition: C4Weather.cpp:89
void SetClimate(int32_t iClimate)
Definition: C4Weather.cpp:137
int32_t YearSpeed
Definition: C4Weather.h:30
int32_t TemperatureRange
Definition: C4Weather.h:32
int32_t GetWind(int32_t x, int32_t y)
Definition: C4Weather.cpp:94
int32_t Wind
Definition: C4Weather.h:31
int32_t GetSeason()
Definition: C4Weather.cpp:132
void Default()
Definition: C4Weather.cpp:105
void SetTemperature(int32_t iTemperature)
Definition: C4Weather.cpp:120
int32_t NoGamma
Definition: C4Weather.h:33
void SetWind(int32_t iWind)
Definition: C4Weather.cpp:114
int32_t SeasonDelay
Definition: C4Weather.h:30
void SetSeason(int32_t iSeason)
Definition: C4Weather.cpp:126
void Execute()
Definition: C4Weather.cpp:58
int32_t TargetWind
Definition: C4Weather.h:31
void SetSeasonGamma()
Definition: C4Weather.cpp:156
int32_t Season
Definition: C4Weather.h:30
int32_t GetClimate()
Definition: C4Weather.cpp:143
int32_t Climate
Definition: C4Weather.h:32
int32_t Temperature
Definition: C4Weather.h:32
void Init(bool fScenario)
Definition: C4Weather.cpp:39
void CompileFunc(StdCompiler *pComp)
Definition: C4Weather.cpp:174
void Value(const T &rStruct)
Definition: StdCompiler.h:161