Add server reconnection tokens and anteroom local list of used nicks
loadfile(GetDataPath() .. "Scripts/Locale.lua")()loadfile(GetDataPath() .. "Scripts/Tracker.lua")()------------------------------------------------------------------------------------------------------------------------------------------------------------ Space Invasion Code Follows (1.1)-------------------------------------------------------------------------------------------------------- VERSION HISTORY------------------ version 0.1------------------ conversion of tumbler into space invasion-- a million and one changes-- bells and whistles------------------ version 0.2------------------ code slowly getting cleaner, it still looks like a spaghetti monster tho-- lots of console tracking :/-- all visual gears are now compulsary (will probably revert this)-- implemented fMod to try combat desyncs and bring this in line with dev------------------ version 0.3------------------ values of scoring changed to 3:10, and now based on vCircScore-- time gained from killing a red circ increased from 3 to 4-- circles now spawn at a distance of at least 800 or until sanity limit-- roundsLimit now based off MinesTime (kinda, its an experiment)-------------------0.4------------------- commented out a lot of WriteLnToConsoles (dont need them at this point)-- added some different WriteLnToConsoles-- changed some of the collision detect for explosives in checkvarious()-------------------0.5------------------- added implementation for a projectile shield-- added a "bonus" orange invader that partially recharges player shield-- added a tough "blueboss" blue invader-- expanded user feedback-- circles now have health and are capable of being merely "damaged"-- redid a lot of the collision code and added CircleDamaged-- added more sounds to events-- added more visual gears-------------------0.6------------------- removed a few WriteLns-- added randomized grunts on circ damage-- added (mostly) graceful fading out of circles :D:-- changed odds for circles-- changed user feedback-- fixed the location of the explosion where player bashes into circ-------------------0.7------------------- added PlaySound(sndSuddenDeath) when ammo gets depleted-- added an extra "Ammo Depleted" note if user presses fire while empty-- specified how much shield power is gained on shield powerup collection-- changed odds for circles AGAIN, ammo is now sliiightly more common-- switched most of the explosions/smoke effects back to non-critical vgears (with a few exceptions)-- tumbletime is now based off turntime and is variable-- delete explosives in DeleteFarFlungBarrel rather than explode them on map boundaries to save on performance-- utilized the improved AddCaption to tint / prevent overrides-- temporarily disabled bugged sort that displays teams according to their score-- reluctantly changed the colour of the bonus circ to purple-- standarized point notation-- added some missing locs-- commented out remaining WriteLnToConsoles for the meanwhile with the prefix "nw"-- ACHIEIVEMENTS added-- (during one turn) aka repeatable-- Ammo Manic (Destroy 3 green circles for + 5 points)-- Drone Hunter (Destroy 5 red circles for + 10 points)-- Shield Seeker (Destroy 3 purple circles for +10 points)-- Boss Slayer (Destroy 2 blue circles for +25 points)-- Shield Master (disolve 5 shells for +10 points)-- Shield Miser (don't use your shield at all (3.5*roundkills)+2 points)-- Depleted Kamikaze! (kamikaze into a blue/red circ when you are out of ammo) 5pts-- Timed Kamikaze! (kamikaze into a blue/red circ when you only have 5s left) 10pts-- Kamikaze Expert (combination of the above two) 15pts-- Multi-shot (destroy more than 1 invader with a single bullet) 15pts-- X-Hit Combo (destroy another invader in less than 3 seconds) chainLength*2 points-- Accuracy Bonus (80% accuracy at the end of your turn with more than 5 shots fired) 15pts--(during the length of the game) aka non-repeatable-- 10/25/50 kills (+25/+50/+100 points)-------------------0.8------------------- added a HUD for turntimeleft, ammo, shield-- shieldhealth hits 0 properly-------------------------- version 0.8.1-------------------------- stop hiding non-existant 4th Tag-- redraw HUD on screen resolution change-------------------------- version 0.9-------------------------- time for more 'EXPERIMENTS' mwahahahahahaha D:-- (hopefully) balanced Shield Miser-- bosses are no longer a redunkulous 50 points, but toned down to 30-- experimental radar (it's INTERACTIVE and math-heavy :D) (visual gears are safe... right? D:)-- bugfix and balance for multishot-------------------------- version 1.0-------------------------- if only version numbers actually worked like this, wouldn't that be awful :D-- added surfer achievement-- increased value of shield miser by 1 point per kill (OP?)-------------------------- version 1.1-------------------------- fixed radar so that blips dont go past circs when you get very close-- added a missing loc for shield depletion-- increased delay to 1000 to try stop noobies missing their turn-- added sniper achievement for hits from over a 1000000 away-- added achievement for 3 "sniper" shots in a round-- added achievement for 3 "point blank" shots in a round-- added "fierce Competition" achievement for shooting an enemy hog (once per round)-- some support for more weapons later----------------------------notes for later---------------------------- maybe add a check for a tie, IMPOSSIBRU THERE ARE NO TIES-- more achievements? (3 kamikazes in a row, supreme shield expert/miser etc?)-- if more weps are added, replace primshotsfired all over the place-- look for derp and let invaders shoot again-- more weps? flamer/machineballgun,-- some kind of bomb that just drops straight down-- "fire and forget" missile-- shockwave-- some kind of ability-meter that lets you do something awesome when you are-- doing really well in a given round.-- probably new kind of shield that pops any invaders who come near-- fix game never ending bug-- fix radar-- new invader: golden snitch, doesn't show up on your radar-- maybe replace (48/100*vCircRadius[i])/2 with something better--[[CAPTION CATEGORIES-----------------capgrpGameState-----------------AddCaption(LOC_NOT("Sniper!") .. " +10 " .. LOC_NOT("points") .. "!",0xffba00ff,capgrpAmmostate)--they call me bullsye--point blank combo--fierce Competition-----------------capgrpAmmostate-----------------AddCaption( chainLength .. LOC_NOT("-chain! +") .. chainLength*2 .. LOC_NOT(" points!"),0xffba00ff,capgrpAmmostate)AddCaption(LOC_NOT("Multi-shot! +15 points!"),0xffba00ff,capgrpAmmostate)-----------------capgrpAmmoinfo-----------------AddCaption(LOC_NOT("Shield Miser! +20 points!"),0xffba00ff,capgrpAmmoinfo)AddCaption(LOC_NOT("Shield Master! +10 points!"),0xffba00ff,capgrpAmmoinfo)-----------------capgrpVolume-----------------AddCaption(LOC_NOT("Boom! +25 points!"),0xffba00ff,capgrpVolume)AddCaption(LOC_NOT("BOOM! +50 points!"),0xffba00ff,capgrpVolume)AddCaption(LOC_NOT("BOOM! BOOM! BOOM! +100 points!"),0xffba00ff,capgrpVolume)AddCaption(LOC_NOT("Accuracy Bonus! +15 points!"),0xffba00ff,capgrpVolume)AddCaption(LOC_NOT("Surfer! +15 points!"),0xffba00ff,capgrpVolume)-----------------capgrpMessage-----------------AddCaption(LOC_NOT("Ammo Depleted!"),0xff0000ff,capgrpMessage)AddCaption(LOC_NOT("Ammo: ") .. primShotsLeft)AddCaption(LOC_NOT("Shield Depleted"),0xff0000ff,capgrpMessage)AddCaption( LOC_NOT("Shield ON:") .. " " .. shieldHealth - 80 .. " " .. LOC_NOT("Power Remaining") )AddCaption(LOC_NOT("Shield OFF:") .. " " .. shieldHealth - 80 .. " " .. LOC_NOT("Power Remaining") )AddCaption(LOC_NOT("Time Extended!") .. "+" .. 4 .. LOC_NOT("s"), 0xff0000ff,capgrpMessage )AddCaption("+" .. 3 .. " " .. LOC_NOT("Ammo"), 0x00ff00ff,capgrpMessage)AddCaption(LOC_NOT("Shield boosted! +30 power"), 0xff00ffff,capgrpMessage)AddCaption(LOC_NOT("Shield is fully recharged!"), 0xffae00ff,capgrpMessage)AddCaption(LOC_NOT("Boss defeated! +50 points!"), 0x0050ffff,capgrpMessage)AddCaption(LOC_NOT("GOTCHA!"))AddCaption(LOC_NOT("Kamikaze Expert! +15 points!"),0xffba00ff,capgrpMessage)AddCaption(LOC_NOT("Depleted Kamikaze! +5 points!"),0xffba00ff,capgrpMessage)AddCaption(LOC_NOT("Timed Kamikaze! +10 points!"),0xffba00ff,capgrpMessage)-----------------capgrpMessage2-----------------AddCaption(LOC_NOT("Drone Hunter! +10 points!"),0xffba00ff,capgrpMessage2)AddCaption(LOC_NOT("Ammo Maniac! +5 points!"),0xffba00ff,capgrpMessage2)AddCaption(LOC_NOT("Shield Seeker! +10 points!"),0xffba00ff,capgrpMessage2)AddCaption(LOC_NOT("Boss Slayer! +25 points!"),0xffba00ff,capgrpMessage2)]]------------------------------------ so I herd u liek wariables------------------------------------local fMod = 1 -- for use in .15 single player only, otherwise desynclocal fMod = 1000000 -- use this for dev and .16+ games-- some console stufflocal shellID = 0local explosivesID = 0-- gaudyRacerlocal boosterOn = falselocal roundLimit = 3 -- no longer set here (see version history)local roundNumber = 0local firstClan = 10local gameOver = falselocal gameBegun = falselocal bestClan = 10local bestScore = 0local sdScore = {}local sdName = {}local sdKills = {}local roundN = 0local lastRoundlocal RoundHasChanged = true---------------------------- hog and team tracking variales--------------------------local numhhs = 0local hhs = {}local numTeamslocal teamNameArr = {}local teamClan = {}local teamSize = {}local teamIndex = {}local teamComment = {}local teamScore = {}local teamCircsKilled = {}local teamSurfer = {}-- stats variables--local teamRed = {}--local teamBlue = {}--local teamOrange = {}--local teamGreen = {}local roundKills = 0local RK = 0local GK = 0local BK = 0local OK = 0local SK = 0local shieldMiser = truelocal fierceComp = falselocal chainCounter = 0local chainLength = 0local shotsFired = 0local shotsHit = 0local SurfTime = 0local sniperHits = 0local pointBlankHits = 0----------------------- tumbler goods---------------------local leftOn = falselocal rightOn = falselocal upOn = falselocal downOn = false------------------ TUMBLERlocal wep = {}local wepAmmo = {}local wepCol = {}local wepIndex = 0local wepCount = 0local fireTimer = 0----------------local primShotsMax = 5local primShotsLeft = 0local TimeLeft = 0local stopMovement = falselocal tumbleStarted = falselocal beam = falselocal pShieldlocal shieldHealthlocal shockwavelocal shockwaveHealth = 0local shockwaveRad = 300local vTag = {}------------------------------------------------- CIRCLY GOODIES-----------------------------------------------local CirclesAreGo = falselocal playerIsFine = truelocal targetHit = falselocal FadeAlpha = 0 -- used to fade the circles out gracefully when player dieslocal pTimer = 0 -- tracking projectiles following player--local m2Count = 0 -- handle speed of circslocal vCirc = {}local vCCount = 0local rCirc = {}local rCircX = {}local rCircY = {}local rAlpha = 255local radShotsLeft = 0local vCircActive = {}local vCircHealth = {}local vType = {}local vCounter = {} -- how often this circ gets to "fire" etclocal vCounterLim = {} -- when vCounter == vCounterLim circle performs its speciallocal vCircScore = {} -- how many points killing this invader giveslocal vCircRadMax = {}local vCircRadMin = {}local vCircRadDir = {}local vCircRadCounter = {}local vCircDX = {}local vCircDY = {}local vCircX = {}local vCircY = {}local vCircMinA = {}local vCircMaxA = {}local vCircType = {}local vCircPulse = {}local vCircFuckAll = {}local vCircRadius = {}local vCircWidth = {}local vCircCol = {}--------------------------------------------- some lazy copypasta/modified methods-------------------------------------------function HideTags() for i = 0, 2 do SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00) endendfunction DrawTag(i) zoomL = 1.3 xOffset = 40 if i == 0 then yOffset = 40 tCol = 0xffba00ff tValue = TimeLeft elseif i == 1 then zoomL = 1.1 yOffset = 70 tCol = 0x00ff00ff tValue = wepAmmo[wepIndex] --primShotsLeft elseif i == 2 then zoomL = 1.1 xOffset = 40 + 35 yOffset = 70 tCol = 0xa800ffff tValue = shieldHealth - 80 end DeleteVisualGear(vTag[i]) vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i]) SetVisualGearValues ( vTag[i], --id -(ScreenWidth/2) + xOffset, --xoffset ScreenHeight - yOffset, --yoffset 0, --dx 0, --dy zoomL, --zoom 1, --~= 0 means align to screen g7, --frameticks tValue, --value 240000, --timer tCol --GetClanColor( GetHogClan(CurrentHedgehog) ) )endfunction 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] = 0 teamCircsKilled[i] = 0 teamSurfer[i] = false 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-1) 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, (TeamsCount-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 endend-- controlfunction AwardPoints(p) for i = 0,(TeamsCount-1) do if teamClan[i] == GetHogClan(CurrentHedgehog) then teamScore[i] = teamScore[i] + p end endendfunction AwardKills(t) roundKills = roundKills + 1 for i = 0,(TeamsCount-1) do if teamClan[i] == GetHogClan(CurrentHedgehog) then teamCircsKilled[i] = teamCircsKilled[i] + 1 if teamCircsKilled[i] == 10 then AddCaption(loc("Boom!") .. " +25 " .. loc("points").."!",0xffba00ff,capgrpVolume) AwardPoints(25) elseif teamCircsKilled[i] == 25 then AddCaption(loc("BOOM!") .. " +50 " .. loc("points") .. "!",0xffba00ff,capgrpVolume) AwardPoints(50) elseif teamCircsKilled[i] == 50 then AddCaption(loc("BOOM!") .. loc("BOOM!") .. loc("BOOM!") .. " +100 " .. loc("points") .. "!",0xffba00ff,capgrpVolume) AwardPoints(100) end --[[ if t == "R" then redCircsKilled[i] = redCircsKilled[i] + 1 end --etc --etc ]] end endend-----------------function bubbleSort(table) for i = 1, #table do for j = 2, #table do if table[j] < table[j-1] then temp = table[j-1] t2 = sdName[j-1] t3 = sdKills[j-1] table[j-1] = table[j] sdName[j-1] = sdName[j] sdKills[j-1] = sdKills[j] table[j] = temp sdName[j] = t2 sdKills[j] = t3 end end end returnend-----------------function CommentOnScore() for i = 0,(TeamsCount-1) do sdScore[i] = teamScore[i] sdKills[i] = teamCircsKilled[i] sdName[i] = teamNameArr[i] end --bubbleSort(sdScore) for i = 0,(TeamsCount-1) do if sdName[i] ~= " " then teamComment[i] = sdName[i] .. " |" .. loc("SCORE") .. ": " .. sdScore[i] .. " " .. loc("points") .. "|" .. loc("KILLS") .. ": " .. sdKills[i] .. " " .. loc("invaders destroyed") .. "|" .. " " .. "|" elseif sdName[i] == " " then teamComment[i] = "|" end end entireC = "" for i = (TeamsCount-1),0,-1 do entireC = entireC .. teamComment[i] end ShowMission("SPACE INVASION", loc("STATUS UPDATE"), loc("Rounds Complete") .. ": " .. roundNumber .. "/" .. roundLimit .. "| " .. "|" .. loc("Team Scores") .. ": |" ..entireC, 4, 1)endfunction onNewRound() roundNumber = roundNumber + 1 CommentOnScore() -- end game if its at round limit if roundNumber == roundLimit then for i = 0, (TeamsCount-1) do if teamScore[i] > bestScore then bestScore = teamScore[i] bestClan = teamClan[i] end end for i = 0, (numhhs-1) do if GetHogClan(hhs[i]) ~= bestClan then SetEffect(hhs[i], heResurrectable, false) SetHealth(hhs[i],0) end end gameOver = true TurnTimeLeft = 0 --1 TimeLeft = 0 endend-- gaudy racerfunction CheckForNewRound() ---------- -- new ---------- --[[if gameBegun == 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() endend------------------------------------------ some tumbler/space invaders methods----------------------------------------function isATrackedGear(gear) if (GetGearType(gear) == gtExplosives) or (GetGearType(gear) == gtShell) or (GetGearType(gear) == gtFlame) or-- new -- gtBall (GetGearType(gear) == gtBall) then return(true) else return(false) endendfunction setNewGearValues(gear) if GetGearType(gear) == gtShell then lfs = 50 -- roughly 5 seconds shellID = shellID + 1 setGearValue(gear,"ID",shellID) --nw WriteLnToConsole("Just assigned ID " .. getGearValue(gear,"ID") .. " to this shell") elseif GetGearType(gear) == gtBall then lfs = 5 --70 -- 7s elseif GetGearType(gear) == gtExplosives then lfs = 15 -- 1.5s explosivesID = explosivesID + 1 setGearValue(gear,"ID",explosivesID) setGearValue(gear,"XP", GetX(gear)) setGearValue(gear,"YP", GetY(gear)) --nw WriteLnToConsole("Just assigned ID " .. getGearValue(gear,"ID") .. " to this explosives") elseif GetGearType(gear) == gtFlame then lfs = 5 -- 0.5s else lfs = 100 end setGearValue(gear,"lifespan",lfs) --WriteLnToConsole("I also set its lifespan to " .. lfs)endfunction HandleLifeSpan(gear) decreaseGearValue(gear,"lifespan") --WriteLnToConsole("Just decreased the lifespan of a gear to " .. getGearValue(gear,"lifespan")) --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) if getGearValue(gear,"lifespan") == 0 then if GetGearType(gear) == gtShell then AddVisualGear(GetX(gear), GetY(gear), vgtExplosion, 0, false) WriteLnToConsole("about to delete a shell due to lifespan == 0") --elseif GetGearType(gear) == gtBall then -- AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, true) elseif GetGearType(gear) == gtExplosives then AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) --nw WriteLnToConsole("about to delete a explosive due to lifespan == 0") elseif GetGearType(gear) == gtFlame then AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false) --WriteLnToConsole("about to delete flame due to lifespan == 0") end DeleteGear(gear) endend-- this prevents ugly barrel clipping sounds when a barrel flies off map limitsfunction DeleteFarFlungBarrel(gear) if GetGearType(gear) == gtExplosives then if (GetX(gear) < -1900) or (GetX(gear) > 6200) or (GetY(gear) < -3400) then AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) DeleteGear(gear) --SetHealth(gear, 0) --WriteLnToConsole("I'm setting barrel ID " .. getGearValue(gear,"ID") .. " to 0 health because it's been flung too close to the map edges. at Game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) end endend-------------------------EVENT HANDLERS-- action keys-----------------------function HandleFlameThrower() -- --flamer fireTimer = fireTimer + 1 if fireTimer == 6 then -- 6 fireTimer = 0 if (wep[wepIndex] == loc("Flamer") ) and (preciseOn == true) and (wepAmmo[wepIndex] > 0) and (stopMovement == false) and (tumbleStarted == true) then wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 AddCaption( loc("Flamer") .. ": " .. (wepAmmo[wepIndex]/800*100) - (wepAmmo[wepIndex]/800*100)%2 .. "%", wepCol[2], capgrpMessage2 ) DrawTag(3) dx, dy = GetGearVelocity(CurrentHedgehog) --gtFlame -- gtSnowball -- gtAirBomb shell = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0) xdev = 1 + GetRandom(35) --25 xdev = xdev / 100 r = GetRandom(2) if r == 1 then xdev = xdev*-1 end ydev = 1 + GetRandom(35) --25 ydev = ydev / 100 r = GetRandom(2) if r == 1 then ydev = ydev*-1 end --4.5 or 2.5 nonflames --4.5 SetGearVelocity(shell, (dx*4.5)+(xdev*fMod), (dy*4.5)+(ydev*fMod)) --10 end endendfunction ChangeWeapon() wepIndex = wepIndex + 1 if wepIndex == wepCount then wepIndex = 0 end AddCaption(wep[wepIndex] .. " " .. loc("selected!"), wepCol[wepIndex],capgrpAmmoinfo ) AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2)end--function onTimer() -- experimental wep --[[SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, 300, 1, 0xff33ffff) AddCaption("boom") PlaySound(sndWarp) shockwaveHealth = 100 shockwaveRad = 100]] --change wep --ChangeWeapon() -- booster --[[if boosterOn == false then boosterOn = true else boosterOn = false end]]--end-- o rite dis wan iz liek synched n stuff hope full lee-- old method--[[function onPrecise() -- Fire Barrel if (primShotsLeft > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then shotsFired = shotsFired +1 morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1) primShotsLeft = primShotsLeft - 1 if primShotsLeft == 0 then PlaySound(sndSuddenDeath) AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) else AddCaption(loc("Ammo") .. ": " .. primShotsLeft) end DrawTag(1) CopyPV(CurrentHedgehog, morte) -- new addition x,y = GetGearVelocity(morte) x = x*2 y = y*2 SetGearVelocity(morte, x, y) elseif (primShotsLeft == 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) endend]]-- derp tumblerfunction onPrecise() if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (wepAmmo[wepIndex] > 0) then wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 --AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2) if wep[wepIndex] == loc("Barrel Launcher") then shotsFired = shotsFired +1 morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1) CopyPV(CurrentHedgehog, morte) -- new addition x,y = GetGearVelocity(morte) x = x*2 y = y*2 SetGearVelocity(morte, x, y) if wepAmmo[wepIndex] == 0 then PlaySound(sndSuddenDeath) AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) else --AddCaption(loc("Ammo") .. ": " .. wepAmmo[wepIndex]) end DrawTag(1) elseif wep[wepIndex] == loc("Mine Deployer") then morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtAirBomb, 0, 0, 0, 0) SetTimer(morte, 1000) DrawTag(1) end elseif (wepAmmo[wepIndex] == 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) end preciseOn = trueendfunction onPreciseUp() preciseOn = falseendfunction onLJump() if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then shieldMiser = false if shieldHealth == 80 then AddCaption(loc("Shield Depleted"),0xff0000ff,capgrpMessage) PlaySound(sndMineTick) PlaySound(sndSwitchHog) elseif (beam == false) and (shieldHealth > 80) then beam = true SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, 300, 1, 0xa800ffff) AddCaption( loc("Shield ON:") .. " " .. shieldHealth - 80 .. " " .. loc("Power Remaining") ) PlaySound(sndWarp) else beam = false SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 0, 0, 1, 10, 0, 0, 0, 0xa800ffff) AddCaption(loc("Shield OFF:") .. " " .. shieldHealth - 80 .. " " .. loc("Power Remaining") ) end endendfunction onHJump() if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (rAlpha == 255) and (radShotsLeft > 0) then rPingTimer = 0 rAlpha = 0 radShotsLeft = radShotsLeft -1 AddCaption(loc("Pings left:") .. " " .. radShotsLeft,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage) endend------------------- movement keys-----------------function onLeft() leftOn = trueendfunction onRight() rightOn = trueendfunction onUp() upOn = trueendfunction onDown() downOn = trueendfunction onDownUp() downOn = falseendfunction onUpUp() upOn = falseendfunction onLeftUp() leftOn = falseendfunction onRightUp() rightOn = falseend---------------------------- other event handlers--------------------------function onGameInit() GameFlags = 0 + gfRandomOrder Theme = "EarthRise" CaseFreq = 0 HealthCaseProb = 0 MinesNum = 0 Explosives = 0 Delay = 1000 for i = 0, 3 do vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false) end HideTags() wep[0] = loc("Barrel Launcher") wep[1] = loc("Mine Deployer") wep[2] = loc("Flamer") wepCol[0] = 0x78818eff wepCol[1] = 0xa12a77ff wepCol[2] = 0xf49318ff wepCount = 3endfunction onGameStart() if (MinesTime == -1000) or (MinesTime == 0) then roundLimit = 3 else roundLimit = (MinesTime / 1000) end ShowMission ( "SPACE INVASION", loc("a Hedgewars mini-game"), loc("Destroy invaders to score points.") .. "|" .. " " .. "|" .. loc("Round Limit") .. ": " .. roundLimit .. "|" .. loc("Turn Time") .. ": " .. (TurnTime/1000) .. loc("sec") .. "|" .. " " .. "|" .. loc("Movement: [Up], [Down], [Left], [Right]") .. "|" .. loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" .. loc("Toggle Shield") .. ": " .. loc("[Enter]") .. "|" .. loc("Radar Ping") .. ": " .. loc("[Backspace]") .. "|" .. --" " .. "|" .. --LOC_NOT("Invaders List: ") .. "|" .. --LOC_NOT("Blue Jabberwock: (50 points)") .. "|" .. --LOC_NOT("Red Warbler: (10 points)") .. "|" .. --LOC_NOT("Orange Gob: (5 points)") .. "|" .. --LOC_NOT("Green Wrangler: (3 points)") .. "|" .. "", 4, 4000 ) CreateMeSomeCircles() RebuildTeamInfo() -- control lastRound = TotalRoundsendfunction onScreenResize() -- redraw Tags so that their screen locations are updated if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then DrawTag(0) DrawTag(1) DrawTag(2) endendfunction onNewTurn() --primShotsLeft = primShotsMax radShotsLeft = 2 stopMovement = false tumbleStarted = false boosterOn = false beam = false shieldHealth = 30 + 80 -- 50 = 5 secs, roughly shockwaveHealth = 0 RK = 0 GK = 0 BK = 0 OK = 0 SK = 0 roundKills = 0 shieldMiser = true fierceComp = false shotsFired = 0 shotsHit = 0 sniperHits = 0 pointBlankHits = 0 chainLength = 0 chainCounter = 0 SurfTime = 12 ------------------------- -- gaudy racer ------------------------- CheckForNewRound() -- Handle Starting Stage of Game if (gameOver == false) and (gameBegun == false) then gameBegun = true roundNumber = 0 -- 0 firstClan = GetHogClan(CurrentHedgehog) end if gameOver == true then gameBegun = false stopMovement = true tumbleStarted = false SetMyCircles(false) end ------- -- tumbler ---- wepAmmo[0] = 5 wepAmmo[1] = 2 wepAmmo[2] = 5000 wepIndex = 2 ChangeWeapon() HideTags() --------------- --------------- --AddCaption("num g: " .. numGears() ) --WriteLnToConsole("onNewTurn, I just set a bunch of variables to their necessary states. This was done at:") --WriteLnToConsole("The above occured at Game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)endfunction ThingsToBeRunOnGears(gear) HandleLifeSpan(gear) DeleteFarFlungBarrel(gear) if CirclesAreGo == true then CheckVarious(gear) ProjectileTrack(gear) endendfunction onGameTick20() --WriteLnToConsole("Start of GameTick") HandleCircles() -- derp --if shockwaveHealth > 0 then -- shockwaveHealth = shockwaveHealth - 1 -- shockwaveRad = shockwaveRad + 5 --end if GameTime%100 == 0 then if beam == true then shieldHealth = shieldHealth - 1 if shieldHealth < 80 then -- <= 80 shieldHealth = 80 beam = false AddCaption(loc("Shield Depleted"),0xff0000ff,capgrpMessage) PlaySound(sndMineTick) PlaySound(sndSwitchHog) end end --nw WriteLnToConsole("Starting ThingsToBeRunOnGears()") runOnGears(ThingsToBeRunOnGears) --nw WriteLnToConsole("Finished ThingsToBeRunOnGears()") --runOnGears(HandleLifeSpan) --runOnGears(DeleteFarFlungBarrel) if CirclesAreGo == true and CurrentHedgehog ~= nil then CheckDistances() --runOnGears(CheckVarious) -- used to be in handletracking for some bizarre reason --runOnGears(ProjectileTrack) end -- white smoke trail as player falls from the sky if (TimeLeft <= 0) and (stopMovement == true) and (CurrentHedgehog ~= nil) then j,k = GetGearVelocity(CurrentHedgehog) if (j ~= 0) and (k ~= 0) then AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, true) end end --nw WriteLnToConsole("Finished 100Timer") end -- start the player tumbling with a boom once their turn has actually begun if (tumbleStarted == false) and (gameOver == false) then if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then --AddCaption(LOC_NOT("Good to go!")) tumbleStarted = true TimeLeft = div(TurnTime, 1000) --45 FadeAlpha = 0 rAlpha = 255 AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1) DrawTag(0) DrawTag(1) DrawTag(2) SetMyCircles(true) end end --WriteLnToConsole("Finished initial check") if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then --AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog) ) -- Calculate and display turn time if GameTime%1000 == 0 then TimeLeft = TimeLeft - 1 if TimeLeft >= 0 then --AddCaption(LOC_NOT("Time Left: ") .. TimeLeft) DrawTag(0) end end --WriteLnToConsole("Finished timeleft calculations") ------------------------------- -- Player has run out of luck (out of time or hit by gtShell) ------------------------------- -- checks in FloatyThings if PlayerIsFine() == false then TimeLeft = 0 end --WriteLnToConsole("successfully checked playerIsFine") if (TimeLeft == 0) then if (stopMovement == false) then --time to stop the player stopMovement = true boosterOn = false beam = false upOn = false down = false leftOn = false rightOn = false SetMyCircles(false) HideTags() rAlpha = 255 --nw WriteLnToConsole("Player is out of luck") if shieldMiser == true then p = (roundKills*3.5) - ((roundKills*3.5)%1) + 2 AddCaption(loc("Shield Miser!") .." +" .. p .." ".. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo) AwardPoints(p) end if ((shotsHit / shotsFired * 100) >= 80) and (shotsFired > 4) then AddCaption(loc("Accuracy Bonus!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpVolume) AwardPoints(15) end end else -- remove this if you want tumbler to fall slowly on death ------------------------------- -- Player is still in luck ------------------------------- --WriteLnToConsole("about to do chainCounter checks") if chainCounter > 0 then chainCounter = chainCounter -1 if chainCounter == 0 then chainLength = 0 end end -- handle movement based on IO if GameTime%100 == 0 then -- 100 --nw WriteLnToConsole("Start of Player MoveTimer") --------------- -- new trail code --------------- -- the trail lets you know you have 5s left to pilot, akin to birdy feathers if (TimeLeft <= 5) and (TimeLeft > 0) then --vgtSmoke tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, true) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, GetClanColor(GetHogClan(CurrentHedgehog)) ) end -------------- -------------- ------------------------ -- surfer achievement ------------------------ if (WaterLine - GetY(CurrentHedgehog)) < 15 then SurfTime = SurfTime -1 end if SurfTime ~= 12 then SurfTime = SurfTime - 1 if SurfTime <= 0 then for i = 0,(TeamsCount-1) do if teamClan[i] == GetHogClan(CurrentHedgehog) and (teamSurfer[i] == false) then teamSurfer[i] = true SurfTime = 12 AddCaption(loc("Surfer! +15 points!"),0xffba00ff,capgrpVolume) AwardPoints(15) end end end end dx, dy = GetGearVelocity(CurrentHedgehog) --WriteLnToConsole("I just got the velocity of currenthedgehog. It is dx: " .. dx .. "; dy: " .. dy) --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) if boosterOn == true then tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtDust, 0, false) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, 1, g9, GetClanColor(GetHogClan(CurrentHedgehog)) ) dxlimit = 0.8*fMod dylimit = 0.8*fMod else dxlimit = 0.4*fMod dylimit = 0.4*fMod end if dx > dxlimit then dx = dxlimit end if dy > dylimit then dy = dylimit end if dx < -dxlimit then dx = -dxlimit end if dy < -dylimit then dy = -dylimit end if leftOn == true then dx = dx - 0.1*fMod end if rightOn == true then dx = dx + 0.1*fMod end if upOn == true then dy = dy - 0.1*fMod end if downOn == true then dy = dy + 0.1*fMod end SetGearVelocity(CurrentHedgehog, dx, dy) --WriteLnToConsole("I just SET the velocity of currenthedgehog. It is now dx: " .. dx .. "; dy: " .. dy) --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) --nw WriteLnToConsole("End of Player MoveTimer") end HandleFlameThrower() end -- new end I put here to check if he's still alive or not end --WriteLnToConsole("End of GameTick")endfunction onGearDamage(gear, damage) if GetGearType(gear) == gtHedgehog then if (fierceComp == false) and (damage >= 60) and (GetHogClan(gear) ~= GetHogClan(CurrentHedgehog)) then fierceComp = true AddCaption(loc("Fierce Competition!") .. " +8 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) AwardPoints(8) end endendfunction onGearResurrect(gear) -- did I fall into the water? well, that was a stupid thing to do if gear == CurrentHedgehog then TimeLeft = 0 --WriteLnToConsole("Current hedgehog just drowned himself") --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) endendfunction onGearAdd(gear) if isATrackedGear(gear) then trackGear(gear) setNewGearValues(gear) end --if GetGearType(gear) == gtBall then -- SetTimer(gear, 5000) --end if GetGearType(gear) == gtHedgehog then SetEffect(gear, heResurrectable, true) ----------- -- control hhs[numhhs] = gear numhhs = numhhs + 1 ----------- endendfunction onGearDelete(gear) --[[if GetGearType(gear) == gtShell then --nw WriteLnToConsole("on GearDelete call. Shell ID: " .. getGearValue(gear,"ID")) --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) --if CurrentHedgehog ~= nil then -- WriteLnToConsole("As it happens, player is at: " .. GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog)) --end elseif GetGearType(gear) == gtExplosives then --nw WriteLnToConsole("on GearDelete call. Explosives ID: " .. getGearValue(gear,"ID")) --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) --if CurrentHedgehog ~= nil then -- WriteLnToConsole("As it happens, player is at: " .. GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog)) --end elseif GetGearType(gear) == gtFlame then --WriteLnToConsole("on GearDelete flame") end]] if isATrackedGear(gear) then trackDeletion(gear) end if CurrentHedgehog ~= nil then FollowGear(CurrentHedgehog) endend-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- FLOATY THINGS-- "I'll make this into a generic library and code properly-- when I have more time and feel less lazy"------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------function DoHorribleThings(cUID) -- work out the distance to the target g1X, g1Y = GetGearPosition(CurrentHedgehog) g2X, g2Y = vCircX[cUID], vCircY[cUID] q = g1X - g2X w = g1Y - g2Y r = math.sqrt( (q*q) + (w*w) ) --alternate opp = w if opp < 0 then opp = opp*-1 end -- work out the angle (theta) to the target t = math.deg ( math.asin(opp / r) ) -- based on the radius of the radar, calculate what x/y displacement should be NR = 150 -- radius at which to draw circs NX = math.cos( math.rad(t) ) * NR NY = math.sin( math.rad(t) ) * NR -- displace xy based on where this thing actually is if r < NR then rCircX[cUID] = g2X elseif q > 0 then rCircX[cUID] = g1X - NX else rCircX[cUID] = g1X + NX end if r < NR then rCircY[cUID] = g2Y elseif w > 0 then rCircY[cUID] = g1Y - NY else rCircY[cUID] = g1Y + NY endendfunction PlayerIsFine() return (playerIsFine)endfunction GetDistFromXYtoXY(a, b, c, d) q = a - c w = b - d return ( (q*q) + (w*w) )endfunction GetDistFromGearToGear(gear, gear2) g1X, g1Y = GetGearPosition(gear) g2X, g2Y = GetGearPosition(gear2) q = g1X - g2X w = g1Y - g2Y --[[ WriteLnToConsole("I just got the position of two gears and calculated the distance betwen them") if gear == CurrentHedgehog then WriteLnToConsole("Gear 1 is CurrentHedgehog.") end if gear2 == CurrentHedgehog then WriteLnToConsole("Gear 2 is CurrentHedgehog.") end WriteLnToConsole("G1X: " .. g1X .. "; G1Y: " .. g1Y) WriteLnToConsole("G2X: " .. g2X .. "; G2Y: " .. g2Y) WriteLnToConsole("Their distance is " .. (q*q) + (w*w) ) WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)]] return ( (q*q) + (w*w) )endfunction GetDistFromGearToXY(gear, g2X, g2Y) g1X, g1Y = GetGearPosition(gear) q = g1X - g2X w = g1Y - g2Y --[[WriteLnToConsole("I just got the position of a gear and calculated the distance betwen it and another xy") if gear == CurrentHedgehog then WriteLnToConsole("Gear 1 is CurrentHedgehog.") end WriteLnToConsole("G1X: " .. g1X .. "; G1Y: " .. g1Y) WriteLnToConsole("Other X: " .. g2X .. "; Other Y: " .. g2Y) WriteLnToConsole("Their distance is " .. (q*q) + (w*w) ) WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)]] return ( (q*q) + (w*w) )endfunction CreateMeSomeCircles() for i = 0, 7 do vCCount = vCCount +1 vCirc[i] = AddVisualGear(0,0,vgtCircle,0,true) rCirc[i] = AddVisualGear(0,0,vgtCircle,0,true) rCircX[i] = 0 rCircY[i] = 0 vCircDX[i] = 0 vCircDY[i] = 0 vType[i] = "generic" vCounter[i] = 0 vCounterLim[i] = 150 vCircScore[i] = 0 vCircHealth[i] = 1 vCircMinA[i] = 80 --80 --20 vCircMaxA[i] = 255 vCircType[i] = 1 --1 vCircPulse[i] = 10 vCircFuckAll[i] = 0 vCircRadius[i] = 0 vCircWidth[i] = 3 --5 vCircRadMax[i] = 0 vCircRadMin[i] = 0 vCircRadDir[i] = -1 vCircRadCounter[i] = 0 vCircX[i], vCircY[i] = 0,0 vCircCol[i] = 0xff00ffff SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i]) SetVisualGearValues(rCirc[i], 0, 0, 100, 255, 1, 10, 0, 40, 3, vCircCol[i]) end pShield = AddVisualGear(0,0,vgtCircle,0,true) --SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 80, 200, 1, 10, 0, 200, 5, 0xff00ffff) shockwave = AddVisualGear(0,0,vgtCircle,0,true)endfunction IGotMeASafeXYValue(i) acceptibleDistance = 800 -- put this in here to thwart attempts at repositioning and test sanity limit --vCircX[i] = GetX(CurrentHedgehog)+250 --vCircY[i] = GetY(CurrentHedgehog)+250 vCircX[i] = GetRandom(5000) vCircY[i] = GetRandom(2000) dist = GetDistFromGearToXY(CurrentHedgehog, vCircX[i], vCircY[i]) if dist > acceptibleDistance*acceptibleDistance then return(true) else return(false) endendfunction CircleDamaged(i) res = "" vCircHealth[i] = vCircHealth[i] -1 if vCircHealth[i] <= 0 then -- circle is dead, do death effects/consequences vCircActive[i] = false if (vType[i] == "drone") then PlaySound(sndHellishImpact4) TimeLeft = TimeLeft + 4 AddCaption(loc("Time Extended!") .. "+" .. 4 .. loc("sec"), 0xff0000ff,capgrpMessage ) DrawTag(0) morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1) SetHealth(morte, 0) RK = RK + 1 if RK == 5 then RK = 0 AddCaption(loc("Drone Hunter!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2) AwardPoints(10) end elseif (vType[i] == "ammo") then AddVisualGear(vCircX[i], vCircY[i], vgtExplosion, 0, false) PlaySound(sndExplosion) PlaySound(sndShotgunReload) wepAmmo[0] = wepAmmo[0] +3 --primShotsLeft = primShotsLeft + 3 AddCaption("+" .. 3 .. " " .. loc("Ammo"), 0x00ff00ff,capgrpMessage) DrawTag(1) GK = GK + 1 if GK == 3 then GK = 0 AddCaption(loc("Ammo Maniac!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2) AwardPoints(5) end elseif (vType[i] == "bonus") then AddVisualGear(vCircX[i], vCircY[i], vgtExplosion, 0, false) PlaySound(sndExplosion) AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false) AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false) AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false) AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false) AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false) AddVisualGear(vCircX[i], vCircY[i], vgtSmoke, 0, false) PlaySound(sndVaporize) --sndWarp sndMineTick --sndSwitchHog --sndSuddenDeath shieldHealth = shieldHealth + 30 AddCaption(loc("Shield boosted! +30 power"), 0xa800ffff,capgrpMessage) if shieldHealth >= 250 then shieldHealth = 250 AddCaption(loc("Shield is fully recharged!"),0xa800ffff,capgrpMessage) end DrawTag(2) OK = OK + 1 if OK == 3 then OK = 0 AddCaption(loc("Shield Seeker!") .. " + 10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2) AwardPoints(10) end elseif (vType[i] == "blueboss") then PlaySound(sndHellishImpact3) AddCaption(loc("Boss defeated!") .. " +30 " .. loc("points") .. "!", 0x0050ffff,capgrpMessage) morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1) SetHealth(morte, 0) BK = BK + 1 if BK == 2 then BK = 0 AddCaption(loc("Boss Slayer!") .. " +25 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2) AwardPoints(25) end end AwardPoints(vCircScore[i]) AwardKills() SetUpCircle(i) res = "fatal" chainCounter = 3000 chainLength = chainLength + 1 if chainLength > 1 then AddCaption( chainLength .. "-" .. loc("Hit Combo!") .. " +" .. chainLength*2 .. " " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate) AwardPoints(chainLength*2) end else -- circle is merely damaged -- do damage effects/sounds AddVisualGear(vCircX[i], vCircY[i], vgtSteam, 0, false) r = GetRandom(4) if r == 0 then PlaySound(sndHellishImpact1) elseif r == 1 then PlaySound(sndHellishImpact2) elseif r == 2 then PlaySound(sndHellishImpact3) elseif r == 3 then PlaySound(sndHellishImpact4) end res = "non-fatal" end return(res)endfunction SetUpCircle(i) r = GetRandom(10) --r = 8 -- 80% of spawning either red/green if r <= 7 then --r = GetRandom(5) r = GetRandom(2) --r = 1 if r == 0 then --if r <= 2 then vCircCol[i] = 0xff0000ff -- red vType[i] = "drone" vCircRadMin[i] = 50 *5 vCircRadMax[i] = 90 *5 vCounterLim[i] = 150 vCircScore[i] = 10 vCircHealth[i] = 1 --else elseif r == 1 then vCircCol[i] = 0x00ff00ff -- green vType[i] = "ammo" vCircRadMin[i] = 25 *7 vCircRadMax[i] = 30 *7 vCircScore[i] = 3 vCircHealth[i] = 1 end -- 20% chance of spawning boss or bonus else r = GetRandom(5) --r = GetRandom(2) --r = 0 if r <= 1 then --if r == 0 then vCircCol[i] = 0x0050ffff -- sexy blue vType[i] = "blueboss" vCircRadMin[i] = 100*5 vCircRadMax[i] = 180*5 vCircWidth[i] = 1 vCounterLim[i] = 100 vCircScore[i] = 30 vCircHealth[i] = 3 else --elseif r == 1 then --vCircCol[i] = 0xffae00ff -- orange vCircCol[i] = 0xa800ffff -- purp vType[i] = "bonus" vCircRadMin[i] = 20 *7 vCircRadMax[i] = 40 *7 vCircScore[i] = 5 vCircHealth[i] = 1 end end -- regenerate circle xy if too close to player or until sanity limit kicks in reN = 0 --zzz = 0 while (reN < 10) do if IGotMeASafeXYValue(i) == false then reN = reN + 1 --zzz = zzz + 1 else reN = 15 end end --AddCaption("Took me this many retries: " .. zzz) -- number of times it took to work vCircRadius[i] = vCircRadMax[i] - GetRandom(vCircRadMin[i]) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], vCircWidth[i], vCircCol[i]-0x000000ff) -- - -0x000000ff g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(rCirc[i]) SetVisualGearValues(rCirc[i], 0, 0, g3, g4, g5, g6, g7, g8, g9, vCircCol[i]-0x000000ff) vCircActive[i] = true -- new --nw WriteLnToConsole("CIRC " .. i .. ": X: " .. vCircX[i] .. "; Y: " .. vCircY[i]) --nw WriteLnToConsole("CIRC " .. i .. ": dX: " .. vCircDX[i] .. "; dY: " .. vCircDY[i]) --nw WriteLnToConsole("CIRC " .. i .. ": RAD:" .. vCircRadius[i])endfunction SetMyCircles(s) CirclesAreGo = s playerIsFine = s if s == true then --nw WriteLnToConsole("About to set up all circles, old values are here:") for i = 0,(vCCount-1) do --nw WriteLnToConsole("CIRC " .. i .. ": X: " .. vCircX[i] .. "; Y: " .. vCircY[i]) --nw WriteLnToConsole("CIRC " .. i .. ": dX: " .. vCircDX[i] .. "; dY: " .. vCircDY[i]) --nw WriteLnToConsole("CIRC " .. i .. ": RAD:" .. vCircRadius[i]) end --nw WriteLnToConsole("Old values given, new values to follow...") end for i = 0,(vCCount-1) do if s == false then --vCircCol[i] = 0xffffffff vCircActive[i] = false elseif s == true then SetUpCircle(i) end endendfunction WellHeAintGonnaJumpNoMore(x,y) AddVisualGear(x, y, vgtBigExplosion, 0, false) playerIsFine = false AddCaption(loc("GOTCHA!")) PlaySound(sndExplosion) PlaySound(sndHellish) targetHit = trueend--- collision detection for weapons firefunction CheckVarious(gear) --if (GetGearType(gear) == gtExplosives) then --nw WriteLnToConsole("Start of CheckVarious(): Exp ID: " .. getGearValue(gear,"ID")) --elseif (GetGearType(gear) == gtShell) then --nw WriteLnToConsole("Start of CheckVarious(): Shell ID: " .. getGearValue(gear,"ID")) --end targetHit = false -- if circle is hit by player fire if (GetGearType(gear) == gtExplosives) then circsHit = 0 for i = 0,(vCCount-1) do --nw WriteLnToConsole("Is it neccessary to check for collision with circ " .. i) --if (vCircActive[i] == true) and ( (vType[i] == "drone") ) then --nw WriteLnToConsole("YES. about to calc distance between gtExplosives and circ " .. i) dist = GetDistFromGearToXY(gear, vCircX[i], vCircY[i]) -- calculate my real radius if I am an aura if vCircType[i] == 0 then NR = vCircRadius[i] else NR = (48/100*vCircRadius[i])/2 end if dist <= NR*NR then --nw WriteLnToConsole("Collision confirmed. The gtExplosives is within the circ radius!") dist = (GetDistFromXYtoXY(vCircX[i], vCircY[i], getGearValue(gear,"XP"), getGearValue(gear,"YP")) - (NR*NR)) --AddCaption(loc("Dist: ") .. dist .. "!",0xffba00ff,capgrpGameState) if dist >= 1000000 then sniperHits = sniperHits +1 AddCaption(loc("Sniper!") .. " +8 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) AwardPoints(8) if sniperHits == 3 then sniperHits = 0 AddCaption(loc("They Call Me Bullseye!") .. " +16 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) AwardPoints(15) end elseif dist <= 6000 then pointBlankHits = pointBlankHits +1 if pointBlankHits == 3 then pointBlankHits = 0 AddCaption(loc("Point Blank Combo!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) AwardPoints(5) end end AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) targetHit = true --DeleteGear(gear) --SetHealth(gear,0) --WriteLnToConsole("set " .. "Exp ID: " .. getGearValue(gear,"ID") .. " health to 0") --WriteLnToConsole("targetHit set to true, explosive is at distance " .. dist .. "(within range " .. NR*NR.. ") of circ" ) CircleDamaged(i) circsHit = circsHit + 1 if circsHit > 1 then AddCaption(loc("Multi-shot!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate) AwardPoints(15) circsHit = 0 end shotsHit = shotsHit + 1 end --end end -- if player is hit by circle bazooka elseif (GetGearType(gear) == gtShell) and (CurrentHedgehog ~= nil) then --or (GetGearType(gear) == gtBall) then dist = GetDistFromGearToGear(gear, CurrentHedgehog) if beam == true then if dist < 3000 then tempE = AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, true) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, 0xff00ffff ) PlaySound(sndVaporize) DeleteGear(gear) SK = SK + 1 if SK == 5 then SK = 0 AddCaption(loc("Shield Master!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo) AwardPoints(10) end end elseif dist < 1600 then WellHeAintGonnaJumpNoMore(GetX(gear), GetY(gear)) end --[[if targetHit == true then WriteLnToConsole("about to delete shell due to targetHit being set to true earlier") DeleteGear(gear) WriteLnToConsole("there, I deleted it") end]] end if targetHit == true then --nw WriteLnToConsole("about to delete something due to targetHit being set to true earlier") DeleteGear(gear) --nw WriteLnToConsole("there, I deleted it") end --nw WriteLnToConsole("End of CheckVarious()")end-- collision detection for player entering a circlefunction CheckDistances() --nw WriteLnToConsole("Start of CheckDistances()") for i = 0,(vCCount-1) do --nw WriteLnToConsole("Attempting to calculate dist of circ " .. i) g1X, g1Y = GetGearPosition(CurrentHedgehog) g2X, g2Y = vCircX[i], vCircY[i] g1X = g1X - g2X g1Y = g1Y - g2Y dist = (g1X*g1X) + (g1Y*g1Y) --DoHorribleThings(i, g1X, g1Y, g2X, g2Y, dist) --nw WriteLnToConsole("Calcs done. Dist to CurrentHedgehog is " .. dist) -- calculate my real radius if I am an aura if vCircType[i] == 0 then NR = vCircRadius[i] else NR = (48/100*vCircRadius[i])/2 end if dist <= NR*NR then if (vCircActive[i] == true) and ((vType[i] == "ammo") or (vType[i] == "bonus") ) then CircleDamaged(i) elseif (vCircActive[i] == true) and ( (vType[i] == "drone") or (vType[i] == "blueboss") ) then ss = CircleDamaged(i) WellHeAintGonnaJumpNoMore(GetX(CurrentHedgehog),GetY(CurrentHedgehog)) if ss == "fatal" then if (wepAmmo[0] == 0) and (TimeLeft <= 9) then --if (primShotsLeft == 0) and (TimeLeft <= 9) then AddCaption(loc("Kamikaze Expert!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpMessage) AwardPoints(15) elseif (wepAmmo[0] == 0) then AddCaption(loc("Depleted Kamikaze!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpMessage) AwardPoints(5) elseif TimeLeft <= 9 then AddCaption(loc("Timed Kamikaze!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage) AwardPoints(10) end end end end end --nw WriteLnToConsole("End of CheckDistances()")endfunction HandleCircles() --[[if CirclesAreGo == true then --CheckDistances() --runOnGears(CheckVarious) -- used to be in handletracking for some bizarre reason --pTimer = pTimer + 1 --if pTimer == 100 then -- pTimer = 0 -- runOnGears(ProjectileTrack) --end end]] if rAlpha ~= 255 then if GameTime%100 == 0 then rAlpha = rAlpha + 5 if rAlpha >= 255 then rAlpha = 255 end end end for i = 0,(vCCount-1) do --if (vCircActive[i] == true) then SetVisualGearValues(rCirc[i], rCircX[i], rCircY[i], 100, 255, 1, 10, 0, 40, 3, vCircCol[i]-rAlpha) --end vCounter[i] = vCounter[i] + 1 if vCounter[i] >= vCounterLim[i] then vCounter[i] = 0 if ((vType[i] == "drone") or (vType[i] == "blueboss") ) and (vCircActive[i] == true) then AddGear(vCircX[i], vCircY[i], gtShell, 0, 0, 0, 1) --WriteLnToConsole("Circle " .. i .. " just fired/added a gtShell") --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) --elseif (vType[i] == "bluebottle") and (vCircActive[i] == true) then -- AddGear(vCircX[i], vCircY[i]-vCircRadius[i], gtBall, 0, 0, 0, 1) -- AddGear(vCircX[i], vCircY[i]+vCircRadius[i], gtBall, 0, 0, 0, 1) -- AddGear(vCircX[i]-vCircRadius[i], vCircY[i], gtBall, 0, 0, 0, 1) -- AddGear(vCircX[i]+vCircRadius[i], vCircY[i], gtBall, 0, 0, 0, 1) end end if (vCircActive[i] == true) then vCircRadCounter[i] = vCircRadCounter[i] + 1 if vCircRadCounter[i] == 100 then vCircRadCounter[i] = 0 -- make my radius increase/decrease faster if I am an aura if vCircType[i] == 0 then M = 1 else M = 10 end vCircRadius[i] = vCircRadius[i] + vCircRadDir[i] if vCircRadius[i] > vCircRadMax[i] then vCircRadDir[i] = -M elseif vCircRadius[i] < vCircRadMin[i] then vCircRadDir[i] = M end -- random effect test -- maybe use this to tell the difference between circs -- you can kill by shooting or not --vgtSmoke vgtSmokeWhite --vgtSteam -- nice long trail --vgtDust -- short trail on earthrise --vgtSmokeTrace if vType[i] == "ammo" then tempE = AddVisualGear(vCircX[i], vCircY[i], vgtSmoke, 0, true) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff SetVisualGearValues(tempE, vCircX[i], vCircY[i], g3, g4, g5, g6, g7, g8, g9, vCircCol[i] ) --AddVisualGear(vCircX[i], vCircY[i], vgtDust, 0, true) elseif vType[i] == "bonus" then tempE = AddVisualGear(vCircX[i], vCircY[i], vgtDust, 0, true) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff --vCircCol[i] SetVisualGearValues(tempE, vCircX[i], vCircY[i], g3, g4, g5, g6, g7, 1, g9, 0xff00ffff ) elseif vType[i] == "blueboss" then k = 25 g = vgtSteam trailColour = 0xae00ffff -- 0xffae00ff -- orange -- 0xae00ffff -- purp tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff SetVisualGearValues(tempE, vCircX[i], vCircY[i]+k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 ) tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff SetVisualGearValues(tempE, vCircX[i]+k, vCircY[i]-k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 ) tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff SetVisualGearValues(tempE, vCircX[i]-k, vCircY[i]-k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 ) end end end end -- alter the circles velocities if GameTime%2000 == 0 then for i = 0,(vCCount-1) do -- bounce the circles off the edges if they go too far -- or make them move in random directions if vCircX[i] > 5500 then vCircDX[i] = -4 --5 circmovchange elseif vCircX[i] < -1500 then vCircDX[i] = 4 --5 circmovchange else z = GetRandom(2) if z == 1 then z = 1 else z = -1 end vCircDX[i] = vCircDX[i] + GetRandom(3)*z --3 circmovchange end if vCircY[i] > 1500 then vCircDY[i] = -4 --5 circmovchange elseif vCircY[i] < -2900 then vCircDY[i] = 4 --5 circmovchange else z = GetRandom(2) if z == 1 then z = 1 else z = -1 end vCircDY[i] = vCircDY[i] + GetRandom(3)*z --3 circmovchange end end end -- move the circles according to their current velocities --m2Count = m2Count + 1 --if m2Count == 25 then --25 circmovchange -- m2Count = 0 for i = 0,(vCCount-1) do vCircX[i] = vCircX[i] + vCircDX[i] vCircY[i] = vCircY[i] + vCircDY[i] if (CurrentHedgehog ~= nil) and (rAlpha ~= 255) then DoHorribleThings(i)--(i, g1X, g1Y, g2X, g2Y, dist) end end if (TimeLeft == 0) and (tumbleStarted == true) then FadeAlpha = FadeAlpha + 1 if FadeAlpha >= 255 then FadeAlpha = 255 end --new --if FadeAlpha == 1 then -- AddCaption("GOT IT") -- for i = 0,(vCCount-1) do -- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) -- vCircCol[i] = g10 -- end --end end -- derp if shockwaveHealth > 0 then shockwaveHealth = shockwaveHealth - 1 shockwaveRad = shockwaveRad + 80 --mrm = ((48/100*shockwaveRad)/2) --AddVisualGear(GetX(CurrentHedgehog)-mrm+GetRandom(mrm*2),GetY(CurrentHedgehog)-mrm+GetRandom(mrm*2), vgtSmoke, 0, false) end --end for i = 0,(vCCount-1) do g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) -- vCircCol[i] g10 SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], g9, g10) end if (TimeLeft == 0) or ((tumbleStarted == false)) then for i = 0,(vCCount-1) do g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) -- vCircCol[i] g10 SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], g9, (vCircCol[i]-FadeAlpha)) end end if (CurrentHedgehog ~= nil) then if beam == true then g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(pShield) --SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, g10 ) SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, 0xa800ffff-0x000000ff - -shieldHealth ) DrawTag(2) else SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 0, g9, g10 ) end if shockwaveHealth > 0 then g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(shockwave) SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, shockwaveRad, g9, 0xff3300ff-0x000000ff - -shockwaveHealth ) else SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 0, g9, g10 ) end endendfunction ProjectileTrack(gear) if (GetGearType(gear) == gtShell) then --nw WriteLnToConsole("ProjectileTrack() for Shell ID: " .. getGearValue(gear,"ID")) -- newnew if (GetGearType(gear) == gtShell) then turningSpeed = 0.1*fMod --elseif (GetGearType(gear) == gtBall) then -- turningSpeed = 0.2*fMod end dx, dy = GetGearVelocity(gear) --WriteLnToConsole("I'm trying to track currenthedge with shell ID: " .. getGearValue(gear,"ID")) --WriteLnToConsole("I just got the velocity of the shell. It is dx: " .. dx .. "; dy: " .. dy) --WriteLnToConsole("CurrentHedgehog is at X: " .. GetX(CurrentHedgehog) .. "; Y: " .. GetY(CurrentHedgehog) ) if CurrentHedgehog ~= nil then if GetX(gear) > GetX(CurrentHedgehog) then dx = dx - turningSpeed--0.1 else dx = dx + turningSpeed--0.1 end if GetY(gear) > GetY(CurrentHedgehog) then dy = dy - turningSpeed--0.1 else dy = dy + turningSpeed--0.1 end end if (GetGearType(gear) == gtShell) then dxlimit = 0.4*fMod dylimit = 0.4*fMod --elseif (GetGearType(gear) == gtBall) then -- dxlimit = 0.5 -- 0.5 is about the same -- dylimit = 0.5 -- 0.6 is faster than player end if dx > dxlimit then dx = dxlimit end if dy > dylimit then dy = dylimit end if dx < -dxlimit then dx = -dxlimit end if dy < -dylimit then dy = -dylimit end SetGearVelocity(gear, dx, dy) --WriteLnToConsole("I just SET the velocity of shell towards currenthegdge. It is now dx: " .. dx .. "; dy: " .. dy) --WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) --nw WriteLnToConsole("ProjectileTrack() finished successfully") endend