share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua
author nemo
Wed, 28 Oct 2015 10:01:31 -0400
changeset 11255 66796cd627d8
parent 10965 fb2b006ba476
child 11520 4dd77731453b
permissions -rw-r--r--
few more missing nil checks in crate spawn

--[[
	version 1.3n

	The expat (MIT) license

	Copyright (C) 2012 Vatten

	Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

	The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]

HedgewarsScriptLoad("/Scripts/Locale.lua")
HedgewarsScriptLoad("/Scripts/Utils.lua")
HedgewarsScriptLoad("/Scripts/Tracker.lua")

--approximative version of square root. This function follows the babylonian method.
function IntegerSqrt(num)
	local temp=num
	while(temp*temp-div(temp,2)>num)
	do
		temp=div((temp+div(num,temp)),2)
	end

	return math.abs(temp)
end

-- sqrt(x^2,y^2), work without desyncs. is approximative
function Norm(xx,yy)
	--to fix overflows
	if(((math.abs(xx)^2)+(math.abs(yy)^2))>2^26)
	then
		local bitr=2^13
		return IntegerSqrt((div(math.abs(xx),bitr)^2)+(div(math.abs(yy),bitr)^2))*bitr
	else
		return IntegerSqrt((math.abs(xx)^2)+(math.abs(yy)^2))
	end
end

-- returns 1 or -1 depending on where it is
function GetIfNegative(num)
	if(num<0)
	then
		return -1
	else
		return 1
	end
end

--Will end the turn + give escape time
function EndTurn()
	SetState(CurrentHedgehog,bor(GetState(CurrentHedgehog),gstAttacked))
	--3 sec espace time
	TurnTimeLeft = GetAwayTime*10*3
 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)))
end

--will use IntegerSqrt
function FireGear(hedgehog,geartype,vx,vy,timer)
	local hypo=Norm(vx,vy)
	return AddGear(div((GetGearRadius(hedgehog)*2*vx),hypo)+GetX(hedgehog), div((GetGearRadius(hedgehog)*2*vy),hypo)+GetY(hedgehog), geartype, 0, vx, vy, timer)
end

--This function will set the gravity on a scale from 0->100, where 50 is the standard one.
 function SetGravityFromScale(grav)
	if(grav>100)
	then
		grav=100
	elseif(grav<0)
	then
		grav=0
	end

	if(grav>50)
	then
		SetGravity(100+((grav-50)*12))
	else
		SetGravity(25+grav+div(grav,2))
	end
 end

--====MISC GLOBALS====

--for selecting continent
local GLOBAL_INIT_TEAMS = {}
local GLOBAL_SELECT_CONTINENT_CHECK=false
local GLOBAL_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

--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

--the visual circle for kerguelen
local GLOBAL_VISUAL_CIRCLE=nil

--the global temp value
local GLOBAL_TEMP_VALUE=0

--for sabotage
local GLOBAL_SABOTAGE_COUNTER=0
local GLOBAL_SABOTAGE_HOGS={}
local GLOBAL_SABOTAGE_FREQUENCY=0
local GLOBAL_SABOTAGE_GRAVITY_SWITCH=true

--for sundaland
local GLOBAL_SUNDALAND_END_HOG=0

--====GENERAL GLOBALS (useful for handling continents)====

local GLOBAL_GENERAL_INFORMATION="- "..loc("Per team weapons").."|- 10 "..loc("weaponschemes").."|- "..loc("Unique new weapons").."| |"..loc("Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu.").."|"..loc("Note: Some weapons have a second option (See continent information). Find and use them with the \"")..loc("switch").."\" "..loc("key.").."|"..loc("Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials.")

local GLOBAL_SHOW_SMALL_INFO=0

local GLOBAL_WEAPON_TEXTS = {
loc("Green lipstick bullet: [Poisonous, deals no damage]"),
loc("Cluck-cluck time: [Fire an egg ~ Sabotages and cures poison ~ Cannot be fired close to another hog]"),
loc("Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"),
loc("Dust storm: [Deals 15 damage to all enemies in the circle]"),
loc("Cricket time: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"),
loc("Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"),
loc("Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"),
loc("Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"),
nil,
loc("Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"),
loc("Hedgehog projectile: [Fire your hog like a Sticky Bomb]"),
loc("Napalm rocket: [Fire a bomb with napalm!]"),
loc("Eagle Eye: [Blink to the impact ~ One shot]"),
loc("Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"),
loc("Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]")
}

local GLOBAL_CONTINENT_INFORMATION =
{
{loc("North America"),"["..loc("Difficulty: ")..loc("EASY").."] "..loc("Area")..": 24,709,000 km2, "..loc("Population")..": 529,000,000",loc("- You can switch between hogs at the start of your turns. (Not first one)").."|"..loc("Special Weapons:").."|"..loc("Shotgun")..": "..GLOBAL_WEAPON_TEXTS[13].."|"..loc("Sniper Rifle")..": "..GLOBAL_WEAPON_TEXTS[1],amSniperRifle,
{{amShotgun,100},{amDEagle,100},{amLaserSight,2},{amSniperRifle,100},{amCake,1},{amAirAttack,2},{amSwitch,2}}},

{loc("South America"),"["..loc("Difficulty: ")..loc("MEDIUM").."] "..loc("Area")..": 17,840,000 km2, "..loc("Population")..": 387,000,000",loc("Special Weapons:").."|"..loc("GasBomb")..": "..GLOBAL_WEAPON_TEXTS[3],amGasBomb,
{{amBirdy,100},{amHellishBomb,1},{amBee,100},{amGasBomb,100},{amFlamethrower,100},{amNapalm,1},{amExtraDamage,2}}},

{loc("Europe"),"["..loc("Difficulty: ")..loc("EASY").."] "..loc("Area")..": 10,180,000 km2, "..loc("Population")..": 740,000,000",loc("Special Weapons:").."|"..loc("Molotov")..": "..GLOBAL_WEAPON_TEXTS[14],amBazooka,
{{amBazooka,100},{amGrenade,100},{amMortar,100},{amMolotov,100},{amVampiric,3},{amPiano,1},{amResurrector,2},{amJetpack,4}}},

{loc("Africa"),"["..loc("Difficulty: ")..loc("MEDIUM").."] "..loc("Area")..": 30,222,000 km2, "..loc("Population")..": 1,033,000,000",loc("Special Weapons:").."|"..loc("Seduction")..": "..GLOBAL_WEAPON_TEXTS[4].."|"..loc("Sticky Mine")..": "..GLOBAL_WEAPON_TEXTS[11].."|"..loc("Sticky Mine")..": "..GLOBAL_WEAPON_TEXTS[12],amSMine,
{{amSMine,100},{amWatermelon,1},{amDrillStrike,1},{amDrill,100},{amInvulnerable,5},{amSeduction,100},{amLandGun,2}}},

{loc("Asia"),"["..loc("Difficulty: ")..loc("MEDIUM").."] "..loc("Area")..": 44,579,000 km2, "..loc("Population")..": 3,880,000,000",loc("- Will give you a parachute every second turn.").."|"..loc("Special Weapons:").."|"..loc("Parachute")..": "..GLOBAL_WEAPON_TEXTS[6],amRope,
{{amRope,100},{amFirePunch,100},{amParachute,2},{amKnife,2},{amDynamite,1}}},

{loc("Australia"),"["..loc("Difficulty: ")..loc("EASY").."] "..loc("Area")..": 8,468,000 km2, "..loc("Population")..": 31,000,000",loc("Special Weapons:").."|"..loc("Baseballbat")..": "..GLOBAL_WEAPON_TEXTS[5].."|"..loc("Baseballbat")..": "..GLOBAL_WEAPON_TEXTS[2],amBaseballBat,
{{amBaseballBat,100},{amMine,100},{amLowGravity,4},{amBlowTorch,100},{amRCPlane,2},{amTeleport,2},{amRubber,2}}},

{loc("Antarctica"),"["..loc("Difficulty: ")..loc("HARD").."] "..loc("Area")..": 14,000,000 km2, "..loc("Population")..": ~1,000",loc("Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."),amIceGun,
{{amSnowball,2},{amIceGun,2},{amPickHammer,100},{amSineGun,5},{amGirder,2},{amExtraTime,1},{amPortalGun,2}}},

{loc("Kerguelen"),"["..loc("Difficulty: ")..loc("EASY").."] "..loc("Area")..": 1,100,000 km2, "..loc("Population")..": ~100",loc("Special Weapons:").."|"..loc("Hammer")..": "..GLOBAL_WEAPON_TEXTS[7].."|"..loc("Hammer")..": "..GLOBAL_WEAPON_TEXTS[8].." ("..loc("Duration")..": 2)|"..loc("Hammer")..": "..GLOBAL_WEAPON_TEXTS[10].."|"..loc("Hammer")..": "..GLOBAL_WEAPON_TEXTS[15],amHammer,
{{amHammer,100},{amMineStrike,1},{amBallgun,1}}},

{loc("Zealandia"),"["..loc("Difficulty: ")..loc("MEDIUM").."] "..loc("Area")..": 3,500,000 km2, "..loc("Population")..": 5,000,000",loc("- Will Get 1-3 random weapons") .. "|" .. loc("- Massive weapon bonus on first turn"),amInvulnerable,
{{amBazooka,1},{amGrenade,1},{amBlowTorch,1},{amSwitch,100},{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}}},

{loc("Sundaland"),"["..loc("Difficulty: ")..loc("HARD").."] "..loc("Area")..": 1,850,000 km2, "..loc("Population")..": 290,000,000",loc("- You will recieve 2-4 weapons on each kill! (Even on own hogs)"),amTardis,
{{amClusterBomb,4},{amTardis,4},{amWhip,100},{amKamikaze,4}}}

}

local GLOBAL_CONTINENT_SOUNDS=
{
	{sndShotgunFire,sndCover},
	{sndEggBreak,sndLaugh},
	{sndExplosion,sndEnemyDown},
	{sndMelonImpact,sndCoward},
	{sndRopeAttach,sndComeonthen},
	{sndBaseballBat,sndNooo},
	{sndSineGun,sndOops},
	{sndPiano5,sndStupid},
	{sndSplash,sndFirstBlood},
	{sndWarp,sndSameTeam},
	{sndFrozenHogImpact,sndUhOh}
}

--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 = {
	{amKamikaze, 0, 1, 0, 1, 0},
	{amSineGun, 0, 1, 0, 1, 1},
	{amBazooka, 0, 1, 0, 1, 0},
	{amMineStrike, 0, 1, 5, 1, 2},
	{amGrenade, 0, 1, 0, 1, 0},
	{amPiano, 0, 1, 5, 1, 0},
	{amClusterBomb, 0, 1, 0, 1, 0},
	{amBee, 0, 1, 0, 1, 0},
	{amShotgun, 0, 0, 0, 1, 1},
	{amMine, 0, 1, 0, 1, 0},
	{amSniperRifle, 0, 1, 0, 1, 1},
	{amDEagle, 0, 1, 0, 1, 0},
	{amDynamite, 0, 1, 5, 1, 1},
	{amFirePunch, 0, 1, 0, 1, 0},
	{amHellishBomb, 0, 1, 5, 1, 2},
	{amWhip, 0, 1, 0, 1, 0},
	{amNapalm, 0, 1, 5, 1, 2},
	{amPickHammer, 0, 1, 0, 1, 0},
	{amBaseballBat, 0, 1, 0, 1, 1},
	{amMortar, 0, 1, 0, 1, 0},
	{amCake, 0, 1, 4, 1, 2},
	{amSeduction, 0, 0, 0, 1, 0},
	{amWatermelon, 0, 1, 5, 1, 2},
	{amDrill, 0, 1, 0, 1, 0},
	{amBallgun, 0, 1, 5, 1, 2},
	{amMolotov, 0, 1, 0, 1, 0},
	{amHammer, 0, 1, 0, 1, 2},
	{amBirdy, 0, 1, 0, 1, 0},
	{amBlowTorch, 0, 1, 0, 1, 0},
	{amRCPlane, 0, 1, 5, 1, 2},
	{amGasBomb, 0, 0, 0, 1, 0},
	{amAirAttack, 0, 1, 4, 1, 1},
	{amFlamethrower, 0, 1, 0, 1, 0},
	{amSMine, 0, 1, 0, 1, 1},
	{amDrillStrike, 0, 1, 4, 1, 2},
	{amSnowball, 0, 1, 0, 1, 0}
}
local GLOBAL_WEAPONS_SUPPORT = {
	{amParachute, 0, 1, 0, 1, 0},
	{amGirder, 0, 1, 0, 1, 0},
	{amSwitch, 0, 1, 0, 1, 0},
	{amLowGravity, 0, 1, 0, 1, 0},
	{amExtraDamage, 0, 1, 2, 1, 0},
	{amRope, 0, 1, 0, 1, 1},
	{amInvulnerable, 0, 1, 0, 1, 0},
	{amExtraTime, 0, 1, 0, 1, 0},
	{amLaserSight, 0, 1, 0, 1, 0},
	{amVampiric, 0, 1, 0, 1, 0},
	{amJetpack, 0, 1, 0, 1, 1},
	{amPortalGun, 0, 1, 2, 1, 1},
	{amResurrector, 0, 1, 3, 1, 0},
	{amTeleport, 0, 1, 0, 1, 0},
	{amLandGun, 0, 1, 0, 1, 0},
	{amTardis, 0, 1, 0, 1, 0},
	{amIceGun, 0, 1, 0, 1, 0},
	{amKnife, 0, 1, 0, 1, 0},
	{amRubber, 0, 1, 0, 1, 0}

}

--will check after borders and stuff
function ValidateWeapon(hog,weapon,amount)
	if(MapHasBorder() == false or (MapHasBorder() == true and weapon ~= amAirAttack and weapon ~= amMineStrike and weapon ~= amNapalm and weapon ~= amDrillStrike and weapon ~= amPiano))
	then
		if(amount==1)
		then
			AddAmmo(hog, weapon)
		else
			AddAmmo(hog, weapon,amount)
		end
	end
end

--removes one weapon
function RemoveWeapon(hog,weapon)

	if(GetAmmoCount(hog, weapon)<100)
	then
		AddAmmo(hog,weapon,GetAmmoCount(hog, weapon)-1)
	end
end

--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
	end

	AddAmmo(hog,amSkip,100)
end

--get the weapons from a weaponset
function LoadWeaponset(hog, num)
	for v,w in pairs(GLOBAL_CONTINENT_INFORMATION[num][5])
	do
		ValidateWeapon(hog, w[1],w[2])
	end
end

--list up all weapons from the icons for each continent
function InitWeaponsMenu(hog)

	if(GetHogLevel(hog)==0)
	then
		for v,w in pairs(GLOBAL_CONTINENT_INFORMATION)
		do
			ValidateWeapon(hog, GLOBAL_CONTINENT_INFORMATION[v][4],1)
		end
		AddAmmo(hog,amSwitch) --random continent

	--for the computers
	else
		--europe
		ValidateWeapon(hog, GLOBAL_CONTINENT_INFORMATION[3][4],1)
		--north america
		ValidateWeapon(hog, GLOBAL_CONTINENT_INFORMATION[1][4],1)
	end
end

--shows the continent info
function ShowContinentInfo(continent,time,generalinf)
	local geninftext=""
	local ns=false
	if(time==-1)
	then
		time=0
		ns=true
	end
	if(generalinf)
	then
		geninftext="| |"..loc("General information")..": |"..GLOBAL_GENERAL_INFORMATION
	end

	GLOBAL_SHOW_SMALL_INFO=div(time,40)

	ShowMission(GLOBAL_CONTINENT_INFORMATION[continent][1],GLOBAL_CONTINENT_INFORMATION[continent][2],GLOBAL_CONTINENT_INFORMATION[continent][3]..geninftext, -GLOBAL_CONTINENT_INFORMATION[continent][4], time)
	if(ns)
	then
		HideMission()
	end
end

--will show a circle of gears (eye candy)
function VisualExplosion(range,xpos,ypos,gear1,gear2)
	local degr=0
	local lap=30
	while(lap<range)
	do
		while(degr < 6.2831)
		do
			AddVisualGear(xpos+math.cos(degr+0.1)*(lap+5), ypos+math.sin(degr+0.1)*(lap+5), gear1, 0, false)
			if(gear2~=false)
			then
				AddVisualGear(xpos+math.cos(degr)*lap, ypos+math.sin(degr)*lap, gear2, 0, false)
			end
			degr=degr+((3.1415*3)*0.125) --1/8 = 0.125
		end
		lap=lap+30
		degr=degr-6.2831
	end
end

--zealandia (generates weapons from the weaponinfo above
function ZealandiaGetWeapons(hog)
	if(GetGearType(hog) == gtHedgehog and GLOBAL_TEAM_CONTINENT[GetHogTeamName(hog)]==9 and getTeamValue(GetHogTeamName(hog), "rand-done-turn")==nil)
	then
		CleanWeapons(hog)

		local random_weapon = 0
		local old_rand_weap = 0
		local rand_weaponset_power = 0

		local numberofweaponssupp=table.maxn(GLOBAL_WEAPONS_SUPPORT)
		local numberofweaponsdmg=table.maxn(GLOBAL_WEAPONS_DAMAGE)

		local rand1=math.abs(GetRandom(numberofweaponssupp)+1)
		local rand2=math.abs(GetRandom(numberofweaponsdmg)+1)

		random_weapon = math.abs(GetRandom(table.maxn(GLOBAL_WEAPONS_DAMAGE))+1)

		while(GLOBAL_WEAPONS_DAMAGE[random_weapon][4]>TotalRounds or (MapHasBorder() == true and (GLOBAL_WEAPONS_DAMAGE[random_weapon][1]== amAirAttack or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amMineStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amNapalm or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amDrillStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amPiano)))
		do
			if(random_weapon>=numberofweaponsdmg)
			then
				random_weapon=0
			end
			random_weapon = random_weapon+1
		end
		ValidateWeapon(hog, GLOBAL_WEAPONS_DAMAGE[random_weapon][1],1)
		rand_weaponset_power=GLOBAL_WEAPONS_DAMAGE[random_weapon][6]
		old_rand_weap = random_weapon

		if(rand_weaponset_power <2)
		then
			random_weapon = rand1
			while(GLOBAL_WEAPONS_SUPPORT[random_weapon][4]>TotalRounds or rand_weaponset_power+GLOBAL_WEAPONS_SUPPORT[random_weapon][6]>2)
			do
				if(random_weapon>=numberofweaponssupp)
				then
					random_weapon=0
				end
				random_weapon = random_weapon+1
			end
			ValidateWeapon(hog, GLOBAL_WEAPONS_SUPPORT[random_weapon][1],1)
			rand_weaponset_power=rand_weaponset_power+GLOBAL_WEAPONS_SUPPORT[random_weapon][6]
		end
		--check again if  the power is enough
		if(rand_weaponset_power <1)
		then
			random_weapon = rand2
			while(GLOBAL_WEAPONS_DAMAGE[random_weapon][4]>TotalRounds or old_rand_weap == random_weapon or GLOBAL_WEAPONS_DAMAGE[random_weapon][6]>0 or (MapHasBorder() == true and (GLOBAL_WEAPONS_DAMAGE[random_weapon][1]== amAirAttack or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amMineStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amNapalm or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amDrillStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amPiano)))
			do
				if(random_weapon>=numberofweaponsdmg)
				then
					random_weapon=0
				end
				random_weapon = random_weapon+1
			end
			ValidateWeapon(hog, GLOBAL_WEAPONS_DAMAGE[random_weapon][1],1)
		end

		setTeamValue(GetHogTeamName(hog), "rand-done-turn", true)
	end
end

--sundaland add weps
function SundalandGetWeapons(hog)

		local random_weapon = 0
		local old_rand_weap = 0
		local rand_weaponset_power = 0

		local firstTurn=0

		local numberofweaponssupp=table.maxn(GLOBAL_WEAPONS_SUPPORT)
		local numberofweaponsdmg=table.maxn(GLOBAL_WEAPONS_DAMAGE)

		local rand1=GetRandom(numberofweaponssupp)+1
		local rand2=GetRandom(numberofweaponsdmg)+1
		local rand3=GetRandom(numberofweaponsdmg)+1

		random_weapon = GetRandom(numberofweaponsdmg)+1

		if(TotalRounds<0)
		then
			firstTurn=-TotalRounds
		end

		while(GLOBAL_WEAPONS_DAMAGE[random_weapon][4]>(TotalRounds+firstTurn) or (MapHasBorder() == true and (GLOBAL_WEAPONS_DAMAGE[random_weapon][1]== amAirAttack or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amMineStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amNapalm or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amDrillStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amPiano)))
		do
			if(random_weapon>=numberofweaponsdmg)
			then
				random_weapon=0
			end
			random_weapon = random_weapon+1
		end
		ValidateWeapon(hog, GLOBAL_WEAPONS_DAMAGE[random_weapon][1],1)
		rand_weaponset_power=GLOBAL_WEAPONS_DAMAGE[random_weapon][6]
		old_rand_weap = random_weapon

		random_weapon = rand1
		while(GLOBAL_WEAPONS_SUPPORT[random_weapon][4]>(TotalRounds+firstTurn) or rand_weaponset_power+GLOBAL_WEAPONS_SUPPORT[random_weapon][6]>2)
		do
			if(random_weapon>=numberofweaponssupp)
			then
				random_weapon=0
			end
			random_weapon = random_weapon+1
		end
		ValidateWeapon(hog, GLOBAL_WEAPONS_SUPPORT[random_weapon][1],1)
		rand_weaponset_power=rand_weaponset_power+GLOBAL_WEAPONS_SUPPORT[random_weapon][6]

		--check again if  the power is enough
		if(rand_weaponset_power <2)
		then
			random_weapon = rand2
			while(GLOBAL_WEAPONS_DAMAGE[random_weapon][4]>(TotalRounds+firstTurn) or old_rand_weap == random_weapon or GLOBAL_WEAPONS_DAMAGE[random_weapon][6]>0 or (MapHasBorder() == true and (GLOBAL_WEAPONS_DAMAGE[random_weapon][1]== amAirAttack or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amMineStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amNapalm or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amDrillStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amPiano)))
			do
				if(random_weapon>=numberofweaponsdmg)
				then
					random_weapon=0
				end
				random_weapon = random_weapon+1
			end
			ValidateWeapon(hog, GLOBAL_WEAPONS_DAMAGE[random_weapon][1],1)
			rand_weaponset_power=GLOBAL_WEAPONS_DAMAGE[random_weapon][6]
		end

		if(rand_weaponset_power <1)
		then
			random_weapon = rand3
			while(GLOBAL_WEAPONS_DAMAGE[random_weapon][4]>(TotalRounds+firstTurn) or old_rand_weap == random_weapon or GLOBAL_WEAPONS_DAMAGE[random_weapon][6]>0 or (MapHasBorder() == true and (GLOBAL_WEAPONS_DAMAGE[random_weapon][1]== amAirAttack or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amMineStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amNapalm or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amDrillStrike or GLOBAL_WEAPONS_DAMAGE[random_weapon][1] == amPiano)))
			do
				if(random_weapon>=numberofweaponsdmg)
				then
					random_weapon=0
				end
				random_weapon = random_weapon+1
			end
			ValidateWeapon(hog, GLOBAL_WEAPONS_DAMAGE[random_weapon][1],1)
		end

		AddVisualGear(GetX(hog), GetY(hog)-30, vgtEvilTrace,0, false)
		PlaySound(sndReinforce,hog)
end


--this will take that hogs settings for the weapons and add them
function SetContinentWeapons()

	CleanWeapons(CurrentHedgehog)
	LoadWeaponset(CurrentHedgehog,GLOBAL_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)))

	ShowContinentInfo(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)],3000,false)
end

--==========================run throw all hog/gear weapons ==========================
--will check if the mine is nicely placed
function AustraliaSpecialCheckHogs(hog)
	if(GetGearType(hog) == gtHedgehog)
	then
		if(gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, false)==true and hog ~= CurrentHedgehog)
		then
			GLOBAL_TEMP_VALUE=1
		end
	end
end

--african special on sedunction
function AfricaSpecialSeduction(hog)
	if(GetGearType(hog) == gtHedgehog)
	then
		local dmg=div(15*GLOBAL_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)
				SetHealth(hog, GetHealth(hog)-dmg)
			else
				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+div(GetHealth(hog)*GLOBAL_VAMPIRIC_IS_ON,100)
				SetHealth(hog, 0)
			end
			ShowDamageTag(hog,dmg)
		end
	end
end

--kerguelen special on structure
function KerguelenSpecialRed(hog)
	if(GetGearType(hog) == gtHedgehog)
	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)

			if(GetHealth(hog)>dmg)
			then
				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+div(dmg*2,3)+div(dmg*GLOBAL_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)
				SetHealth(hog, 0)
			end
			ShowDamageTag(hog,dmg)
			AddVisualGear(GetX(hog), GetY(hog), vgtExplosion, 0, false)
			AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmokeWhite, 0, false)
		end
	end
end

--will count the hogs, used to get one random hog.
function KerguelenSpecialYellowCountHogs(hog)
	if(GetGearType(hog) == gtHedgehog)
	then
		if(GetHogClan(hog) ~= GetHogClan(CurrentHedgehog) and gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 420, false))
		then
			GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+1
		end
	end
end
--kerguelen special swap hog
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))
		then
			if(GLOBAL_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
			else
				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE-1
			end
		end
	end
end

--kerguelen special will apply sabotage
function KerguelenSpecialGreen(hog)
	if(GetGearType(hog) == gtHedgehog)
	then
		if(CurrentHedgehog~=hog and gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 80, false))
		then
			GLOBAL_TEMP_VALUE=1
			GLOBAL_SABOTAGE_HOGS[hog]=1
			AddGear(GetX(hog), GetY(hog), gtCluster, 0, 0, 0, 1)
			PlaySound(sndNooo,hog)
		end
	end
end

--first part on kerguelen special (lonely cries)
function KerguelenSpecialBlueCheck(hog)
	if(GetGearType(hog) == gtHedgehog and hog ~= CurrentHedgehog and gearIsInCircle(hog,GetX(CurrentHedgehog), GetY(CurrentHedgehog), 550, false))
	then
		GLOBAL_KERGUELEN_SPECIAL=-1
	end
end

--second part on kerguelen special (lonely cries)
function KerguelenSpecialBlueActivate(hog)
	if(GetGearType(hog) == gtHedgehog)
	then
		local dmg=div(6*GLOBAL_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)
				SetHealth(hog, GetHealth(hog)-dmg)
			else
				GLOBAL_TEMP_VALUE=GLOBAL_TEMP_VALUE+div(GetHealth(hog)*GLOBAL_VAMPIRIC_IS_ON,100)
				SetHealth(hog, 0)
			end
			ShowDamageTag(hog,dmg)

			AddVisualGear(GetX(hog), GetY(hog)-30, vgtEvilTrace, 0, false)
		end
	end
end

--australia
function AustraliaSpecialEggHit(hog)
	if(GetGearType(hog) == gtHedgehog)
	then
		if(gearIsInCircle(hog,GetX(GLOBAL_TEMP_VALUE), GetY(GLOBAL_TEMP_VALUE), 18, false))
		then
			GLOBAL_SABOTAGE_HOGS[hog]=1
			PlaySound(sndNooo,hog)
			SetEffect(hog, hePoisoned, false)
		end
	end
end

--south american special (used fire gear)
function SouthAmericaSpecialCheeseExplosion(hog)
	if(GetGearType(hog) == gtHedgehog or GetGearType(hog) == gtMine or GetGearType(hog) == gtExplosives)
	then
		local power_radius_outer=230
		local power_radius_inner=45
		local power_sa=500000
		local hypo=0
		if(gearIsInCircle(hog,GetX(GLOBAL_TEMP_VALUE), GetY(GLOBAL_TEMP_VALUE), power_radius_outer, false) and gearIsInCircle(hog,GetX(GLOBAL_TEMP_VALUE), GetY(GLOBAL_TEMP_VALUE), power_radius_inner, false)==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))
		end
	end
end

--north american special on sniper
function NorthAmericaSpecialSniper(hog)
	if(GetGearType(hog) == gtHedgehog)
	then
		if(gearIsInCircle(GLOBAL_TEMP_VALUE,GetX(hog), GetY(hog), 20, false))
		then
			SetEffect(hog, hePoisoned, 1)
			PlaySound(sndBump)
		end
	end
end

--european special on molotov (used fire gear)
function EuropeSpecialMolotovHit(hog)
	if(GetGearType(hog) == gtHedgehog)
	then
		if(gearIsInCircle(GLOBAL_TEMP_VALUE,GetX(hog), GetY(hog), 100, false))
		then
			SetHealth(hog, GetHealth(hog)+25+(div(25*GLOBAL_VAMPIRIC_IS_ON,100)))
			SetEffect(hog, hePoisoned, false)
			GLOBAL_SABOTAGE_HOGS[hog]=0
		end
	end
end

--for sundaland
function SundalandFindOtherHogInTeam(hog)
	if(GetGearType(hog) == gtHedgehog)
	then
		if(GetHogTeamName(GLOBAL_SUNDALAND_END_HOG)==GetHogTeamName(hog))
		then
			GLOBAL_SUNDALAND_END_HOG=hog
		end
	end
end
--============================================================================

--for custom made continent, follows the same standards as the globalism one. You can make your continent with <Name>~<Information>~<Weapons>. Take the weapons generated from globalism, if you want a GUI :P
--weapons=<ammo><types>, ammo = ascii[116(1 ammo) to 125(inf ammo)] types = ascii[36(Grenade), 37(Clusterbomb) to 90(knife)] see https://code.google.com/p/hedgewars/wiki/AmmoTypes
--ex "Own continent~this continent rocks!~tZ}$" will get 1 knife and inf grenades
function onParameters()

	if(ScriptParam~=nil)
	then
		local continentinfo={}
		local numb=0
		local wepcodes=0
		local where=0

		local x=0
		local i=1

		--default icon
		continentinfo[4]=amLowGravity

		for c in ScriptParam:gmatch"."
		do
			if(where==0)
			then
				if(string.byte(c)==126)
				then
					continentinfo[1]=string.sub(ScriptParam,0,numb)
					wepcodes=numb
					where=1
				end
			elseif(where==1)
			then
				if(string.byte(c)==126)
				then
					continentinfo[2]=string.sub(ScriptParam,wepcodes+2,numb)
					continentinfo[5]={}
					wepcodes=numb
					where=2
				end
			elseif(where==2)
			then
				x=string.byte(c)-35
				if(x>90)
				then
					break
				elseif(x>80)
				then
					if(x-80<10)
					then
						i=x-80
					else
						i=100
					end
				else
					table.insert(continentinfo[5],{x,i})
				end
			end
			numb=numb+1
		end

		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!")

			table.insert(GLOBAL_CONTINENT_INFORMATION, continentinfo)
		end
	end
end

--set each weapons settings
function onAmmoStoreInit()

	SetAmmo(amSkip, 9, 0, 0, 0)

	for v,w in pairs(GLOBAL_WEAPONS_DAMAGE)
	do
		SetAmmo(w[1], w[2], w[3], w[4], w[5])
	end

	for v,w in pairs(GLOBAL_WEAPONS_SUPPORT)
	do
		SetAmmo(w[1], w[2], w[3], w[4], w[5])
	end
end

--on game start
function onGameStart()
	ShowMission(loc("Continental supplies"),loc("Let a continent provide your weapons!"),
	GLOBAL_GENERAL_INFORMATION, -amLowGravity, 0)
end

--what happen when a turn starts
function onNewTurn()

	--will refresh the info on each tab weapon
	GLOBAL_AUSTRALIAN_SPECIAL=0
	GLOBAL_AFRICAN_SPECIAL_SEDUCTION=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_TEMP_VALUE=0

	GLOBAL_SUNDALAND_END_HOG=CurrentHedgehog

	--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)
		then
			AddCaption("["..loc("Select continent!").."]")
			InitWeaponsMenu(CurrentHedgehog)
			GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=0
			GLOBAL_SELECT_CONTINENT_CHECK=true
			GLOBAL_INIT_TEAMS[GetHogTeamName(CurrentHedgehog)] = 2

			if(GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]~=nil and GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]==1)
			then
				GLOBAL_SABOTAGE_COUNTER=-750
			end
		else
			--if its not the initialization turn
			GLOBAL_SELECT_CONTINENT_CHECK=false
			if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
			then
				GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GetRandom(table.maxn(GLOBAL_CONTINENT_INFORMATION))+1
				SetContinentWeapons()
			end
			ShowContinentInfo(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)],-1,true)

			--give zeelandia-teams new weapons so they can plan for the next turn
			runOnGears(ZealandiaGetWeapons)

			--some specials for some continents (GLOBAL_TEMP_VALUE is from get random weapons)
			if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==9)
			then
				setTeamValue(GetHogTeamName(CurrentHedgehog), "rand-done-turn", nil)
			elseif(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==7)
			then
				if(getTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick")==nil)
				then
					setTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick", 1)
				end

				if(getTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick")>=4)
				then
					AddAmmo(CurrentHedgehog,amPortalGun)
					AddAmmo(CurrentHedgehog,amPortalGun)
					AddAmmo(CurrentHedgehog,amSineGun)
					AddAmmo(CurrentHedgehog,amSineGun)
					AddAmmo(CurrentHedgehog,amGirder)
					AddAmmo(CurrentHedgehog,amSnowball)
					setTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick", 0)
				end
				setTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick", getTeamValue(GetHogTeamName(CurrentHedgehog), "Antarctica2-turntick")+1)

			elseif(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==5)
			then
				if(getTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick")==nil)
				then
					setTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick", 1)
				end

				if(getTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick")>=2)
				then
					AddAmmo(CurrentHedgehog,amParachute)
					setTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick", 0)
				end
				setTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick", getTeamValue(GetHogTeamName(CurrentHedgehog), "Asia-turntick")+1)
			elseif(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==1)
			then
				AddAmmo(CurrentHedgehog,amSwitch,GetAmmoCount(CurrentHedgehog, amSwitch)+1)

				ParseCommand("setweap " .. string.char(amSwitch))
				GLOBAL_TEMP_VALUE=87
			end
		end
	end
end

--what happens when you press "tab" (common button)
function onSwitch()

	if(GLOBAL_SWITCH_HOG_IS_ON==false)
	then
		--place mine (australia)
		if(GetCurAmmoType() == amBaseballBat)
		then
			if(GLOBAL_AUSTRALIAN_SPECIAL==0)
			then
				GLOBAL_AUSTRALIAN_SPECIAL = 1
				AddCaption(GLOBAL_WEAPON_TEXTS[5])
			elseif(GLOBAL_AUSTRALIAN_SPECIAL==1)
			then
				GLOBAL_AUSTRALIAN_SPECIAL = 2
				AddCaption(GLOBAL_WEAPON_TEXTS[2])
			else
				GLOBAL_AUSTRALIAN_SPECIAL = 0
				AddCaption(loc("NORMAL"))
			end

		--Asian special
		elseif(GLOBAL_PARACHUTE_IS_ON==1)
		then
			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

		--africa
		elseif(GetCurAmmoType() == amSeduction)
		then
			if(GLOBAL_AFRICAN_SPECIAL_SEDUCTION==0)
			then
				GLOBAL_AFRICAN_SPECIAL_SEDUCTION = 1
				AddCaption(GLOBAL_WEAPON_TEXTS[4])
			else
				GLOBAL_AFRICAN_SPECIAL_SEDUCTION = 0
				AddCaption(loc("NORMAL"))
			end

		--south america
		elseif(GetCurAmmoType() == amGasBomb)
		then
			if(GLOBAL_SOUTH_AMERICAN_SPECIAL==false)
			then
				GLOBAL_SOUTH_AMERICAN_SPECIAL = true
				AddCaption(GLOBAL_WEAPON_TEXTS[3])
			else
				GLOBAL_SOUTH_AMERICAN_SPECIAL = false
				AddCaption(loc("NORMAL"))
			end

		--africa
		elseif(GetCurAmmoType() == amSMine)
		then
			if(GLOBAL_AFRICAN_SPECIAL_STICKY==0)
			then
				GLOBAL_AFRICAN_SPECIAL_STICKY = 1
				AddCaption(GLOBAL_WEAPON_TEXTS[11])
			elseif(GLOBAL_AFRICAN_SPECIAL_STICKY == 1)
			then
				GLOBAL_AFRICAN_SPECIAL_STICKY = 2
				AddCaption(GLOBAL_WEAPON_TEXTS[12])
			elseif(GLOBAL_AFRICAN_SPECIAL_STICKY == 2)
			then
				GLOBAL_AFRICAN_SPECIAL_STICKY = 0
				AddCaption(loc("NORMAL"))
			end

		--north america (sniper)
		elseif(GetCurAmmoType() == amSniperRifle and GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON==false)
		then
			if(GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER==2)
			then
				GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER = 1
				AddCaption(loc("NORMAL"))
			elseif(GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER==1)
			then
				GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER = 2
				AddCaption(GLOBAL_WEAPON_TEXTS[1])
			end

		--north america (shotgun)
		elseif(GetCurAmmoType() == amShotgun and GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN~=nil)
		then
			if(GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN==false)
			then
				GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN = true
				AddCaption(GLOBAL_WEAPON_TEXTS[13])
			else
				GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN = false
				AddCaption(loc("NORMAL"))
			end

		--europe
		elseif(GetCurAmmoType() == amMolotov)
		then
			if(GLOBAL_EUROPE_SPECIAL==0)
			then
				GLOBAL_EUROPE_SPECIAL = 1
				AddCaption(GLOBAL_WEAPON_TEXTS[14])
			else
				GLOBAL_EUROPE_SPECIAL = 0
				AddCaption(loc("NORMAL"))
			end

		--kerguelen
		elseif(GetCurAmmoType() == amHammer)
		then
			if(GLOBAL_KERGUELEN_SPECIAL==6)
			then
				GLOBAL_KERGUELEN_SPECIAL = 1
				AddCaption("Normal")
			elseif(GLOBAL_KERGUELEN_SPECIAL==1)
			then
				GLOBAL_KERGUELEN_SPECIAL = 2
				AddCaption("#"..GLOBAL_WEAPON_TEXTS[7])
			elseif(GLOBAL_KERGUELEN_SPECIAL==2 and TotalRounds>=1)
			then
				GLOBAL_KERGUELEN_SPECIAL = 3
				AddCaption("##"..GLOBAL_WEAPON_TEXTS[8])
			elseif(GLOBAL_KERGUELEN_SPECIAL==3 or (GLOBAL_KERGUELEN_SPECIAL==2 and TotalRounds<1))
			then
				GLOBAL_KERGUELEN_SPECIAL = 5
				AddCaption("###"..GLOBAL_WEAPON_TEXTS[10])
			elseif(GLOBAL_KERGUELEN_SPECIAL==5)
			then
				GLOBAL_KERGUELEN_SPECIAL = 6
				AddCaption("####"..GLOBAL_WEAPON_TEXTS[15])
			end
		--for selecting weaponset, this is mostly for old players.
		elseif(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

			if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]> table.maxn(GLOBAL_CONTINENT_INFORMATION))
			then
				GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=1
			end
			SetContinentWeapons()
		end
	--if switching out from sabotage.
	elseif(GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]~=nil and GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]==2)
	then
		GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=1
	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

		if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]> table.maxn(GLOBAL_CONTINENT_INFORMATION))
		then
			GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=1
		end
		SetContinentWeapons()
	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

		if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]<=0)
		then
			GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=table.maxn(GLOBAL_CONTINENT_INFORMATION)
		end
		SetContinentWeapons()
	end
end

function onGameTick20()
	--if you picked a weaponset from the weaponmenu (icon)
	if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
	then
		if(GetCurAmmoType()==amSwitch)
		then
			GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GetRandom(table.maxn(GLOBAL_CONTINENT_INFORMATION))+1
			SetContinentWeapons()
			PlaySound(sndMineTick)
		else
			for v,w in pairs(GLOBAL_CONTINENT_INFORMATION)
			do
				if(GetCurAmmoType()==GLOBAL_CONTINENT_INFORMATION[v][4])
				then
					GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=v
					SetContinentWeapons()
					PlaySound(GLOBAL_CONTINENT_SOUNDS[v][1])
					PlaySound(GLOBAL_CONTINENT_SOUNDS[v][2],CurrentHedgehog)
				end
			end
		end
	end

	--show the kerguelen ring
	if(GLOBAL_KERGUELEN_SPECIAL > 1 and GetCurAmmoType() == amHammer)
	then
		if(GLOBAL_VISUAL_CIRCLE==nil)
		then
			GLOBAL_VISUAL_CIRCLE=AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtCircle, 0, true)
		end

		if(GLOBAL_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
		then
			SetVisualGearValues(GLOBAL_VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 420, 3, 0xffff00ee)
		elseif(GLOBAL_KERGUELEN_SPECIAL == 5) --cries
		then
			SetVisualGearValues(GLOBAL_VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 550, 1, 0x0000ffee)
		elseif(GLOBAL_KERGUELEN_SPECIAL == 6) --sabotage
		then
			SetVisualGearValues(GLOBAL_VISUAL_CIRCLE, GetX(CurrentHedgehog), GetY(CurrentHedgehog),20, 200, 0, 0, 100, 80, 10, 0x00ff00ee)
		end

	elseif(GLOBAL_VISUAL_CIRCLE~=nil)
	then
		DeleteVisualGear(GLOBAL_VISUAL_CIRCLE)
		GLOBAL_VISUAL_CIRCLE=nil
	end

	--sabotage
	if(GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]~=nil and GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]>=1)
	then
		--for sabotage
		if(GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]==1)
		then
			local RND=GetRandom(2)
			if(RND==0)
			then
				AddCaption(loc("You are sabotaged, RUN!"))
			else
				AddCaption(loc("WARNING: Sabotage detected!"))
			end
			PlaySound(sndHellish)
			GLOBAL_SABOTAGE_COUNTER=-50
			--update the constant at the top also to something in between
			GLOBAL_SABOTAGE_FREQUENCY=(25*(RND))+70
			GLOBAL_SABOTAGE_GRAVITY_SWITCH=true

			GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=2
		end

		if(GLOBAL_SABOTAGE_COUNTER >0)
		then
			if(GLOBAL_SABOTAGE_GRAVITY_SWITCH)
			then
				SetGravityFromScale(div(100*GLOBAL_SABOTAGE_COUNTER,GLOBAL_SABOTAGE_FREQUENCY))
			else
				SetGravityFromScale(100-div(100*GLOBAL_SABOTAGE_COUNTER,GLOBAL_SABOTAGE_FREQUENCY))
			end

			if(GLOBAL_SABOTAGE_COUNTER % 20 == 0)
			then
				AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmokeWhite, 0, false)
			end
		end

		if(TurnTimeLeft<(GetAwayTime*10) or band(GetState(CurrentHedgehog),gstAttacked)==1)
		then
			GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=0
			SetGravity(100)
		elseif(GLOBAL_SABOTAGE_COUNTER >= GLOBAL_SABOTAGE_FREQUENCY)
		then
			if(GLOBAL_SABOTAGE_GRAVITY_SWITCH==true)
			then
				GLOBAL_SABOTAGE_GRAVITY_SWITCH=false
			else
				--AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog)-10, gtCluster, 0, 0, -160000, 30)
				GLOBAL_SABOTAGE_GRAVITY_SWITCH=true
			end

			if(GetHealth(CurrentHedgehog)<=2)
			then
				SetHealth(CurrentHedgehog, 0)
				GLOBAL_SABOTAGE_HOGS[CurrentHedgehog]=0
				SetGravity(100)
			else
				SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)-2)
			end
			ShowDamageTag(CurrentHedgehog,2)

			GLOBAL_SABOTAGE_COUNTER=0
		else
			GLOBAL_SABOTAGE_COUNTER=GLOBAL_SABOTAGE_COUNTER+1
		end
	end

	if(GetCurAmmoType() == amSwitch and GLOBAL_TEMP_VALUE==87)
	then
		SetGearMessage(CurrentHedgehog,gmAttack)
		GLOBAL_TEMP_VALUE=0
	end

	if(GLOBAL_SHOW_SMALL_INFO>0)
	then
		if(GLOBAL_SHOW_SMALL_INFO==1)
		then
			ShowContinentInfo(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)],-1,true)
		end

		GLOBAL_SHOW_SMALL_INFO=GLOBAL_SHOW_SMALL_INFO-1
	end
end

--some ppl complained :P
function onSlot(slot)
	if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
	then
		ParseCommand("setweap " .. string.char(amSkip))
	end
end

--if you used hogswitch or any similar weapon, dont enable any weaponchange
function onAttack()
	GLOBAL_SELECT_CONTINENT_CHECK=false

	--african special
	if(GLOBAL_AFRICAN_SPECIAL_SEDUCTION == 1 and GetCurAmmoType() == amSeduction and band(GetState(CurrentHedgehog),gstAttacked)==0)
	then
		EndTurn()

		GLOBAL_TEMP_VALUE=0
		runOnGears(AfricaSpecialSeduction)
		SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+GLOBAL_TEMP_VALUE)

		--visual stuff
		VisualExplosion(250,GetX(CurrentHedgehog), GetY(CurrentHedgehog),vgtSmoke,vgtSmokeWhite)
		PlaySound(sndParachute)

		RemoveWeapon(CurrentHedgehog,amSeduction)

	--Kerguelen specials
	elseif(GetCurAmmoType() == amHammer and GLOBAL_KERGUELEN_SPECIAL > 1 and band(GetState(CurrentHedgehog),gstAttacked)==0)
	then
		--scream
		if(GLOBAL_KERGUELEN_SPECIAL == 2)
		then
			GLOBAL_TEMP_VALUE=0
			runOnGears(KerguelenSpecialRed)
			SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+GLOBAL_TEMP_VALUE)
			PlaySound(sndHellish)

		--swap
		elseif(GLOBAL_KERGUELEN_SPECIAL == 3 and TotalRounds>=1)
		then
			GLOBAL_TEMP_VALUE=0
			runOnGears(KerguelenSpecialYellowCountHogs)
			if(GLOBAL_TEMP_VALUE>0)
			then
				GLOBAL_TEMP_VALUE=GetRandom(GLOBAL_TEMP_VALUE)
				runOnGears(KerguelenSpecialYellowSwap)
				PlaySound(sndPiano3)
			else
				PlaySound(sndPiano6)
			end

		--cries
		elseif(GLOBAL_KERGUELEN_SPECIAL == 5)
		then
			runOnGears(KerguelenSpecialBlueCheck)
			if(GLOBAL_KERGUELEN_SPECIAL~=-1)
			then
				AddGear(0, 0, gtWaterUp, 0, 0,0,0)
				PlaySound(sndWarp)
				PlaySound(sndMolotov)

				GLOBAL_TEMP_VALUE=0
				runOnGears(KerguelenSpecialBlueActivate)
				SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+GLOBAL_TEMP_VALUE)
			else
				HogSay(CurrentHedgehog, loc("Hogs in sight!"), SAY_SAY)
			end

		--sabotage
		elseif(GLOBAL_KERGUELEN_SPECIAL == 6)
		then
			GLOBAL_TEMP_VALUE=0
			runOnGears(KerguelenSpecialGreen)
			if(GLOBAL_TEMP_VALUE==0)
			then
				PlaySound(sndThrowRelease)
				AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog)-20, gtCluster, 0, 0, -1000000, 32)
			end
		end

		EndTurn()

		DeleteVisualGear(GLOBAL_VISUAL_CIRCLE)
		GLOBAL_VISUAL_CIRCLE=nil
		GLOBAL_KERGUELEN_SPECIAL=0

		RemoveWeapon(CurrentHedgehog,amHammer)

	elseif(GetCurAmmoType() == amVampiric)
	then
		GLOBAL_VAMPIRIC_IS_ON=75
	elseif(GetCurAmmoType() == amExtraDamage)
	then
		GLOBAL_EXTRA_DAMAGE_IS_ON=150
	end
end

function onGearAdd(gearUid)
	GLOBAL_SELECT_CONTINENT_CHECK=false

	--track the gears im using
	if(GetGearType(gearUid) == gtHedgehog or GetGearType(gearUid) == gtMine or GetGearType(gearUid) == gtExplosives)
	then
		trackGear(gearUid)
	end

	--remove gasclouds on gasbombspecial
	if(GetGearType(gearUid)==gtPoisonCloud and GLOBAL_SOUTH_AMERICAN_SPECIAL == true)
	then
		DeleteGear(gearUid)
	--african special
	elseif(GetGearType(gearUid)==gtSMine)
	then
		vx,vy=GetGearVelocity(gearUid)
		if(GLOBAL_AFRICAN_SPECIAL_STICKY == 1)
		then
			SetState(CurrentHedgehog, gstHHDriven+gstMoving)
			SetGearPosition(CurrentHedgehog, GetX(CurrentHedgehog),GetY(CurrentHedgehog)-3)
			SetGearVelocity(CurrentHedgehog, vx, vy)
			DeleteGear(gearUid)

		elseif(GLOBAL_AFRICAN_SPECIAL_STICKY == 2)
		then
			FireGear(CurrentHedgehog,gtNapalmBomb, vx, vy, 0)
			DeleteGear(gearUid)
		end
	--north american special
	elseif(GetGearType(gearUid)==gtSniperRifleShot)
	then
		GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=true
		if(GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER~=1)
		then
			SetHealth(gearUid, 1)
		end
	--north american special
	elseif(GetGearType(gearUid)==gtShotgunShot)
	then
		if(GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN==true)
		then
			AddVisualGear(GetX(gearUid), GetY(gearUid), vgtFeather, 0, false)
			AddVisualGear(GetX(gearUid), GetY(gearUid), vgtFeather, 0, false)
			AddVisualGear(GetX(gearUid), GetY(gearUid), vgtFeather, 0, false)
			PlaySound(sndBirdyLay)
		else
			GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN=nil
		end
	--european special
	elseif(GetGearType(gearUid)==gtMolotov and GLOBAL_EUROPE_SPECIAL==1)
	then
		vx,vy=GetGearVelocity(gearUid)
		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)
	then
		GLOBAL_TEMP_VALUE=0
		runOnGears(AustraliaSpecialCheckHogs)

		if(GLOBAL_TEMP_VALUE==0)
		then
			vx,vy=GetGearVelocity(gearUid)

			if(GLOBAL_AUSTRALIAN_SPECIAL==1)
			then
				local austmine=FireGear(CurrentHedgehog,gtMine, vx, vy, 0)
				SetHealth(austmine, 100)
				SetTimer(austmine, 1000)
			else
				local austmine=FireGear(CurrentHedgehog,gtEgg, vx, vy, 10)
				--SetHealth(austmine, 2000)
				SetTimer(austmine, 6000)
				SetGearMessage(austmine, 3)
			end
		else
			PlaySound(sndDenied)
		end
	elseif(GetGearType(gearUid)==gtParachute)
	then
		GLOBAL_PARACHUTE_IS_ON=1
	elseif(GetGearType(gearUid)==gtSwitcher)
	then
		GLOBAL_SWITCH_HOG_IS_ON=true
	end
end

function onGearDelete(gearUid)

	if(GetGearType(gearUid) == gtHedgehog or GetGearType(gearUid) == gtMine or GetGearType(gearUid) == gtExplosives)
	then
		trackDeletion(gearUid)

		--sundaland special
		if(GetGearType(gearUid) == gtHedgehog and GLOBAL_TEAM_CONTINENT[GetHogTeamName(GLOBAL_SUNDALAND_END_HOG)]==10)
		then
			if(GLOBAL_SUNDALAND_END_HOG==CurrentHedgehog)
			then
				runOnGears(SundalandFindOtherHogInTeam)
			end

			SundalandGetWeapons(GLOBAL_SUNDALAND_END_HOG)
		end
	end

	--north american lipstick
	if(GetGearType(gearUid)==gtSniperRifleShot )
	then
		GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER_IS_ON=false
		if(GLOBAL_NORTH_AMERICAN_SPECIAL_SNIPER==2)
		then
			GLOBAL_TEMP_VALUE=gearUid
			runOnGears(NorthAmericaSpecialSniper)
		end
	--north american eagle eye
	elseif(GetGearType(gearUid)==gtShotgunShot and GLOBAL_NORTH_AMERICAN_SPECIAL_SHOTGUN==true)
	then
		EndTurn()
		SetGearPosition(CurrentHedgehog, GetX(gearUid), GetY(gearUid)+7)
		PlaySound(sndWarp)
	--south american special
	elseif(GetGearType(gearUid)==gtGasBomb and GLOBAL_SOUTH_AMERICAN_SPECIAL == true)
	then
		GLOBAL_TEMP_VALUE=gearUid
		runOnGears(SouthAmericaSpecialCheeseExplosion)
		AddVisualGear(GetX(gearUid), GetY(gearUid), vgtExplosion, 0, false)

	--asian special
	elseif(GetGearType(gearUid)==gtSnowball and GetGearMessage(gearUid)==1)
	then
		AddGear(GetX(gearUid), GetY(gearUid), gtCluster, 0, 0, 0, 22)

	--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)
	--australian special
	elseif(GetGearType(gearUid)==gtEgg and GetGearMessage(gearUid)==3)
	then
		GLOBAL_TEMP_VALUE=gearUid
		runOnGears(AustraliaSpecialEggHit)
		GLOBAL_TEMP_VALUE=0
	--asia (using para)
	elseif(GetGearType(gearUid)==gtParachute)
	then
		GLOBAL_PARACHUTE_IS_ON=false
	elseif(GetGearType(gearUid)==gtSwitcher)
	then
		GLOBAL_SWITCH_HOG_IS_ON=false
	end
end

--[[
	sources (populations & area):
	Own calculations from wikipedia.
	Some are approximations.
]]