Massive Continental supplies update
authorWuzzy <Wuzzy2@mail.ru>
Thu, 03 May 2018 15:18:28 +0200
changeset 13360 e27540ad33bd
parent 13359 7d772358dc22
child 13361 aabec3d86139
Massive Continental supplies update List of changes: * Invulnerability protects from sabotage damage * Sabotage kills hog instantly when health reaches 0 * Reliably prevent using of Lonely Cries and baseball bat specials when usage not allowed * Don't explode Anno 1302 and Medicine if drowning * Don't play “Missed” and “Laugh” taunt when those don't make sense * Major rewrite of ALL strings for better usability * Add custom weapon tooltips * Major refactoring * Improve audiovisual effects * Show message when hog receives new continent ammo * Sabotaged hedgehogs also emit smoke when it's not their turn * Can switch continent in reverse order with [Precise]+[Switch] * Fix retreat timer not turning red for some weapons
share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua
--- a/share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua	Thu May 03 11:58:07 2018 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua	Thu May 03 15:18:28 2018 +0200
@@ -47,17 +47,18 @@
 end
 
 --Will end the turn + give escape time
-function EndTurn(seconds)
-	SetState(CurrentHedgehog,bor(GetState(CurrentHedgehog),gstAttacked))
-	--set espace time
+function EndTurnCS(seconds)
+	--set escape time
 	TurnTimeLeft = GetAwayTime*10*seconds
+	if TurnTimeLeft > 0 then
+		Retreat(TurnTimeLeft, false)
+	end
  end
 
  --show health tag (will mostly be used when a hog is damaged)
 function ShowDamageTag(hog,damage)
-	healthtag=AddVisualGear(GetX(hog), GetY(hog), vgtHealthTag, damage, false)
-	v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 = GetVisualGearValues(healthtag)
-	SetVisualGearValues(healthtag, v1, v2, v3, v4, v5, v6, v7, v8, v9, GetClanColor(GetHogClan(hog)))
+	local healthtag=AddVisualGear(GetX(hog), GetY(hog), vgtHealthTag, damage, false)
+	SetVisualGearValues(healthtag, nil, nil, nil, nil, nil, nil, nil, nil, nil, GetClanColor(GetHogClan(hog)))
 end
 
 --will use IntegerSqrt
@@ -66,127 +67,299 @@
 	return AddGear(div((GetGearRadius(hedgehog)*2*vx),hypo)+GetX(hedgehog), div((GetGearRadius(hedgehog)*2*vy),hypo)+GetY(hedgehog), geartype, 0, vx, vy, timer)
 end
 
---====MISC GLOBALS====
+function CollectMultiAmmo(hog, ammoList, noAddAmmo)
+	local x, y = GetGearPosition(hog)
+	x = x + 2
+	y = y + 32
+	local ammoStr = ""
+	local ammoLength = 0
+	for _, _ in pairs(ammoList) do
+		ammoLength = ammoLength + 1
+	end
+	local a = 1
+	for ammo, count in pairs(ammoList) do
+		if not noAddAmmo then
+			local oldCount = GetAmmoCount(hog, ammo)
+			local newCount = oldCount + count
+			-- Make sure that finite ammo stays finite
+			if count < 100 and oldCount < 100 and newCount >= 100 then
+				newCount = 99
+			end
+			AddAmmo(hog, ammo, newCount)
+		end
+		if IsHogLocal(hog) then
+			x = x + 2
+			y = y + 32
+			local vgear = AddVisualGear(x, y, vgtAmmo, 0, true)
+			if vgear ~= nil then
+				local vgtFrame = ammo
+				SetVisualGearValues(vgear, nil, nil, nil, nil, nil, vgtFrame)
+			end
+
+			ammoStr = ammoStr .. string.format(loc("%s (+%d)"), GetAmmoName(ammo), count)
+			if a < ammoLength then
+				ammoStr = ammoStr .. " • "
+			end
+		end
+		a = a + 1
+	end
+	if ammoLength > 0 then
+		PlaySound(sndShotgunReload)
+		-- Show collected ammo
+		if IsHogLocal(hog) then
+			AddCaption(ammoStr, GetClanColor(GetHogClan(hog)), capgrpAmmoinfo)
+		end
+	end
+end
+
+function SetAttackState(state)
+	if state==true then
+		SetInputMask(bor(GetInputMask(), gmAttack))
+	else
+		SetInputMask(band(GetInputMask(), bnot(gmAttack)))
+	end
+end
+
+--====MISC_TIMER GLOBALS====
+local CS = {}
 
 --for selecting continent
-local GLOBAL_INIT_TEAMS = {}
-local GLOBAL_SELECT_CONTINENT_CHECK=false
-local GLOBAL_START_TIME=0
-local GLOBAL_HOG_HEALTH=100
-local GLOBAL_TEAM_CONTINENT = {}
+
+CS.INIT_TEAMS = {}
+CS.GAME_STARTED = false
+CS.SELECT_CONTINENT_CHECK=false
+CS.START_TIME=0
+CS.HOG_HEALTH=100
+CS.TEAM_CONTINENT = {}
 
 --variables for seeing if you have swaped around on a weapon
-local GLOBAL_AUSTRALIAN_SPECIAL=0
-local GLOBAL_AFRICAN_SPECIAL_SEDUCTION=0
-local GLOBAL_AFRICAN_SPECIAL_STICKY=0
-local GLOBAL_SOUTH_AMERICAN_SPECIAL=false
-local GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER=1
-local GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=false
-local GLOBAL_KERGUELEN_SPECIAL=1
-local GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN=false
-local GLOBAL_EUROPE_SPECIAL=0
-local GLOBAL_ANTARCTICA_SPECIAL=0
-local GLOBAL_SEDUCTION_INCREASER=0
+CS.AUSTRALIAN_SPECIAL=0
+CS.AFRICAN_SPECIAL_SEDUCTION=0
+CS.AFRICAN_SPECIAL_STICKY=0
+CS.SOUTH_AMERICAN_SPECIAL=false
+CS.NORTH_AMERICAN_SPECIAL_SNIPER=1
+CS.NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=false
+CS.KERGUELEN_SPECIAL=1
+CS.NORTH_AMERICAN_SPECIAL_SHOTGUN=false
+CS.EUROPE_SPECIAL=0
+CS.ANTARCTICA_SPECIAL=0
+CS.SEDUCTION_INCREASER=0
 
 --detection if something is activated
-local GLOBAL_SWITCH_HOG_IS_ON=false
-local GLOBAL_VAMPIRIC_IS_ON=0
-local GLOBAL_EXTRA_DAMAGE_IS_ON=100
-local GLOBAL_PARACHUTE_IS_ON=false
+CS.SWITCH_HOG_IS_ON=false
+CS.VAMPIRIC_IS_ON=0
+CS.EXTRA_DAMAGE_IS_ON=100
+CS.PARACHUTE_IS_ON=false
+CS.PRECISE=false
+
+CS.CONTINENT_LABEL_TIMER=-1
+CS.SPEECH_TIMER=-1
+CS.HANDLE_SPECIAL_WEAPON_MISC_TIMER=-1
+CS.CONFIRM_CONTINENT_SELECTION=-1
 
 --the visual circle for kerguelen
-local GLOBAL_VISUAL_CIRCLE=nil
+CS.VISUAL_CIRCLE=nil
+
+--the global temporary value
+CS.TEMP_VALUE=0
 
---the global temp value
-local GLOBAL_TEMP_VALUE=0
+--true if player used any sticky mine mine mode besides hedgehog projectile in this turn
+CS.AFRICAN_SPECIAL_NON_PROJECTILE_USED=false
+
+-- “constants”
+CS.SABOTAGE_GRAVITY=350
+CS.SABOTAGE_GRAVITY_LOW=175
+CS.SABOTAGE_DAMAGE=2
+CS.SABOTAGE_FREQUENCY=100
 
 --for sabotage
-local GLOBAL_SABOTAGE_COUNTER=0
-local GLOBAL_SABOTAGE_HOGS={}
-local GLOBAL_SABOTAGE_FREQUENCY=0
-
-local GLOBAL_CRATE_TEST=-1
+CS.SABOTAGE_COUNTER=0
+CS.SABOTAGE_HOGS={}
+CS.SABOTAGE_FREQUENCY_NOW=0
 
 --for sundaland
-local GLOBAL_SUNDALAND_END_HOG_CONTINENT_NAME
+CS.SUNDALAND_END_HOG_CONTINENT_NAME=nil
 
-local OPTION_NO_SPECIALS=false
+--misc.
+CS.OPTION_NO_SPECIALS=false
 
 --====GENERAL GLOBALS (useful for handling continents)====
 
-local GLOBAL_SNIPER_SPECIAL_INFO = loc("Green lipstick bullet: [Poisonous, deals no damage]")
-local GLOBAL_BASEBALLBAT_BOOMERANG_INFO = loc("Bouncy boomerang: [Launch your bouncy boomerang ~ Turns into a present on explosion]")
-local GLOBAL_CHEESE_SPECIAL_INFO = loc("Anno 1032: [The explosion will make a strong push ~ No poison]")
-local GLOBAL_SEDUCTION_SPECIAL_INFO = loc("Dust storm: [Deals 15 + %s damage to all enemies in the circle]")
-local GLOBAL_INVULNERABLE_SPECIAL_INFO = loc("Temporarily increase the damage of duststorm with +7%s, Removes 1 Invurnurable%s")
-local GLOBAL_BASEBALLBAT_CRICKET_INFO = loc("Cricket time: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]")
-local GLOBAL_PARACHUTE_SPECIAL_INFO = loc("Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact ~ wont end turn]")
-local GLOBAL_HAMMER_ROAR_INFO = loc("Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]")
-local GLOBAL_HAMMER_SWAP_INFO = loc("Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]")
-local GLOBAL_HAMMER_LONELY_INFO = loc("Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]")
-local GLOBAL_STICKY_PROJECTILE_INFO = loc("Hedgehog projectile: [Fire your hog like a Sticky Bomb]")
-local GLOBAL_STICKY_NAPALM_INFO = loc("Napalm rocket: [Fire a bomb with napalm!]")
-local GLOBAL_SHOTGUN_SPECIAL_INFO = loc("Eagle Eye: [Blink to the impact ~ One shot]")
-local GLOBAL_MOLOTOV_SPECIAL_INFO = loc("Medicine: [Fire some exploding medicine that will heal 15 hp to all hogs effected by the explosion]")
-local GLOBAL_HAMMER_SABOTAGE_INFO = loc("Flare: [Sabotage all hogs in the circle (dmg over time and high gravity) and fire one cluster above you]")
-local GLOBAL_PICKHAMMER_SPECIAL_INFO = loc("World wrap: [Will teleport you to the top of the map, expect fall damage]")
+CS.SNIPER_SPECIAL_NAME = loc("Green Lipstick Bullet")
+CS.BASEBALLBAT_BOOMERANG_NAME = loc("Bouncy Boomerang")
+CS.CHEESE_SPECIAL_NAME = loc("Anno 1032")
+CS.SEDUCTION_SPECIAL_NAME = loc("Dust Storm")
+CS.BASEBALLBAT_CRICKET_NAME = loc("Cricket Time")
+CS.PARACHUTE_SPECIAL_NAME = loc("Heroic Wind")
+CS.HAMMER_ROAR_NAME = loc("Penguin Roar")
+CS.HAMMER_SWAP_NAME = loc("Disguise as a Rockhopper Penguin")
+CS.HAMMER_LONELY_NAME = loc("Lonely Cries")
+CS.STICKY_PROJECTILE_NAME = loc("Hedgehog Projectile")
+CS.STICKY_NAPALM_NAME = loc("Napalm Rocket")
+CS.SHOTGUN_SPECIAL_NAME = loc("Eagle Eye")
+CS.MOLOTOV_SPECIAL_NAME = loc("Medicine")
+CS.HAMMER_SABOTAGE_NAME = loc("Flare")
+CS.PICKHAMMER_SPECIAL_NAME = loc("Upside-Down World")
+
+CS.SNIPER_SPECIAL_DESC = loc("Poisonous, deals no damage.")
+CS.BASEBALLBAT_BOOMERANG_DESC = loc("Launch a bouncy ball which explodes into a crate.")
+CS.CHEESE_SPECIAL_DESC = loc("Strong knockback, but no poison.")
+CS.SEDUCTION_SPECIAL_DESC = loc("Deals 15 damage to all enemies in the circle.")
+CS.BASEBALLBAT_CRICKET_DESC = loc("Throw a 1 second mine!")
+CS.PARACHUTE_SPECIAL_DESC = loc("Drop a ball of dirt which turns into a|cluster on impact. Doesn’t end turn.")
+CS.HAMMER_ROAR_DESC = loc("Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back.")
+CS.HAMMER_SWAP_DESC = loc("Swap place with a random enemy in the circle.")
+CS.HAMMER_LONELY_DESC = loc("Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs.")
+CS.STICKY_PROJECTILE_DESC = loc("Fire your hedgehog like a sticky mine.")
+CS.STICKY_NAPALM_DESC = loc("Fire a rocket with napalm.")
+CS.SHOTGUN_SPECIAL_DESC = loc("Teleport to the impact location.")
+CS.MOLOTOV_SPECIAL_DESC = loc("Fire some exploding medicine that will heal 15 health to all hogs in its effect radius.")
+CS.HAMMER_SABOTAGE_DESC = loc("Sabotage all hogs in the circle and fire a cluster above you.|Sabotaged hogs lose health and have to deal with a very high gravity during their turn.")
+CS.PICKHAMMER_SPECIAL_DESC = loc("Teleport to the top of the map, expect fall damage!")
 
-local GLOBAL_ALL_SPECIALS_INFO = loc("Weapons with specials: ")..loc("Shotgun")..", "..loc("Sniper Rifle")..", "..loc("GasBomb")..", "..loc("Molotov")..", "..loc("Parachute")..", "..loc("Seduction")..", "..loc("Sticky Mine").." (2),"..loc("Baseballbat (2)")..", "..loc("Hammer (4)")
+CS.INVULNERABLE_SPECIAL_CAPTION = loc("15+%d damage, %d invulnerable left")
+-- Make info
+local minfo = function(name, desc)
+	return string.format(loc("%s: %s"), name, desc)
+end
+CS.SNIPER_SPECIAL_INFO = minfo(CS.SNIPER_SPECIAL_NAME, CS.SNIPER_SPECIAL_DESC)
+CS.BASEBALLBAT_BOOMERANG_INFO = minfo(CS.BASEBALLBAT_BOOMERANG_NAME, CS.BASEBALLBAT_BOOMERANG_DESC)
+CS.CHEESE_SPECIAL_INFO = minfo(CS.CHEESE_SPECIAL_NAME, CS.CHEESE_SPECIAL_DESC)
+CS.SEDUCTION_SPECIAL_INFO = minfo(CS.SEDUCTION_SPECIAL_NAME, CS.SEDUCTION_SPECIAL_DESC)
+CS.INVULNERABLE_SPECIAL_INFO = loc("Increase the dust storm damage by sacrificing|your invulnerable ammo.")
+CS.INVULNERABLE_SPECIAL_CTRL = loc("Up/Down: Adjust dust storm damage")
+CS.BASEBALLBAT_CRICKET_INFO = minfo(CS.BASEBALLBAT_CRICKET_NAME, CS.BASEBALLBAT_CRICKET_DESC)
+CS.PARACHUTE_SPECIAL_INFO = minfo(CS.PARACHUTE_SPECIAL_NAME, CS.PARACHUTE_SPECIAL_DESC)
+CS.HAMMER_ROAR_INFO = minfo(CS.HAMMER_ROAR_NAME, CS.HAMMER_ROAR_DESC)
+CS.HAMMER_SWAP_INFO = minfo(CS.HAMMER_SWAP_NAME, CS.HAMMER_SWAP_DESC)
+CS.HAMMER_LONELY_INFO = minfo(CS.HAMMER_LONELY_NAME, CS.HAMMER_LONELY_DESC)
+CS.STICKY_PROJECTILE_INFO = minfo(CS.STICKY_PROJECTILE_NAME, CS.STICKY_PROJECTILE_DESC)
+CS.STICKY_NAPALM_INFO = minfo(CS.STICKY_NAPALM_NAME, CS.STICKY_NAPALM_DESC)
+CS.SHOTGUN_SPECIAL_INFO = minfo(CS.SHOTGUN_SPECIAL_NAME, CS.SHOTGUN_SPECIAL_DESC)
+CS.MOLOTOV_SPECIAL_INFO = minfo(CS.MOLOTOV_SPECIAL_NAME, CS.MOLOTOV_SPECIAL_DESC)
+CS.HAMMER_SABOTAGE_INFO = minfo(CS.HAMMER_SABOTAGE_NAME, CS.HAMMER_SABOTAGE_DESC)
+CS.PICKHAMMER_SPECIAL_INFO = minfo(CS.PICKHAMMER_SPECIAL_NAME, CS.PICKHAMMER_SPECIAL_DESC)
 
-local GLOBAL_SELECT_WEP_INFORMATION=loc("Select your continent with: the \"Up\" or \"Down\" keys, or by selecting a representative weapon.")
-local GLOBAL_GENERAL_INFORMATION="- "..loc("Per team weapons").."|- "..loc("10 weapon schemes").."|- "..loc("Unique new weapons").."| |"..GLOBAL_SELECT_WEP_INFORMATION.."|"..loc("Note: Some weapons have a second option (See continent information). Find and use them with the \"")..loc("switch").."\" "..loc("key").." (↹).|"..GLOBAL_ALL_SPECIALS_INFO.."|"..loc("Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials." .. "|")
+CS.SELECT_WEP_INFORMATION=loc("Select your continent with [Up]/[Down] or by selecting a representative weapon.").."|"..
+	loc("Press [Attack] to confirm.")
+CS.SELECT_WEP_INFORMATION_SHORT=loc("%s, select your continent!")
 
-local GLOBAL_CONTINENT_INFORMATION =
+function GeneralInformation()
+	local select_wep, quit_hint
+	if not CS.GAME_STARTED then
+		select_wep = "| |"..CS.SELECT_WEP_INFORMATION
+		quit_hint = "|"..loc("Hint: Use the quit key to see the team’s continent.")
+	else
+		select_wep = ""
+		quit_hint = ""
+	end
+	local general_information =
+		loc("Continents: Select a continent at the beginning.").."|"..
+		loc("Supplies: Each continent gives you unique weapons, specials and health.").."|"..
+		loc("Weapon specials: Some weapons have special modes (see weapon description).")..
+		select_wep..
+		quit_hint
+	return general_information
+end
+
+CS.CONTINENT_INFORMATION =
 {
-{loc("North America"),"["..loc("Difficulty: ")..loc("EASY").."] ",loc("- You can switch between hogs at the start of your turns. (Not first one)").."|"..loc("Special Weapons:").."|"..loc("Shotgun")..": "..GLOBAL_SHOTGUN_SPECIAL_INFO.."|"..loc("Sniper Rifle")..": "..GLOBAL_SNIPER_SPECIAL_INFO,{amSniperRifle,1},
+{loc("North America"),
+loc("The continent of firearms"),
+loc("The Union: You can select a hedgehog at the start of your turns.").."| |"..
+loc("Special weapons:").."|"..
+GetAmmoName(amShotgun)..": "..CS.SHOTGUN_SPECIAL_INFO.."|"..
+GetAmmoName(amSniperRifle)..": "..CS.SNIPER_SPECIAL_INFO,
+{amSniperRifle,1},
 {{amShotgun,100},{amDEagle,100},{amLaserSight,2},{amSniperRifle,100},{amCake,1},{amAirAttack,2},{amSwitch,2}},
-},
---{sndShotgunFire,sndCover},100},
+{sndShotgunFire,sndCover},100},
 
-{loc("South America"),"["..loc("Difficulty: ")..loc("MEDIUM").."] ",loc("Special Weapons:").."|"..loc("GasBomb")..": "..GLOBAL_CHEESE_SPECIAL_INFO,{amGasBomb,2},
+{loc("South America"),
+loc("The continent of guerilla tactics"),
+"| |"..loc("Special weapons:").."|"
+..GetAmmoName(amGasBomb)..": "..CS.CHEESE_SPECIAL_INFO,
+{amGasBomb,2},
 {{amBirdy,100},{amHellishBomb,1},{amBee,100},{amGasBomb,100},{amFlamethrower,100},{amNapalm,2},{amExtraDamage,3}},
 {sndEggBreak,sndLaugh},125},
 
-{loc("Europe"),"["..loc("Difficulty: ")..loc("EASY").."] ",loc("Special Weapons:").."|"..loc("Molotov")..": "..GLOBAL_MOLOTOV_SPECIAL_INFO,{amBazooka,3},
+{loc("Europe"),
+loc("The continent of medicine"),
+"| |"..loc("Special weapons:").."|"
+..GetAmmoName(amMolotov)..": "..CS.MOLOTOV_SPECIAL_INFO,
+{amBazooka,3},
 {{amBazooka,100},{amGrenade,100},{amMortar,100},{amMolotov,100},{amVampiric,4},{amPiano,1},{amResurrector,2},{amJetpack,4}},
 {sndExplosion,sndEnemyDown},100},
 
-{loc("Africa"),"["..loc("Difficulty: ")..loc("MEDIUM").."] ",loc("Special Weapons:").."|"..loc("Seduction")..": "..string.format(GLOBAL_SEDUCTION_SPECIAL_INFO,loc("(*see below)")).."|- "..string.format(GLOBAL_INVULNERABLE_SPECIAL_INFO,"","").."|- "..loc("You can modify the damage/invulnerables with the up/down keys on dust storm.").."|"..loc("Sticky Mine")..": "..GLOBAL_STICKY_PROJECTILE_INFO.."|"..loc("Sticky Mine")..": "..GLOBAL_STICKY_NAPALM_INFO,{amSMine,4},
+{loc("Africa"),
+loc("The continent of dust"),
+"| |"..loc("Special weapons:").."|"..
+GetAmmoName(amSeduction)..": "..CS.SEDUCTION_SPECIAL_INFO.."|"..
+CS.INVULNERABLE_SPECIAL_INFO.."|"..
+GetAmmoName(amSMine)..": "..CS.STICKY_PROJECTILE_INFO.."|"..
+GetAmmoName(amSMine)..": "..CS.STICKY_NAPALM_INFO,
+{amSMine,4},
 {{amSMine,100},{amWatermelon,1},{amDrillStrike,1},{amDrill,100},{amInvulnerable,7},{amSeduction,100},{amLandGun,3}},
 {sndMelonImpact,sndCoward},125},
 
-{loc("Asia"),"["..loc("Difficulty: ")..loc("MEDIUM").."] ",loc("- Will give you a parachute every third turn.").."|"..loc("Special Weapons:").."|"..loc("Parachute")..": "..GLOBAL_PARACHUTE_SPECIAL_INFO,{amRope,5},
+{loc("Asia"),
+loc("The continent of ninjas"),
+loc("Textile industry: Will give you a parachute every second turn.").."| |"..
+loc("Special weapons:").."|"..
+GetAmmoName(amParachute)..": "..CS.PARACHUTE_SPECIAL_INFO,
+{amRope,5},
 {{amRope,100},{amFirePunch,100},{amParachute,1},{amKnife,2},{amDynamite,1}},
 {sndRopeAttach,sndComeonthen},50},
 
-{loc("Australia"),"["..loc("Difficulty: ")..loc("EASY").."] ",loc("Special Weapons:").."|"..loc("Baseballbat")..": "..GLOBAL_BASEBALLBAT_CRICKET_INFO.."|"..loc("Baseballbat")..": "..GLOBAL_BASEBALLBAT_BOOMERANG_INFO,{amBaseballBat,6},
+{loc("Australia"),
+loc("The continent of sports"),
+"| |"..loc("Special weapons:").."|"..
+GetAmmoName(amBaseballBat)..": "..CS.BASEBALLBAT_CRICKET_INFO.."|"..
+GetAmmoName(amBaseballBat)..": "..CS.BASEBALLBAT_BOOMERANG_INFO.."|"..
+loc("Baseball bat specials cannot be used close to other hogs."),
+{amBaseballBat,6},
 {{amBaseballBat,100},{amMine,100},{amLowGravity,4},{amBlowTorch,100},{amRCPlane,2},{amRubber,4}},
 {sndBaseballBat,sndNooo},100},
 
-{loc("Antarctica"),"["..loc("Difficulty: ")..loc("HARD").."] ",loc("Antarctic summer: - Will give you girders=1,mudballs=1,sineguns=2,portals=1 every fourth turn.").."|"..loc("Special Weapons:").."|"..loc("Pick hammer")..": "..GLOBAL_PICKHAMMER_SPECIAL_INFO,{amIceGun,7},
+{loc("Antarctica"),
+loc("The continent of ice and science"),
+loc("Antarctic summer: Every 4th turn you get 1 girder, 1 mudball, 2 sine guns and 1 portable portal device.").."| |"..
+loc("Special weapons:").."|"..
+GetAmmoName(amPickHammer)..": "..CS.PICKHAMMER_SPECIAL_INFO,
+{amIceGun,7},
 {{amSnowball,2},{amPickHammer,100},{amSineGun,4},{amGirder,1},{amExtraTime,1},{amIceGun,1},{amPortalGun,2}},
 {sndSineGun,sndOops},75},
 
-{loc("Kerguelen"),"["..loc("Difficulty: ")..loc("EASY").."] ",loc("Special Weapons:").."|"..loc("Hammer")..": "..GLOBAL_HAMMER_ROAR_INFO.."|"..loc("Hammer")..": "..GLOBAL_HAMMER_SWAP_INFO.."|"..loc("Hammer")..": "..GLOBAL_HAMMER_LONELY_INFO.."|"..loc("Hammer")..": "..GLOBAL_HAMMER_SABOTAGE_INFO,{amHammer,8},
+{loc("Kerguelen"),
+loc("The continent of cowards"),
+"| |"..loc("Special weapons:").."|"..
+GetAmmoName(amHammer)..": "..CS.HAMMER_ROAR_INFO.."|"..
+GetAmmoName(amHammer)..": "..CS.HAMMER_SWAP_INFO.."|"..
+GetAmmoName(amHammer)..": "..CS.HAMMER_LONELY_INFO.."|"..
+GetAmmoName(amHammer)..": "..CS.HAMMER_SABOTAGE_INFO,
+{amHammer,8},
 {{amHammer,100},{amMineStrike,1},{amBallgun,1},{amTeleport,1}},
 {sndPiano5,sndStupid},75},
 
-{loc("Zealandia"),"["..loc("Difficulty: ")..loc("MEDIUM").."] ",loc("- Will Get 1-3 random weapons") .. "|" .. loc("- Massive weapon bonus on first turn|You will lose all your weapons each turn."),{amInvulnerable,9},
+{loc("Zealandia"),
+loc("The forgotten continent"),
+loc("Surprise supplies: Get 1-3 random weapons each turn.") .. "|" ..
+loc("Treasure: Massive weapon bonus in first turn.").."|"..
+loc("Forgetfulness: You will lose all your weapons each turn."),
+{amInvulnerable,9},
 {{amBazooka,1},{amGrenade,1},{amBlowTorch,1},{amSwitch,1},{amRope,1},{amDrill,1},{amDEagle,1},{amPickHammer,1},{amFirePunch,1},{amWhip,1},{amMortar,1},{amSnowball,1},{amExtraTime,1},{amInvulnerable,1},{amVampiric,1},{amFlamethrower,1},{amBee,1},{amClusterBomb,1},{amTeleport,1},{amLowGravity,1},{amJetpack,1},{amGirder,1},{amLandGun,1},{amBirdy,1},{amAirMine,1},{amTardis,1},{amLaserSight,1},{amAirMine,1}},
 {sndSplash,sndFirstBlood},100},
 
-{loc("Sundaland"),"["..loc("Difficulty: ")..loc("HARD").."] ",loc("- You will recieve 6 weapons on each kill! (Even on own hogs)"),{amTardis,10},
-{{amClusterBomb,5},{amTardis,100},{amWhip,100},{amKamikaze,100},{amAirMine,2},{amDuck,2}},
+{loc("Sundaland"),
+loc("The continent of greed"),
+loc("Bounty: Get 6 weapons for each kill (even on own hogs)."),
+{amTardis,10},
+{{amClusterBomb,5},{amTardis,100},{amWhip,100},{amKamikaze,100},{amAirMine,2}},
 {sndWarp,sndSameTeam},100}
 
 }
 
---very strange bug
-GLOBAL_CONTINENT_INFORMATION[1][7]=100
-GLOBAL_CONTINENT_INFORMATION[1][6]={sndShotgunFire,sndCover}
-
 --weapontype,ammo,?,duration,*times your choice,affect on random team (should be placed with 1,0,1,0,1 on the 6th option for better randomness)
-local GLOBAL_WEAPONS_DAMAGE = {
+CS.WEAPONS_DAMAGE = {
 	{amKamikaze,    0, 1, 0, 1, 0},
 	{amSineGun,     0, 1, 0, 1, 0},
 	{amMineStrike,  0, 1, 6, 1, 1},
@@ -225,9 +398,8 @@
 	{amDrillStrike, 0, 1, 5, 1, 1},
 	{amBazooka,     0, 1, 0, 1, 0},
 	{amAirMine,     0, 1, 0, 1, 0},
-	{amDuck,        0, 1, 0, 1, 0}
 }
-local GLOBAL_WEAPONS_SUPPORT = {
+CS.WEAPONS_SUPPORT = {
 	{amParachute,   0, 1, 0, 1, 0},
 	{amGirder,      0, 1, 0, 1, 0},
 	{amSwitch,      0, 1, 0, 1, 0},
@@ -273,25 +445,25 @@
 end
 
 function SpawnRandomCrate(x,y,strength)
-	local tot=table.maxn(GLOBAL_WEAPONS_SUPPORT)+table.maxn(GLOBAL_WEAPONS_DAMAGE)
+	local tot=table.maxn(CS.WEAPONS_SUPPORT)+table.maxn(CS.WEAPONS_DAMAGE)
 	local rand=GetRandom(tot)+1
 
-	if(rand>table.maxn(GLOBAL_WEAPONS_SUPPORT))
+	if(rand>table.maxn(CS.WEAPONS_SUPPORT))
 	then
-		local weapon=rand-table.maxn(GLOBAL_WEAPONS_SUPPORT)
+		local weapon=rand-table.maxn(CS.WEAPONS_SUPPORT)
 
-		while(wepNotValidBorder(GLOBAL_WEAPONS_DAMAGE[weapon][1])==false)
+		while(wepNotValidBorder(CS.WEAPONS_DAMAGE[weapon][1])==false)
 		do
-			if(weapon>=table.maxn(GLOBAL_WEAPONS_DAMAGE))
+			if(weapon>=table.maxn(CS.WEAPONS_DAMAGE))
 			then
 				weapon=0
 			end
 			weapon = weapon+1
 		end
 
-		SpawnAmmoCrate(x, y, GLOBAL_WEAPONS_DAMAGE[weapon][1])
+		SpawnAmmoCrate(x, y, CS.WEAPONS_DAMAGE[weapon][1])
 	else
-		SpawnUtilityCrate(x, y, GLOBAL_WEAPONS_SUPPORT[rand][1])
+		SpawnUtilityCrate(x, y, CS.WEAPONS_SUPPORT[rand][1])
 	end
 end
 
@@ -307,45 +479,42 @@
 --reset all weapons for a team
 function CleanWeapons(hog)
 
-	local i=1
-	--+1 for skip
-	while(i<=table.maxn(GLOBAL_WEAPONS_SUPPORT)+table.maxn(GLOBAL_WEAPONS_DAMAGE)+1)
-	do
-		AddAmmo(hog,i,0)
-		i=i+1
+	for w=1, #CS.WEAPONS_SUPPORT do
+		AddAmmo(hog, CS.WEAPONS_SUPPORT[w][1], 0)
 	end
-
-	AddAmmo(hog,amSkip,100)
+	for w=1, #CS.WEAPONS_DAMAGE do
+		AddAmmo(hog, CS.WEAPONS_DAMAGE[w][1], 0)
+	end
 end
 
 --get the weapons from a weaponset
 function LoadWeaponset(hog, num)
-	for v,w in pairs(GLOBAL_CONTINENT_INFORMATION[num][5])
+	for v,w in pairs(CS.CONTINENT_INFORMATION[num][5])
 	do
 		ValidateWeapon(hog, w[1],w[2])
 	end
 
-	GLOBAL_TEMP_VALUE=GLOBAL_CONTINENT_INFORMATION[num][7]
+	CS.TEMP_VALUE=CS.CONTINENT_INFORMATION[num][7]
 	runOnGears(SetHogHealth)
 end
 
 --list up all weapons from the icons for each continent
 function InitWeaponsMenu(hog)
 
-	if(GetHogLevel(hog)==0 or GLOBAL_CONTINENT_INFORMATION[1][6][1]==sndFrozenHogImpact)
+	if(GetHogLevel(hog)==0 or CS.CONTINENT_INFORMATION[1][6][1]==sndFrozenHogImpact)
 	then
-		for v,w in pairs(GLOBAL_CONTINENT_INFORMATION)
+		for v,w in pairs(CS.CONTINENT_INFORMATION)
 		do
-			ValidateWeapon(hog, GLOBAL_CONTINENT_INFORMATION[v][4][1],1)
+			ValidateWeapon(hog, CS.CONTINENT_INFORMATION[v][4][1], 100)
 		end
-		AddAmmo(hog,amSwitch) --random continent
+		AddAmmo(hog, amSwitch, 100) --random continent
 
 	--for the computers
 	else
 		--europe
-		ValidateWeapon(hog, GLOBAL_CONTINENT_INFORMATION[3][4][1],1)
+		ValidateWeapon(hog, CS.CONTINENT_INFORMATION[3][4][1], 100)
 		--north america
-		ValidateWeapon(hog, GLOBAL_CONTINENT_INFORMATION[1][4][1],1)
+		ValidateWeapon(hog, CS.CONTINENT_INFORMATION[1][4][1], 100)
 	end
 end
 
@@ -360,13 +529,21 @@
 	end
 	if(generalinf)
 	then
-		geninftext="| |"..loc("General information")..": |"..GLOBAL_GENERAL_INFORMATION
+		geninftext="| |"..loc("General information:").."|"..GeneralInformation()
+	else
+		geninftext="| |"..loc("Press [Attack] to select this continent!")
 	end
 
-	ShowMission(GLOBAL_CONTINENT_INFORMATION[continent][1],GLOBAL_CONTINENT_INFORMATION[continent][2]..loc(" Starting HP: ")..GLOBAL_CONTINENT_INFORMATION[continent][7],GLOBAL_CONTINENT_INFORMATION[continent][3]..geninftext, GLOBAL_CONTINENT_INFORMATION[continent][4][2], time)
+	ShowMission(CS.CONTINENT_INFORMATION[continent][1],
+		CS.CONTINENT_INFORMATION[continent][2],
+		string.format(loc("Initial health: %d"), CS.CONTINENT_INFORMATION[continent][7]) .. "|"..
+		CS.CONTINENT_INFORMATION[continent][3]..geninftext,
+		CS.CONTINENT_INFORMATION[continent][4][2], time)
 	if(ns)
 	then
 		HideMission()
+	elseif not CS.GAME_STARTED then
+		AddCaption(CS.CONTINENT_INFORMATION[continent][1], GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
 	end
 end
 
@@ -426,11 +603,11 @@
 function RandomContinentsGetWeapons(hog)
 	if(GetGearType(hog) == gtHedgehog)
 	then
-		local currCont=GLOBAL_TEAM_CONTINENT[GetHogTeamName(hog)]
+		local currCont=CS.TEAM_CONTINENT[GetHogTeamName(hog)]
 
 		if(currCont~=0)
 		then
-			local checkDefCont=GLOBAL_CONTINENT_INFORMATION[currCont][4][2]
+			local checkDefCont=CS.CONTINENT_INFORMATION[currCont][4][2]
 
 			--for sunda
 			local wepamount=getTeamValue(GetHogTeamName(hog), "sundaland-count")
@@ -440,11 +617,10 @@
 				CleanWeapons(hog)
 
 				local rand_weaponset_power = 0
-				local currwep
 
-				rand_weaponset_power, currwep=GetRandomWeapon(hog,GLOBAL_WEAPONS_DAMAGE,100,true,false,rand_weaponset_power)
-				rand_weaponset_power, currwep=GetRandomWeapon(hog,GLOBAL_WEAPONS_SUPPORT,2,true,false,rand_weaponset_power)
-				rand_weaponset_power, currwep=GetRandomWeapon(hog,GLOBAL_WEAPONS_DAMAGE,1,true,false,rand_weaponset_power)
+				rand_weaponset_power=GetRandomWeapon(hog,CS.WEAPONS_DAMAGE,100,true,false,rand_weaponset_power)
+				rand_weaponset_power=GetRandomWeapon(hog,CS.WEAPONS_SUPPORT,2,true,false,rand_weaponset_power)
+				rand_weaponset_power=GetRandomWeapon(hog,CS.WEAPONS_DAMAGE,1,true,false,rand_weaponset_power)
 
 				setTeamValue(GetHogTeamName(hog), "rand-done-turn", true)
 
@@ -454,14 +630,30 @@
 
 				while(loci<wepamount)
 				do
+					local _
+					local wep = {}
 					--6 random weapons
-					GetRandomWeapon(hog,GLOBAL_WEAPONS_DAMAGE,100,false,true,0)
-					GetRandomWeapon(hog,GLOBAL_WEAPONS_DAMAGE,100,false,true,0)
-					GetRandomWeapon(hog,GLOBAL_WEAPONS_DAMAGE,2,false,true,1)
+					_, wep[1] = GetRandomWeapon(hog,CS.WEAPONS_DAMAGE,100,false,true,0)
+					_, wep[2] = GetRandomWeapon(hog,CS.WEAPONS_DAMAGE,100,false,true,0)
+					_, wep[3] = GetRandomWeapon(hog,CS.WEAPONS_DAMAGE,2,false,true,1)
+
+					_, wep[4] = GetRandomWeapon(hog,CS.WEAPONS_SUPPORT,100,false,true,0)
+					_, wep[5] = GetRandomWeapon(hog,CS.WEAPONS_SUPPORT,100,false,true,0)
+					_, wep[6] = GetRandomWeapon(hog,CS.WEAPONS_SUPPORT,100,false,true,0)
 
-					GetRandomWeapon(hog,GLOBAL_WEAPONS_SUPPORT,100,false,true,0)
-					GetRandomWeapon(hog,GLOBAL_WEAPONS_SUPPORT,100,false,true,0)
-					GetRandomWeapon(hog,GLOBAL_WEAPONS_SUPPORT,100,false,true,0)
+					-- Don't give weapons directly, only insert them into the global temp. value
+					-- We expect this function to be called by runOnGears for Sundaland.
+					if CS.TEMP_VALUE[hog] == nil then
+						CS.TEMP_VALUE[hog] = {}
+					end
+					for w=1, #wep do
+						local ammoList = CS.TEMP_VALUE[hog]
+						if ammoList[wep[w]] == nil then
+							ammoList[wep[w]] = 1
+						else
+							ammoList[wep[w]] = math.min(99, ammoList[wep[w]] + 1)
+						end
+					end
 
 					loci=loci+1
 				end
@@ -476,20 +668,20 @@
 function SetContinentWeapons()
 
 	CleanWeapons(CurrentHedgehog)
-	LoadWeaponset(CurrentHedgehog,GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)])
+	LoadWeaponset(CurrentHedgehog,CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)])
 
-	visualstuff=AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog)-5, vgtDust,0, false)
-	v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 = GetVisualGearValues(visualstuff)
-	SetVisualGearValues(visualstuff, v1, v2, v3, v4, v5, v6, v7, 2, v9, GetClanColor(GetHogClan(CurrentHedgehog)))
+	local visualstuff=AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog)-5, vgtDust,0, false)
+	SetVisualGearValues(visualstuff, nil, nil, nil, nil, nil, nil, nil, 2, nil, GetClanColor(GetHogClan(CurrentHedgehog)))
 
-	ShowContinentInfo(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)],3000,false)
+	SetCSAmmoDescriptions("weapons")
+	ShowContinentInfo(CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)],5000,false)
 end
 
 --count hogs in team
 function CountHogsInTeam(hog)
 	if(GetHogTeamName(hog)==GetHogTeamName(CurrentHedgehog))
 	then
-		GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+1
+		CS.TEMP_VALUE=CS.TEMP_VALUE+1
 	end
 end
 
@@ -498,7 +690,7 @@
 function SetHogHealth(hog)
 	if(GetGearType(hog) == gtHedgehog and GetHogClan(hog) == GetHogClan(CurrentHedgehog))
 	then
-		SetHealth(hog, div(GLOBAL_TEMP_VALUE*GLOBAL_HOG_HEALTH,100))
+		SetHealth(hog, div(CS.TEMP_VALUE*CS.HOG_HEALTH,100))
 	end
 end
 
@@ -508,26 +700,42 @@
 	then
 		if(gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, false)==true and hog ~= CurrentHedgehog)
 		then
-			GLOBAL_TEMP_VALUE=1
+			CS.TEMP_VALUE=1
 		end
 	end
 end
 
+function HogOuch(hog, ouchType)
+	local r
+	if ouchType == "moan" then
+		r = math.random(1, 2)
+		if r == 1 then
+			PlaySound(sndPoisonMoan, hog, true)
+		else
+			PlaySound(sndPoisonCough, hog, true)
+		end
+	else
+		local r = math.random(1, 4)
+		PlaySound(_G["sndOw"..r], hog)
+	end
+end
+
 --african special on sedunction
 function AfricaSpecialSeduction(hog)
 	if(GetGearType(hog) == gtHedgehog)
 	then
-		local dmg=div((15+GLOBAL_SEDUCTION_INCREASER)*GLOBAL_EXTRA_DAMAGE_IS_ON,100)
+		local dmg=div((15+CS.SEDUCTION_INCREASER)*CS.EXTRA_DAMAGE_IS_ON,100)
 		if(gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 250, false)==true and GetHogClan(hog) ~= GetHogClan(CurrentHedgehog))
 		then
 			if(GetHealth(hog) > dmg)
 			then
-				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+div(dmg*GLOBAL_VAMPIRIC_IS_ON,100)
+				CS.TEMP_VALUE=CS.TEMP_VALUE+div(dmg*CS.VAMPIRIC_IS_ON,100)
 				SetHealth(hog, GetHealth(hog)-dmg)
 			else
-				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+div(GetHealth(hog)*GLOBAL_VAMPIRIC_IS_ON,100)
+				CS.TEMP_VALUE=CS.TEMP_VALUE+div(GetHealth(hog)*CS.VAMPIRIC_IS_ON,100)
 				SetHealth(hog, 0)
 			end
+			HogOuch(hog)
 			ShowDamageTag(hog,dmg)
 		end
 	end
@@ -539,16 +747,17 @@
 	then
 		if(gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 120, false)==true and GetHogClan(hog) ~= GetHogClan(CurrentHedgehog))
 		then
-			local dmg=div((15+div(GetHealth(CurrentHedgehog)*10,100))*GLOBAL_EXTRA_DAMAGE_IS_ON,100)
+			local dmg=div((15+div(GetHealth(CurrentHedgehog)*10,100))*CS.EXTRA_DAMAGE_IS_ON,100)
 
 			if(GetHealth(hog)>dmg)
 			then
-				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+div(dmg*2,3)+div(dmg*GLOBAL_VAMPIRIC_IS_ON*2,100*3)
+				CS.TEMP_VALUE=CS.TEMP_VALUE+div(dmg*2,3)+div(dmg*CS.VAMPIRIC_IS_ON*2,100*3)
 				SetHealth(hog, GetHealth(hog)-dmg)
 			else
-				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+(div(GetHealth(hog)*75,100))+(div(GetHealth(CurrentHedgehog)*10,100))+div((GetHealth(hog)+div(GetHealth(CurrentHedgehog)*10,100))*GLOBAL_VAMPIRIC_IS_ON,100)
+				CS.TEMP_VALUE=CS.TEMP_VALUE+(div(GetHealth(hog)*75,100))+(div(GetHealth(CurrentHedgehog)*10,100))+div((GetHealth(hog)+div(GetHealth(CurrentHedgehog)*10,100))*CS.VAMPIRIC_IS_ON,100)
 				SetHealth(hog, 0)
 			end
+			HogOuch(hog)
 			ShowDamageTag(hog,dmg)
 			AddVisualGear(GetX(hog), GetY(hog), vgtExplosion, 0, false)
 			AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmokeWhite, 0, false)
@@ -562,7 +771,7 @@
 	then
 		if(GetHogClan(hog) ~= GetHogClan(CurrentHedgehog) and gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 390, false))
 		then
-			GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+1
+			CS.TEMP_VALUE=CS.TEMP_VALUE+1
 		end
 	end
 end
@@ -570,17 +779,17 @@
 function KerguelenSpecialYellowSwap(hog)
 	if(GetGearType(hog) == gtHedgehog)
 	then
-		if(GLOBAL_KERGUELEN_SPECIAL ~= -1 and GetHogClan(hog) ~= GetHogClan(CurrentHedgehog) and gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 420, false))
+		if(CS.KERGUELEN_SPECIAL ~= -1 and GetHogClan(hog) ~= GetHogClan(CurrentHedgehog) and gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 420, false))
 		then
-			if(GLOBAL_TEMP_VALUE==0)
+			if(CS.TEMP_VALUE==0)
 			then
 				local thisX=GetX(CurrentHedgehog)
 				local thisY=GetY(CurrentHedgehog)
 				SetGearPosition(CurrentHedgehog, GetX(hog), GetY(hog))
 				SetGearPosition(hog, thisX, thisY)
-				GLOBAL_KERGUELEN_SPECIAL=-1
+				CS.KERGUELEN_SPECIAL=-1
 			else
-				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE-1
+				CS.TEMP_VALUE=CS.TEMP_VALUE-1
 			end
 		end
 	end
@@ -592,8 +801,8 @@
 	then
 		if(CurrentHedgehog~=hog and gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 80, false))
 		then
-			GLOBAL_TEMP_VALUE=1
-			GLOBAL_SABOTAGE_HOGS[hog]=1
+			CS.TEMP_VALUE=1
+			CS.SABOTAGE_HOGS[hog]=1
 			AddGear(GetX(hog), GetY(hog), gtCluster, 0, 0, 0, 1)
 			PlaySound(sndNooo,hog)
 		end
@@ -602,9 +811,9 @@
 
 --first part on kerguelen special (lonely cries)
 function KerguelenSpecialBlueCheck(hog)
-	if(GetGearType(hog) == gtHedgehog and hog ~= CurrentHedgehog and gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 500, false))
+	if(GetGearType(hog) == gtHedgehog and hog ~= CurrentHedgehog and GetHealth(CurrentHedgehog) and gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 500, false))
 	then
-		GLOBAL_TEMP_VALUE=1
+		CS.TEMP_VALUE=1
 	end
 end
 
@@ -612,17 +821,18 @@
 function KerguelenSpecialBlueActivate(hog)
 	if(GetGearType(hog) == gtHedgehog)
 	then
-		local dmg=div(6*GLOBAL_EXTRA_DAMAGE_IS_ON,100)
+		local dmg=div(6*CS.EXTRA_DAMAGE_IS_ON,100)
 		if(GetHogClan(hog) ~= GetHogClan(CurrentHedgehog))
 		then
 			if(GetHealth(hog) > dmg)
 			then
-				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+div(dmg*GLOBAL_VAMPIRIC_IS_ON,100)
+				CS.TEMP_VALUE=CS.TEMP_VALUE+div(dmg*CS.VAMPIRIC_IS_ON,100)
 				SetHealth(hog, GetHealth(hog)-dmg)
 			else
-				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+div(GetHealth(hog)*GLOBAL_VAMPIRIC_IS_ON,100)
+				CS.TEMP_VALUE=CS.TEMP_VALUE+div(GetHealth(hog)*CS.VAMPIRIC_IS_ON,100)
 				SetHealth(hog, 0)
 			end
+			HogOuch(hog, "moan")
 			ShowDamageTag(hog,dmg)
 
 			AddVisualGear(GetX(hog), GetY(hog)-30, vgtEvilTrace, 0, false)
@@ -637,15 +847,15 @@
 		local power_radius_outer=230
 		local power_sa=700000
 		local hypo=0
-		if(gearIsInCircle(hog,GetX(GLOBAL_TEMP_VALUE), GetY(GLOBAL_TEMP_VALUE), power_radius_outer, false))
+		if(gearIsInCircle(hog,GetX(CS.TEMP_VALUE), GetY(CS.TEMP_VALUE), power_radius_outer, false))
 		then
 			if(hog == CurrentHedgehog)
 			then
 				SetState(CurrentHedgehog, gstMoving)
 			end
 			SetGearPosition(hog, GetX(hog),GetY(hog)-3)
-			hypo=Norm(math.abs(GetX(hog)-GetX(GLOBAL_TEMP_VALUE)),math.abs(GetY(hog)-GetY(GLOBAL_TEMP_VALUE)))
-			SetGearVelocity(hog, div((power_radius_outer-hypo)*power_sa*GetIfNegative(GetX(hog)-GetX(GLOBAL_TEMP_VALUE)),power_radius_outer), div((power_radius_outer-hypo)*power_sa*GetIfNegative(GetY(hog)-GetY(GLOBAL_TEMP_VALUE)),power_radius_outer))
+			hypo=Norm(math.abs(GetX(hog)-GetX(CS.TEMP_VALUE)),math.abs(GetY(hog)-GetY(CS.TEMP_VALUE)))
+			SetGearVelocity(hog, div((power_radius_outer-hypo)*power_sa*GetIfNegative(GetX(hog)-GetX(CS.TEMP_VALUE)),power_radius_outer), div((power_radius_outer-hypo)*power_sa*GetIfNegative(GetY(hog)-GetY(CS.TEMP_VALUE)),power_radius_outer))
 		end
 	end
 end
@@ -654,10 +864,11 @@
 function NorthAmericaSpecialSniper(hog)
 	if(GetGearType(hog) == gtHedgehog)
 	then
-		if(gearIsInCircle(GLOBAL_TEMP_VALUE,GetX(hog), GetY(hog), 20, false))
+		if(gearIsInCircle(CS.TEMP_VALUE,GetX(hog), GetY(hog), 20, false))
 		then
 			SetEffect(hog, hePoisoned, 5)
 			PlaySound(sndBump)
+			SetSoundMask(sndMissed, true)
 		end
 	end
 end
@@ -666,12 +877,13 @@
 function EuropeSpecialMolotovHit(hog)
 	if(GetGearType(hog) == gtHedgehog)
 	then
-		if(gearIsInCircle(GLOBAL_TEMP_VALUE,GetX(hog), GetY(hog), 100, false))
+		if(gearIsInCircle(CS.TEMP_VALUE,GetX(hog), GetY(hog), 100, false))
 		then
 			local healthadd=15
-			HealHog(hog, healthadd+(div(healthadd*GLOBAL_VAMPIRIC_IS_ON,100)), hog == CurrentHedgehog)
+			HealHog(hog, healthadd+(div(healthadd*CS.VAMPIRIC_IS_ON,100)), hog == CurrentHedgehog)
 			SetEffect(hog, hePoisoned, false)
-			GLOBAL_SABOTAGE_HOGS[hog]=0
+			CS.SABOTAGE_HOGS[hog]=0
+			SetSoundMask(sndMissed, true)
 		end
 	end
 end
@@ -690,15 +902,15 @@
 	continentinfo[4]={}
 	if(icon==1000)
 	then
-		local mid=table.maxn(GLOBAL_WEAPONS_DAMAGE)
-		local max=mid+table.maxn(GLOBAL_WEAPONS_SUPPORT)
+		local mid=table.maxn(CS.WEAPONS_DAMAGE)
+		local max=mid+table.maxn(CS.WEAPONS_SUPPORT)
 		local ic=(string.byte(string) % max)+1
 
 		if(ic>mid)
 		then
-			ic=GLOBAL_WEAPONS_SUPPORT[ic-mid][1]
+			ic=CS.WEAPONS_SUPPORT[ic-mid][1]
 		else
-			ic=GLOBAL_WEAPONS_DAMAGE[ic][1]
+			ic=CS.WEAPONS_DAMAGE[ic][1]
 		end
 
 		continentinfo[4][1]=ic
@@ -756,9 +968,10 @@
 
 	if(continentinfo[5]~=nil and continentinfo[5][1]~=nil)
 	then
-		continentinfo[3]="- "..continentinfo[1]..loc(" was extracted from the scheme|- This continent will be able to use the specials from the other continents!")
+		continentinfo[3] =
+			string.format(loc("%s was extracted from the scheme"), continentinfo[1])
 
-		table.insert(GLOBAL_CONTINENT_INFORMATION, continentinfo)
+		table.insert(CS.CONTINENT_INFORMATION, continentinfo)
 	end
 
 	return nil
@@ -782,7 +995,7 @@
 
 				if(continentinfo~=nil)
 				then
-					table.insert(GLOBAL_CONTINENT_INFORMATION, continentinfo)
+					table.insert(CS.CONTINENT_INFORMATION, continentinfo)
 				end
 				return
 			end
@@ -808,7 +1021,7 @@
 
 	if(match~=nil)
 	then
-		GLOBAL_TEMP_VALUE=1
+		CS.TEMP_VALUE=1
 
 		ScriptParam=string.gsub(ScriptParam,"(,?)"..searchfor.."(,?)","")
 	end
@@ -818,7 +1031,7 @@
 
 	if(match~=nil)
 	then
-		OPTION_NO_SPECIALS=true
+		CS.OPTION_NO_SPECIALS=true
 
 		ScriptParam=string.gsub(ScriptParam,"(,?)"..searchfor.."(,?)","")
 	end
@@ -828,7 +1041,7 @@
 
 	if(match~=nil)
 	then
-		GLOBAL_CONTINENT_INFORMATION={}
+		CS.CONTINENT_INFORMATION={}
 
 		ScriptParam=string.gsub(ScriptParam,"(,?)"..searchfor.."(,?)","")
 	end
@@ -839,7 +1052,7 @@
 
 		if(continentinfo~=nil)
 		then
-			table.insert(GLOBAL_CONTINENT_INFORMATION, continentinfo)
+			table.insert(CS.CONTINENT_INFORMATION, continentinfo)
 		end
 	end
 end
@@ -849,36 +1062,95 @@
 
 	SetAmmo(amSkip, 9, 0, 0, 0)
 
-	for v,w in pairs(GLOBAL_WEAPONS_DAMAGE)
+	for v,w in pairs(CS.WEAPONS_DAMAGE)
 	do
 		SetAmmo(w[1], w[2], w[3], w[4], w[5])
 	end
 
-	for v,w in pairs(GLOBAL_WEAPONS_SUPPORT)
+	for v,w in pairs(CS.WEAPONS_SUPPORT)
 	do
 		SetAmmo(w[1], w[2], w[3], w[4], w[5])
 	end
 end
 
+function SetCSAmmoDescriptions(mode)
+	if mode == "continents" then
+		for c=1, #CS.CONTINENT_INFORMATION do
+			local cont = CS.CONTINENT_INFORMATION[c]
+			local hp = string.format(loc("Initial health: %d"), cont[7])
+			SetAmmoTexts(cont[4][1], cont[1], cont[2], hp .."|" .. cont[3])
+			SetAmmoDescriptionAppendix(cont[4][1], nil)
+		end
+		SetAmmoTexts(amSwitch, loc("Random continent"), loc("If you just don't care …"), loc("Select this item for a random continent."))
+
+	elseif mode == "weapons" then
+		local specSelect = loc("Switch: Select weapon special")
+		local specHeader = loc("Available weapon specials:")
+		local specText="|"..
+			specSelect.."| |"..
+			specHeader.."|"
+
+		SetAmmoDescriptionAppendix(amSniperRifle,
+			specText..
+			CS.SNIPER_SPECIAL_INFO)
+		SetAmmoDescriptionAppendix(amBaseballBat,
+			specText..
+			CS.BASEBALLBAT_BOOMERANG_INFO .. "|" ..
+			CS.BASEBALLBAT_CRICKET_INFO .. "|" ..
+			loc("These weapon specials cannot be used close to other hogs."))
+		SetAmmoDescriptionAppendix(amGasBomb,
+			specText..
+			CS.CHEESE_SPECIAL_INFO)
+		SetAmmoDescriptionAppendix(amSeduction,
+			specSelect .. "|" ..
+			CS.INVULNERABLE_SPECIAL_CTRL .. "| |" ..
+			specHeader .. "|" ..
+			CS.SEDUCTION_SPECIAL_INFO .. "|" ..
+			CS.INVULNERABLE_SPECIAL_INFO)
+		SetAmmoDescriptionAppendix(amParachute,
+			loc("Switch: Drop ball of dirt from parachute (once)") .. "| |" ..
+			specHeader .. "|" ..
+			CS.PARACHUTE_SPECIAL_INFO)
+		SetAmmoDescriptionAppendix(amHammer,
+			specText..
+			CS.HAMMER_ROAR_INFO .. "|" ..
+			CS.HAMMER_SWAP_INFO .. "|" ..
+			CS.HAMMER_LONELY_INFO .. "|" ..
+			CS.HAMMER_SABOTAGE_INFO)
+		SetAmmoDescriptionAppendix(amSMine,
+			specText..
+			CS.STICKY_PROJECTILE_INFO .. "|" ..
+			CS.STICKY_NAPALM_INFO)
+		SetAmmoDescriptionAppendix(amShotgun,
+			specText..
+			CS.SHOTGUN_SPECIAL_INFO)
+		SetAmmoDescriptionAppendix(amMolotov,
+			specText..
+			CS.MOLOTOV_SPECIAL_INFO)
+		SetAmmoDescriptionAppendix(amPickHammer,
+			specText..
+			CS.PICKHAMMER_SPECIAL_INFO)
+
+		for c=1, #CS.CONTINENT_INFORMATION do
+			local cont = CS.CONTINENT_INFORMATION[c]
+			SetAmmoTexts(cont[4][1], nil, nil, nil)
+		end
+		SetAmmoTexts(amSwitch, nil, nil, nil)
+	end
+
+	if mode == "continents" or not CS.GAME_STARTED then
+		SetAmmoTexts(amSkip, loc("Select continent"), loc("Continent selection"), loc("Select the current continent.") .. "|" .. loc("Choose your continent wisely, as your decision will be permanent.") .. "|" .. loc("Up/Down: Browse through continents") .. "|" .. loc("Attack: Select this continent"))
+	else
+		SetAmmoTexts(amSkip, nil, nil, nil)
+	end
+end
+
 --on game start
 function onGameStart()
-	ShowMission(loc("Continental supplies"),loc("Let a continent provide your weapons!"),GLOBAL_GENERAL_INFORMATION, -amLowGravity, 0)
-
-	local specText="| |"..loc("Additional feautures for this weapon: (Switch/Tab)").."|"
+	ShowMission(loc("Continental supplies"),loc("Let a continent provide your weapons!"),GeneralInformation(), 0, 0)
+	SetCSAmmoDescriptions("continents")
 
-	SetAmmoDescriptionAppendix(amSniperRifle,specText..GLOBAL_SNIPER_SPECIAL_INFO)
-	SetAmmoDescriptionAppendix(amBaseballBat,specText..GLOBAL_BASEBALLBAT_BOOMERANG_INFO .. "|" .. GLOBAL_BASEBALLBAT_CRICKET_INFO)
-	SetAmmoDescriptionAppendix(amGasBomb,specText..GLOBAL_CHEESE_SPECIAL_INFO)
-	SetAmmoDescriptionAppendix(amSeduction,specText..GLOBAL_SEDUCTION_SPECIAL_INFO)
-	SetAmmoDescriptionAppendix(amInvulnerable,specText..GLOBAL_INVULNERABLE_SPECIAL_INFO)
-	SetAmmoDescriptionAppendix(amParachute,specText..GLOBAL_PARACHUTE_SPECIAL_INFO)
-	SetAmmoDescriptionAppendix(amHammer,specText..GLOBAL_HAMMER_ROAR_INFO .. "|" .. GLOBAL_HAMMER_SWAP_INFO .. "|" .. GLOBAL_HAMMER_LONELY_INFO .. "|" .. GLOBAL_HAMMER_SABOTAGE_INFO)
-	SetAmmoDescriptionAppendix(amSMine,specText..GLOBAL_STICKY_PROJECTILE_INFO .. "|" .. GLOBAL_STICKY_NAPALM_INFO)
-	SetAmmoDescriptionAppendix(amShotgun,specText..GLOBAL_SHOTGUN_SPECIAL_INFO)
-	SetAmmoDescriptionAppendix(amMolotov,specText..GLOBAL_MOLOTOV_SPECIAL_INFO)
-	SetAmmoDescriptionAppendix(amPickHammer,specText..GLOBAL_PICKHAMMER_SPECIAL_INFO)
-
-	if(GLOBAL_TEMP_VALUE==1)
+	if(CS.TEMP_VALUE==1)
 	then
 		runOnGears(HogNameToWeaponset)
 	end
@@ -890,74 +1162,83 @@
 
 --what happen when a turn starts
 function onNewTurn()
+	--will refresh the info on each tab weapon
+	CS.AUSTRALIAN_SPECIAL=0
+	CS.AFRICAN_SPECIAL_SEDUCTION=0
+	CS.SEDUCTION_INCREASER=0
+	CS.SOUTH_AMERICAN_SPECIAL=false
+	CS.AFRICAN_SPECIAL_STICKY=0
+	CS.KERGUELEN_SPECIAL=1
+	CS.NORTH_AMERICAN_SPECIAL_SNIPER=1
+	CS.NORTH_AMERICAN_SPECIAL_SHOTGUN=false
+	CS.NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=false
+	CS.EUROPE_SPECIAL=0
+	CS.VAMPIRIC_IS_ON=0
+	CS.EXTRA_DAMAGE_IS_ON=100
+	CS.SABOTAGE_COUNTER=0
+	CS.ANTARCTICA_SPECIAL=0
 
-	--will refresh the info on each tab weapon
-	GLOBAL_AUSTRALIAN_SPECIAL=0
-	GLOBAL_AFRICAN_SPECIAL_SEDUCTION=0
-	GLOBAL_SEDUCTION_INCREASER=0
-	GLOBAL_SOUTH_AMERICAN_SPECIAL=false
-	GLOBAL_AFRICAN_SPECIAL_STICKY=0
-	GLOBAL_KERGUELEN_SPECIAL=1
-	GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER=1
-	GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN=false
-	GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=false
-	GLOBAL_EUROPE_SPECIAL=0
-	GLOBAL_VAMPIRIC_IS_ON=0
-	GLOBAL_EXTRA_DAMAGE_IS_ON=100
-	GLOBAL_CRATE_TEST=-1
-	GLOBAL_SABOTAGE_COUNTER=0
-	GLOBAL_ANTARCTICA_SPECIAL=0
+	CS.TEMP_VALUE=0
+
+	CS.SUNDALAND_END_HOG_CONTINENT_NAME=GetHogTeamName(CurrentHedgehog)
 
-	GLOBAL_TEMP_VALUE=0
+	if TotalRounds >= 1 then
+		CS.GAME_STARTED = true
+	end
 
-	GLOBAL_SUNDALAND_END_HOG_CONTINENT_NAME=GetHogTeamName(CurrentHedgehog)
+	SetSoundMask(sndLaugh, false)
+	SetSoundMask(sndMissed, false)
+	CS.AFRICAN_SPECIAL_NON_PROJECTILE_USED=false
+	SetAttackState(true)
 
 	--when all hogs are "placed"
 	if(GetCurAmmoType()~=amTeleport)
 	then
 		--will run once when the game really starts (after placing hogs and so on
-		if(GLOBAL_INIT_TEAMS[GetHogTeamName(CurrentHedgehog)] == nil)
+		if(CS.INIT_TEAMS[GetHogTeamName(CurrentHedgehog)] == nil)
 		then
-			SetInputMask(band(0xFFFFFFFF,gmWeapon))
+			SetInputMask(band(GetInputMask(), gmWeapon))
 
-			if(GLOBAL_START_TIME==0)
+			if(CS.START_TIME==0)
 			then
-				GLOBAL_START_TIME=TurnTimeLeft
-				GLOBAL_HOG_HEALTH=GetHealth(CurrentHedgehog)
+				CS.START_TIME=TurnTimeLeft
+				CS.HOG_HEALTH=GetHealth(CurrentHedgehog)
 			end
 
 			TurnTimeLeft=100000
 
-			AddCaption(GLOBAL_SELECT_WEP_INFORMATION, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage)
-			ShowMission(loc("Continental supplies"),loc("Let a continent provide your weapons!"),GLOBAL_GENERAL_INFORMATION, -amLowGravity, 0)
-			HideMission()
+			AddCaption(string.format(CS.SELECT_WEP_INFORMATION_SHORT, GetHogTeamName(CurrentHedgehog)), 0xFFFFFFFF, capgrpGameState)
+			AddCaption(loc("No continent selected"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+			CS.SELECT_CONTINENT_CHECK=true
+			ShowMission(loc("Continental supplies"),loc("Let a continent provide your weapons!"),GeneralInformation(), 0, 0)
+			SetCSAmmoDescriptions("continents")
 
 			InitWeaponsMenu(CurrentHedgehog)
-			GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=0
-			GLOBAL_SELECT_CONTINENT_CHECK=true
-			GLOBAL_INIT_TEAMS[GetHogTeamName(CurrentHedgehog)] = 2
+			CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=0
+			CS.INIT_TEAMS[GetHogTeamName(CurrentHedgehog)] = 2
 
---			if(GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]==1)
---			then
---				GLOBAL_SABOTAGE_COUNTER=-750
---			end
 		else
 			--if its not the initialization turn
-			GLOBAL_SELECT_CONTINENT_CHECK=false
-			SetInputMask(0xFFFFFFFF)
+			CS.SELECT_CONTINENT_CHECK=false
+			SetInputMask(bor(GetInputMask(), bnot(gmWeapon)))
 
-			if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
+			if(CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
 			then
-				GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GetRandom(table.maxn(GLOBAL_CONTINENT_INFORMATION))+1
+				CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GetRandom(table.maxn(CS.CONTINENT_INFORMATION))+1
 				SetContinentWeapons()
 			end
-			local currCont=GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]
-			local checkDefCont=GLOBAL_CONTINENT_INFORMATION[currCont][4][2]
+			local currCont=CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]
+			local checkDefCont=CS.CONTINENT_INFORMATION[currCont][4][2]
 
 			--give zeelandia-teams new weapons so they can plan for the next turn
+			-- Use temporary value to store list of collected weapons
+			CS.TEMP_VALUE = {}
 			runOnGears(RandomContinentsGetWeapons)
+			for hog, ammoList in pairs(CS.TEMP_VALUE) do
+				CollectMultiAmmo(hog, ammoList, true)
+			end
 
-			--some specials for some continents (GLOBAL_TEMP_VALUE is from get random weapons)
+			--some specials for some continents (CS.TEMP_VALUE is from get random weapons)
 			if(checkDefCont==9)
 			then
 				setTeamValue(GetHogTeamName(CurrentHedgehog), "rand-done-turn", false)
@@ -969,13 +1250,10 @@
 					setTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick", 1)
 				end
 
+				-- Antarctic summer
 				if(getTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick")>=4)
 				then
-					AddAmmo(CurrentHedgehog,amPortalGun)
-					AddAmmo(CurrentHedgehog,amSineGun)
-					AddAmmo(CurrentHedgehog,amSineGun)
-					AddAmmo(CurrentHedgehog,amGirder)
-					AddAmmo(CurrentHedgehog,amSnowball)
+					CollectMultiAmmo(CurrentHedgehog, {[amPortalGun] = 1, [amSineGun] = 2, [amGirder] = 1, [amSnowball] = 1})
 					setTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick", 0)
 				end
 				setTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick", getTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick")+1)
@@ -990,384 +1268,583 @@
 
 				if(getTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick")>=2)
 				then
-					AddAmmo(CurrentHedgehog,amParachute)
+					CollectMultiAmmo(CurrentHedgehog, {[amParachute] = 1})
 					setTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick", 0)
 				end
 				setTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick", getTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick")+1)
 			elseif(checkDefCont==1)
 			then
-				GLOBAL_TEMP_VALUE=0
+				CS.TEMP_VALUE=0
 				runOnGears(CountHogsInTeam)
 
-				if(GLOBAL_TEMP_VALUE>1)
+				if(CS.TEMP_VALUE>1)
 				then
 					AddAmmo(CurrentHedgehog,amSwitch,GetAmmoCount(CurrentHedgehog, amSwitch)+1)
 
 					SetWeapon(amSwitch)
-					GLOBAL_TEMP_VALUE=87
+					CS.TEMP_VALUE=87
 				end
 			end
 
 			ShowContinentInfo(currCont,-1,true)
+			SetCSAmmoDescriptions("weapons")
 		end
 	end
 end
 
+function ShowSpecialWeaponCaption(ammoType)
+	--place mine (australia)
+	if(ammoType == amBaseballBat)
+	then
+		if(CS.AUSTRALIAN_SPECIAL==1)
+		then
+			AddCaption(CS.BASEBALLBAT_CRICKET_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		elseif(CS.AUSTRALIAN_SPECIAL==2)
+		then
+			AddCaption(CS.BASEBALLBAT_BOOMERANG_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		else
+			AddCaption(GetAmmoName(amBaseballBat), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		end
+
+	--africa
+	elseif(ammoType == amSeduction)
+	then
+		if(CS.AFRICAN_SPECIAL_SEDUCTION==1)
+		then
+			AddCaption(CS.SEDUCTION_SPECIAL_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+			AddCaption(string.format(CS.INVULNERABLE_SPECIAL_CAPTION, CS.SEDUCTION_INCREASER, GetAmmoCount(CurrentHedgehog,amInvulnerable)), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmostate)
+		else
+			AddCaption(GetAmmoName(amSeduction), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		end
+
+	--south america
+	elseif(ammoType == amGasBomb)
+	then
+		if(CS.SOUTH_AMERICAN_SPECIAL==true)
+		then
+			AddCaption(CS.CHEESE_SPECIAL_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		else
+			AddCaption(GetAmmoName(amGasBomb), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		end
+
+	--africa
+	elseif(ammoType == amSMine)
+	then
+		if(CS.AFRICAN_SPECIAL_STICKY==1)
+		then
+			AddCaption(CS.STICKY_PROJECTILE_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		elseif(CS.AFRICAN_SPECIAL_STICKY == 2)
+		then
+			AddCaption(CS.STICKY_NAPALM_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		else
+			AddCaption(GetAmmoName(amSMine), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		end
+
+	--north america (sniper)
+	elseif(ammoType == amSniperRifle and CS.NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON==false)
+	then
+		if(CS.NORTH_AMERICAN_SPECIAL_SNIPER==1)
+		then
+			AddCaption(GetAmmoName(amSniperRifle), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		elseif(CS.NORTH_AMERICAN_SPECIAL_SNIPER==2)
+		then
+			AddCaption(CS.SNIPER_SPECIAL_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		end
+
+	--north america (shotgun)
+	elseif(ammoType == amShotgun)
+	then
+		if(CS.NORTH_AMERICAN_SPECIAL_SHOTGUN==true)
+		then
+			AddCaption(CS.SHOTGUN_SPECIAL_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		else
+			AddCaption(GetAmmoName(amShotgun), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		end
+
+	--europe
+	elseif(ammoType == amMolotov)
+	then
+		if(CS.EUROPE_SPECIAL==1)
+		then
+			AddCaption(CS.MOLOTOV_SPECIAL_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		else
+			AddCaption(GetAmmoName(amMolotov), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		end
+
+	--antarctica
+	elseif(ammoType == amPickHammer)
+	then
+		if(CS.ANTARCTICA_SPECIAL==1)
+		then
+			AddCaption(CS.PICKHAMMER_SPECIAL_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		else
+			AddCaption(GetAmmoName(amPickHammer), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		end
+
+	--kerguelen
+	elseif(ammoType == amHammer)
+	then
+		if(CS.KERGUELEN_SPECIAL==1)
+		then
+			AddCaption(GetAmmoName(amHammer), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		elseif(CS.KERGUELEN_SPECIAL==2)
+		then
+			AddCaption(CS.HAMMER_ROAR_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		elseif(CS.KERGUELEN_SPECIAL==3)
+		then
+			AddCaption(CS.HAMMER_SWAP_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		elseif(CS.KERGUELEN_SPECIAL==5)
+		then
+			AddCaption(CS.HAMMER_LONELY_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		elseif(CS.KERGUELEN_SPECIAL==6)
+		then
+			AddCaption(CS.HAMMER_SABOTAGE_NAME, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+		end
+	end
+end
+
+function onPrecise()
+	CS.PRECISE = true
+end
+function onPreciseUp()
+	CS.PRECISE = false
+end
+
 --what happens when you press "tab" (common button)
 function onSwitch()
 
-	if(GLOBAL_SWITCH_HOG_IS_ON==false)
+	if(CS.SWITCH_HOG_IS_ON==false)
 	then
-		if(OPTION_NO_SPECIALS==false and GLOBAL_SELECT_CONTINENT_CHECK==false)
+		if(CS.OPTION_NO_SPECIALS==false and CS.SELECT_CONTINENT_CHECK==false and
+		band(GetState(CurrentHedgehog), gstAttacked) == 0 and
+		band(GetState(CurrentHedgehog), gstHHDriven) ~= 0)
 		then
 			--place mine (australia)
 			if(GetCurAmmoType() == amBaseballBat)
 			then
-				if(GLOBAL_AUSTRALIAN_SPECIAL==0)
-				then
-					GLOBAL_AUSTRALIAN_SPECIAL = 1
-					AddCaption(GLOBAL_BASEBALLBAT_CRICKET_INFO)
-				elseif(GLOBAL_AUSTRALIAN_SPECIAL==1)
-				then
-					GLOBAL_AUSTRALIAN_SPECIAL = 2
-					AddCaption(GLOBAL_BASEBALLBAT_BOOMERANG_INFO)
-				else
-					GLOBAL_AUSTRALIAN_SPECIAL = 0
-					AddCaption(loc("DEFAULT"))
-				end
+				CS.AUSTRALIAN_SPECIAL = CS.AUSTRALIAN_SPECIAL + 1
+				CS.AUSTRALIAN_SPECIAL = CS.AUSTRALIAN_SPECIAL % 3
+
+				SetAttackState(CS.AUSTRALIAN_SPECIAL == 0)
 
 			--Asian special
-			elseif(GLOBAL_PARACHUTE_IS_ON==1)
+			elseif(CS.PARACHUTE_IS_ON==1)
 			then
-				asiabomb=AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog)+3, gtSnowball, 0, 0, 0, 0)
+				local asiabomb=AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog)+3, gtSnowball, 0, 0, 0, 0)
 				SetGearMessage(asiabomb, 1)
 
-				GLOBAL_PARACHUTE_IS_ON=2
-				GLOBAL_SELECT_CONTINENT_CHECK=false
+				CS.PARACHUTE_IS_ON=2
+				CS.SELECT_CONTINENT_CHECK=false
 
 			--africa
 			elseif(GetCurAmmoType() == amSeduction)
 			then
-				if(GLOBAL_AFRICAN_SPECIAL_SEDUCTION==0)
+				if(CS.AFRICAN_SPECIAL_SEDUCTION==0)
 				then
-					GLOBAL_AFRICAN_SPECIAL_SEDUCTION = 1
-
-					AddCaption(string.format(GLOBAL_SEDUCTION_SPECIAL_INFO,GLOBAL_SEDUCTION_INCREASER))
+					CS.AFRICAN_SPECIAL_SEDUCTION = 1
 				else
-					GLOBAL_AFRICAN_SPECIAL_SEDUCTION = 0
-					AddCaption(loc("DEFAULT"))
+					CS.AFRICAN_SPECIAL_SEDUCTION = 0
 				end
 
 			--south america
 			elseif(GetCurAmmoType() == amGasBomb)
 			then
-				if(GLOBAL_SOUTH_AMERICAN_SPECIAL==false)
+				if(CS.SOUTH_AMERICAN_SPECIAL==false)
 				then
-					GLOBAL_SOUTH_AMERICAN_SPECIAL = true
-					AddCaption(GLOBAL_CHEESE_SPECIAL_INFO)
+					CS.SOUTH_AMERICAN_SPECIAL = true
 				else
-					GLOBAL_SOUTH_AMERICAN_SPECIAL = false
-					AddCaption(loc("DEFAULT"))
+					CS.SOUTH_AMERICAN_SPECIAL = false
 				end
 
 			--africa
 			elseif(GetCurAmmoType() == amSMine)
 			then
-				if(GLOBAL_AFRICAN_SPECIAL_STICKY==0)
-				then
-					GLOBAL_AFRICAN_SPECIAL_STICKY = 1
-					AddCaption(GLOBAL_STICKY_PROJECTILE_INFO)
-				elseif(GLOBAL_AFRICAN_SPECIAL_STICKY == 1)
-				then
-					GLOBAL_AFRICAN_SPECIAL_STICKY = 2
-					AddCaption(GLOBAL_STICKY_NAPALM_INFO)
-				elseif(GLOBAL_AFRICAN_SPECIAL_STICKY == 2)
-				then
-					GLOBAL_AFRICAN_SPECIAL_STICKY = 0
-					AddCaption(loc("DEFAULT"))
-				end
+				CS.AFRICAN_SPECIAL_STICKY = CS.AFRICAN_SPECIAL_STICKY + 1
+				CS.AFRICAN_SPECIAL_STICKY = CS.AFRICAN_SPECIAL_STICKY % 3
+				SetSoundMask(sndLaugh, CS.AFRICAN_SPECIAL_STICKY ~= 0)
 
 			--north america (sniper)
-			elseif(GetCurAmmoType() == amSniperRifle and GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON==false)
+			elseif(GetCurAmmoType() == amSniperRifle and CS.NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON==false)
 			then
-				if(GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER==2)
+				if(CS.NORTH_AMERICAN_SPECIAL_SNIPER==2)
 				then
-					GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER = 1
-					AddCaption(loc("DEFAULT"))
-				elseif(GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER==1)
+					CS.NORTH_AMERICAN_SPECIAL_SNIPER = 1
+				elseif(CS.NORTH_AMERICAN_SPECIAL_SNIPER==1)
 				then
-					GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER = 2
-					AddCaption(GLOBAL_SNIPER_SPECIAL_INFO)
+					CS.NORTH_AMERICAN_SPECIAL_SNIPER = 2
 				end
 
 			--north america (shotgun)
 			elseif(GetCurAmmoType() == amShotgun)
 			then
-				if(GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN==false)
+				if(CS.NORTH_AMERICAN_SPECIAL_SHOTGUN==false)
 				then
-					GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN = true
-					AddCaption(GLOBAL_SHOTGUN_SPECIAL_INFO)
+					CS.NORTH_AMERICAN_SPECIAL_SHOTGUN = true
 				else
-					GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN = false
-					AddCaption(loc("DEFAULT"))
+					CS.NORTH_AMERICAN_SPECIAL_SHOTGUN = false
 				end
 
 			--europe
 			elseif(GetCurAmmoType() == amMolotov)
 			then
-				if(GLOBAL_EUROPE_SPECIAL==0)
+				if(CS.EUROPE_SPECIAL==0)
 				then
-					GLOBAL_EUROPE_SPECIAL = 1
-					AddCaption(GLOBAL_MOLOTOV_SPECIAL_INFO)
+					CS.EUROPE_SPECIAL = 1
 				else
-					GLOBAL_EUROPE_SPECIAL = 0
-					AddCaption(loc("DEFAULT"))
+					CS.EUROPE_SPECIAL = 0
 				end
 
 			--antarctica
 			elseif(GetCurAmmoType() == amPickHammer)
 			then
-				if(GLOBAL_ANTARCTICA_SPECIAL==0)
+				if(CS.ANTARCTICA_SPECIAL==0)
 				then
-					GLOBAL_ANTARCTICA_SPECIAL = 1
-					AddCaption(GLOBAL_PICKHAMMER_SPECIAL_INFO)
+					CS.ANTARCTICA_SPECIAL = 1
 				else
-					GLOBAL_ANTARCTICA_SPECIAL = 0
-					AddCaption(loc("DEFAULT"))
+					CS.ANTARCTICA_SPECIAL = 0
 				end
 
 			--kerguelen
 			elseif(GetCurAmmoType() == amHammer)
 			then
-				if(GLOBAL_KERGUELEN_SPECIAL==6)
+				if(CS.KERGUELEN_SPECIAL==6)
 				then
-					GLOBAL_KERGUELEN_SPECIAL = 1
-					AddCaption("DEFAULT")
-				elseif(GLOBAL_KERGUELEN_SPECIAL==1)
+					CS.KERGUELEN_SPECIAL = 1
+				elseif(CS.KERGUELEN_SPECIAL==1)
 				then
-					GLOBAL_KERGUELEN_SPECIAL = 2
-					AddCaption("#"..GLOBAL_HAMMER_ROAR_INFO)
-				elseif(GLOBAL_KERGUELEN_SPECIAL==2)
+					CS.KERGUELEN_SPECIAL = 2
+				elseif(CS.KERGUELEN_SPECIAL==2)
 				then
-					GLOBAL_KERGUELEN_SPECIAL = 3
-					AddCaption("##"..GLOBAL_HAMMER_SWAP_INFO)
-				elseif(GLOBAL_KERGUELEN_SPECIAL==3)
+					CS.KERGUELEN_SPECIAL = 3
+				elseif(CS.KERGUELEN_SPECIAL==3)
+				then
+					CS.KERGUELEN_SPECIAL = 5
+				elseif(CS.KERGUELEN_SPECIAL==5)
 				then
-					GLOBAL_KERGUELEN_SPECIAL = 5
-					AddCaption("###"..GLOBAL_HAMMER_LONELY_INFO)
-				elseif(GLOBAL_KERGUELEN_SPECIAL==5)
-				then
-					GLOBAL_KERGUELEN_SPECIAL = 6
-					AddCaption("####"..GLOBAL_HAMMER_SABOTAGE_INFO)
+					CS.KERGUELEN_SPECIAL = 6
 				end
+				SetAttackState(CS.KERGUELEN_SPECIAL == 1)
 			end
+			ShowSpecialWeaponCaption(GetCurAmmoType())
 		end
 		--for selecting weaponset, this is mostly for old players.
-		if(GetHogLevel(CurrentHedgehog)==0 and GLOBAL_SELECT_CONTINENT_CHECK==true and (GetCurAmmoType() == amSkip or GetCurAmmoType() == amNothing))
-		then
-			GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]+1
+		-- Switch: Next continent
+		-- Precise+Switch: Previous continent
+		TrySelectNextContinent(CS.PRECISE)
+	--if switching out from sabotage.
+	elseif(CS.SABOTAGE_HOGS[CurrentHedgehog]~=nil and CS.SABOTAGE_HOGS[CurrentHedgehog]==2)
+	then
+		CS.SABOTAGE_HOGS[CurrentHedgehog]=1
+	end
+end
 
-			if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]> table.maxn(GLOBAL_CONTINENT_INFORMATION))
-			then
-				GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=1
-			end
-			SetContinentWeapons()
+function TrySelectNextContinent(reverse)
+	local direction = 1
+	if reverse then
+		direction = -1
+	end
+	if(GetHogLevel(CurrentHedgehog)==0 and CS.SELECT_CONTINENT_CHECK==true and (GetCurAmmoType() == amSkip or GetCurAmmoType() == amNothing))
+	then
+		CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)] + direction
+
+		if(CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]> table.maxn(CS.CONTINENT_INFORMATION))
+		then
+			CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=1
 		end
-	--if switching out from sabotage.
-	elseif(GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]~=nil and GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]==2)
-	then
-		GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=1
+		if(CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]<=0)
+		then
+			CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=table.maxn(CS.CONTINENT_INFORMATION)
+		end
+		SetContinentWeapons()
+
+		PlaySound(sndSwitchHog)
 	end
 end
 
 function onUp()
 	--swap forward in the weaponmenu (1.0 style)
-	if(GetHogLevel(CurrentHedgehog)==0 and GLOBAL_SELECT_CONTINENT_CHECK==true and (GetCurAmmoType() == amSkip or GetCurAmmoType() == amNothing))
-	then
-		GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]+1
+	TrySelectNextContinent(false)
 
-		if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]> table.maxn(GLOBAL_CONTINENT_INFORMATION))
-		then
-			GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=1
-		end
-		SetContinentWeapons()
-	end
-
-	if(GetCurAmmoType() == amSeduction and GLOBAL_AFRICAN_SPECIAL_SEDUCTION == 1 and GetAmmoCount(CurrentHedgehog,amInvulnerable)>0)
+	if(GetCurAmmoType() == amSeduction and CS.AFRICAN_SPECIAL_SEDUCTION == 1 and GetAmmoCount(CurrentHedgehog,amInvulnerable)>0)
 	then
-		GLOBAL_SEDUCTION_INCREASER=GLOBAL_SEDUCTION_INCREASER+7
+		CS.SEDUCTION_INCREASER=CS.SEDUCTION_INCREASER+7
 
 		RemoveWeapon(CurrentHedgehog,amInvulnerable)
 
-		AddCaption(string.format(GLOBAL_INVULNERABLE_SPECIAL_INFO," ("..(GLOBAL_SEDUCTION_INCREASER+15)..")"," ("..GetAmmoCount(CurrentHedgehog,amInvulnerable)..")"))
+		AddCaption(string.format(CS.INVULNERABLE_SPECIAL_CAPTION, CS.SEDUCTION_INCREASER, GetAmmoCount(CurrentHedgehog,amInvulnerable)), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmostate)
 	end
 end
 
 function onDown()
 	--swap backwards in the weaponmenu (1.0 style)
-	if(GetHogLevel(CurrentHedgehog)==0 and GLOBAL_SELECT_CONTINENT_CHECK==true and (GetCurAmmoType() == amSkip or GetCurAmmoType() == amNothing))
-	then
-		GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]-1
+	TrySelectNextContinent(true)
 
-		if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]<=0)
-		then
-			GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=table.maxn(GLOBAL_CONTINENT_INFORMATION)
-		end
-		SetContinentWeapons()
-	end
-
-	if(GetCurAmmoType() == amSeduction and GLOBAL_AFRICAN_SPECIAL_SEDUCTION == 1 and GLOBAL_SEDUCTION_INCREASER>0)
+	if(GetCurAmmoType() == amSeduction and CS.AFRICAN_SPECIAL_SEDUCTION == 1 and CS.SEDUCTION_INCREASER>0)
 	then
-		GLOBAL_SEDUCTION_INCREASER=GLOBAL_SEDUCTION_INCREASER-7
+		CS.SEDUCTION_INCREASER=CS.SEDUCTION_INCREASER-7
 
 		AddAmmo(CurrentHedgehog,amInvulnerable,GetAmmoCount(CurrentHedgehog, amInvulnerable)+1)
 
-		AddCaption(string.format(GLOBAL_INVULNERABLE_SPECIAL_INFO," ("..(GLOBAL_SEDUCTION_INCREASER+15)..")"," ("..GetAmmoCount(CurrentHedgehog,amInvulnerable)..")"))
+		AddCaption(string.format(CS.INVULNERABLE_SPECIAL_CAPTION, CS.SEDUCTION_INCREASER, GetAmmoCount(CurrentHedgehog,amInvulnerable)), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmostate)
+	end
+end
+
+-- Spawn sabotage smoke for inactive hogs (red smoke, more subtle than for active hogs)
+function SabotageSmokeInactive(gear)
+	if GetGearType(gear) == gtHedgehog and gear ~= CurrentHedgehog and CS.SABOTAGE_HOGS[gear]~=nil and CS.SABOTAGE_HOGS[gear]>=1 then
+		local vg = AddVisualGear(GetX(gear), GetY(gear), vgtSmokeWhite, 0, false)
+		SetVisualGearValues(vg, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0xFF8080B0)
+	end
+end
+
+function ShowContinentLabel()
+	if CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)] == 0 then
+		AddCaption(loc("Random continent"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+	else
+		AddCaption(CS.CONTINENT_INFORMATION[CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]][1], GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
+	end
+end
+
+function onGameTick()
+	-- This is a trick to show the continent label delayed by 1 tick
+	if CS.CONTINENT_LABEL_TIMER > 0 then
+		CS.CONTINENT_LABEL_TIMER = CS.CONTINENT_LABEL_TIMER - 1
+	end
+	if CS.CONTINENT_LABEL_TIMER == 0 then
+		ShowContinentLabel()
+		CS.CONTINENT_LABEL_TIMER = -1
+	end
+
+	if CS.HANDLE_SPECIAL_WEAPON_MISC_TIMER > 0 then
+		CS.HANDLE_SPECIAL_WEAPON_MISC_TIMER = CS.HANDLE_SPECIAL_WEAPON_MISC_TIMER - 1
+	end
+	if CS.HANDLE_SPECIAL_WEAPON_MISC_TIMER == 0 then
+		HandleSpecialWeaponMisc()
+		CS.HANDLE_SPECIAL_WEAPON_MISC_TIMER = -1
+	end
+
+	-- See onAttack()
+	if CS.CONFIRM_CONTINENT_SELECTION > 0 then
+		CS.CONFIRM_CONTINENT_SELECTION = CS.CONFIRM_CONTINENT_SELECTION - 1
+	end
+	if CS.CONFIRM_CONTINENT_SELECTION == 0 then
+		CS.SELECT_CONTINENT_CHECK=false
+		EndTurnCS(0)
+		PlaySound(sndPlaced)
+		ShowContinentLabel()
+		CS.CONFIRM_CONTINENT_SELECTION = -1
+	end
+
+	if GameTime % 600 == 0 then
+		runOnGears(SabotageSmokeInactive)
 	end
 end
 
 function onGameTick20()
 	--if you picked a weaponset from the weaponmenu (icon)
-	if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
+	if(CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
 	then
 		if(GetCurAmmoType()==amSwitch)
 		then
-			GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GetRandom(table.maxn(GLOBAL_CONTINENT_INFORMATION))+1
+			CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GetRandom(table.maxn(CS.CONTINENT_INFORMATION))+1
 			SetContinentWeapons()
+			SetWeapon(amSkip)
 			PlaySound(sndMineTick)
+			CS.CONTINENT_LABEL_TIMER = 1
 		else
-			for v,w in pairs(GLOBAL_CONTINENT_INFORMATION)
+			for v,w in pairs(CS.CONTINENT_INFORMATION)
 			do
-				if(GetCurAmmoType()==GLOBAL_CONTINENT_INFORMATION[v][4][1])
+				if(GetCurAmmoType()==CS.CONTINENT_INFORMATION[v][4][1])
 				then
-					GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=v
+					CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=v
 					SetContinentWeapons()
-					PlaySound(GLOBAL_CONTINENT_INFORMATION[v][6][1])
-					PlaySound(GLOBAL_CONTINENT_INFORMATION[v][6][2],CurrentHedgehog)
+					SetWeapon(amSkip)
+					PlaySound(CS.CONTINENT_INFORMATION[v][6][1])
+					PlaySound(CS.CONTINENT_INFORMATION[v][6][2],CurrentHedgehog)
+					CS.CONTINENT_LABEL_TIMER = 1
+					break
 				end
 			end
 		end
 	end
 
 	--show the kerguelen ring
-	if(GLOBAL_KERGUELEN_SPECIAL > 1 and GetCurAmmoType() == amHammer)
+	if(CS.KERGUELEN_SPECIAL > 1 and GetCurAmmoType() == amHammer and
+		band(GetState(CurrentHedgehog), gstAttacked) == 0 and
+		band(GetState(CurrentHedgehog), gstHHDriven) ~= 0)
 	then
-		if(GLOBAL_VISUAL_CIRCLE==nil)
+		if(CS.VISUAL_CIRCLE==nil)
 		then
-			GLOBAL_VISUAL_CIRCLE=AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtCircle, 0, true)
+			CS.VISUAL_CIRCLE=AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtCircle, 0, true)
 		end
 
-		if(GLOBAL_KERGUELEN_SPECIAL == 2) --walrus scream
+		if(CS.KERGUELEN_SPECIAL == 2) --walrus scream
 		then
-			SetVisualGearValues(GLOBAL_VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 120, 4, 0xff0000ee)
-		elseif(GLOBAL_KERGUELEN_SPECIAL == 3) --swap hog
+			SetVisualGearValues(CS.VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 120, 4, 0xff0000ee)
+		elseif(CS.KERGUELEN_SPECIAL == 3) --swap hog
 		then
-			SetVisualGearValues(GLOBAL_VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 390, 3, 0xffff00ee)
-		elseif(GLOBAL_KERGUELEN_SPECIAL == 5) --cries
+			SetVisualGearValues(CS.VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 390, 3, 0xffff00ee)
+		elseif(CS.KERGUELEN_SPECIAL == 5) --cries
 		then
 
-			GLOBAL_TEMP_VALUE=0
+			CS.TEMP_VALUE=0
 			runOnGears(KerguelenSpecialBlueCheck)
-			if(GLOBAL_TEMP_VALUE==0)
+			if(CS.TEMP_VALUE==0)
 			then
-				SetVisualGearValues(GLOBAL_VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 500, 1, 0x0000ffee)
+				SetVisualGearValues(CS.VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 500, 1, 0x0000ffee)
 			else
-				SetVisualGearValues(GLOBAL_VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 500, 10, 0x0000ffee)
+				SetVisualGearValues(CS.VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 500, 10, 0x0000ffee)
 			end
 
-		elseif(GLOBAL_KERGUELEN_SPECIAL == 6) --sabotage
+		elseif(CS.KERGUELEN_SPECIAL == 6) --sabotage
 		then
-			SetVisualGearValues(GLOBAL_VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 80, 10, 0x00ff00ee)
+			SetVisualGearValues(CS.VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 80, 10, 0x00ff00ee)
 		end
 
-	elseif(GLOBAL_VISUAL_CIRCLE~=nil)
+	elseif(CS.VISUAL_CIRCLE~=nil)
 	then
-		DeleteVisualGear(GLOBAL_VISUAL_CIRCLE)
-		GLOBAL_VISUAL_CIRCLE=nil
+		DeleteVisualGear(CS.VISUAL_CIRCLE)
+		CS.VISUAL_CIRCLE=nil
 	end
 
 	--sabotage
-	if(GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]~=nil and GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]>=1)
+	if(CS.SABOTAGE_HOGS[CurrentHedgehog]~=nil and CS.SABOTAGE_HOGS[CurrentHedgehog]>=1)
 	then
 		--for sabotage
-		if(GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]==1)
+		if(CS.SABOTAGE_HOGS[CurrentHedgehog]==1)
 		then
 			AddCaption(loc("You are sabotaged, RUN!"))
 
 			PlaySound(sndHellish)
 			--update the constant at the top also to something in between
-			GLOBAL_SABOTAGE_FREQUENCY=100
-			SetGravity(350)
+			CS.SABOTAGE_FREQUENCY_NOW=CS.SABOTAGE_FREQUENCY
+			SetGravity(CS.SABOTAGE_GRAVITY)
 
-			GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=2
+			CS.SABOTAGE_HOGS[CurrentHedgehog]=2
 		end
 
-		if(GLOBAL_SABOTAGE_COUNTER % 20 == 0)
+		if(CS.SABOTAGE_COUNTER % 20 == 0)
 		then
-			AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmokeWhite, 0, false)
+			-- Sabotage effect (red smoke)
+			local vg = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmokeWhite, 0, false)
+			SetVisualGearValues(vg, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0xFF4040FF)
 		end
 
 		if(TurnTimeLeft<(GetAwayTime*10) or band(GetState(CurrentHedgehog),gstAttacked)==1)
 		then
-			GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=0
-		elseif(GLOBAL_SABOTAGE_COUNTER >= GLOBAL_SABOTAGE_FREQUENCY)
+			CS.SABOTAGE_HOGS[CurrentHedgehog]=0
+		elseif(CS.SABOTAGE_COUNTER >= CS.SABOTAGE_FREQUENCY_NOW)
 		then
-
-			if(GetHealth(CurrentHedgehog)<=2)
+			-- Sabotage decreases hog health regularily,
+			-- but invulnerable protects.
+			-- Also do not decrease health while retreating or attacking.
+			if(GetEffect(CurrentHedgehog, heInvulnerable) == 0 and
+			band(GetState(CurrentHedgehog), gstHHDriven) ~= 0 and
+			band(GetState(CurrentHedgehog), gstAttacked+gstAttacking) == 0)
 			then
-				SetHealth(CurrentHedgehog, 0)
-				GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=0
-			else
-				SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)-2)
+				if(GetHealth(CurrentHedgehog)<=CS.SABOTAGE_DAMAGE)
+				then
+					-- All health lost! Sabotage is cruel.
+					PlaySound(sndPoisonMoan, CurrentHedgehog)
+					SetHealth(CurrentHedgehog, 0)
+					CS.SABOTAGE_HOGS[CurrentHedgehog]=0
+					-- Take away control so the hog can die in peace.
+					SetState(CurrentHedgehog, band(GetState(CurrentHedgehog), bnot(gstHHDriven)))
+				else
+					local newHealth = GetHealth(CurrentHedgehog)-CS.SABOTAGE_DAMAGE
+					-- Start moaning if health is at a critical level
+					if newHealth <= 16 then
+						PlaySound(sndPoisonMoan, CurrentHedgehog)
+					elseif newHealth <= 32 then
+						PlaySound(sndPoisonCough, CurrentHedgehog)
+					end
+					SetHealth(CurrentHedgehog, newHealth)
+				end
+				ShowDamageTag(CurrentHedgehog,CS.SABOTAGE_DAMAGE)
 			end
-			ShowDamageTag(CurrentHedgehog,2)
 
-			GLOBAL_SABOTAGE_COUNTER=0
+			CS.SABOTAGE_COUNTER=0
 		else
-			GLOBAL_SABOTAGE_COUNTER=GLOBAL_SABOTAGE_COUNTER+1
+			CS.SABOTAGE_COUNTER=CS.SABOTAGE_COUNTER+1
 		end
-	elseif(GetGravity()==350 and (GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]==0 or GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]==nil))
+	elseif((GetGravity()==CS.SABOTAGE_GRAVITY or GetGravity()==CS.SABOTAGE_GRAVITY_LOW) and (CS.SABOTAGE_HOGS[CurrentHedgehog]==0 or CS.SABOTAGE_HOGS[CurrentHedgehog]==nil))
 	then
+		-- Reset gravity
 		SetGravity(100)
 	end
 
 	--enable switch (north america)
-	if(GetCurAmmoType() == amSwitch and GLOBAL_TEMP_VALUE==87)
+	if(GetCurAmmoType() == amSwitch and CS.TEMP_VALUE==87)
 	then
 		SetGearMessage(CurrentHedgehog,gmAttack)
-		GLOBAL_TEMP_VALUE=0
+		CS.TEMP_VALUE=0
+	end
+
+	if(CS.SPEECH_TIMER > 0) then
+		CS.SPEECH_TIMER = CS.SPEECH_TIMER - 20
+	end
+end
+
+function HandleSpecialWeaponMisc(ammoType)
+	if not ammoType then
+		ammoType = GetCurAmmoType()
 	end
+	ShowSpecialWeaponCaption(ammoType)
+	if ammoType == amSMine and CS.AFRICAN_SPECIAL_STICKY ~= 0 then
+		SetSoundMask(sndLaugh, true)
+	else
+		SetSoundMask(sndLaugh, false)
+	end
+	if (ammoType == amHammer and CS.KERGUELEN_SPECIAL > 1) or (ammoType == amBaseballBat and CS.AUSTRALIAN_SPECIAL ~= 0) then
+		SetAttackState(false)
+	else
+		SetAttackState(true)
+	end
+
 end
 
 --some ppl complained :P
 function onSlot(slot)
-	if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
+	if(CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
 	then
 		SetWeapon(amSkip)
 	end
+	if CS.GAME_STARTED then
+		-- Delay calling HandleSpecialWeaponMisc because
+		-- the CurAmmoType is not updated yet.
+		CS.HANDLE_SPECIAL_WEAPON_MISC_TIMER = 2
+	end
+end
+
+function onSetWeapon(ammoType)
+	if CS.GAME_STARTED then
+		HandleSpecialWeaponMisc(ammoType)
+	end
 end
 
 --if you used hogswitch or any similar weapon, dont enable any weaponchange
 function onAttack()
-	if(GLOBAL_SELECT_CONTINENT_CHECK==true)
+	if(CS.SELECT_CONTINENT_CHECK==true)
 	then
 		if(GetCurAmmoType() == amSkip or GetCurAmmoType() == amNothing)
 		then
-			GLOBAL_SELECT_CONTINENT_CHECK=false
-			EndTurn(0)
+			SetWeapon(amNothing)
+			-- Delay the real continent selection so the SetWeapon
+			-- has time to take effect.
+			CS.CONFIRM_CONTINENT_SELECTION=2
 		else
 			SetWeapon(amSkip)
 		end
 	end
 
 	--african special
-	if(GLOBAL_AFRICAN_SPECIAL_SEDUCTION == 1 and GetCurAmmoType() == amSeduction and band(GetState(CurrentHedgehog),gstAttacked)==0)
+	if(CS.AFRICAN_SPECIAL_SEDUCTION == 1 and GetCurAmmoType() == amSeduction and band(GetState(CurrentHedgehog),gstAttacked)==0)
 	then
-		EndTurn(3)
+		EndTurnCS(3)
 
-		GLOBAL_TEMP_VALUE=0
+		CS.TEMP_VALUE=0
 		runOnGears(AfricaSpecialSeduction)
-		SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+GLOBAL_TEMP_VALUE)
+		SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+CS.TEMP_VALUE)
 
 		--visual stuff
 		VisualExplosion(250,GetX(CurrentHedgehog), GetY(CurrentHedgehog),vgtSmoke,vgtSmokeWhite)
@@ -1375,38 +1852,39 @@
 
 		RemoveWeapon(CurrentHedgehog,amSeduction)
 
-	elseif(GLOBAL_ANTARCTICA_SPECIAL == 1 and GetCurAmmoType() == amPickHammer and band(GetState(CurrentHedgehog),gstAttacked)==0)
+	elseif(CS.ANTARCTICA_SPECIAL == 1 and GetCurAmmoType() == amPickHammer and band(GetState(CurrentHedgehog),gstAttacked)==0)
 	then
-		EndTurn(10)
+		EndTurnCS(10)
 		SetGearPosition(CurrentHedgehog,GetX(CurrentHedgehog),0)
 		ParseCommand("hjump")
 		SetGearVelocity(CurrentHedgehog, 0, 100000000)
 
 		PlaySound(sndPiano8)
+		PlaySound(sndWarp)
 
 		RemoveWeapon(CurrentHedgehog,amPickHammer)
 
 	--Kerguelen specials
-	elseif(GetCurAmmoType() == amHammer and GLOBAL_KERGUELEN_SPECIAL > 1 and band(GetState(CurrentHedgehog),gstAttacked)==0)
+	elseif(GetCurAmmoType() == amHammer and CS.KERGUELEN_SPECIAL > 1 and band(GetState(CurrentHedgehog),gstAttacked)==0)
 	then
 		local escapetime=3
 
 		--scream
-		if(GLOBAL_KERGUELEN_SPECIAL == 2)
+		if(CS.KERGUELEN_SPECIAL == 2)
 		then
-			GLOBAL_TEMP_VALUE=0
+			CS.TEMP_VALUE=0
 			runOnGears(KerguelenSpecialRed)
-			HealHog(CurrentHedgehog, GLOBAL_TEMP_VALUE)
+			HealHog(CurrentHedgehog, CS.TEMP_VALUE)
 			PlaySound(sndHellish)
 
 		--swap
-		elseif(GLOBAL_KERGUELEN_SPECIAL == 3)
+		elseif(CS.KERGUELEN_SPECIAL == 3)
 		then
-			GLOBAL_TEMP_VALUE=0
+			CS.TEMP_VALUE=0
 			runOnGears(KerguelenSpecialYellowCountHogs)
-			if(GLOBAL_TEMP_VALUE>0)
+			if(CS.TEMP_VALUE>0)
 			then
-				GLOBAL_TEMP_VALUE=GetRandom(GLOBAL_TEMP_VALUE)
+				CS.TEMP_VALUE=GetRandom(CS.TEMP_VALUE)
 				runOnGears(KerguelenSpecialYellowSwap)
 				PlaySound(sndPiano3)
 			else
@@ -1414,56 +1892,85 @@
 			end
 
 		--cries
-		elseif(GLOBAL_KERGUELEN_SPECIAL == 5)
+		elseif(CS.KERGUELEN_SPECIAL == 5)
 		then
-			GLOBAL_TEMP_VALUE=0
+			CS.TEMP_VALUE=0
 			runOnGears(KerguelenSpecialBlueCheck)
-			if(GLOBAL_TEMP_VALUE==0)
+			if(CS.TEMP_VALUE==0)
 			then
 				AddGear(0, 0, gtWaterUp, 0, 0,0,0)
 				PlaySound(sndWarp)
 				PlaySound(sndMolotov)
 
 				runOnGears(KerguelenSpecialBlueActivate)
-				SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+GLOBAL_TEMP_VALUE)
+				SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+CS.TEMP_VALUE)
 			else
-				HogSay(CurrentHedgehog, loc("Hogs in sight!"), SAY_SAY)
+				PlaySound(sndDenied)
+				escapetime = -1
+				if CS.SPEECH_TIMER <= 0 then
+					HogSay(CurrentHedgehog, loc("Hogs in sight!"), SAY_SAY)
+					CS.SPEECH_TIMER = 5000
+				end
 			end
 
-		--sabotage
-		elseif(GLOBAL_KERGUELEN_SPECIAL == 6)
+		--flare/sabotage
+		elseif(CS.KERGUELEN_SPECIAL == 6)
 		then
-			GLOBAL_TEMP_VALUE=0
+			CS.TEMP_VALUE=0
 			runOnGears(KerguelenSpecialGreen)
 
 			PlaySound(sndThrowRelease)
 			AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog)-20, gtCluster, 0, 0, -1000000, 32)
 
-			if(GLOBAL_TEMP_VALUE==1)
+			if(CS.TEMP_VALUE==1)
 			then
 				escapetime=10
 			end
 		end
 
-		EndTurn(escapetime)
+		if escapetime >= 0 then
+			EndTurnCS(escapetime)
+
+			DeleteVisualGear(CS.VISUAL_CIRCLE)
+			CS.VISUAL_CIRCLE=nil
+			CS.KERGUELEN_SPECIAL=0
+
+			RemoveWeapon(CurrentHedgehog,amHammer)
+		end
 
-		DeleteVisualGear(GLOBAL_VISUAL_CIRCLE)
-		GLOBAL_VISUAL_CIRCLE=nil
-		GLOBAL_KERGUELEN_SPECIAL=0
-
-		RemoveWeapon(CurrentHedgehog,amHammer)
+	elseif(GetCurAmmoType() == amBaseballBat)
+	then
+		if CS.AUSTRALIAN_SPECIAL ~= 0
+		then
+			CS.TEMP_VALUE=0
+			runOnGears(AustraliaSpecialCheckHogs)
+			if CS.TEMP_VALUE == 0 then
+				SetGearMessage(CurrentHedgehog, bor(GetGearMessage(CurrentHedgehog), gmAttack))
+			else
+				PlaySound(sndDenied)
+			end
+		end
 
 	elseif(GetCurAmmoType() == amVampiric)
 	then
-		GLOBAL_VAMPIRIC_IS_ON=75
+		CS.VAMPIRIC_IS_ON=75
 	elseif(GetCurAmmoType() == amExtraDamage)
 	then
-		GLOBAL_EXTRA_DAMAGE_IS_ON=150
+		CS.EXTRA_DAMAGE_IS_ON=150
+	end
+end
+
+function onHogAttack(ammoType)
+	-- When a sabotaged hog uses low gravity, overwrite the default low gravity,
+	-- otherwise it would be too easy.
+	if(ammoType == amLowGravity and CS.SABOTAGE_HOGS[CurrentHedgehog]~=nil and CS.SABOTAGE_HOGS[CurrentHedgehog]>=1)
+	then
+		SetGravity(CS.SABOTAGE_GRAVITY_LOW)
 	end
 end
 
 function onGearAdd(gearUid)
-	GLOBAL_SELECT_CONTINENT_CHECK=false
+	CS.SELECT_CONTINENT_CHECK=false
 
 	--track the gears im using
 	if(GetGearType(gearUid) == gtHedgehog or GetGearType(gearUid) == gtMine or GetGearType(gearUid) == gtExplosives)
@@ -1472,37 +1979,47 @@
 	end
 
 	--remove gasclouds on gasbombspecial
-	if(GetGearType(gearUid)==gtPoisonCloud and GLOBAL_SOUTH_AMERICAN_SPECIAL == true)
+	if(GetGearType(gearUid)==gtPoisonCloud and CS.SOUTH_AMERICAN_SPECIAL == true)
 	then
 		DeleteGear(gearUid)
 	--african special
 	elseif(GetGearType(gearUid)==gtSMine)
 	then
-		vx,vy=GetGearVelocity(gearUid)
-		if(GLOBAL_AFRICAN_SPECIAL_STICKY == 1)
+		local vx,vy=GetGearVelocity(gearUid)
+		if(CS.AFRICAN_SPECIAL_STICKY == 1)
 		then
 			SetState(CurrentHedgehog, gstHHDriven+gstMoving)
 			SetGearPosition(CurrentHedgehog, GetX(CurrentHedgehog),GetY(CurrentHedgehog)-3)
 			SetGearVelocity(CurrentHedgehog, vx, vy)
+			PlaySound(sndJump2, CurrentHedgehog)
 			DeleteGear(gearUid)
+			if (not CS.AFRICAN_SPECIAL_NON_PROJECTILE_USED) then
+				SetSoundMask(sndMissed, true)
+			end
 
-		elseif(GLOBAL_AFRICAN_SPECIAL_STICKY == 2)
+		elseif(CS.AFRICAN_SPECIAL_STICKY == 2)
 		then
 			FireGear(CurrentHedgehog,gtNapalmBomb, vx, vy, 0)
 			DeleteGear(gearUid)
+			CS.AFRICAN_SPECIAL_NON_PROJECTILE_USED=true
+			SetSoundMask(sndMissed, false)
+		else
+			CS.AFRICAN_SPECIAL_NON_PROJECTILE_USED=true
+			SetSoundMask(sndMissed, false)
 		end
 	--north american special
 	elseif(GetGearType(gearUid)==gtSniperRifleShot)
 	then
-		GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=true
-		if(GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER~=1)
+		CS.NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=true
+		if(CS.NORTH_AMERICAN_SPECIAL_SNIPER~=1)
 		then
 			SetHealth(gearUid, 1)
+			SetGearValues(gearUid, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0)
 		end
 	--north american special
 	elseif(GetGearType(gearUid)==gtShotgunShot)
 	then
-		if(GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN==true)
+		if(CS.NORTH_AMERICAN_SPECIAL_SHOTGUN==true)
 		then
 			AddVisualGear(GetX(gearUid), GetY(gearUid), vgtFeather, 0, false)
 			AddVisualGear(GetX(gearUid), GetY(gearUid), vgtFeather, 0, false)
@@ -1510,30 +2027,30 @@
 			PlaySound(sndBirdyLay)
 		end
 	--european special
-	elseif(GetGearType(gearUid)==gtMolotov and GLOBAL_EUROPE_SPECIAL==1)
+	elseif(GetGearType(gearUid)==gtMolotov and CS.EUROPE_SPECIAL==1)
 	then
-		vx,vy=GetGearVelocity(gearUid)
-		e_health=FireGear(CurrentHedgehog,gtCluster, vx, vy, 1)
+		local vx,vy=GetGearVelocity(gearUid)
+		local e_health=FireGear(CurrentHedgehog,gtCluster, vx, vy, 1)
 		SetGearMessage(e_health, 2)
 		DeleteGear(gearUid)
 	--australian specials
-	elseif(GetGearType(gearUid)==gtShover and GLOBAL_AUSTRALIAN_SPECIAL~=0)
+	elseif(GetGearType(gearUid)==gtShover and CS.AUSTRALIAN_SPECIAL~=0)
 	then
-		GLOBAL_TEMP_VALUE=0
+		CS.TEMP_VALUE=0
 		runOnGears(AustraliaSpecialCheckHogs)
 
-		if(GLOBAL_TEMP_VALUE==0)
+		if(CS.TEMP_VALUE==0)
 		then
-			vx,vy=GetGearVelocity(gearUid)
+			local vx,vy=GetGearVelocity(gearUid)
 
-			if(GLOBAL_AUSTRALIAN_SPECIAL==1)
+			if(CS.AUSTRALIAN_SPECIAL==1)
 			then
 				local austmine=FireGear(CurrentHedgehog,gtMine, vx, vy, 0)
 				SetHealth(austmine, 100)
 				SetTimer(austmine, 1000)
+				PlaySound(sndLaugh, CurrentHedgehog)
 			else
 				local austmine=FireGear(CurrentHedgehog,gtBall, vx, vy, 1)
-				--SetHealth(austmine, 1)
 				SetTimer(austmine, 1000)
 				SetGearMessage(austmine, 3)
 			end
@@ -1542,22 +2059,17 @@
 		end
 	elseif(GetGearType(gearUid)==gtParachute)
 	then
-		GLOBAL_PARACHUTE_IS_ON=1
+		CS.PARACHUTE_IS_ON=1
 	elseif(GetGearType(gearUid)==gtSwitcher)
 	then
-		GLOBAL_SWITCH_HOG_IS_ON=true
+		CS.SWITCH_HOG_IS_ON=true
 	end
 end
 
 function onGearDamage(gearUid, damage)
-	if (GetGearType(gearUid) == gtCase)
+	if(gearUid==CurrentHedgehog and CS.SABOTAGE_HOGS[CurrentHedgehog]==1)
 	then
-		GLOBAL_CRATE_TEST=gearUid
-	end
-
-	if(gearUid==CurrentHedgehog and GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]==1)
-	then
-		GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=0
+		CS.SABOTAGE_HOGS[CurrentHedgehog]=0
 	end
 end
 
@@ -1566,48 +2078,49 @@
 	if(GetGearType(gearUid) == gtHedgehog or GetGearType(gearUid) == gtMine or GetGearType(gearUid) == gtExplosives)
 	then
 		--sundaland special
-		if(GetGearType(gearUid) == gtHedgehog and GLOBAL_TEAM_CONTINENT[GLOBAL_SUNDALAND_END_HOG_CONTINENT_NAME]==10)
+		if(GetGearType(gearUid) == gtHedgehog and CS.TEAM_CONTINENT[CS.SUNDALAND_END_HOG_CONTINENT_NAME]==10)
 		then
-			local currvalue=getTeamValue(GLOBAL_SUNDALAND_END_HOG_CONTINENT_NAME, "sundaland-count")
+			local currvalue=getTeamValue(CS.SUNDALAND_END_HOG_CONTINENT_NAME, "sundaland-count")
 
 			if(currvalue==nil)
 			then
 				currvalue=0
 			end
 
-			setTeamValue(GLOBAL_SUNDALAND_END_HOG_CONTINENT_NAME, "sundaland-count", currvalue+1)
-			PlaySound(sndReinforce,CurrentHedgehog)
+			setTeamValue(CS.SUNDALAND_END_HOG_CONTINENT_NAME, "sundaland-count", currvalue+1)
 		end
 
 		trackDeletion(gearUid)
 	end
 
-	--if picking up a health crate
-	if(GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]~=0 and GetGearType(gearUid) == gtCase and GetHealth(gearUid)~=0 and gearUid~=GLOBAL_CRATE_TEST and gearIsInCircle(CurrentHedgehog,GetX(gearUid), GetY(gearUid), 50, false)==true)
+	--if picking up a health crate, heal sabotage
+	if(CS.SABOTAGE_HOGS[CurrentHedgehog]~=0 and GetGearType(gearUid) == gtCase and GetGearPos(gearUid)==2 and band(GetGearMessage(gearUid), gmDestroy) ~= 0)
 	then
-		GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=0
+		CS.SABOTAGE_HOGS[CurrentHedgehog]=0
 	end
 
 	--north american lipstick
 	if(GetGearType(gearUid)==gtSniperRifleShot )
 	then
-		GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=false
-		if(GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER==2)
+		CS.NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=false
+		if(CS.NORTH_AMERICAN_SPECIAL_SNIPER==2)
 		then
-			GLOBAL_TEMP_VALUE=gearUid
+			CS.TEMP_VALUE=gearUid
 			runOnGears(NorthAmericaSpecialSniper)
 		end
 	--north american eagle eye
-	elseif(GetGearType(gearUid)==gtShotgunShot and GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN==true)
+	elseif(GetGearType(gearUid)==gtShotgunShot and CS.NORTH_AMERICAN_SPECIAL_SHOTGUN==true)
 	then
 		SetGearPosition(CurrentHedgehog, GetX(gearUid), GetY(gearUid)+7)
 		PlaySound(sndWarp)
 	--south american special
-	elseif(GetGearType(gearUid)==gtGasBomb and GLOBAL_SOUTH_AMERICAN_SPECIAL == true)
+	elseif(GetGearType(gearUid)==gtGasBomb and CS.SOUTH_AMERICAN_SPECIAL == true)
 	then
-		GLOBAL_TEMP_VALUE=gearUid
-		runOnGears(SouthAmericaSpecialCheeseExplosion)
-		AddVisualGear(GetX(gearUid), GetY(gearUid), vgtExplosion, 0, false)
+		if band(GetState(gearUid), gstDrowning) == 0 then
+			CS.TEMP_VALUE=gearUid
+			runOnGears(SouthAmericaSpecialCheeseExplosion)
+			AddVisualGear(GetX(gearUid), GetY(gearUid), vgtExplosion, 0, false)
+		end
 
 	--asian special
 	elseif(GetGearType(gearUid)==gtSnowball and GetGearMessage(gearUid)==1)
@@ -1617,11 +2130,13 @@
 	--europe special
 	elseif(GetGearType(gearUid)==gtCluster and GetGearMessage(gearUid)==2)
 	then
-		GLOBAL_TEMP_VALUE=gearUid
-		runOnGears(EuropeSpecialMolotovHit)
-		VisualExplosion(100,GetX(gearUid), GetY(gearUid),vgtSmokeWhite,vgtSmokeWhite)
-		AddVisualGear(GetX(gearUid), GetY(gearUid), vgtExplosion, 0, false)
-		PlaySound(sndGraveImpact)
+		if band(GetState(gearUid), gstDrowning) == 0 then
+			CS.TEMP_VALUE=gearUid
+			runOnGears(EuropeSpecialMolotovHit)
+			VisualExplosion(100,GetX(gearUid), GetY(gearUid),vgtSmokeWhite,vgtSmokeWhite)
+			AddVisualGear(GetX(gearUid), GetY(gearUid), vgtExplosion, 0, false)
+			PlaySound(sndGraveImpact)
+		end
 	--australian special
 	elseif(GetGearType(gearUid)==gtBall and GetGearMessage(gearUid)==3)
 	then
@@ -1630,16 +2145,10 @@
 	--asia (using para)
 	elseif(GetGearType(gearUid)==gtParachute)
 	then
-		GLOBAL_PARACHUTE_IS_ON=false
+		CS.PARACHUTE_IS_ON=false
 	elseif(GetGearType(gearUid)==gtSwitcher)
 	then
-		GLOBAL_SWITCH_HOG_IS_ON=false
+		CS.SWITCH_HOG_IS_ON=false
 	end
 end
 
---[[
-	sources (populations & area):
-	Own calculations from wikipedia.
-	Some are approximations.
-]]
-