# HG changeset patch # User mikade # Date 1369910079 -32400 # Node ID 6d2efdca5da28fdcbf10c3226ab6a184e79ba4c4 # Parent d971f88c71c0adf702f047149abd6799d1ea0ba9 Add how to play description to Mutant Fix issue #277 diff -r d971f88c71c0 -r 6d2efdca5da2 share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Wed May 29 17:47:54 2013 -0400 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Thu May 30 19:34:39 2013 +0900 @@ -1,625 +1,615 @@ -local MUTANT_VERSION = "v0.9.4" - ---[[ ___ ___ - ( ) ( ) -___ .-. .-. ___ ___ | |_ .---. ___ .-. | |_ -( ) ' ( )( ( __) / .-, ( ) ( __) -| .-. .-. | | | | | | (__) ; || .-. .| | -| | | | | | | | | | | ___ .'` || | | || | ___ -| | | | | | | | | | |( / .'| || | | || |( ) -| | | | | | | | | | | | | / | || | | || | | | -| | | | | | | ; ' | ' | ; | ; || | | || ' | | -| | | | | ' `-' / ' `-' ' `-' || | | |' `-' ; -(___)(___)(___'.__.' `.__.`.__.'_(___)(___)`.__. - - ----- IMPORTANT! ----- ----- You should save (press Ctrl+S) this script to: ----- Program Files\Hedgewars\share\hedgewars\Data\Scripts\Multiplayer\Mutant.lua ----- or (on Linux): ----- ~/.hedgewars/Data/Scripts/Multiplayer/Mutant.lua ----- ----- (or wherever scripts like Highlander.lua, Racer.lua are on your system) ----- ----- Also, if you didn't have Mutant script yet, you need to restart Hedgewars for it to find the script file. ----- - - ----- GAME RULES ----- ----- Recommended settings: ----- * one hedgehog per team ----- * 'Small' one-island map ----- ----- First one to kill anyone becomes Mutant. Mutant has super-weapons ----- and a lot of health, which however depletes if he doesn't frag fast. ----- Goal of Mutant is to use his weapons to hold his status for as long ----- as he can. ----- Goal of others is to hunt the Mutant down. The one who kills Mutant, ----- becomes Mutant himself. ----- The player with least points (or most deaths) is Bottom Feeder. He ----- can gain points by killing anyone. Other normal players only get points ----- for killing Mutant. ----- ----- Points: ----- +2 for becoming a Mutant ----- +1 to a Mutant for killing anyone ----- +1 to a Bottom Feeder for killing anyone ----- -1 to anyone for a suicide ----- other kills don't give you points. ----- - ---]] - -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 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 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 -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 - - ShowMission( loc("Score"), - loc("-------"), - showScore, 0, 200) - - 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 onGearDamage(gear, dmg) - -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 ---]] +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 +--]] diff -r d971f88c71c0 -r 6d2efdca5da2 share/hedgewars/Data/Scripts/Multiplayer/Racer.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Wed May 29 17:47:54 2013 -0400 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Thu May 30 19:34:39 2013 +0900 @@ -1,700 +1,706 @@ - ------------------------------------------- --- RACER 0.5 --- map-independant racing script --- by mikade ------------------------------------------ - ------------------------------------ ---0.1: took all the code from crazy racer and scrapped most of it ------------------------------------ - --- Removed tumbler system --- Removed extra adds like boosters etc --- Added experimental waypoint placement system --- More user feedback --- Reduced race complexity limit to 5 waypoints --- stop placement at complexity limit reached and end turn --- guys dont keep racing after dying --- invulnerable feasibility --- reverted time keeping method --- reduced feedback display time --- colour-coded addcaptions --- cleaned up code --- support for more players properly added --- tardis fix --- remove airstrikes - --- i think the remainder 0 .456 sec of the tracktime isnt getting reset on newturn - --- update feedback - -------- --- 0.2 -------- - --- allow gameflags --- extend time to 90s --- remove other air-attack based weps --- turn off water rise for sd - -------- --- 0.3 -------- - --- prevent WP being placed in land --- prevent waypoints being placed outside border - -------- --- 0.4 -------- - --- update user feedback --- add more sounds - -------- --- 0.5 -------- - --- fix ghost disappearing if hog falls in water or somehow dies --- lengthen ghost tracking interval to improve performance on slower machines --- increase waypoint limit to 8 --- allow for persistent showmission information - ------------------------------ --- SCRIPT BEGINS ------------------------------ - -HedgewarsScriptLoad("/Scripts/Locale.lua") - ------------------- --- Got Variables? ------------------- - -local fMod = 1000000 -- 1 -local roundLimit = 3 -local roundNumber = 0 -local firstClan = 10 - -local fastX = {} -local fastY = {} -local fastCount = 0 -local fastIndex = 0 -local fastColour - -local currX = {} -local currY = {} -local currCount = 0 - --------------------------- --- hog and team tracking variales --------------------------- - -local numhhs = 0 -- store number of hedgehogs -local hhs = {} -- store hedgehog gears - -local numTeams -- store the number of teams in the game -local teamNameArr = {} -- store the list of teams -local teamClan = {} -local teamSize = {} -- store how many hogs per team -local teamIndex = {} -- at what point in the hhs{} does each team begin - -local teamComment = {} -local teamScore = {} - -------- --- racer vars --------- - -local cGear = nil - -local bestClan = nil -local bestTime = nil - -local gameBegun = false -local gameOver = false -local racerActive = false -local trackTime = 0 - -local wpCirc = {} -local wpX = {} -local wpY = {} -local wpCol = {} -local wpActive = {} -local wpRad = 450 --75 -local wpCount = 0 -local wpLimit = 8 - -local roundN -local lastRound -local RoundHasChanged - -------------------- --- general methods -------------------- - -function RebuildTeamInfo() - - - -- make a list of individual team names - for i = 0, (TeamsCount-1) do - teamNameArr[i] = " " -- = i - teamSize[i] = 0 - teamIndex[i] = 0 - teamScore[i] = 100000 - end - numTeams = 0 - - for i = 0, (numhhs-1) do - - z = 0 - unfinished = true - while(unfinished == true) do - - newTeam = true - tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name - - if tempHogTeamName == teamNameArr[z] then - newTeam = false - unfinished = false - end - - z = z + 1 - - if z == TeamsCount then - unfinished = false - if newTeam == true then - teamNameArr[numTeams] = tempHogTeamName - numTeams = numTeams + 1 - end - end - - end - - end - - -- find out how many hogs per team, and the index of the first hog in hhs - for i = 0, (numTeams-1) do - for z = 0, (numhhs-1) do - if GetHogTeamName(hhs[z]) == teamNameArr[i] then - teamClan[i] = GetHogClan(hhs[z]) - if teamSize[i] == 0 then - teamIndex[i] = z -- should give starting index - end - teamSize[i] = teamSize[i] + 1 - --add a pointer so this hog appears at i in hhs - end - end - - end - -end - - ------------------ --- RACER METHODS ------------------ - -function CheckWaypoints() - - trackFinished = true - - for i = 0, (wpCount-1) do - - g1X, g1Y = GetGearPosition(CurrentHedgehog) - g2X, g2Y = wpX[i], wpY[i] - - g1X = g1X - g2X - g1Y = g1Y - g2Y - dist = (g1X*g1X) + (g1Y*g1Y) - - --if i == 0 then - -- AddCaption(dist .. "/" .. (wpRad*wpRad) ) - --end - - NR = (48/100*wpRad)/2 - - if dist < (NR*NR) then - --if dist < (wpRad*wpRad) then - --AddCaption("howdy") - wpActive[i] = true - wpCol[i] = GetClanColor(GetHogClan(CurrentHedgehog)) -- new --GetClanColor(1) - SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i]) - - wpRem = 0 - for k = 0, (wpCount-1) do - if wpActive[k] == false then - wpRem = wpRem + 1 - end - end - - AddCaption(loc("Way-Points Remaining") .. ": " .. wpRem,0xffba00ff,capgrpAmmoinfo) - - end - - if wpActive[i] == false then - trackFinished = false - end - - end - - return(trackFinished) - -end - -function AdjustScores() - - if bestTime == nil then - bestTime = 100000 - bestClan = 10 - bestTimeComment = "N/A" - end - - newScore = false - - -- update this clan's time if the new track is better - for i = 0, (numTeams-1) do - if teamClan[i] == GetHogClan(CurrentHedgehog) then - if trackTime < teamScore[i] then - teamScore[i] = trackTime - newScore = true - else - newScore = false - end - end - end - - --bestTime = 100000 - --bestClan = 10 - - -- find the best time out of those so far - for i = 0, (numTeams-1) do - if teamScore[i] < bestTime then - bestTime = teamScore[i] - bestClan = teamClan[i] - end - end - - if bestTime ~= 100000 then - bestTimeComment = (bestTime/1000) ..loc("s") - end - - if newScore == true then - if trackTime == bestTime then -- best time of the race - ShowMission(loc("RACER"), - loc("TRACK COMPLETED"), - loc("NEW RACE RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. - loc("WINNING TIME: ") .. bestTimeComment, 0, 4000) - PlaySound(sndHomerun) - else -- best time for the clan - ShowMission(loc("RACER"), - loc("TRACK COMPLETED"), - loc("NEW CLAN RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. - loc("WINNING TIME: ") .. bestTimeComment, 4, 4000) - end - else -- not any kind of new score - ShowMission(loc("RACER"), - loc("TRACK COMPLETED"), - loc("TIME: ") .. (trackTime/1000) ..loc("s") .. "|" .. - loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000) - PlaySound(sndHellish) - end - - - -------- - --new - -------- - - if bestTime == trackTime then - --AddCaption("wooooooooooooooooooooooooooooo") - - fastColour = GetClanColor(GetHogClan(CurrentHedgehog)) - - for i = 0, (currCount-1) do - fastX[i] = currX[i] - fastY[i] = currY[i] - end - - fastCount = currCount - fastIndex = 0 - - --currCount = 0 -- is this needed? - - else - currCount = 0 - fastIndex = 0 - end - - -end - -function onNewRound() - - roundNumber = roundNumber + 1 - - totalComment = "" - for i = 0, (TeamsCount-1) do - if teamNameArr[i] ~= " " then -- teamScore[teamClan[i]] - teamComment[i] = teamNameArr[i] .. ": " .. (teamScore[i]/1000) .. loc("s|") - totalComment = totalComment .. teamComment[i] - elseif teamNameArr[i] == " " then - teamComment[i] = "|" - end - end - - ShowMission( loc("RACER"), - loc("STATUS UPDATE"), - loc("Rounds Complete: ") .. roundNumber .. "/" .. roundLimit .. "|" .. " " .. "|" .. - loc("Best Team Times: ") .. "|" .. totalComment, 0, 4000) - - -- end game if its at round limit - if roundNumber == roundLimit then - for i = 0, (numhhs-1) do - if GetHogClan(hhs[i]) ~= bestClan then - SetEffect(hhs[i], heResurrectable, 0) - SetHealth(hhs[i],0) - end - end - gameOver = true - TurnTimeLeft = 1 - end - -end - -function CheckForNewRound() - - ------------- - ------ new - ------------- - - --[[turnN = turnN + 1 - if gameBegun == false then - if turnN == 2 then - for i = 0, (numhhs-1) do - if hhs[i] ~= nil then - SetEffect(hhs[i], heResurrectable, 0) - SetHealth(hhs[i],0) - end - end - gameOver = true - TurnTimeLeft = 1 - end - else - - - end]] - - --[[if roundBegun == true then - - if RoundHasChanged == true then - roundN = roundN + 1 - RoundHasChanged = false - onNewRound() - end - - if lastRound ~= TotalRounds then -- new round, but not really - - if RoundHasChanged == false then - RoundHasChanged = true - end - - end - - AddCaption("RoundN:" .. roundN .. "; " .. "TR: " .. TotalRounds) - - lastRound = TotalRounds - - end]] - - ------------ - ----- old - ------------ - - if GetHogClan(CurrentHedgehog) == firstClan then - onNewRound() - end - -end - -function DisableTumbler() - currCount = 0 - fastIndex = 0 - TurnTimeLeft = 0 - racerActive = false -- newadd -end - -function HandleGhost() - - -- get the current xy of the racer at this point - currX[currCount] = GetX(CurrentHedgehog) - currY[currCount] = GetY(CurrentHedgehog) - currCount = currCount + 1 - - -- draw a ping of smoke where the fastest player was at this point - if (fastCount ~= 0) and (fastIndex < fastCount) then - - fastIndex = fastIndex + 1 - - tempE = AddVisualGear(fastX[fastIndex], fastY[fastIndex], vgtSmoke, 0, false) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, fastColour ) - - --AddCaption("fC: " .. fastIndex .. " / " .. fastCount) - - else - - --AddCaption("excep fC: " .. fastIndex .. " / " .. fastCount) - - end - - - -end - ----------------------------------- --- GAME METHODS / EVENT HANDLERS ----------------------------------- - -function onGameInit() - GameFlags = GameFlags + gfInfAttack + gfInvulnerable - CaseFreq = 0 - TurnTime = 90000 - WaterRise = 0 -end - - -function onGameStart() - - roundN = 0 - lastRound = TotalRounds - RoundHasChanged = false -- true - - RebuildTeamInfo() - - ShowMission ( - loc("RACER"), - loc("a Hedgewars mini-game"), - - loc("Build a track and race.") .. "|" .. - loc("Round Limit:") .. " " .. roundLimit .. "|" .. - - "", 4, 4000 - ) -end - -function PlaceWayPoint(x,y) - - if (wpCount < wpLimit) then -- seems to not work with a hedgehog nil chek - - wpX[wpCount] = x - wpY[wpCount] = y - wpCol[wpCount] = 0xffffffff - wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true) - --100 - SetVisualGearValues(wpCirc[wpCount], wpX[wpCount], wpY[wpCount], 20, 100, 1, 10, 0, wpRad, 5, wpCol[wpCount]) - - wpCount = wpCount + 1 - - AddCaption(loc("Waypoint placed.") .. " " .. loc("Available points remaining: ") .. (wpLimit-wpCount)) - - end - -end - -function onNewTurn() - - CheckForNewRound() - - racerActive = false - - trackTime = 0 - - currCount = 0 -- hopefully this solves problem - AddAmmo(CurrentHedgehog, amAirAttack, 0) - gTimer = 0 - - -- Set the waypoints to unactive on new round - for i = 0,(wpCount-1) do - wpActive[i] = false - wpCol[i] = 0xffffffff - SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i]) - end - - -- Handle Starting Stage of Game - if (gameOver == false) and (gameBegun == false) then - if wpCount >= 3 then - gameBegun = true - roundNumber = 0 - firstClan = GetHogClan(CurrentHedgehog) - ShowMission(loc("RACER"), - loc("GAME BEGUN!!!"), - loc("Complete the track as fast as you can!"), 2, 4000) - else - ShowMission(loc("RACER"), - loc("NOT ENOUGH WAYPOINTS"), - loc("Place more waypoints using the 'Air Attack' weapon."), 2, 4000) - AddAmmo(CurrentHedgehog, amAirAttack, 4000) - ParseCommand("setweap " .. string.char(amAirAttack)) - end - end - - if gameOver == true then - gameBegun = false - racerActive = false -- newadd - end - - AddAmmo(CurrentHedgehog, amTardis, 0) - AddAmmo(CurrentHedgehog, amDrillStrike, 0) - AddAmmo(CurrentHedgehog, amMineStrike, 0) - AddAmmo(CurrentHedgehog, amNapalm, 0) - AddAmmo(CurrentHedgehog, amPiano, 0) - -end - -function onGameTick20() - - -- airstrike detected, convert this into a potential waypoint spot - if cGear ~= nil then - x,y = GetGearPosition(cGear) - if x > -9000 then - x,y = GetGearTarget(cGear) - - - if TestRectForObstacle(x-20, y-20, x+20, y+20, true) then - AddCaption(loc("Please place the way-point in the open, within the map boundaries.")) - PlaySound(sndDenied) - elseif (y > WaterLine-50) then - AddCaption(loc("Please place the way-point further from the waterline.")) - PlaySound(sndDenied) - else - PlaceWayPoint(x, y) - if wpCount == wpLimit then - AddCaption(loc("Race complexity limit reached.")) - DisableTumbler() - end - end - else - DeleteGear(cGear) - end - SetGearPosition(cGear, -10000, 0) - end - - - -- start the player tumbling with a boom once their turn has actually begun - if racerActive == false then - - if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then - - -- if the gamehas started put the player in the middle of the first - --waypoint that was placed - if gameBegun == true then - AddCaption(loc("Good to go!")) - racerActive = true - trackTime = 0 - - SetGearPosition(CurrentHedgehog, wpX[0], wpY[0]) - AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1) - FollowGear(CurrentHedgehog) - - HideMission() - - else - -- still in placement mode - end - - end - end - - - - -- has the player started his tumbling spree? - if (CurrentHedgehog ~= nil) then - - --airstrike conversion used to be here - - -- if the RACE has started, show tracktimes and keep tabs on waypoints - if (racerActive == true) and (gameBegun == true) then - - --ghost - if GameTime%40 == 0 then - HandleGhost() - end - - trackTime = trackTime + 20 - - if GameTime%100 == 0 then - - if trackTime%1000 == 0 then - AddCaption((trackTime/1000)..'.0',GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) - else - AddCaption(trackTime/1000,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) - end - - if (CheckWaypoints() == true) then - AdjustScores() - racerActive = false - DisableTumbler() - end - - end - - end - - - - -- if the player has expended his tunbling time, stop him tumbling - if TurnTimeLeft <= 20 then - DisableTumbler() - end - - end - -end - -function onGearResurrect(gear) - - AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) - - if gear == CurrentHedgehog then - DisableTumbler() - end - - -- if the player stops and "dies" or flies into water, stop him racing - --[[if gear == CurrentHedgehog then - DisableTumbler() - ShowMission(loc("RACER"), - loc("TRACK FAILED!"), - loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000) - end]] - -end - -function onGearAdd(gear) - - if GetGearType(gear) == gtHedgehog then - hhs[numhhs] = gear - numhhs = numhhs + 1 - SetEffect(gear, heResurrectable, 1) - end - - if GetGearType(gear) == gtAirAttack then - cGear = gear - end - -end - -function onGearDelete(gear) - - if GetGearType(gear) == gtAirAttack then - cGear = nil - end - -end - ---[[function onAmmoStoreInit() - SetAmmo(amRope, 9, 0, 0, 0) - SetAmmo(amJetpack, 9, 0, 0, 0) - SetAmmo(amSkip, 9, 0, 0, 0) -end]] - - + +------------------------------------------ +-- RACER 0.6 +-- map-independant racing script +-- by mikade +----------------------------------------- + +----------------------------------- +--0.1: took all the code from crazy racer and scrapped most of it +----------------------------------- + +-- Removed tumbler system +-- Removed extra adds like boosters etc +-- Added experimental waypoint placement system +-- More user feedback +-- Reduced race complexity limit to 5 waypoints +-- stop placement at complexity limit reached and end turn +-- guys dont keep racing after dying +-- invulnerable feasibility +-- reverted time keeping method +-- reduced feedback display time +-- colour-coded addcaptions +-- cleaned up code +-- support for more players properly added +-- tardis fix +-- remove airstrikes + +-- i think the remainder 0 .456 sec of the tracktime isnt getting reset on newturn + +-- update feedback + +------- +-- 0.2 +------- + +-- allow gameflags +-- extend time to 90s +-- remove other air-attack based weps +-- turn off water rise for sd + +------- +-- 0.3 +------- + +-- prevent WP being placed in land +-- prevent waypoints being placed outside border + +------- +-- 0.4 +------- + +-- update user feedback +-- add more sounds + +------- +-- 0.5 +------- + +-- fix ghost disappearing if hog falls in water or somehow dies +-- lengthen ghost tracking interval to improve performance on slower machines +-- increase waypoint limit to 8 +-- allow for persistent showmission information + +------- +-- 0.6 +------- + +-- remove hogs from racing area as per request + +----------------------------- +-- SCRIPT BEGINS +----------------------------- + +HedgewarsScriptLoad("/Scripts/Locale.lua") + +------------------ +-- Got Variables? +------------------ + +local fMod = 1000000 -- 1 +local roundLimit = 3 +local roundNumber = 0 +local firstClan = 10 + +local fastX = {} +local fastY = {} +local fastCount = 0 +local fastIndex = 0 +local fastColour + +local currX = {} +local currY = {} +local currCount = 0 + +-------------------------- +-- hog and team tracking variales +-------------------------- + +local numhhs = 0 -- store number of hedgehogs +local hhs = {} -- store hedgehog gears + +local numTeams -- store the number of teams in the game +local teamNameArr = {} -- store the list of teams +local teamClan = {} +local teamSize = {} -- store how many hogs per team +local teamIndex = {} -- at what point in the hhs{} does each team begin + +local teamComment = {} +local teamScore = {} + +------- +-- racer vars +-------- + +local cGear = nil + +local bestClan = nil +local bestTime = nil + +local gameBegun = false +local gameOver = false +local racerActive = false +local trackTime = 0 + +local wpCirc = {} +local wpX = {} +local wpY = {} +local wpCol = {} +local wpActive = {} +local wpRad = 450 --75 +local wpCount = 0 +local wpLimit = 8 + +local roundN +local lastRound +local RoundHasChanged + +------------------- +-- general methods +------------------- + +function RebuildTeamInfo() + + + -- make a list of individual team names + for i = 0, (TeamsCount-1) do + teamNameArr[i] = " " -- = i + teamSize[i] = 0 + teamIndex[i] = 0 + teamScore[i] = 100000 + end + numTeams = 0 + + for i = 0, (numhhs-1) do + + z = 0 + unfinished = true + while(unfinished == true) do + + newTeam = true + tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name + + if tempHogTeamName == teamNameArr[z] then + newTeam = false + unfinished = false + end + + z = z + 1 + + if z == TeamsCount then + unfinished = false + if newTeam == true then + teamNameArr[numTeams] = tempHogTeamName + numTeams = numTeams + 1 + end + end + + end + + end + + -- find out how many hogs per team, and the index of the first hog in hhs + for i = 0, (numTeams-1) do + for z = 0, (numhhs-1) do + if GetHogTeamName(hhs[z]) == teamNameArr[i] then + teamClan[i] = GetHogClan(hhs[z]) + if teamSize[i] == 0 then + teamIndex[i] = z -- should give starting index + end + teamSize[i] = teamSize[i] + 1 + --add a pointer so this hog appears at i in hhs + end + end + + end + +end + + +----------------- +-- RACER METHODS +----------------- + +function CheckWaypoints() + + trackFinished = true + + for i = 0, (wpCount-1) do + + g1X, g1Y = GetGearPosition(CurrentHedgehog) + g2X, g2Y = wpX[i], wpY[i] + + g1X = g1X - g2X + g1Y = g1Y - g2Y + dist = (g1X*g1X) + (g1Y*g1Y) + + --if i == 0 then + -- AddCaption(dist .. "/" .. (wpRad*wpRad) ) + --end + + NR = (48/100*wpRad)/2 + + if dist < (NR*NR) then + --if dist < (wpRad*wpRad) then + --AddCaption("howdy") + wpActive[i] = true + wpCol[i] = GetClanColor(GetHogClan(CurrentHedgehog)) -- new --GetClanColor(1) + SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i]) + + wpRem = 0 + for k = 0, (wpCount-1) do + if wpActive[k] == false then + wpRem = wpRem + 1 + end + end + + AddCaption(loc("Way-Points Remaining") .. ": " .. wpRem,0xffba00ff,capgrpAmmoinfo) + + end + + if wpActive[i] == false then + trackFinished = false + end + + end + + return(trackFinished) + +end + +function AdjustScores() + + if bestTime == nil then + bestTime = 100000 + bestClan = 10 + bestTimeComment = "N/A" + end + + newScore = false + + -- update this clan's time if the new track is better + for i = 0, (numTeams-1) do + if teamClan[i] == GetHogClan(CurrentHedgehog) then + if trackTime < teamScore[i] then + teamScore[i] = trackTime + newScore = true + else + newScore = false + end + end + end + + --bestTime = 100000 + --bestClan = 10 + + -- find the best time out of those so far + for i = 0, (numTeams-1) do + if teamScore[i] < bestTime then + bestTime = teamScore[i] + bestClan = teamClan[i] + end + end + + if bestTime ~= 100000 then + bestTimeComment = (bestTime/1000) ..loc("s") + end + + if newScore == true then + if trackTime == bestTime then -- best time of the race + ShowMission(loc("RACER"), + loc("TRACK COMPLETED"), + loc("NEW RACE RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. + loc("WINNING TIME: ") .. bestTimeComment, 0, 4000) + PlaySound(sndHomerun) + else -- best time for the clan + ShowMission(loc("RACER"), + loc("TRACK COMPLETED"), + loc("NEW CLAN RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. + loc("WINNING TIME: ") .. bestTimeComment, 4, 4000) + end + else -- not any kind of new score + ShowMission(loc("RACER"), + loc("TRACK COMPLETED"), + loc("TIME: ") .. (trackTime/1000) ..loc("s") .. "|" .. + loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000) + PlaySound(sndHellish) + end + + + -------- + --new + -------- + + if bestTime == trackTime then + --AddCaption("wooooooooooooooooooooooooooooo") + + fastColour = GetClanColor(GetHogClan(CurrentHedgehog)) + + for i = 0, (currCount-1) do + fastX[i] = currX[i] + fastY[i] = currY[i] + end + + fastCount = currCount + fastIndex = 0 + + --currCount = 0 -- is this needed? + + else + currCount = 0 + fastIndex = 0 + end + + +end + +function onNewRound() + + roundNumber = roundNumber + 1 + + totalComment = "" + for i = 0, (TeamsCount-1) do + if teamNameArr[i] ~= " " then -- teamScore[teamClan[i]] + teamComment[i] = teamNameArr[i] .. ": " .. (teamScore[i]/1000) .. loc("s|") + totalComment = totalComment .. teamComment[i] + elseif teamNameArr[i] == " " then + teamComment[i] = "|" + end + end + + ShowMission( loc("RACER"), + loc("STATUS UPDATE"), + loc("Rounds Complete: ") .. roundNumber .. "/" .. roundLimit .. "|" .. " " .. "|" .. + loc("Best Team Times: ") .. "|" .. totalComment, 0, 4000) + + -- end game if its at round limit + if roundNumber == roundLimit then + for i = 0, (numhhs-1) do + if GetHogClan(hhs[i]) ~= bestClan then + SetEffect(hhs[i], heResurrectable, 0) + SetHealth(hhs[i],0) + end + end + gameOver = true + TurnTimeLeft = 1 + end + +end + +function CheckForNewRound() + + ------------- + ------ new + ------------- + + --[[turnN = turnN + 1 + if gameBegun == false then + if turnN == 2 then + for i = 0, (numhhs-1) do + if hhs[i] ~= nil then + SetEffect(hhs[i], heResurrectable, 0) + SetHealth(hhs[i],0) + end + end + gameOver = true + TurnTimeLeft = 1 + end + else + + + end]] + + --[[if roundBegun == true then + + if RoundHasChanged == true then + roundN = roundN + 1 + RoundHasChanged = false + onNewRound() + end + + if lastRound ~= TotalRounds then -- new round, but not really + + if RoundHasChanged == false then + RoundHasChanged = true + end + + end + + AddCaption("RoundN:" .. roundN .. "; " .. "TR: " .. TotalRounds) + + lastRound = TotalRounds + + end]] + + ------------ + ----- old + ------------ + + if GetHogClan(CurrentHedgehog) == firstClan then + onNewRound() + end + +end + +function DisableTumbler() + currCount = 0 + fastIndex = 0 + TurnTimeLeft = 0 + racerActive = false -- newadd +end + +function HandleGhost() + + -- get the current xy of the racer at this point + currX[currCount] = GetX(CurrentHedgehog) + currY[currCount] = GetY(CurrentHedgehog) + currCount = currCount + 1 + + -- draw a ping of smoke where the fastest player was at this point + if (fastCount ~= 0) and (fastIndex < fastCount) then + + fastIndex = fastIndex + 1 + + tempE = AddVisualGear(fastX[fastIndex], fastY[fastIndex], vgtSmoke, 0, false) + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) + SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, fastColour ) + + --AddCaption("fC: " .. fastIndex .. " / " .. fastCount) + + else + + --AddCaption("excep fC: " .. fastIndex .. " / " .. fastCount) + + end + + + +end + +function TryRepositionHogs() + + if MapHasBorder() == true then + + for i = 0, (numhhs-1) do + if hhs[i] ~= nil then + SetGearPosition(hhs[i],GetX(hhs[i]), TopY-10) + end + end + + end + +end + +---------------------------------- +-- GAME METHODS / EVENT HANDLERS +---------------------------------- + +function onGameInit() + GameFlags = bor(GameFlags,gfInfAttack + gfInvulnerable) + CaseFreq = 0 + TurnTime = 90000 + WaterRise = 0 +end + + +function onGameStart() + + roundN = 0 + lastRound = TotalRounds + RoundHasChanged = false -- true + + RebuildTeamInfo() + + ShowMission ( + loc("RACER"), + loc("a Hedgewars mini-game"), + + loc("Build a track and race.") .. "|" .. + loc("Round Limit:") .. " " .. roundLimit .. "|" .. + + "", 4, 4000 + ) + + TryRepositionHogs() + +end + +function PlaceWayPoint(x,y) + + if (wpCount < wpLimit) then -- seems to not work with a hedgehog nil chek + + wpX[wpCount] = x + wpY[wpCount] = y + wpCol[wpCount] = 0xffffffff + wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true) + --100 + SetVisualGearValues(wpCirc[wpCount], wpX[wpCount], wpY[wpCount], 20, 100, 1, 10, 0, wpRad, 5, wpCol[wpCount]) + + wpCount = wpCount + 1 + + AddCaption(loc("Waypoint placed.") .. " " .. loc("Available points remaining: ") .. (wpLimit-wpCount)) + + end + +end + +function onNewTurn() + + CheckForNewRound() + TryRepositionHogs() + + racerActive = false + + trackTime = 0 + + currCount = 0 -- hopefully this solves problem + AddAmmo(CurrentHedgehog, amAirAttack, 0) + gTimer = 0 + + -- Set the waypoints to unactive on new round + for i = 0,(wpCount-1) do + wpActive[i] = false + wpCol[i] = 0xffffffff + SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i]) + end + + -- Handle Starting Stage of Game + if (gameOver == false) and (gameBegun == false) then + if wpCount >= 3 then + gameBegun = true + roundNumber = 0 + firstClan = GetHogClan(CurrentHedgehog) + ShowMission(loc("RACER"), + loc("GAME BEGUN!!!"), + loc("Complete the track as fast as you can!"), 2, 4000) + else + ShowMission(loc("RACER"), + loc("NOT ENOUGH WAYPOINTS"), + loc("Place more waypoints using the 'Air Attack' weapon."), 2, 4000) + AddAmmo(CurrentHedgehog, amAirAttack, 4000) + ParseCommand("setweap " .. string.char(amAirAttack)) + end + end + + if gameOver == true then + gameBegun = false + racerActive = false -- newadd + end + + AddAmmo(CurrentHedgehog, amTardis, 0) + AddAmmo(CurrentHedgehog, amDrillStrike, 0) + AddAmmo(CurrentHedgehog, amMineStrike, 0) + AddAmmo(CurrentHedgehog, amNapalm, 0) + AddAmmo(CurrentHedgehog, amPiano, 0) + +end + +function onGameTick20() + + -- airstrike detected, convert this into a potential waypoint spot + if cGear ~= nil then + x,y = GetGearPosition(cGear) + if x > -9000 then + x,y = GetGearTarget(cGear) + + + if TestRectForObstacle(x-20, y-20, x+20, y+20, true) then + AddCaption(loc("Please place the way-point in the open, within the map boundaries.")) + PlaySound(sndDenied) + elseif (y > WaterLine-50) then + AddCaption(loc("Please place the way-point further from the waterline.")) + PlaySound(sndDenied) + else + PlaceWayPoint(x, y) + if wpCount == wpLimit then + AddCaption(loc("Race complexity limit reached.")) + DisableTumbler() + end + end + else + DeleteGear(cGear) + end + SetGearPosition(cGear, -10000, 0) + end + + + -- start the player tumbling with a boom once their turn has actually begun + if racerActive == false then + + if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then + + -- if the gamehas started put the player in the middle of the first + --waypoint that was placed + if gameBegun == true then + AddCaption(loc("Good to go!")) + racerActive = true + trackTime = 0 + + SetGearPosition(CurrentHedgehog, wpX[0], wpY[0]) + AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1) + FollowGear(CurrentHedgehog) + + HideMission() + + else + -- still in placement mode + end + + end + end + + + + -- has the player started his tumbling spree? + if (CurrentHedgehog ~= nil) then + + --airstrike conversion used to be here + + -- if the RACE has started, show tracktimes and keep tabs on waypoints + if (racerActive == true) and (gameBegun == true) then + + --ghost + if GameTime%40 == 0 then + HandleGhost() + end + + trackTime = trackTime + 20 + + if GameTime%100 == 0 then + + if trackTime%1000 == 0 then + AddCaption((trackTime/1000)..'.0',GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) + else + AddCaption(trackTime/1000,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) + end + + if (CheckWaypoints() == true) then + AdjustScores() + racerActive = false + DisableTumbler() + end + + end + + end + + -- if the player has expended his tunbling time, stop him tumbling + if TurnTimeLeft <= 20 then + DisableTumbler() + end + + end + +end + +function onGearResurrect(gear) + + AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) + + if gear == CurrentHedgehog then + DisableTumbler() + end + +end + +function onGearAdd(gear) + + if GetGearType(gear) == gtHedgehog then + hhs[numhhs] = gear + numhhs = numhhs + 1 + SetEffect(gear, heResurrectable, 1) + end + + if GetGearType(gear) == gtAirAttack then + cGear = gear + end + +end + +function onGearDelete(gear) + + if GetGearType(gear) == gtAirAttack then + cGear = nil + end + +end