count = 0 timer = 0 score = 0 active = false broken = false function init() skeetSnd = LoadSound("skeet.ogg") machine = FindShape("machine") emitPos = GetLocationTransform(FindLocation("emit")).pos onSnd = LoadSound("clickdown.ogg") offSnd = LoadSound("clickup.ogg") startSnd = LoadSound("skeet-start.ogg") finishSnd = LoadSound("skeet-finish.ogg") scoreSnd = LoadSound("skeet-score.ogg") button = FindShape("button") end function tick(dt) if broken then return end if GetPlayerInteractShape() == button and InputPressed("interact") then if count > 0 then count = 0 active = false PlaySound(offSnd) SetTag(button, "interact", "loc@START") else count = 10 score = 0 active = true timer = 2 PlaySound(onSnd) PlaySound(startSnd) SetTag(button, "interact", "loc@STOP") end end if count > 0 then timer = timer - dt if timer <= 0 then local pos = emitPos local vel = VecScale(VecNormalize(Vec(-1.0, 0.7, math.random()-0.5)), math.random()*6+14) local t = Transform(pos) local entities = Spawn('', t) local b = entities[1] SetBodyVelocity(b, vel) SetBodyAngularVelocity(b, Vec(0, -15, 0)) SetTag(entities[2], "skeet") PlaySound(skeetSnd, pos) timer = 0.8 + math.random()*0.8 count = count - 1 end end local skeet = FindShapes("skeet", true) for i=1, #skeet do local s = skeet[i] local p = GetShapeWorldTransform(s).pos local vel = GetBodyVelocity(GetShapeBody(s)) if p[2] < 0 or VecLength(vel) < 1 then RemoveTag(s, "skeet") else if IsShapeBroken(s) then score = score + 1 PlaySound(scoreSnd) RemoveTag(s, "skeet") local mi,ma = GetShapeBounds(s) local as = QueryAabbShapes(mi, ma) for j=1, #as do local s2 = as[j] local b2 = GetShapeBody(s2) if IsBodyDynamic(b2) and GetBodyMass(b2) < 50 then Delete(b2) end end end end end if count == 0 and #skeet == 0 and active then PlaySound(finishSnd) active = false SetTag(button, "interact", "loc@START") end if IsShapeBroken(machine) or IsShapeBroken(button) then RemoveTag(button, "interact") broken = true end SetBool("level.skeet.active", active) SetInt("level.skeet.count", count) SetInt("level.skeet.score", score) end