diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Tumbler.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Tumbler.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,786 @@ +------------------------------------ +-- TUMBLER +-- v.0.7.1 +------------------------------------ + +loadfile(GetDataPath() .. "Scripts/Locale.lua")() +loadfile(GetDataPath() .. "Scripts/Tracker.lua")() + +local fMod = 1000000 -- use this for dev and .16+ games + +local leftOn = false +local rightOn = false +local upOn = false +local downOn = false +local preciseOn = false + +local wep = {} +local wepAmmo = {} +local wepCol = {} +local wepIndex = 0 +local wepCount = 0 +local fGears = 0 + +local mineSpawn +local barrelSpawn + +local roundKills = 0 +local barrelsEaten = 0 +local minesEaten = 0 + +local moveTimer = 0 +local fireTimer = 0 +local TimeLeftCounter = 0 +local TimeLeft = 0 +local stopMovement = false +local tumbleStarted = false + +local vTag = {} + +------------------------ +-- version 0.4 +------------------------ + +-- removed some old code/comments +-- removed both shell and mortar as the primary and secondary weapons +-- the primary weapon is now an explosive(barrel) + +-- added support for picking up barrels scattered about the map (backspace) +-- added support for dragging around mines (enter toggles on/off) +-- added support for primary fire being onAttackUp +-- added a trail to indicate when the player has 5s or less left to tumble +-- updated showmission to reflect changed controls and options + +------------------------ +-- version 0.5 +------------------------ + +-- changed some of the user feedback +-- i can't remember?? +-- substituted onAttackUp for onPrecise() +-- brought in line with new velocity changes + +------------------------ +-- version 0.6 +------------------------ + +-- reduced starting "ammo" +-- randomly spawn new barrels/mines on new turn +-- updated user feedback +-- better locs and coloured addcaptions +-- added tag for turntime +-- removed tractor beam +-- added two new weapons and changed ammo handling +-- health crates now give tumbler time, and wep/utility give flamer ammo +-- explosives AND mines can be picked up to increase their relative ammo +-- replaced "no weapon" selected message that hw serves +-- modified crate frequencies a bit +-- added some simple kill-based achievements, i think + +------------------------ +-- version 0.7 +------------------------ + +-- a few code optimisations/performance tweaks +-- removed some deprecated code +-- fix a potential spawn bug + +-- improved HUD (now shows ammo counts) +-- improved user feedback (less generic messages) +-- colour-coded addcaptions to match hud :) + +-- base tumbling time now equals scheme turntime +-- tumbling time extension is now based on the amount of health contained in crate +-- new mines per turn based on minesnum +-- new barrels per turn based on explosives + +-- added 2 more achievements: barrel eater and mine eater (like kills, don't do anything atm) +-- slightly increased grab distance for explosives/mines +-- slightly increased flamer velocity +-- slightly decreased flamer volume +-- added a flame vaporiser (based on number of flame gears?) +-- give tumblers an extra 47 health on the start of their tumble to counter the grenade (exp) +-- refocus camera on tumbler on newturn (not on crates, barrels etc) +-- increase delay: yes, yes, eat your hearts out + +-- commit log +-- Better HUD +-- Allow more user customization +-- Bugfix for new gear spawns +-- Performance tweaks +-- Variety of small gameplay changes + +------------------------ +-- version 0.7.1 +------------------------ + +-- redraw HUD on screen resolution change + +--------------------------- +-- some other ideas/things +--------------------------- +--[[ +-- add better gameflag handling +-- fix flamer "shots remaining" message on start or choose a standard versus % +-- add more sounds +-- better barrel/minespawn effects +-- separate grab distance for mines/barrels +-- [probably not] make barrels always explode? +-- [probably not] persistent ammo? +-- [probably not] dont hurt tumblers and restore their health at turn end? +]] + + +---------------------------------------------------------------- +---------------------------------------------------------------- + +local flames = {} +local fGearValues = {} + +function runOnflames(func) + for k, gear in ipairs(flames) do + func(gear) + end +end + +function trackFGear(gear) + table.insert(flames, gear) +end + +function trackFGearDeletion(gear) + fGearValues[gear] = nil + for k, g in ipairs(flames) do + if g == gear then + table.remove(flames, k) + break + end + end +end + +function getFGearValue(gear, key) + if fGearValues[gear] ~= nil then + return fGearValues[gear][key] + end + return nil +end + +function setFGearValue(gear, key, value) + found = false + for id, values in pairs(fGearValues) do + if id == gear then + values[key] = value + found = true + end + end + if not found then + fGearValues[gear] = { [key] = value } + end +end + +function decreaseFGearValue(gear, key) + for id, values in pairs(fGearValues) do + if id == gear then + values[key] = values[key] - 1 + end + end +end + +function HandleLife(gear) + + decreaseFGearValue(gear, "L") + if getFGearValue(gear, "L") == 0 then + AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false) + DeleteGear(gear) + end + +end + +---------------------------------------------------------------- +---------------------------------------------------------------- + +function HideTags() + + for i = 0, 3 do + SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00) + end + +end + +function DrawTag(i) + + zoomL = 1.3 + + xOffset = 40 + + if i == 0 then + yOffset = 40 + tCol = 0xffba00ff --0xffed09ff --0xffba00ff + tValue = TimeLeft + elseif i == 1 then + zoomL = 1.1 + yOffset = 70 + tCol = wepCol[0] + tValue = wepAmmo[0] + elseif i == 2 then + zoomL = 1.1 + xOffset = 40 + 35 + yOffset = 70 + tCol = wepCol[1] + tValue = wepAmmo[1] + elseif i == 3 then + zoomL = 1.1 + xOffset = 40 + 70 + yOffset = 70 + tCol = wepCol[2] + tValue = wepAmmo[2] + 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) ) + ) + +end + +function GetGearDistance(gear) + + g1X, g1Y = GetGearPosition(gear) + g2X, g2Y = GetGearPosition(CurrentHedgehog) + + q = g1X - g2X + w = g1Y - g2Y + return( (q*q) + (w*w) ) + +end + +-- add to your ammo ***WHEN YOU PUSH A KEY*** near them +-- yes that was my justification for a non generic method +function CheckProximityToExplosives(gear) + + if (GetGearDistance(gear) < 1400) then + + if (GetGearType(gear) == gtExplosives) then + + wepAmmo[0] = wepAmmo[0] + 1 + PlaySound(sndShotgunReload) + DeleteGear(gear) + AddCaption(wep[0] .. " " .. loc("ammo extended!"), wepCol[0], capgrpAmmoinfo ) + DrawTag(1) + + barrelsEaten = barrelsEaten + 1 + if barrelsEaten == 5 then + AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Barrel Eater!"),0xffba00ff,capgrpMessage2) + end + + elseif (GetGearType(gear) == gtMine) then + wepAmmo[1] = wepAmmo[1] + 1 + PlaySound(sndShotgunReload) + DeleteGear(gear) + AddCaption(wep[1] .. " " .. loc("ammo extended!"), wepCol[1], capgrpAmmoinfo ) + DrawTag(2) + + minesEaten = minesEaten + 1 + if minesEaten == 5 then + AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Mine Eater!"),0xffba00ff,capgrpMessage2) + end + + end + + else + --AddCaption("There is nothing here...") + end + +end + +-- check proximity on crates +function CheckProximity(gear) + + dist = GetGearDistance(gear) + + if (dist < 1600) and (GetGearType(gear) == gtCase) then + + if GetHealth(gear) > 0 then + + AddCaption(loc("Tumbling Time Extended!"), 0xffba00ff, capgrpMessage2 ) + + TimeLeft = TimeLeft + HealthCaseAmount --5 --5s + DrawTag(0) + --PlaySound(sndShotgunReload) + else + wepAmmo[2] = wepAmmo[2] + 800 + PlaySound(sndShotgunReload) + AddCaption(wep[2] .. " " .. loc("fuel extended!"), wepCol[2], capgrpAmmoinfo ) + DrawTag(3) + end + + DeleteGear(gear) + + end + +end + +function 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 + +--------------- +-- action keys +--------------- + +function 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 + 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) + DrawTag(1) + + elseif wep[wepIndex] == loc("Mine Deployer") then + morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtMine, 0, 0, 0, 0) + SetTimer(morte, 1000) + DrawTag(2) + end + + end + + preciseOn = true + +end + +function onPreciseUp() + preciseOn = false +end + +function onHJump() + -- pick up explosives/mines if nearby them + if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then + runOnGears(CheckProximityToExplosives) + end +end + +function onLJump() + ChangeWeapon() +end + +----------------- +-- movement keys +----------------- + +function onLeft() + if (CurrentHedgehog ~= nil) and (stopMovement == false) then + leftOn = true + end +end + +function onRight() + if (CurrentHedgehog ~= nil) and (stopMovement == false) then + rightOn = true + end +end + +function onUp() + if (CurrentHedgehog ~= nil) and (stopMovement == false) then + upOn = true + end +end + +function onDown() + if (CurrentHedgehog ~= nil) and (stopMovement == false) then + downOn = true + end +end + +function onDownUp() + downOn = false +end +function onUpUp() + upOn = false +end +function onLeftUp() + leftOn = false +end +function onRightUp() + rightOn = false +end + +-------------------------- +-- other event handlers +-------------------------- + +function onGameInit() + CaseFreq = 0 + HealthCaseProb = 0 + Delay = 1000 + + mineSpawn = MinesNum + if mineSpawn > 4 then + mineSpawn = 4 + end + + barrelSpawn = Explosives + if barrelSpawn > 4 then + barrelSpawn = 4 + end + + --MinesNum = 0 + --Explosives = 0 + + 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 = 3 + +end + +function onGameStart() + + ShowMission ( + "TUMBLER", + loc("a Hedgewars mini-game"), + loc("Eliminate the enemy hogs to win.") .. "|" .. + " " .. "|" .. + + loc("New Mines Per Turn") .. ": " .. (mineSpawn) .. "|" .. + loc("New Barrels Per Turn") .. ": " .. (barrelSpawn) .. "|" .. + loc("Time Extension") .. ": " .. (HealthCaseAmount) .. loc("sec") .. "|" .. + " " .. "|" .. + + loc("Movement: [Up], [Down], [Left], [Right]") .. "|" .. + loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" .. + loc("Change Weapon") .. ": " .. loc("[Enter]") .. "|" .. + loc("Grab Mines/Explosives") .. ": " .. loc("[Backspace]") .. "|" .. + + " " .. "|" .. + + loc("Health crates extend your time.") .. "|" .. + loc("Ammo is reset at the end of your turn.") .. "|" .. + + "", 4, 4000 + ) + +end + +function onScreenResize() + + -- redraw Tags so that their screen locations are updated + if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then + for i = 0, 3 do + DrawTag(i) + end + end + +end + +function onNewTurn() + + stopMovement = false + tumbleStarted = false + + -- randomly create new barrels mines on the map every turn (can be disabled by setting mine/barrels to 0 in scheme) + for i = 0, barrelSpawn-1 do + gear = AddGear(100, 100, gtExplosives, 0, 0, 0, 0) + SetHealth(gear, 100) + if FindPlace(gear, false, 0, LAND_WIDTH, false) ~= nil then + tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) + end + end + for i = 0, mineSpawn-1 do + gear = AddGear(100, 100, gtMine, 0, 0, 0, 0) + if FindPlace(gear, false, 0, LAND_WIDTH, false) ~= nil then + tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) + end + end + + -- randomly spawn time extension crates / flamer fuel on the map + r = GetRandom(100) + if r > 50 then + gear = SpawnHealthCrate(0, 0) + end + r = GetRandom(100) + if r > 70 then + gear = SpawnAmmoCrate(0, 0, amSkip) + end + + HideTags() + + --reset ammo counts + wepAmmo[0] = 2 + wepAmmo[1] = 1 + wepAmmo[2] = 50 -- 50000 -- 50 + wepIndex = 2 + ChangeWeapon() + + roundKills = 0 + barrelsEaten = 0 + minesEaten = 0 + + FollowGear(CurrentHedgehog) + +end + + +function DisableTumbler() + stopMovement = true + upOn = false + down = false + leftOn = false + rightOn = false + HideTags() +end + +function onGameTick() + + -- start the player tumbling with a boom once their turn has actually begun + if tumbleStarted == false then + if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then + --AddCaption(loc("Good to go!")) + tumbleStarted = true + TimeLeft = (TurnTime/1000) + AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1) + SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog) + 47) -- new + for i = 0, 3 do + DrawTag(i) + end + end + end + + if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then + + runOnGears(CheckProximity) -- crates + + -- Calculate and display turn time + TimeLeftCounter = TimeLeftCounter + 1 + if TimeLeftCounter == 1000 then + TimeLeftCounter = 0 + TimeLeft = TimeLeft - 1 + + if TimeLeft >= 0 then + DrawTag(0) + end + + end + + if TimeLeft == 0 then + DisableTumbler() + end + + -- handle movement based on IO + moveTimer = moveTimer + 1 + if moveTimer == 100 then -- 100 + moveTimer = 0 + + runOnflames(HandleLife) + + --------------- + -- 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 + tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), 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, GetClanColor(GetHogClan(CurrentHedgehog)) ) + end + -------------- + + dx, dy = GetGearVelocity(CurrentHedgehog) + + dxlimit = 0.4*fMod + dylimit = 0.4*fMod + + 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) + + end + + -- + --flamer + -- + fireTimer = fireTimer + 1 + if fireTimer == 6 then -- 5 --10 + 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) + shell = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0) + + xdev = 1 + GetRandom(25) --15 + xdev = xdev / 100 + + r = GetRandom(2) + if r == 1 then + xdev = xdev*-1 + end + + ydev = 1 + GetRandom(25) --15 + ydev = ydev / 100 + + r = GetRandom(2) + if r == 1 then + ydev = ydev*-1 + end + + --*13 --8 *-4 + SetGearVelocity(shell, (dx*4.5)+(xdev*fMod), (dy*4.5)+(ydev*fMod)) --10 + + end + + end + -- + + end + + +end + +function isATrackedGear(gear) + if (GetGearType(gear) == gtExplosives) or + (GetGearType(gear) == gtMine) or + (GetGearType(gear) == gtCase) + then + return(true) + else + return(false) + end +end + +--[[function onGearDamage(gear, damage) + if gear == CurrentHedgehog then + -- You are now tumbling + end +end]] + +function onGearAdd(gear) + + if GetGearType(gear) == gtFlame then + + trackFGear(gear) + + fGears = fGears +1 + + if fGears < 80 then + setFGearValue(gear,"L",30) + else + setFGearValue(gear,"L",5) --3 + end + + elseif isATrackedGear(gear) then + trackGear(gear) + end + +end + +function onGearDelete(gear) + + if GetGearType(gear) == gtFlame then + trackFGearDeletion(gear) + fGears = fGears -1 + + elseif isATrackedGear(gear) then + trackDeletion(gear) + + -- achievements? prototype + elseif GetGearType(gear) == gtHedgehog then + + if GetHogTeamName(gear) ~= GetHogTeamName(CurrentHedgehog) then + + roundKills = roundKills + 1 + if roundKills == 2 then + AddCaption(loc("Double Kill!"),0xffba00ff,capgrpMessage2) + elseif roundKills == 3 then + AddCaption(loc("Killing spree!"),0xffba00ff,capgrpMessage2) + elseif roundKills >= 4 then + AddCaption(loc("Unstoppable!"),0xffba00ff,capgrpMessage2) + end + + elseif gear == CurrentHedgehog then + DisableTumbler() + + elseif gear ~= CurrentHedgehog then + AddCaption(loc("Friendly Fire!"),0xffba00ff,capgrpMessage2) + end + + end + + if CurrentHedgehog ~= nil then + FollowGear(CurrentHedgehog) + end + +end + +