1HedgewarsScriptLoad("/Scripts/Locale.lua")
2HedgewarsScriptLoad("/Scripts/Params.lua")
3
4local gravity = 100
5local mingravity
6local maxgravity
7local mingravity_normal
8local maxgravity_normal
9local mingravity_low
10local maxgravity_low
11local delta = 0
12local period
13local periodtimer = 0
14local wdGameTicks = 0
15local wdTTL = 0
16local mln = 1000000
17local lowGravityUsed = false
18
19local script2_onNewTurn
20local script2_onGameTick20
21local script2_onGameInit
22local script2_onHogAttack
23
24
25function grav_onNewTurn()
26    lowGravityUsed = false
27    if maxgravity_normal == nil then
28        gravity = mingravity_normal
29    else
30        mingravity = mingravity_normal
31        maxgravity = maxgravity_normal
32        if period > 0 then
33           delta = div(maxgravity_normal - mingravity_normal, period)
34        end
35    end
36    if delta ~= nil and period == nil then
37      SetGravity(gravity)
38    else
39      SetGravity(div(gravity, mln))
40    end
41
42    wdGameTicks = GameTime
43
44    if script2_onNewTurn ~= nil then
45        script2_onNewTurn()
46    end
47end
48
49function grav_onGameTick20()
50    if wdGameTicks + 15000 < GameTime then
51        SetGravity(100)
52    else
53        if wdTTL ~= TurnTimeLeft then
54            wdGameTicks = GameTime
55        end
56
57        if delta == nil then
58            if periodtimer == 0 then
59                periodtimer = period * 2
60                SetGravity(div(GetRandom(maxgravity - mingravity + 1) + mingravity, mln))
61            else
62                periodtimer = periodtimer - 1
63            end
64        elseif delta == 0 then
65            SetGravity(gravity)
66        else
67            if delta > 0 and gravity + delta > maxgravity then
68                gravity = maxgravity
69                delta = -delta
70            elseif delta < 0 and gravity + delta < mingravity then
71                gravity = mingravity
72                delta = -delta
73            else
74                gravity = gravity + delta
75            end
76
77            SetGravity(div(gravity, mln))
78        end
79    end
80
81    wdTTL = TurnTimeLeft
82
83    if script2_onGameTick20 ~= nil then
84        script2_onGameTick20()
85    end
86end
87
88function onParameters()
89    parseParams()
90
91    gravity = tonumber(params["g"]) or gravity
92
93    mingravity_normal = gravity
94    if mingravity_normal > 0 then
95        mingravity_low = div(mingravity_normal, 2)
96    else
97        mingravity_low = mingravity_normal * 2
98    end
99    mingravity = mingravity_normal
100    if type(tonumber(params["g2"])) == "number" then
101        maxgravity_normal = tonumber(params["g2"])
102        if maxgravity_normal > 0 then
103            maxgravity_low = div(maxgravity_normal, 2)
104        else
105            maxgravity_low = maxgravity_normal * 2
106        end
107        maxgravity = maxgravity_normal
108    end
109    period = params["period"]
110
111    if type(mingravity) == "number" and type(maxgravity) == "number" then
112        if period ~= nil then
113            period = div(period, 40)
114        else
115            period = 125
116        end
117
118        mingravity = mingravity * mln
119        mingravity_normal = mingravity_normal * mln
120        mingravity_low = mingravity_low * mln
121        maxgravity = maxgravity * mln
122        maxgravity_normal = maxgravity_normal * mln
123        maxgravity_low = maxgravity_low * mln
124
125        if mingravity > maxgravity then
126            mingravity, maxgravity = maxgravity, mingravity
127            mingravity_normal, maxgravity_normal = maxgravity_normal, mingravity_normal
128            mingravity_low, maxgravity_low = maxgravity_low, mingravity_low
129        end
130
131        gravity = mingravity
132
133        if period > 0 then
134            delta = div(maxgravity_normal - mingravity_normal, period)
135        else
136            period = -period
137            delta = nil
138        end
139    end
140
141    secondScript = params["script2"]
142
143    if secondScript ~= nil then
144        onParameters = nil
145        HedgewarsScriptLoad("/Scripts/Multiplayer/" .. secondScript .. ".lua")
146
147        script2_onNewTurn = onNewTurn
148        script2_onGameTick20 = onGameTick20
149        script2_onGameInit = onGameInit
150        script2_onHogAttack = onHogAttack
151
152        if onParameters ~= nil then
153            onParameters()
154        end
155    end
156
157    onNewTurn = grav_onNewTurn
158    onGameTick20 = grav_onGameTick20
159    onGameInit = grav_onGameInit
160    onHogAttack = grav_onHogAttack
161end
162
163function grav_onGameInit()
164    DisableGameFlags(gfLowGravity)
165
166    local v, printperiod
167    if period ~= nil then
168        local period_ms = period * 40
169        if period_ms % 1000 == 0 then
170            printperiod = string.format(loc("%i s"), div(period_ms, 1000))
171        else
172            printperiod = string.format(loc("%i ms"), period_ms)
173        end
174    end
175    if delta == nil then
176        v = string.format(loc("Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"), div(mingravity_normal, mln), div(maxgravity_normal, mln), printperiod)
177    elseif period ~= nil then
178        v = string.format(loc("Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"), div(mingravity_normal, mln), div(maxgravity_normal, mln), printperiod)
179    elseif gravity > 100 then
180        v = string.format(loc("High Gravity: Gravity is %i%%"), gravity)
181    elseif gravity < 100 then
182        v = string.format(loc("Low Gravity: Gravity is %i%%"), gravity)
183    else
184        v = loc("Gravity: 100%") .. "|" ..
185            loc("Script parameter examples:") .. "|" ..
186            loc("“g=150”, where 150 is 150% of normal gravity.") .. "|" ..
187            loc("“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms.") .. "|" ..
188            loc("Set period to negative value for random gravity.")
189    end
190    Goals = v
191
192    if script2_onGameInit ~= nil then
193        script2_onGameInit()
194    end
195end
196
197function grav_onHogAttack(ammoType)
198    if ammoType == amLowGravity then
199        lowGravityUsed = true
200        if maxgravity_normal == nil then
201            gravity = mingravity_low
202        else
203            mingravity = mingravity_low
204            maxgravity = maxgravity_low
205            if period > 0 then
206                delta = div(maxgravity_low - mingravity_low, period)
207            end
208        end
209    end
210    if script2_onHogAttack ~= nil then
211        script2_onHogAttack()
212    end
213end
214