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