local MUTANT_VERSION = "v0.9.5"
--[[ ___ ___
( ) ( )
___ .-. .-. ___ ___ | |_ .---. ___ .-. | |_
( ) ' ( )( ( __) / .-, ( ) ( __)
| .-. .-. | | | | | | (__) ; || .-. .| |
| | | | | | | | | | | ___ .'` || | | || | ___
| | | | | | | | | | |( / .'| || | | || |( )
| | | | | | | | | | | | | / | || | | || | | |
| | | | | | | ; ' | ' | ; | ; || | | || ' | |
| | | | | ' `-' / ' `-' ' `-' || | | |' `-' ;
(___)(___)(___'.__.' `.__.`.__.'_(___)(___)`.__.
---- Recommended settings:
---- * one hedgehog per team
---- * 'Small' one-island map
--]]
HedgewarsScriptLoad("/Scripts/Locale.lua")
HedgewarsScriptLoad("/Scripts/Tracker.lua")
--[[
MUTANT SCRIPT
To Do: -Clean-up this fucking piece of code
-Debug
-Find a girlfriend
-Fix Sheepluva's hat +[p]
-Cookies
-----------------------]]
local hhs = {}
local numhhs = 0
local meh = false
local gameOver=false
local mutant = nil
local mutant_base_health = 200
local mutant_base_disease = 25
local disease_timer = 2000
local kill_reward = nil
local mt_hurt=false
local killsCounter = 0
local team_fire_punishment = 3
local mutant_kill_reward = 2
local hh_weapons = { amBazooka, amGrenade, amShotgun, amMine}
local mt_weapons = {amWatermelon, amHellishBomb, amBallgun, amRCPlane, amTeleport}
local disease=0
local timer=0
local winScore = 15
local hogsLimit = 1
local teams = {}
local circles = {}
local circleFrame = -1
function showStartingInfo()
ruleSet = loc("RULES") .. ": " ..
" |" .. --" |" ..
loc("The first player to kill someone becomes the Mutant.") .. "|" ..
loc("The Mutant has super-weapons and a lot of health.") .. "|" ..
loc("The Mutant loses health quickly if he doesn't keep scoring kills.") .. "|" ..
" |" ..
loc("Normal players can only score points by killing the mutant.") .. "|" ..
" |" .. "" ..
loc("The player with least points (or most deaths) becomes the Bottom Feeder.") .. "|" ..
loc("The Bottom Feeder can score points by killing anyone.") .. "|" ..
" |" ..
loc("POINTS") .. ": " ..
" |" ..
loc("+2 for becoming a Mutant") .. "|" ..
loc("+1 to a Mutant for killing anyone") .. "|" ..
loc("+1 to a Bottom Feeder for killing anyone") .. "|" ..
loc("-1 to anyone for a suicide") .. "|" ..
loc("Other kills don't give you points.")
ShowMission(loc("Mutant"),
loc("a Hedgewars tag game"),
ruleSet, 0, 5000)
end
function onGameInit()
TurnTime = 20000
WaterRise = 0
GameFlags = GameFlags + gfResetWeps + gfPerHogAmmo
HealthCaseProb=0
HealthCaseAmount=0
MinesTime=1000
CaseFreq = 2
end
function limitHogs(gear)
cnthhs = cnthhs + 1
if cnthhs > 1 then
hogLimitHit = true
SetEffect(gear, heResurrectable, false)
--SetHealth(gear, 0)
SetGearPosition(gear, -100,LAND_HEIGHT)
end
end
function onGameStart()
trackTeams()
teamScan()
runOnHogs(saveStuff)
--local str = "/say " .. MUTANT_VERSION
--ParseCommand(str)
hogLimitHit = false
for i=0 , TeamsCount - 1 do
cnthhs = 0
runOnHogsInTeam(limitHogs, teams[i])
end
if hogLimitHit then
AddCaption(loc("ONE HOG PER TEAM! KILLING EXCESS HEDGES"))
end
showStartingInfo()
end
function giveWeapons(gear)
if gear == mutant then
AddAmmo(gear, amRope)
for i=1, #mt_weapons do
AddAmmo(gear, mt_weapons[i])
end
else
for i=1, #hh_weapons do
AddAmmo(gear,hh_weapons[i])
end
end
end
function onAmmoStoreInit()
SetAmmo(amSkip, 9, 0, 0, 0)
SetAmmo(amRope,0,1,0,5)
SetAmmo(amSnowball,0,1,0,1)
for i=1, #hh_weapons do
SetAmmo(hh_weapons[i], 0, 0, 0, 1)
end
for i=1, #mt_weapons do
SetAmmo(mt_weapons[i], 0, 3, 0, 1)
end
end
function drawCircles()
for i = 0, #hhs do
if circles[hhs[i]] ~= nil then
DeleteVisualGear(circles[hhs[i]])
circles[hhs[i]] = nil
end
if hhs[i] ~= CurrentHedgehog then
if mutant == nil then
circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 5, 0xff000080)
elseif CurrentHedgehog == mutant then
circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 3, 0xaa000070)
elseif getGearValue(CurrentHedgehog, "Feeder") and hhs[i] ~= mutant then
circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 3, 0xaa000070)
elseif hhs[i] == mutant then
circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 5, 0xff000080)
end
end
end
circleFrame = 0
end
function onNewTurn()
trackTeams()
killsCounter = 0
if mutant == nil then
AddCaption( loc("FIRST BLOOD MUTATES") )
end
checkScore()
giveWeapons(CurrentHedgehog)
drawCircles()
setAIHints()
kill_reward= numhhs*10
if CurrentHedgehog == mutant then
mt_hurt=true
disease= mutant_base_disease - numhhs
else
mt_hurt=false
end
setGearValue(CurrentHedgehog, "Alive", true)
end
function countBodies()
if killsCounter == 2 then
AddCaption(loc("DOUBLE KILL"))
elseif killsCounter == 3 then
AddCaption(loc("MEGA KILL"))
PlaySound(sndRegret)
elseif killsCounter == 4 then
AddCaption(loc("ULTRA KILL"))
elseif killsCounter == 5 then
AddCaption(loc("MONSTER KILL"))
PlaySound(sndIllGetYou)
elseif killsCounter == 6 then
AddCaption(loc("LUDICROUS KILL"))
PlaySound(sndNutter)
elseif killsCounter == 7 then
AddCaption(loc("HOLY SHYTE!"))
PlaySound(sndLaugh)
elseif killsCounter > 8 then
AddCaption(loc("INSANITY"))
end
end
function onGameTick()
if circleFrame > -1 then
for i = 0, #hhs do
if circles[hhs[i]] ~= nil and hhs[i]~= nil then
hhx, hhy = GetGearPosition(hhs[i])
X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint = GetVisualGearValues(circles[hhs[i]])
SetVisualGearValues(circles[hhs[i]], hhx + 1, hhy - 3, 0, 0, 0, 0, 0, 40 - (circleFrame % 25), Timer, Tint)
end
end
circleFrame = circleFrame + 0.06
if circleFrame >= 25 then
for i = 0, #hhs do
if circles[hhs[i]] ~= nil then
DeleteVisualGear(circles[hhs[i]])
circles[hhs[i]] = nil
end
end
end
end
if TurnTimeLeft==0 and mt_hurt then
mt_hurt = false
end
if mt_hurt and mutant~=nil then
timer = timer + 1
if timer > disease_timer then
timer = 0
SetHealth(mutant, GetHealth(mutant)-disease )
AddVisualGear(GetX(mutant), GetY(mutant)-5, vgtHealthTag, disease, true)
if GetHealth(mutant)<=0 then
SetHealth(mutant,0)
mt_hurt= false
setGearValue(mutant,"SelfDestruct",true)
TurnTimeLeft = 0
end
end
end
end
function saveStuff(gear)
setGearValue(gear,"Name",GetHogName(gear))
setGearValue(gear,"Hat",GetHogHat(gear))
end
function armageddon(gear)
SetState(gear, gstLoser)
SetEffect(gear, heResurrectable, false)
SetHealth(gear, 0)
end
function updateScore()
local showScore = ""
for i=0, TeamsCount-1 do
if teams[i]~= nil then
local curr_score = getTeamValue(teams[i], "Score")
showScore = showScore .. teams[i] .. ": " .. curr_score .. " (deaths: " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|"
end
end
ShowMission(loc("Score"),
"-------",
showScore, 0, 200)
HideMission()
end
function checkScore()
local showScore = ""
local lowest_score_team = nil
local min_score=nil
local winTeam = nil
local only_low_score = true
for i=0, TeamsCount-1 do
if teams[i]~=nil then
local curr_score = getTeamValue(teams[i], "Score")
runOnHogsInTeam(removeFeeder, teams[i])
showScore = showScore .. teams[i] ..": " .. curr_score .. " (deaths: " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|"
if curr_score >= winScore then
gameOver = true
winTeam = teams[i]
end
if min_score==nil then
min_score= curr_score
lowest_score_team = teams[i]
else
if curr_score <= min_score then
if curr_score == min_score then
if getTeamValue(teams[i], "DeadHogs") == getTeamValue(lowest_score_team, "DeadHogs") then
only_low_score = false
else
if getTeamValue(teams[i], "DeadHogs") > getTeamValue(lowest_score_team, "DeadHogs") then
lowest_score_team = teams[i]
end
only_low_score = true
end
else
min_score= curr_score
lowest_score_team = teams[i]
only_low_score = true
end
end
end
end
end
if gameOver then
TurnTimeLeft = 0
for i=0, #teams do
if teams[i]~=winTeam then
runOnHogsInTeam(armageddon, teams[i])
end
end
ShowMission( loc("WINNER IS ") .. winTeam,
"~~~~~~~~~~~~~~~~~~~~~~~~~",
showScore, 0, 200)
else
if only_low_score then
runOnHogsInTeam(setFeeder, lowest_score_team)
end
if meh == false then
meh = true
else
ShowMission( loc("Score"),
loc("-------"),
showScore, 0, 200)
end
end
end
function backToNormal(gear)
SetHogName(gear, getGearValue(gear,"Name"))
SetHogHat(gear, 'NoHat')
SetHogHat(gear, getGearValue(gear,"Hat"))
setGearValue(mutant,"SelfDestruct",false)
mt_hurt=false
mutant=nil
end
function setAIHints()
for i = 0, #hhs do
if mutant == nil or hhs[i] == mutant or CurrentHedgehog == mutant then
SetGearAIHints(hhs[i], aihUsual)
else
SetGearAIHints(hhs[i], aihDoesntMatter)
end
end
end
function removeFeeder(gear)
if gear~=nil then
setGearValue(gear,"Feeder",false)
if gear~= mutant then
SetHogName(gear, getGearValue(gear,"Name") )
SetHogHat(gear, 'NoHat')
SetHogHat(gear, getGearValue(gear,"Hat"))
end
end
end
function setFeeder(gear)
if gear~= mutant and gear~= nil then
SetHogName(gear,"BOTTOM FEEDER")
SetHogHat(gear, 'poke_slowpoke')
setGearValue(gear,"Feeder", true)
end
end
function setMutantStuff(gear)
mutant = gear
SetHogName(gear,"MUTANT")
SetHogHat(gear,'WhySoSerious')
SetHealth(gear, ( mutant_base_health + numhhs*25) )
SetEffect(gear, hePoisoned, 1)
setGearValue(mutant,"SelfDestruct",false)
setGearValue(gear, "Feeder", false)
AddCaption(getGearValue(gear, "Name") .. loc(" HAS MUTATED"))
TurnTimeLeft=0
AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
PlaySound(sndSuddenDeath)
end
function teamScan()
for i=0, TeamsCount-1 do --nil filling
teams[i]=nil
end
for i=0, #hhs do
for j=0, TeamsCount-1 do
if teams[j] ==nil and hhs[i]~=nil then
teams[j] = GetHogTeamName(hhs[i])
setTeamValue(teams[j],"Score",0)
setTeamValue(teams[j], "DeadHogs",0)
break
end
if teams[j] == GetHogTeamName(hhs[i]) then
break
end
end
end
---***---
end
function set_Mutant_and_Score(gear)
local curr_team = GetHogTeamName(CurrentHedgehog)
if gear == CurrentHedgehog then
if CurrentHedgehog == mutant then
PlaySound(sndHomerun)
if getGearValue(gear, "SelfDestruct")==false then
decreaseTeamValue(curr_team,"Score")
end
backToNormal(gear)
else
decreaseTeamValue(curr_team,"Score")
end
else
if gear == mutant then
backToNormal(mutant)
if curr_team ~=GetHogTeamName(gear) then
if getGearValue(CurrentHedgehog, "Alive") then
setMutantStuff(CurrentHedgehog)
setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") + mutant_kill_reward))
end
else
setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment))
end
else
if mutant==nil then
if curr_team ~=GetHogTeamName(gear) then
if getGearValue(CurrentHedgehog, "Alive") then
setMutantStuff(CurrentHedgehog)
setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") + mutant_kill_reward))
else
increaseTeamValue(curr_team,"Score")
end
else
setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment))
end
else
if curr_team ~=GetHogTeamName(gear) then
if CurrentHedgehog==mutant and getGearValue(mutant,"SelfDestruct")==false then
SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+kill_reward)
AddCaption("+" .. kill_reward .. loc(" HP") )
increaseTeamValue(curr_team,"Score")
end
if getGearValue(CurrentHedgehog,"Feeder") then
increaseTeamValue(curr_team,"Score")
end
else
setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment))
end
end
end
end
end
function onGearResurrect(gear)
if not gameOver then
if GetGearType(gear) == gtHedgehog then
increaseTeamValue(GetHogTeamName(gear), "DeadHogs")
if gear==CurrentHedgehog then
setGearValue(CurrentHedgehog, "Alive", false)
end
set_Mutant_and_Score(gear)
if gear~=CurrentHedgehog then
killsCounter = killsCounter + 1
countBodies()
end
AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
PlaySound(sndWhack)
updateScore()
end
end
end
function onGearAdd(gear)
-- Catch hedgehogs for the tracker
if GetGearType(gear) == gtHedgehog then
trackGear(gear)
hhs[numhhs] = gear
numhhs = numhhs + 1
SetEffect(gear, heResurrectable, 1)
end
end
function checkEmptyTeam (teamName)
for i=0 , #hhs do
if hhs[i]~=nil then
if teamName == GetHogTeamName(hhs[i]) then
return false
end
end
end
return true
end
function onGearDelete(gear)
-- Remove hogs that are gone
if GetGearType(gear) == gtHedgehog then
numhhs = numhhs - 1
local found
for i=0, #hhs do
if hhs[i] == gear then
found = i
break
end
end
for i = found, #hhs - 1 do
hhs[i] = hhs[i + 1]
end
hhs[#hhs] = nil
local t_name = GetHogTeamName(gear)
if checkEmptyTeam(t_name) then
for i = 0, TeamsCount - 1 do
if teams[i] == t_name then
found = i
break
end
end
for i = found, TeamsCount - 2 do
teams[i] = teams[i + 1]
end
teams[TeamsCount - 1] = nil
TeamsCount = TeamsCount - 1
end
AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
trackDeletion(gear)
end
end
--[[
S T A R R I N G
prof - Coding, implementing and evangelism
vos - Initial idea and script improvements
mikade - Moving the `how to play` into the game so that people know `how to play`, and whitespace :D
--]]