# HG changeset patch # User Medo # Date 1345306264 -7200 # Node ID 75ba91f14ed5d6667664fce36ef83c58c4e54289 # Parent 57d343ee382f407247e4222e0eca21e821a7c115 Hedgeroid: - Updated assets - reworked team management in a room - lower engine quality (for now) - added focus/disable states for spinner and button graphics diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Airplane.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Airplane.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/AmmoMenu/Ammos.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/AmmoMenu/Ammos.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/AmmoMenu/Ammos_bw.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/AmmoMenu/Ammos_bw.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_42.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_42.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_anarchy.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_anarchy.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_balrog.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_balrog.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_bars.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_bars.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_birdy.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_birdy.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_bloodyblade.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_bloodyblade.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_brittany.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_brittany.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_bustamove.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_bustamove.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_cog.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_cog.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_crossedswords.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_crossedswords.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_dragonrb.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_dragonrb.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_earth.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_earth.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_earth2.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_earth2.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_eyeofhorus.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_eyeofhorus.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_face.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_face.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_fcw.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_fcw.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_female.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_female.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_galaxy.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_galaxy.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_hax0r.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_hax0r.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_hurrah.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_hurrah.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_iluvu.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_iluvu.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_lips.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_lips.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_magicskull.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_magicskull.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_male.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_male.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_mog.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_mog.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_music.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_music.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pacman.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pacman.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pacman2.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pacman2.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pentagram.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pentagram.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pirate.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pirate.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pokemon.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_pokemon.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_scout.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_scout.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_shoppa.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_shoppa.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_sonic.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_sonic.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_spider.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_spider.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_star.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_star.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_swordshield.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_swordshield.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_swordshield2.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_swordshield2.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_vampire.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_vampire.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_yinyang.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Flags/cm_yinyang.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Badger.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Badger.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Cherry.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Cherry.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Duck2.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Duck2.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Earth.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Earth.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Egg.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Egg.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Flower.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Flower.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Ghost.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Ghost.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Grave.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Grave.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Plinko.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Plinko.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Rip.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Rip.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Rubberduck.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Rubberduck.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Simple.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Simple.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Statue.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/Statue.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/bp2.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/bp2.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/bubble.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/bubble.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/chest.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/chest.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/coffin.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/coffin.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/deadhog.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/deadhog.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/eyecross.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/eyecross.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/heart.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/heart.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/money.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/money.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/mouton1.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/mouton1.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/octopus.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/octopus.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/plant2.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/plant2.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/plant3.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/plant3.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/pokeball.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/pokeball.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/pyramid.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/pyramid.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/ring.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/ring.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/skull.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/skull.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/star.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Graves/star.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Hats/android.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Hats/android.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Hedgehog/amKamikaze.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Hedgehog/amKamikaze.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Hedgehog/amSineGun.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Hedgehog/amSineGun.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/LandIce.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/LandIce.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Molotov.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Molotov.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Progress.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Progress.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/RCPlane.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/RCPlane.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Snow.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Snow.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/SuddenDeath/SDFlake.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/SuddenDeath/SDFlake.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Graphics/botlevels.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/botlevels.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Locale.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Locale.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,18 @@ +-- Library for localizing strings in lua scripts + +local lang = loadfile(GetUserDataPath() .. "Locale/" .. tostring(L) .. ".lua") + +if lang ~= nil then + lang() +else + lang = loadfile(GetDataPath() .. "Locale/" .. tostring(L) .. ".lua") + if lang ~= nil then + lang() + end +end + +function loc(text) + if lang ~= nil and locale ~= nil and locale[text] ~= nil then return locale[text] + else return text + end +end diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Balanced_Random_Weapon.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Balanced_Random_Weapon.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Default +locked diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,148 @@ +loadfile(GetDataPath() .. "Scripts/Locale.lua")() +loadfile(GetDataPath() .. "Scripts/Tracker.lua")() + +local weapons = { amGrenade, amClusterBomb, amBazooka, amBee, amShotgun, amMine, amDEagle, amDynamite, amFirePunch, amWhip, amPickHammer, amBaseballBat, amMortar, amCake, amSeduction, amWatermelon, amHellishBomb, amDrill, amBallgun, amRCPlane, amSniperRifle, amMolotov, amBirdy, amBlowTorch, amGasBomb, amFlamethrower, amSMine, amKamikaze } + +-- G,C,B,B,S,M,D,D,F,W,P,B,M,C,S,W,H,D,B,R,S,M,B,B,G,F,S,K +local weapons_values = {1,1,1,2,1,1,1,2,1,1,1,2,1,3,1,3,3,2,3,3,1,1,2,1,1,2,2,1} + +local airweapons = { amAirAttack, amMineStrike, amNapalm, amDrillStrike } + +-- A,M,N,D +local airweapons_values = {2,2,2,2} + +local utilities = { amTeleport, amGirder, amSwitch, amLowGravity, amResurrector, amRope, amParachute, amJetpack, amPortalGun, amSnowball } + +-- T,G,S,L,R,R,P,J,P,S +local utilities_values = {1,2,2,1,2,2,1,2,2,2} + +function randomAmmo() + local n = 3 --"points" to be allocated on weapons + + --pick random weapon and subtract cost + local r = GetRandom(table.maxn(weapons_values)) + 1 + local picked_items = {} + table.insert(picked_items, weapons[r]) + n = n - weapons_values[r] + + + --choose any weapons or utilities to use up remaining n + + while n > 0 do + local items = {} + local items_values = {} + + for i, w in pairs(weapons_values) do + local used = false + if w <= n then + --check that this weapon hasn't been given already + for j, k in pairs(picked_items) do + if weapons[i] == k then + used = true + end + end + if not used then + table.insert(items_values, w) + table.insert(items, weapons[i]) + end + end + end + + for i, w in pairs(utilities_values) do + local used = false + if w <= n then + --check that this weapon hasn't been given already + for j, k in pairs(picked_items) do + if utilities[i] == k then + used = true + end + end + if not used then + table.insert(items_values, w) + table.insert(items, utilities[i]) + end + end + end + + local r = GetRandom(table.maxn(items_values)) + 1 + table.insert(picked_items, items[r]) + n = n - items_values[r] + end + + return picked_items +end + +function assignAmmo(hog) + local name = GetHogTeamName(hog) + local processed = getTeamValue(name, "processed") + if processed == nil or not processed then + local ammo = getTeamValue(name, "ammo") + if ammo == nil then + ammo = randomAmmo() + setTeamValue(name, "ammo", ammo) + end + for i, w in pairs(ammo) do + AddAmmo(hog, w) + end + setTeamValue(name, "processed", true) + end +end + +function reset(hog) + setTeamValue(GetHogTeamName(hog), "processed", false) +end + +function onGameInit() + GameFlags = band(bor(GameFlags, gfResetWeps), bnot(gfPerHogAmmo)) + Goals = loc("Each turn you get 1-3 random weapons") +end + +function onGameStart() + trackTeams() + if MapHasBorder() == false then + for i, w in pairs(airweapons) do + table.insert(weapons, w) + end + for i, w in pairs(airweapons_values) do + table.insert(weapons_values, w) + end + end +end + +function onAmmoStoreInit() + SetAmmo(amSkip, 9, 0, 0, 0) + + SetAmmo(amExtraDamage, 0, 1, 0, 1) + SetAmmo(amInvulnerable, 0, 1, 0, 1) + SetAmmo(amExtraTime, 0, 1, 0, 1) + SetAmmo(amLaserSight, 0, 1, 0, 1) + SetAmmo(amVampiric, 0, 1, 0, 1) + + for i, w in pairs(utilities) do + SetAmmo(w, 0, 0, 0, 1) + end + + for i, w in pairs(weapons) do + SetAmmo(w, 0, 0, 0, 1) + end + + for i, w in pairs(airweapons) do + SetAmmo(w, 0, 0, 0, 1) + end +end + +function onNewTurn() + runOnGears(assignAmmo) + runOnGears(reset) + setTeamValue(GetHogTeamName(CurrentHedgehog), "ammo", nil) +end + +function onGearAdd(gear) + if GetGearType(gear) == gtHedgehog then + trackGear(gear) + end +end + +function onGearDelete(gear) + trackDeletion(gear) +end diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Capture_the_Flag.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Capture_the_Flag.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Default +Default diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Capture_the_Flag.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Capture_the_Flag.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,630 @@ +--------------------------------------- +-- CAPTURE_THE_FLAG GAMEPLAY MODE 0.5 +-- by mikade +--------------------------------------- + +-- Version History +--------- +-- 0.1 +--------- + +-- [conversion from map-dependant CTF_Blizzard to map independant Capture the Flag] +-- added an intial starting stage where flagspawn is decided by the players (weapon set will require a jetpack unless I set) +-- changed the flag from a crate to a visual gear, and all associated methods and checks relating to flags (five hours later, lol) +-- changed starting/respawning positioning to accommodate different map sizes +-- added another circle to mark flag spawn +-- added gameFlag filter +-- changed scoring feedback +-- cleaned up some code + +-- removing own flag from spawning point no longer possible +-- destroying flags no longer possible. +-- added basic glowing circle effect to spawn area +-- added expanding circle to fgear itself + +-- removed teleporters +-- removed random crate drops (this should be decided by scheme) +-- removed set map criteria like minesNum, turnTime, explosives etc. except for sudden death +-- removed weapon defintions +-- removed placement and respawning methods, hopefully divideTeams will have this covered + +--------- +-- 0.2 +--------- + +-- [now with user friendliness] +-- flag is now placed wherever you end up at the end of your first turn, this ensures that it is always placed by turn 3 +-- removed a bunch of backup code and no-longer needed variables / methods from CTF_Blizzard days +-- removed an aura that was still mistakenly hanging about +-- added an in-game note about placements +-- added an in-game note about the rules of the game +-- added translation support and loc()'ed everything +-- changed things so the seed is no longer always the same... + +-- In this version: +--------- +-- 0.3 +--------- +-- [fufufufu kamikaze fix] +-- added nill checks to make sure the player doesn't generate errors by producing a nil value in hhs[] when he uses kamikaze +-- added a check to make sure the player doesn't kamikaze straight down and make the flag's starting point underwater +-- added a check to make sure the player drops the flag if he has it and he uses kamikaze + +-------- +-- 0.4 +-------- + +-- remove user-branding and version numbers +-- removed some stuff that wasn't needed +-- fix piano strike exploit +-- changed delay to allow for better portals +-- changed starting feedback a little +-- increased the radius around the circle indicating the flag thief so that it doesn't obscure his health + +-------- +-- 0.5 +-------- + +-- add support for more players +-- allow limited sudden death +-- stop TimeBox ruining my life +-- profit??? + +----------------- +--SCRIPT BEGINS +----------------- + +-- enable awesome translaction support so we can use loc() wherever we want +loadfile(GetDataPath() .. "Scripts/Locale.lua")() + +--------------------------------------------------------------- +----------lots of bad variables and things +----------because someone is too lazy +----------to read about tables properly +------------------ "Oh well, they probably have the memory" + +local gameStarted = false +local gameTurns = 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 teamSize = {} -- store how many hogs per team +local teamIndex = {} -- at what point in the hhs{} does each team begin + +------------------- +-- flag variables +------------------- + +local fPlaced = {} -- has the flag been placed TRUE/FALSE + +local fGear = {} -- pointer to the visual gears that represent the flag +local fGearX = {} +local fGearY = {} + +local fThief = {} -- pointer to the hogs who stole the flags +local fIsMissing = {} -- have the flags been destroyed or captured +local fNeedsRespawn = {} -- do the flags need to be respawned +local fCaptures = {} -- the team "scores" how many captures +local fSpawnX = {} -- spawn X for flags +local fSpawnY = {} -- spawn Y for flags + +local fThiefX = {} +local fThiefY = {} +local FTTC = 0 -- flag thief tracker counter + +local fSpawnC = {} -- spawn circle marker +local fCirc = {} -- flag/carrier marker circles +local fCol = {} -- colour of the clans + +local fGearRad = 0 +local fGearRadMin = 5 +local fGearRadMax = 33 +local fGearTimer = 0 + +------------------------ +--flag methods +------------------------ + +function CheckScore(teamID) + + if teamID == 0 then + alt = 1 + elseif teamID == 1 then + alt = 0 + end + + if fCaptures[teamID] == 3 then + for i = 0, (numhhs-1) do + if hhs[i] ~= nil then + if GetHogClan(hhs[i]) == alt then + SetEffect(hhs[i], heResurrectable, false) + SetHealth(hhs[i],0) + end + end + end + if CurrentHedgehog ~= nil then + ShowMission(loc("GAME OVER!"), loc("Victory for the ") .. GetHogTeamName(CurrentHedgehog), loc("Hooray!"), 0, 0) + end + end + +end + +function DoFlagStuff(gear) + + if (gear == fGear[0]) then + wtf = 0 + bbq = 1 + elseif (gear == fGear[1]) then + wtf = 1 + bbq = 0 + end + + -- player has successfully captured the enemy flag + if (GetHogClan(CurrentHedgehog) == wtf) and (CurrentHedgehog == fThief[bbq]) and (fIsMissing[wtf] == false) then + + DeleteVisualGear(fGear[wtf]) + fGear[wtf] = nil -- the flag has now disappeared + + fIsMissing[wtf] = false + fNeedsRespawn[wtf] = true + fIsMissing[bbq] = false + fNeedsRespawn[bbq] = true + fCaptures[wtf] = fCaptures[wtf] +1 + ShowMission(loc("You have SCORED!!"), GetHogTeamName(CurrentHedgehog) .. ": " .. fCaptures[wtf], loc("Opposing Team: ") .. fCaptures[bbq], 0, 0) + PlaySound(sndVictory) + fThief[bbq] = nil -- player no longer has the enemy flag + CheckScore(wtf) + + --if the player is returning the flag + elseif (GetHogClan(CurrentHedgehog) == wtf) and (fIsMissing[wtf] == true) then + + DeleteVisualGear(fGear[wtf]) + fGear[wtf] = nil -- the flag has now disappeared + + fNeedsRespawn[wtf] = true + HandleRespawns() -- this will set fIsMissing[wtf] to false :) + AddCaption(loc("Flag returned!")) + + --if the player is taking the enemy flag + elseif GetHogClan(CurrentHedgehog) == bbq then + + DeleteVisualGear(fGear[wtf]) + fGear[wtf] = nil -- the flag has now disappeared + + fIsMissing[wtf] = true + for i = 0,numhhs-1 do + if CurrentHedgehog ~= nil then + if CurrentHedgehog == hhs[i] then + fThief[wtf] = hhs[i] + end + end + end + AddCaption(loc("Flag captured!")) + + end + +end + +function CheckFlagProximity() + + for i = 0, 1 do + if fGear[i] ~= nil then + + g1X = fGearX[i] + g1Y = fGearY[i] + + g2X, g2Y = GetGearPosition(CurrentHedgehog) + + q = g1X - g2X + w = g1Y - g2Y + dist = (q*q) + (w*w) + + if dist < 500 then --1600 + DoFlagStuff(fGear[i]) + end + end + end + +end + + +function HandleRespawns() + + for i = 0, 1 do + + if fNeedsRespawn[i] == true then + fGear[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) + fGearX[i] = fSpawnX[i] + fGearY[i] = fSpawnY[i] + + fNeedsRespawn[i] = false + fIsMissing[i] = false -- new, this should solve problems of a respawned flag being "returned" when a player tries to score + AddCaption(loc("Flag respawned!")) + end + + end + +end + + +function FlagThiefDead(gear) + + if (gear == fThief[0]) then + wtf = 0 + bbq = 1 + elseif (gear == fThief[1]) then + wtf = 1 + bbq = 0 + end + + if fThief[wtf] ~= nil then + -- falls into water + --ShowMission(LAND_HEIGHT, fThiefY[wtf], (LAND_HEIGHT - fThiefY[wtf]), 0, 0) + if (LAND_HEIGHT - fThiefY[wtf]) < 15 then + fIsMissing[wtf] = true + fNeedsRespawn[wtf] = true + HandleRespawns() + else --normally + fGearX[wtf] = fThiefX[wtf] + fGearY[wtf] = fThiefY[wtf] + fGear[wtf] = AddVisualGear(fGearX[wtf],fGearY[wtf],vgtCircle,0,true) + end + + AddVisualGear(fThiefX[wtf], fThiefY[wtf], vgtBigExplosion, 0, false) + fThief[wtf] = nil + end + +end + +function HandleCircles() + + fGearTimer = fGearTimer + 1 + if fGearTimer == 50 then + fGearTimer = 0 + fGearRad = fGearRad + 1 + if fGearRad > fGearRadMax then + fGearRad = fGearRadMin + end + end + + for i = 0, 1 do + + --SetVisualGearValues(fSpawnC[i], fSpawnX[i],fSpawnY[i], 20, 200, 0, 0, 100, 50, 3, fCol[i]) -- draw a circ for spawning area + + if fIsMissing[i] == false then -- draw a flag marker at the flag's spawning place + SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], 20, 20, 0, 10, 0, 33, 3, fCol[i]) + if fGear[i] ~= nil then -- draw the flag gear itself + SetVisualGearValues(fGear[i], fSpawnX[i],fSpawnY[i], 20, 200, 0, 0, 100, fGearRad, 2, fCol[i]) + end + elseif (fIsMissing[i] == true) and (fNeedsRespawn[i] == false) then + if fThief[i] ~= nil then -- draw circle round flag carrier -- 33 + SetVisualGearValues(fCirc[i], fThiefX[i], fThiefY[i], 20, 200, 0, 0, 100, 50, 3, fCol[i]) + --AddCaption("circle marking carrier") + elseif fThief[i] == nil then -- draw cirle round dropped flag + --g1X,g1Y,g4,g5,g6,g7,g8,g9,g10,g11 = GetVisualGearValues(fGear[i]) + --SetVisualGearValues(fCirc[i], g1X, g1Y, 20, 200, 0, 0, 100, 33, 2, fCol[i]) + SetVisualGearValues(fCirc[i], fGearX[i], fGearY[i], 20, 200, 0, 0, 100, 33, 3, fCol[i]) + --AddCaption('dropped circle marker') + if fGear[i] ~= nil then -- flag gear itself + --SetVisualGearValues(fGear[i], g1X, g1Y, 20, 200, 0, 0, 100, 10, 4, fCol[i]) + SetVisualGearValues(fGear[i], fGearX[i], fGearY[i], 20, 200, 0, 0, 100, fGearRad, 2, fCol[i]) + --AddCaption('dropped flag itself') + end + end + end + + if fNeedsRespawn[i] == true then -- if the flag has been destroyed, no need for a circle + SetVisualGearValues(fCirc[i], fSpawnX[i],fSpawnY[i], 20, 200, 0, 0, 100, 0, 0, fCol[i]) + --AddCaption("needs respawn = true. flag 'destroyed'?") + end + end + +end + +------------------------ +-- general methods +------------------------ + +function CheckDistance(gear1, gear2) + + g1X, g1Y = GetGearPosition(gear1) + g2X, g2Y = GetGearPosition(gear2) + + g1X = g1X - g2X + g1Y = g1Y - g2Y + z = (g1X*g1X) + (g1Y*g1Y) + + dist = z + + return dist + +end + +function RebuildTeamInfo() + + + -- make a list of individual team names + for i = 0, (TeamsCount-1) do + teamNameArr[i] = i + teamSize[i] = 0 + teamIndex[i] = 0 + 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 + 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 + +function StartTheGame() + + gameStarted = true + AddCaption(loc("Game Started!")) + + for i = 0, 1 do + + -- if someone uses kamikaze downwards, this can happen as the hog won't respawn + if (LAND_HEIGHT - fSpawnY[i]) < 0 then + tempG = AddGear(0, 0, gtTarget, 0, 0, 0, 0) + FindPlace(tempG, true, 0, LAND_WIDTH, true) + fSpawnX[i], fSpawnY[i] = GetGearPosition(tempG) + DeleteGear(tempG) + end + + fGear[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) + fCirc[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) + fSpawnC[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) + + fGearX[i] = fSpawnX[i] + fGearY[i] = fSpawnY[i] + + fCol[i] = GetClanColor(i) + fIsMissing[i] = false + fNeedsRespawn[i] = false + fCaptures[i] = 0 + + --SetVisualGearValues(zxc, 1000,1000, 20, 100, 0, 10, 1, 100, 5, GetClanColor(0)) + + SetVisualGearValues(fSpawnC[i], fSpawnX[i],fSpawnY[i], 20, 100, 0, 10, 0, 75, 5, fCol[i]) + + end + +end + +------------------------ +-- game methods +------------------------ + +function onGameInit() + + GameFlags = band(bor(GameFlags, gfDivideTeams), bnot(gfKing + gfForts)) + --SuddenDeathTurns = 999 -- suddendeath is off, effectively + WaterRise = 0 + Delay = 10 + +end + + +function onGameStart() + + --ShowMission(loc(caption), loc(subcaption), loc(goal), 0, 0) + ShowMission(loc("CAPTURE THE FLAG"), loc("Flags, and their home base will be placed where each team ends their first turn."), "", 0, 0) + + RebuildTeamInfo() + + -- should gfDivideTeams do this automatically? + --[[for i = 0, (TeamsCount-1) do + for g = teamIndex[i], (teamIndex[i]+teamSize[i]-1) do + if GetHogClan(hhs[g]) == 0 then + FindPlace(hhs[g], false, 0, LAND_WIDTH/2) + elseif GetHogClan(hhs[g]) == 1 then + FindPlace(hhs[g], false, LAND_WIDTH/2, LAND_WIDTH) + end + end + end]] + + fPlaced[0] = false + fPlaced[1] = false + + --zxc = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) + + + --SetVisualGearValues(zxc, 1000,1000, 20, 255, 1, 10, 0, 200, 1, GetClanColor(0)) + --minO,max0 -glowyornot --pulsate timer -- fuckall -- radius -- width -- colour +end + + +function onNewTurn() + + gameTurns = gameTurns + 1 + + if lastTeam ~= GetHogTeamName(CurrentHedgehog) then + lastTeam = GetHogTeamName(CurrentHedgehog) + end + + --AddCaption("Handling respawns") + if gameStarted == true then + HandleRespawns() + --new method of placing starting flags + elseif gameTurns == 1 then + ShowMission(loc("CAPTURE THE FLAG"), loc("Flags, and their home base will be placed where each team ends their first turn."), "", 0, 0) + elseif gameTurns == 2 then + fPlaced[0] = true + ShowMission(loc("CAPTURE THE FLAG"), loc("RULES OF THE GAME [Press ESC to view]"), loc(" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"), 0, 0) + elseif gameTurns == 3 then + fPlaced[1] = true + StartTheGame() + end + +end + +function onGameTick() + + -- onRessurect calls AFTER you have resurrected, + -- so keeping track of x,y a few milliseconds before + -- is useful + --FTTC = FTTC + 1 + --if FTTC == 100 then + -- FTTC = 0 + for i = 0,1 do + if fThief[i] ~= nil then + fThiefX[i] = GetX(fThief[i]) + fThiefY[i] = GetY(fThief[i]) + end + end + --end + + -- things we wanna check often + if (CurrentHedgehog ~= nil) then + --AddCaption(LAND_HEIGHT - GetY(CurrentHedgehog)) + --AddCaption(GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog)) + --CheckTeleporters() + + end + + if gameStarted == true then + HandleCircles() + if CurrentHedgehog ~= nil then + CheckFlagProximity() + end + elseif CurrentHedgehog ~= nil then -- if the game hasn't started yet, keep track of where we are gonna put the flags on turn end + + if GetHogClan(CurrentHedgehog) == 0 then + i = 0 + elseif GetHogClan(CurrentHedgehog) == 1 then + i = 1 + end + + fSpawnX[i] = GetX(CurrentHedgehog) + fSpawnY[i] = GetY(CurrentHedgehog) + + end + +end + +function onGearResurrect(gear) + + --AddCaption("A gear has been resurrected!") + + -- mark the flag thief as dead if he needed a respawn + for i = 0,1 do + if gear == fThief[i] then + FlagThiefDead(gear) + end + end + + -- should be covered by gfDivideTeams, actually + -- place hogs belonging to each clan either left or right side of map + --if GetHogClan(gear) == 0 then + -- FindPlace(gear, false, 0, LAND_WIDTH/2) + --elseif GetHogClan(gear) == 1 then + -- FindPlace(gear, false, LAND_WIDTH/2, LAND_WIDTH) + --end + + AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) + +end + +function InABetterPlaceNow(gear) + for i = 0, (numhhs-1) do + if gear == hhs[i] then + + for i = 0,1 do + if gear == fThief[i] then + FlagThiefDead(gear) + end + end + hhs[i] = nil + end + end +end + +function onHogHide(gear) + InABetterPlaceNow(gear) +end + +function onHogRestore(gear) + match = false + for i = 0, (numhhs-1) do + if (hhs[i] == nil) and (match == false) then + hhs[i] = gear + --AddCaption(GetHogName(gear) .. " has reappeared it seems!") + match = true + end + end +end + + +function onGearAdd(gear) + + if GetGearType(gear) == gtHedgehog then + hhs[numhhs] = gear + numhhs = numhhs + 1 + SetEffect(gear, heResurrectable, true) + + elseif GetGearType(gear) == gtPiano then + + for i = 0, 1 do + if CurrentHedgehog == fThief[i] then + FlagThiefDead(gear) + end + end + + end + +end + +function onGearDelete(gear) + + if GetGearType(gear) == gtHedgehog then + InABetterPlaceNow(gear) + end + +end diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Highlander.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Highlander.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Default +Default diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Highlander.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Highlander.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,233 @@ +-------------------------------- +-- HIGHLANDER / HOGS OF WAR +-- version 0.3c +-- by mikade +-------------------------------- + +----------- +--0.1 +----------- + +-- concept test + +----------- +--0.2 +----------- + +-- remove tardis till Henek fixes his tracker +-- change wep crates to health crates +-- reset arb turntimevalue +-- include randomOrder +-- Until fixed .17 methods come out, remove switches and resurrector +-- on request, removed kamikaze and piano weapons +-- provisional fixing of bugs that can't actually be fixed yet + +----------- +--0.3 +----------- + +-- meh, update incorrect display +-- may change this in the future to have switches +-- but for now people are used to it without, so~ + +-- mudball is now counted as a utility + +----------- +--0.3b +----------- + +-- cleaned up code and got rid of unneccessary vars +-- mudball is a weapon again +-- landgun is now a utility +-- extra time, vampirism utility removed +-- hammer wep removed +-- all hogs have kamikaze + +----------- +--0.3c +----------- + +-- restructured some code +-- added napalm (whoops) to list of possible weapons you can get +-- hogs no longer recieve airstrike-related weps on border maps + +loadfile(GetDataPath() .. "Scripts/Locale.lua")() +loadfile(GetDataPath() .. "Scripts/Tracker.lua")() + +local airWeapons = {amAirAttack, amMineStrike, amNapalm, amDrillStrike --[[,amPiano]]} + +local atkArray = { + amBazooka, amBee, amMortar, amDrill, --[[amSnowball,]] + amGrenade, amClusterBomb, amMolotov, amWatermelon, amHellishBomb, amGasBomb, + amShotgun, amDEagle, amFlamethrower, amSniperRifle, amSineGun, + amFirePunch, amWhip, amBaseballBat, --[[amKamikaze,]] amSeduction, --[[amHammer,]] + amMine, amDynamite, amCake, amBallgun, amRCPlane, amSMine, + amRCPlane, amSMine, + amBirdy + } + +local utilArray = { + amBlowTorch, amPickHammer, amGirder, amPortalGun, + amRope, amParachute, amTeleport, amJetpack, + amInvulnerable, amLaserSight, --[[amVampiric,]] + amLowGravity, amExtraDamage, --[[amExtraTime,]] + amLandGun + --[[,amTardis, amResurrector, amSwitch]] + } + +local wepArray = {} + +local currName +local lastName +local started = false +local switchStage = 0 + +function StartingSetUp(gear) + + for i = 1, #wepArray do + setGearValue(gear,wepArray[i],0) + end + + setGearValue(gear,amKamikaze,1) + + i = 1 + GetRandom(#atkArray) + setGearValue(gear,atkArray[i],1) + + i = 1 + GetRandom(#utilArray) + setGearValue(gear,utilArray[i],1) + + SetHealth(gear, 100) + +end + +--[[function SaveWeapons(gear) + + - + for i = 1, (#wepArray) do + setGearValue(gear, wepArray[i], GetAmmoCount(gear, wepArray[i]) ) + --AddAmmo(gear, wepArray[i], getGearValue(gear,wepArray[i]) ) + end + +end]] + +function ConvertValues(gear) + + for i = 1, #wepArray do + AddAmmo(gear, wepArray[i], getGearValue(gear,wepArray[i]) ) + end + + +end + + +function TransferWeps(gear) + + if CurrentHedgehog ~= nil then + + for i = 1, #wepArray do + val = getGearValue(gear,wepArray[i]) + if val ~= 0 then + setGearValue(CurrentHedgehog, wepArray[i], val) + AddAmmo(CurrentHedgehog, wepArray[i], val) + end + end + + end + +end + +function onGameInit() + GameFlags = gfInfAttack + gfRandomOrder + HealthCaseProb = 100 +end + +function onGameStart() + + + ShowMission ( + loc("HIGHLANDER"), + loc("Not all hogs are born equal."), + + "- " .. loc("Eliminate enemy hogs and take their weapons.") .. "|" .. + "- " .. loc("Per-Hog Ammo") .. "|" .. + "- " .. loc("Weapons reset.") .. "|" .. + "- " .. loc("Unlimited Attacks") .. "|" .. + "", 4, 4000 + ) + + if MapHasBorder() == false then + for i, w in pairs(airWeapons) do + table.insert(atkArray, w) + end + end + + for i, w in pairs(atkArray) do + table.insert(wepArray, w) + end + + for i, w in pairs(utilArray) do + table.insert(wepArray, w) + end + + runOnGears(StartingSetUp) + runOnGears(ConvertValues) + + +end + +function onNewTurn() +-- +end + + +function onGameTick20() + + if (CurrentHedgehog ~= nil) then + + currName = GetHogName(CurrentHedgehog) + + if (currName ~= lastName) then + AddCaption(loc("Switched to ") .. currName .. "!") + ConvertValues(CurrentHedgehog) + end + + lastName = currName + end + +end + +--[[function onHogHide(gear) + -- waiting for Henek +end + +function onHogRestore(gear) + -- waiting for Henek +end]] + +function onGearAdd(gear) + + --if GetGearType(gear) == gtSwitcher then + -- SaveWeapons(CurrentHedgehog) + --end + + if (GetGearType(gear) == gtHedgehog) then + trackGear(gear) + end + +end + +function onGearDelete(gear) + + if (GetGearType(gear) == gtHedgehog) then --or (GetGearType(gear) == gtResurrector) then + TransferWeps(gear) + trackDeletion(gear) + end + +end + +function onAmmoStoreInit() + SetAmmo(amSkip, 9, 0, 0, 0) + SetAmmo(amKamikaze, 9, 0, 0, 0) + --SetAmmo(amSwitch, 9, 0, 0, 0) -------1 +end + diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/No_Jumping.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/No_Jumping.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Default +Default diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/No_Jumping.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/No_Jumping.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,34 @@ +-------------------------------- +-- NO JUMPING +-------------------------------- + +loadfile(GetDataPath() .. "Scripts/Locale.lua")() + +local specialGear = nil + +function onGameInit() + Goals = loc("Jumping is disabled") +end + +function onNewTurn() + SetInputMask(band(0xFFFFFFFF, bnot(gmLJump + gmHJump))) +end + +function onGearAdd(gear) + + if (GetGearType(gear) == gtJetpack) or (GetGearType(gear) == gtRope) or (GetGearType(gear) == gtParachute) then + specialGear = gear + SetInputMask(band(0xFFFFFFFF, bnot(gmHJump))) + end + +end + +function onGearDelete(gear) + + if (GetGearType(gear) == gtJetpack) or (GetGearType(gear) == gtRope) or (GetGearType(gear) == gtParachute) then + specialGear = nil + SetInputMask(band(0xFFFFFFFF, bnot(gmLJump + gmHJump))) + end + +end + diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Racer.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Racer.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Shoppa +Shoppa diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Racer.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Racer.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,700 @@ + +------------------------------------------ +-- 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 +----------------------------- + +loadfile(GetDataPath() .. "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, false) + 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, false) + 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, true) + 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]] + + diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Random_Weapon.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Random_Weapon.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Default +locked diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Random_Weapon.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Random_Weapon.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,113 @@ +-- Random Weapons, example for gameplay scripts + +-- Load the library for localisation ("loc" function) +loadfile(GetDataPath() .. "Scripts/Locale.lua")() + +-- Load the gear tracker +loadfile(GetDataPath() .. "Scripts/Tracker.lua")() + +-- List of available weapons +local weapons = { amGrenade, amClusterBomb, amBazooka, amBee, amShotgun, + amMine, amDEagle, amDynamite, amFirePunch, amWhip, amPickHammer, + amBaseballBat, amTeleport, amMortar, amCake, amSeduction, + amWatermelon, amHellishBomb, amDrill, amBallgun, amRCPlane, + amSniperRifle, amMolotov, amBirdy, amBlowTorch, amGasBomb, + amFlamethrower, amSMine, amHammer } + +-- List of weapons that attack from the air +local airweapons = { amAirAttack, amMineStrike, amNapalm, amDrillStrike } + +-- Function that assigns the team their weapon +function assignAmmo(hog) + -- Get name of the current team + local name = GetHogTeamName(hog) + -- Get whither the team has been processed + local processed = getTeamValue(name, "processed") + -- If it has not, process it + if processed == nil or not processed then + -- Get the ammo for this hog's team + local ammo = getTeamValue(name, "ammo") + -- If there is no ammo, get a random one from the list and store it + if ammo == nil then + ammo = weapons[GetRandom(table.maxn(weapons)) + 1] + setTeamValue(name, "ammo", ammo) + end + -- Add the ammo for the hog + AddAmmo(hog, ammo) + -- Mark as processed + setTeamValue(name, "processed", true) + end +end + +-- Mark team as not processed +function reset(hog) + setTeamValue(GetHogTeamName(hog), "processed", false) +end + +function onGameInit() + -- Limit flags that can be set, but allow game schemes to be used + GameFlags = band(bor(GameFlags, gfResetWeps), bnot(gfInfAttack)) + -- Set a custom game goal that will show together with the scheme ones + Goals = loc("Each turn you get one random weapon") +end + +function onGameStart() + -- Initialize the tracking of hogs and teams + trackTeams() + -- Add air weapons to the game if the border is not active + if MapHasBorder() == false then + for i, w in pairs(airweapons) do + table.insert(weapons, w) + end + end +end + +function onAmmoStoreInit() + -- Allow skip at all times + SetAmmo(amSkip, 9, 0, 0, 0) + + -- Let utilities be available through crates + SetAmmo(amParachute, 0, 1, 0, 1) + SetAmmo(amGirder, 0, 1, 0, 2) + SetAmmo(amSwitch, 0, 1, 0, 1) + SetAmmo(amLowGravity, 0, 1, 0, 1) + SetAmmo(amExtraDamage, 0, 1, 0, 1) + SetAmmo(amInvulnerable, 0, 1, 0, 1) + SetAmmo(amExtraTime, 0, 1, 0, 1) + SetAmmo(amLaserSight, 0, 1, 0, 1) + SetAmmo(amVampiric, 0, 1, 0, 1) + SetAmmo(amJetpack, 0, 1, 0, 1) + SetAmmo(amPortalGun, 0, 1, 0, 1) + SetAmmo(amResurrector, 0, 1, 0, 1) + + -- Allow weapons to be used + for i, w in pairs(weapons) do + SetAmmo(w, 0, 0, 0, 1) + end + + -- Allow air weapons to be used + for i, w in pairs(airweapons) do + SetAmmo(w, 0, 0, 0, 1) + end +end + +function onNewTurn() + -- Give every team their weapons, so one can plan during anothers turn + runOnGears(assignAmmo) + -- Mark all teams as not processed + runOnGears(reset) + -- Set the current teams weapons to nil so they will get new after the turn has ended + setTeamValue(GetHogTeamName(CurrentHedgehog), "ammo", nil) +end + +function onGearAdd(gear) + -- Catch hedgehogs for the tracker + if GetGearType(gear) == gtHedgehog then + trackGear(gear) + end +end + +function onGearDelete(gear) + -- Remove hogs that are gone + trackDeletion(gear) +end diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Space_Invasion.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Space_Invasion.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Default +Default diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Space_Invasion.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Space_Invasion.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2435 @@ + +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 desync +local fMod = 1000000 -- use this for dev and .16+ games + +-- some console stuff +local shellID = 0 +local explosivesID = 0 + +-- gaudyRacer +local boosterOn = false +local roundLimit = 3 -- no longer set here (see version history) +local roundNumber = 0 +local firstClan = 10 +local gameOver = false +local gameBegun = false + +local bestClan = 10 +local bestScore = 0 +local sdScore = {} +local sdName = {} +local sdKills = {} + +local roundN = 0 +local lastRound +local RoundHasChanged = true + +-------------------------- +-- hog and team tracking variales +-------------------------- + +local numhhs = 0 +local hhs = {} + +local numTeams +local 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 = 0 +local RK = 0 +local GK = 0 +local BK = 0 +local OK = 0 +local SK = 0 +local shieldMiser = true +local fierceComp = false +local chainCounter = 0 +local chainLength = 0 +local shotsFired = 0 +local shotsHit = 0 +local SurfTime = 0 +local sniperHits = 0 +local pointBlankHits = 0 +--------------------- +-- tumbler goods +--------------------- + +local leftOn = false +local rightOn = false +local upOn = false +local downOn = false + +---------------- +-- TUMBLER +local wep = {} +local wepAmmo = {} +local wepCol = {} +local wepIndex = 0 +local wepCount = 0 +local fireTimer = 0 +---------------- + + + +local primShotsMax = 5 +local primShotsLeft = 0 + +local TimeLeft = 0 +local stopMovement = false +local tumbleStarted = false + +local beam = false +local pShield +local shieldHealth + +local shockwave +local shockwaveHealth = 0 +local shockwaveRad = 300 + +local vTag = {} + +----------------------------------------------- +-- CIRCLY GOODIES +----------------------------------------------- + +local CirclesAreGo = false +local playerIsFine = true +local targetHit = false + +local FadeAlpha = 0 -- used to fade the circles out gracefully when player dies +local pTimer = 0 -- tracking projectiles following player + +--local m2Count = 0 -- handle speed of circs + +local vCirc = {} +local vCCount = 0 + +local rCirc = {} +local rCircX = {} +local rCircY = {} +local rAlpha = 255 +local radShotsLeft = 0 + +local vCircActive = {} +local vCircHealth = {} +local vType = {} +local vCounter = {} -- how often this circ gets to "fire" etc +local vCounterLim = {} -- when vCounter == vCounterLim circle performs its special +local vCircScore = {} -- how many points killing this invader gives + +local 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) + end + +end + +function 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) ) + ) + +end + +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] = 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 + + end + +end + +-- control +function AwardPoints(p) + + for i = 0,(TeamsCount-1) do + if teamClan[i] == GetHogClan(CurrentHedgehog) then + teamScore[i] = teamScore[i] + p + end + end + +end + +function 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 + end + +end + +----------------- + +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 + + return + +end + +----------------- + +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) + +end + +function 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 + end +end + +-- gaudy racer +function 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() + end + +end + + +---------------------------------------- +-- 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) + end +end + +function 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) + + +end + +function 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) + + end + +end + +-- this prevents ugly barrel clipping sounds when a barrel flies off map limits +function 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 + + end + +end + +----------------------- +--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 + + 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 + +--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) + end + + +end]] + +-- derp tumbler +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 + 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 = true + +end + +function onPreciseUp() + preciseOn = false +end + +function 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 + end +end + +function 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) + end + +end + +----------------- +-- movement keys +----------------- + +function onLeft() + leftOn = true +end + +function onRight() + rightOn = true +end + +function onUp() + upOn = true +end + +function onDown() + downOn = true +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() + 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 = 3 + +end + +function 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 = TotalRounds + +end + +function onScreenResize() + + -- redraw Tags so that their screen locations are updated + if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then + DrawTag(0) + DrawTag(1) + DrawTag(2) + end + +end + +function 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) + +end + +function ThingsToBeRunOnGears(gear) + + HandleLifeSpan(gear) + DeleteFarFlungBarrel(gear) + + if CirclesAreGo == true then + CheckVarious(gear) + ProjectileTrack(gear) + end + +end + + +function 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") + +end + +function 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 + end +end + +function 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) + end + +end + +function 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 + ----------- + end + +end + +function 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) + end + +end + + + +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-- 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 + end + +end + +function PlayerIsFine() + return (playerIsFine) +end + +function GetDistFromXYtoXY(a, b, c, d) + q = a - c + w = b - d + return ( (q*q) + (w*w) ) +end + +function 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) ) + +end + +function 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) ) + + +end + +function 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) + +end + +function 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) + end + +end + +function 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) + +end + +function 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]) + +end + +function 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 + + end + +end + +function WellHeAintGonnaJumpNoMore(x,y) + + AddVisualGear(x, y, vgtBigExplosion, 0, false) + playerIsFine = false + AddCaption(loc("GOTCHA!")) + PlaySound(sndExplosion) + PlaySound(sndHellish) + + targetHit = true + +end + +--- collision detection for weapons fire +function 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 circle +function 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()") + +end + +function 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 + + end + + +end + +function 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") + + end + +end + diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/The_Specialists.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/The_Specialists.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Default +Default diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/The_Specialists.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/The_Specialists.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,291 @@ +---------------------------------- +-- THE SPECIALISTS MODE 0.7 +-- by mikade +---------------------------------- + +-- version history +----------------- +-- version 0.1 +----------------- +-- concept test + +---------------- +-- version 0.2 +---------------- +-- added gfRandomOrder to gameflags +-- removed some deprecated variables/methods +-- fixed lack of portal reset + +---------------- +-- version 0.3 +---------------- +-- added switching on start +-- removed switch from engineer weaponset + +---------------- +-- version 0.4 +---------------- +-- Attempted to: +-- fix potential switch explit +-- improve user feedback on start + +---------------- +-- version 0.5 +---------------- +-- provision for variable minetimer / demo mines set to 5000ms +-- don't autoswitch if player only has 1 hog on his team + +---------------- +-- version 0.6 +---------------- +-- for the meanwhile, don't drop any crates except health crates + +---------------- +-- version 0.7 +---------------- +-- perhogadmsdf :D :D :D :D + +-------------------- +--TO DO +-------------------- + +-- balance hog health, maybe +-- add proper gameflag checking, maybe (so that we can throw in a .cfg and let the users break everything) + +loadfile(GetDataPath() .. "Scripts/Locale.lua")() +loadfile(GetDataPath() .. "Scripts/Tracker.lua")() + +local numhhs = 0 +local hhs = {} + +local currName +local lastName +local started = false +local switchStage = 0 + +local hogCounter + +function CountHog(gear) + hogCounter = hogCounter +1 +end + +function onNewAmmoStore(groupIndex, hogIndex) + + SetAmmo(amSkip, 9, 0, 0, 0) + + if hogIndex == 0 then + SetAmmo(amBazooka, 1, 0, 0, 0) + SetAmmo(amGrenade, 1, 0, 0, 0) + SetAmmo(amShotgun, 1, 0, 0, 0) + elseif hogIndex == 1 then + SetAmmo(amGirder, 2, 0, 0, 0) + SetAmmo(amBlowTorch, 1, 0, 0, 0) + SetAmmo(amPickHammer, 1, 0, 0, 0) + elseif hogIndex == 2 then + SetAmmo(amRope, 9, 0, 0, 0) + SetAmmo(amParachute, 9, 0, 0, 0) + SetAmmo(amFirePunch, 1, 0, 0, 0) + elseif hogIndex == 3 then + SetAmmo(amDynamite, 1, 0, 0, 0) + SetAmmo(amMine, 1, 0, 0, 0) + SetAmmo(amDrill, 1, 0, 0, 0) + elseif hogIndex == 4 then + SetAmmo(amSniperRifle, 1, 0, 0, 0) + SetAmmo(amDEagle, 1, 0, 0, 0) + SetAmmo(amPortalGun, 2, 0, 0, 0) + elseif hogIndex == 5 then + SetAmmo(amSeduction, 9, 0, 0, 0) + SetAmmo(amResurrector, 1, 0, 0, 0) + SetAmmo(amInvulnerable, 1, 0, 0, 0) + elseif hogIndex == 6 then + SetAmmo(amFlamethrower, 1, 0, 0, 0) + SetAmmo(amMolotov, 1, 0, 0, 0) + SetAmmo(amNapalm, 1, 0, 0, 0) + elseif hogIndex == 7 then + SetAmmo(amBaseballBat, 1, 0, 0, 0) + SetAmmo(amGasBomb, 1, 0, 0, 0) + SetAmmo(amKamikaze, 1, 0, 0, 0) + end + +end + +function CreateTeam() + + currTeam = "" + lastTeam = "" + z = 0 + + for i = 0, (numhhs-1) do + + currTeam = GetHogTeamName(hhs[i]) + + if currTeam == lastTeam then + z = z + 1 + else + z = 1 + end + + if z == 1 then + + SetHogName(hhs[i],"Soldier") + SetHogHat(hhs[i], "sf_vega") + SetHealth(hhs[i],200) + + elseif z == 2 then + + SetHogHat(hhs[i], "Glasses") + SetHogName(hhs[i],"Engineer") + + elseif z == 3 then + + SetHogName(hhs[i],"Ninja") + SetHogHat(hhs[i], "NinjaFull") + SetHealth(hhs[i],80) + + elseif z == 4 then + + SetHogName(hhs[i],"Demo") + SetHogHat(hhs[i], "Skull") + SetHealth(hhs[i],200) + + elseif z == 5 then + + SetHogName(hhs[i],"Sniper") + SetHogHat(hhs[i], "Sniper") + SetHealth(hhs[i],120) + + elseif z == 6 then + + SetHogName(hhs[i],"Saint") + SetHogHat(hhs[i], "angel") + SetHealth(hhs[i],300) + + elseif z == 7 then + + SetHogName(hhs[i],"Pyro") + SetHogHat(hhs[i], "Gasmask") + SetHealth(hhs[i],150) + + elseif z == 8 then + + SetHogName(hhs[i],"Loon") + SetHogHat(hhs[i], "clown") + SetHealth(hhs[i],100) + + end + + lastTeam = GetHogTeamName(hhs[i]) + + end + +end + +function onGameInit() + GameFlags = gfRandomOrder + gfResetWeps + gfInfAttack + gfPlaceHog +gfPerHogAmmo + Delay = 10 + HealthCaseProb = 100 +end + +function onGameStart() + + CreateTeam() + + ShowMission ( + loc("THE SPECIALISTS"), + loc("a Hedgewars mini-game"), + + loc("Eliminate the enemy specialists.") .. "|" .. + " " .. "|" .. + + loc("Game Modifiers: ") .. "|" .. + loc("Per-Hog Ammo") .. "|" .. + loc("Weapons Reset") .. "|" .. + loc("Unlimited Attacks") .. "|" .. + + "", 4, 4000 + ) + + trackTeams() + +end + + +function onNewTurn() + currName = GetHogName(CurrentHedgehog) + lastName = GetHogName(CurrentHedgehog) + started = true + switchStage = 0 +end + +function onGameTick20() + + if (CurrentHedgehog ~= nil) then + + currName = GetHogName(CurrentHedgehog) + + if (currName ~= lastName) and (switchStage > 5) then + AddCaption(loc("Switched to ") .. currName .. "!") + end + + if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) and (switchStage < 5) then + + AddCaption(loc("Prepare yourself") .. ", " .. currName .. "!") + + hogCounter = 0 + runOnHogsInTeam(CountHog, GetHogTeamName(CurrentHedgehog) ) + + if hogCounter > 1 then + + switchStage = switchStage + 1 + + if switchStage == 1 then + AddAmmo(CurrentHedgehog, amSwitch, 1) + + elseif switchStage == 2 then + ParseCommand("setweap " .. string.char(amSwitch)) + elseif switchStage == 3 then + SetGearMessage(CurrentHedgehog,gmAttack) + elseif switchStage == 4 then + switchStage = 6 + AddAmmo(CurrentHedgehog, amSwitch, 0) + end + + else + switchStage = 6 + end + + + end + + lastName = currName + + end + +end + +function onGearAdd(gear) + + if GetGearType(gear) == gtHedgehog then + hhs[numhhs] = gear + numhhs = numhhs + 1 + elseif (GetGearType(gear) == gtMine) and (started == true) then + SetTimer(gear,5000) + end + + if (GetGearType(gear) == gtHedgehog) or (GetGearType(gear) == gtResurrector) then + trackGear(gear) + end + + +end + +function onGearDelete(gear) + if (GetGearType(gear) == gtHedgehog) or (GetGearType(gear) == gtResurrector) then + trackDeletion(gear) + end +end + +function onAmmoStoreInit() +-- +end + diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Tumbler.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Tumbler.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Default +Default 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 + + diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/WxW.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/WxW.cfg Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,2 @@ +Shoppa +Shoppa diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/WxW.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/WxW.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,751 @@ + +---------------------- +-- WALL TO WALL 0.4 +---------------------- +-- a shoppa minigame +-- by mikade + +-- feel free to add map specific walls to LoadConfig, or post additional +-- wall suggestions on our forum at: http://www.hedgewars.org/forum + +---------------- +--0.1 +---------------- +-- concept test + +---------------- +--0.2 +---------------- +-- unhardcoded turntimeleft, now uses shoppa default of 45s +-- changed some things behind the scenes +-- fixed oooooold radar bug +-- added radar / script support for multiple crates +-- tweaked weapons tables +-- added surfing and changed crate spawn requirements a bit + +---------------- +--0.3 +---------------- +-- stuffed dirty clothes into cupboard +-- improved user feedback +-- added/improved experimental config system, input masks included :D + +---------------- +--0.4 +---------------- +-- for version 0.9.18, now detects border in correct location +-- fix 0.3 config constraint +-- remove unnecessary vars +-- oops, remove hardcoding of minesnum,explosives +-- ... and unhardcode turntime (again)... man, 30s is hard :( +-- move some initialisations around +-- numerous improvements to user feedback +-- walls disappear after being touched +-- added backwards compatibility with 0.9.17 + +---------------- +--TO DO +---------------- +-- achievements / try detect shoppa moves? :| +-- maybe add ability for the user to place zones like in Racer? +-- add more hard-coded values for specific maps + +----------------------------- +-- GO PONIES, GO PONIES, GO! +----------------------------- + +loadfile(GetDataPath() .. "Scripts/Locale.lua")() +loadfile(GetDataPath() .. "Scripts/Tracker.lua")() +loadfile(GetDataPath() .. "Scripts/Utils.lua")() + +-- experimental menu stuff +local menuIndex = 1 +local menu = {} +local preMenuCfg +local postMenuCfg +local roundN = 0 + +-- config and wall variables +local AFR = false +local allowCrazyWeps = false +local requireSurfer = true +local wX = {} +local wY = {} +local wWidth = {} +local wHeight = {} +local wTouched = {} +--local margin +local wallsLeft = 0 + +local highestY = 0 +local surferTimer = 0 +local hasSurfed = false +local allWallsHit = false + +local gTimer = 1 +local effectTimer = 1 + +local ropeG = nil +local crateG = nil +local allowCrate = true + +-- crate radar vars +local rCirc = {} +local rAlpha = 255 +local rPingTimer = 0 +local m2Count = 0 + +local weapons = {} + +--[[local unlisted = {amTardis, amLandGun,amExtraTime,amExtraDamage, + amVampiric, amSwitch, amInvulnerable, amGirder, amJetpack, + amPortalGun, amTeleport, amResurrector, amLaserSight, amLowGravity, + amAirAttack, amNapalm, amMineStrike, amDrillStrike, + amKamikaze, amSnowball, amSeduction}]] + +local crazyWeps = {amWatermelon, amHellishBomb, amBallgun, amRCPlane} + +local groundWeps = {amBee, amShotgun,amDEagle,amFirePunch, amWhip, + amPickHammer, amBaseballBat, amCake,amBallgun, + amRCPlane, amSniperRifle, amBirdy, amBlowTorch, amGasBomb, + amFlamethrower, amSMine, amMortar, amHammer} + +local ropeWeps = {amGrenade, amClusterBomb, amBazooka, amMine, amDynamite, + amWatermelon, amHellishBomb, amDrill, amMolotov} + +-- 0.9.18+ extra custom data for preset maps +local MapList = + { + --name, surfer, roof, LRwalls + {"Atlantis Shoppa", true, false, true}, + {"BambooPlinko", true, false, true}, + {"BrickShoppa", false, false, true}, + {"BubbleFlow", true, false, true}, + {"Cave", false, false, true}, + {"Glass Shoppa", true, false, true}, + {"HardIce", false, false, true}, + {"Industrial", false, false, true}, + {"Islands", true, false, true}, + {"Hedgelove", true, false, true}, + {"NeonStyle", false, false, true}, + {"Octorama", false, false, true}, + {"red vs blue - Castle", true, false, true}, + {"red vs blue - castle2", true, false, true}, + {"red vs blue - True Shoppa Sky", true, false, true}, + {"Ropes", false, false, true}, + {"Ropes Rearranged", false, false, true}, + {"RopesRevenge Flipped", true, false, true}, + {"Ropes Three", false, false, true}, + {"RopesTwo", false, false, true}, + {"ShapeShoppa1.0", true, false, true}, + {"ShappeShoppa Darkhow", true, false, true}, + {"ShoppaCave2", true, false, true}, + {"ShoppaFun", true, false, true}, + {"ShoppaGolf", false, false, true}, + {"ShoppaHell", false, true, false}, + {"ShoppaKing", false, false, false}, + {"ShoppaNeon", false, false, true}, + {"ShoppaSky", false, false, true}, + {"Shoppawall", false, false, true}, + {"SkatePark", false, false, true}, + {"SloppyShoppa", false, false, true}, + {"Sticks", true, false, true}, + {"Symmetrical Ropes ", false, false, true}, + {"Tetris", false, false, true}, + {"TransRopes2", false, false, true}, + {"Wildmap", false, false, true}, + {"Winter Shoppa", false, false, true}, + {"2Cshoppa", true, false, true} + } + +function BoolToCfgTxt(p) + if p == false then + return("Disabled") + else + return("Enabled") + end +end + +function LoadConfig(p) + + margin = 20 + mapID = nil + + -- 0.9.17 + if Map == "CHANGE_ME" then + AddCaption(loc("For improved features/stability, play 0.9.18+")) + --AddWall(10,10,4085,margin) + AddWall(10,10,margin,2025) + AddWall(4085-margin,10,margin,2025) + end + + --0.9.18+ + for i = 1, #MapList do + if Map == MapList[i][1] then + mapID = i + --AddCaption(MapList[i][1] .. " found. reqSurf is " .. BoolToCfgTxt(MapList[i][2])) + end + end + + if (p == 1) and (mapID ~= nil) then + requireSurfer = MapList[mapID][2] + end + + if mapID ~= nil then + + -- add a wall to the roof + if MapList[mapID][3] == true then + AddWall(LeftX+10,TopY+10,RightX-LeftX-20,margin) + end + + -- add walls on the left and right border + if MapList[mapID][4] == true then + AddWall(LeftX+10,TopY+10,margin,WaterLine) + AddWall(RightX-10-margin,TopY+10,margin,WaterLine) + end + + -- add map specific walls + if Map == "Ropes" then + AddWall(1092,934,54,262) + AddWall(2822,323,33,137) + elseif Map == "ShoppaKing" then + AddWall(3777,1520,50,196) + AddWall(1658,338,46,670) + elseif Map == "ShoppaHell" then + AddWall(2035,831,30,263) + AddWall(3968,1668,31,383) + elseif Map == "ShoppaNeon" then + AddWall(980,400,20,300) + AddWall(1940,400,20,300) + AddWall(3088,565,26,284) + AddWall(187,270,28,266) + end + + -- if map is unrecognized, add two walls on the side borders + -- also, if version of hw is not 0.9.17 or lower + elseif Map ~= "CHANGE_ME" then + AddWall(LeftX+10,TopY+10,margin,WaterLine) + AddWall(RightX-10-margin,TopY+10,margin,WaterLine) + end + + +end + +function AddWall(zXMin,zYMin, zWidth, zHeight) + + table.insert(wX, zXMin) + table.insert(wY, zYMin) + table.insert(wWidth, zWidth) + table.insert(wHeight, zHeight) + table.insert(wTouched, false) + +end + +function DrawBlip(gear) + SetVisualGearValues(getGearValue(gear,"CIRC"), getGearValue(gear,"RX"), getGearValue(gear,"RY"), 100, 255, 1, 10, 0, 40, 3, GetClanColor(GetHogClan(CurrentHedgehog))-rAlpha) +end + +function TrackRadarBlip(gear) + + -- work out the distance to the target + g1X, g1Y = GetGearPosition(CurrentHedgehog) + g2X, g2Y = GetX(gear), GetY(gear) + q = g1X - g2X + w = g1Y - g2Y + r = math.sqrt( (q*q) + (w*w) ) --alternate + + RCX = getGearValue(gear,"RX") + RCY = getGearValue(gear,"RY") + + rCircDistance = r -- distance to circle + + 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 + + if rCircDistance < NR then + RCX = g2X + elseif q > 0 then + RCX = g1X - NX + else + RCX = g1X + NX + end + + if rCircDistance < NR then + RCY = g2Y + elseif w > 0 then + RCY = g1Y - NY + else + RCY = g1Y + NY + end + + setGearValue(gear, "RX", RCX) + setGearValue(gear, "RY", RCY) + +end + + +function HandleCircles() + + -- enable this if you want the radar to only show for a few seconds + -- after you spawn the crate + --[[if rAlpha ~= 255 then + + rPingTimer = rPingTimer + 1 + if rPingTimer == 100 then + rPingTimer = 0 + + rAlpha = rAlpha + 5 + if rAlpha >= 255 then + rAlpha = 255 + end + end + + end]] + + runOnGears(DrawBlip) + + m2Count = m2Count + 1 + if m2Count == 25 then + m2Count = 0 + + if (CurrentHedgehog ~= nil) and (rAlpha ~= 255) then + runOnGears(TrackRadarBlip) + end + + end + +end + + +function CheckCrateConditions() + + crateSpawn = true + + if requireSurfer == true then + if hasSurfed == false then + crateSpawn = false + end + end + + if #wTouched > 0 then + if allWallsHit == false then + crateSpawn = false + end + end + + if crateSpawn == true then + if allowCrate == true then + --if (crateG == nil) and (allowCrate == true) then + --AddCaption("") + SpawnAmmoCrate(0, 0, weapons[1+GetRandom(#weapons)] ) + rPingTimer = 0 + rAlpha = 0 + PlaySound(sndWarp) + end + end + +end + +function CheckSurfer() + + if GetY(CurrentHedgehog) > highestY then + highestY = GetY(CurrentHedgehog) + end + + if (highestY == (WaterLine-8)) and (hasSurfed == false) then + + surferTimer = surferTimer +1 + if (surferTimer == 40) then + hasSurfed = true + AddCaption(loc("Surfer!"),0xffba00ff,capgrpMessage2) + end + end + +end + + + +function WallHit(id, zXMin,zYMin, zWidth, zHeight) + + if wTouched[id] == false then + tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtBigExplosion, 0, false) + PlaySound(sndExplosion) + wallsLeft = wallsLeft - 1 + + if wallsLeft == 0 then + AddCaption(loc("All walls touched!")) + allWallsHit = true + if (requireSurfer == true) and (hasSurfed == false) then + AddCaption(loc("Go surf!"),0xffba00ff,capgrpMessage2) + end + else + AddCaption(loc("Walls Left") .. ": " .. wallsLeft) + end + + end + + wTouched[id] = true + tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, false) + --PlaySound(sndVaporize) -- yeah, this is just annoying as shit + +end + +function CheckForWallCollision() + + for i = 1, #wTouched do + if gearIsInBox(CurrentHedgehog, wX[i],wY[i],wWidth[i],wHeight[i]) then + WallHit(i, wX[i],wY[i],wWidth[i],wHeight[i]) + end + end + +end + +function BorderSpark(zXMin,zYMin, zWidth, zHeight, bCol) + + eX = zXMin + GetRandom(zWidth+10) + eY = zYMin + GetRandom(zHeight+10) + + tempE = AddVisualGear(eX, eY, vgtDust, 0, false) + if tempE ~= 0 then + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) + SetVisualGearValues(tempE, eX, eY, g3, g4, g5, g6, g7, 1, g9, bCol ) + end + +end + + +function HandleBorderEffects() + + effectTimer = effectTimer + 1 + if effectTimer > 15 then --25 + + effectTimer = 1 + + for i = 1, #wTouched do + if wTouched[i] == true then + --bCol = GetClanColor(GetHogClan(CurrentHedgehog)) + else + --bCol = 0xFFFFFFFF + bCol = GetClanColor(GetHogClan(CurrentHedgehog)) + BorderSpark(wX[i],wY[i],wWidth[i],wHeight[i], bCol) + end + --BorderSpark(wX[i],wY[i],wWidth[i],wHeight[i], bCol) + end + + end + +end + +function onLJump() + if roundN < 2 then + roundN = 100 + SetInputMask(0xFFFFFFFF) + TurnTimeLeft = 1 + AddCaption(loc("Configuration accepted."),0xffba00ff,capgrpMessage) + HideMission() + end +end + +function onAttack() + + if roundN < 2 then + + if menuIndex == 1 then + + if #wTouched > 0 then + for i = 1, #wTouched do + wTouched[i] = nil + wX[i] = nil + wY[i] = nil + wWidth[i] = nil + wHeight[i] = nil + end + else + LoadConfig(2) + end + + elseif menuIndex == 2 then + requireSurfer = not(requireSurfer) + elseif menuIndex == 3 then + AFR = not(AFR) + elseif menuIndex == 4 then + allowCrazyWeps = not(allowCrazyWeps) + end + + UpdateMenu() + configureWeapons() + HandleStartingStage() + + elseif (AFR == true) then + + if (GetCurAmmoType() ~= amRope) and + (GetCurAmmoType() ~= amSkip) and + (GetCurAmmoType() ~= amNothing) + then + AddCaption(loc("You may only attack from a rope!"),0xffba00ff,capgrpMessage2) + end + + end + +end + +function onDown() + if roundN < 2 then + menuIndex = menuIndex +1 + if menuIndex > #menu then + menuIndex = 1 + end + HandleStartingStage() + end +end + +function onUp() + if roundN < 2 then + menuIndex = menuIndex -1 + if menuIndex == 0 then + menuIndex = #menu + end + HandleStartingStage() + end +end + +function onGameInit() + + GameFlags = gfRandomOrder + gfBorder + gfSolidLand --+ gfInfAttack + HealthCaseProb = 0 + CaseFreq = 0 + +end + +function configureWeapons() + + -- reset wep array + for i = 1, #weapons do + weapons[i] = nil + end + + -- add rope weps + for i, w in pairs(ropeWeps) do + table.insert(weapons, w) + end + + -- add ground weps + for i, w in pairs(groundWeps) do + table.insert(weapons, w) + end + + -- remove ground weps if attacking from rope is mandatory + if AFR == true then + for i = 1, #weapons do + for w = 1, #groundWeps do + if groundWeps[w] == weapons[i] then + table.remove(weapons, i) + end + end + end + end + + -- remove crazy weps is crazy weps aren't allowed + if allowCrazyWeps == false then + for i = 1, #weapons do + for w = 1, #crazyWeps do + if crazyWeps[w] == weapons[i] then + table.remove(weapons, i) + end + end + end + end + +end + +function onGameStart() + + LoadConfig(1) + configureWeapons() + UpdateMenu() + HandleStartingStage() + +end + +function onNewTurn() + + wallsLeft = #wTouched + + for i = 1, #wTouched do + wTouched[i] = false + end + + allowCrate = true + + surferTimer = 0 + hasSurfed = false + allWallsHit = false + highestY = 0 + + crateG = nil + + -- new config stuff + roundN = roundN + 1 + if roundN < 2 then + TurnTimeLeft = -1 + SetInputMask(0) + allowCrate = false + HandleStartingStage() -- new + end + +end + +function UpdateMenu() + + preMenuCfg = loc("Spawn the crate, and attack!") .. "|" + postMenuCfg = loc("Press [Enter] to accept this configuration.") + + menu = { + loc("Walls Required") .. ": " .. #wTouched .. "|", + loc("Surf Before Crate") .. ": " .. BoolToCfgTxt(requireSurfer) .. "|", + loc("Attack From Rope") .. ": " .. BoolToCfgTxt(AFR) .. "|", + loc("Super Weapons") .. ": " .. BoolToCfgTxt(allowCrazyWeps) .. "|" + } +end + +function HandleStartingStage() + + temp = menu[menuIndex] + menu[menuIndex] = "--> " .. menu[menuIndex] + + missionComment = "" + for i = 1, #menu do + missionComment = missionComment .. menu[i] + end + + ShowMission ( + loc("WALL TO WALL") .. " 0.4", + loc("a shoppa minigame"), + preMenuCfg.. + missionComment .. + postMenuCfg .. + --" " .. "|" .. + "", 4, 300000 + ) + + menu[menuIndex] = temp + +end + +function onGameTick() + + if CurrentHedgehog ~= nil then + + --AddCaption(Map) + --AddCaption(RightX ..";" .. GetX(CurrentHedgehog)) + + CheckSurfer() + + gTimer = gTimer + 1 + if gTimer == 25 then + gTimer = 1 + + CheckForWallCollision() + CheckCrateConditions() + + if (crateG == GetFollowGear()) and (crateG ~= nil) then + FollowGear(CurrentHedgehog) + end + + -- if attackfromrope is set, forbid firing unless using rope + if (AFR == true) and (roundN >= 2) then + if (GetCurAmmoType() == amRope) or + (GetCurAmmoType() == amSkip) or + (GetCurAmmoType() == amNothing) + then + SetInputMask(0xFFFFFFFF) + elseif ropeG == nil then + SetInputMask(bnot(gmAttack)) + end + end + + end + + HandleBorderEffects() + HandleCircles() + + end + +end + +function onGearAdd(gear) + + if GetGearType(gear) == gtRope then + ropeG = gear + elseif GetGearType(gear) == gtCase then + + crateG = gear + trackGear(gear) + + table.insert(rCirc, AddVisualGear(0,0,vgtCircle,0,true) ) + setGearValue(gear,"CIRC",rCirc[#rCirc]) + setGearValue(gear,"RX",0) + setGearValue(gear,"RY",0) + SetVisualGearValues(rCirc[#rCirc], 0, 0, 100, 255, 1, 10, 0, 40, 3, 0xff00ffff) + + allowCrate = false + + rPingTimer = 0 + rAlpha = 0 + + end + +end + +function onGearDelete(gear) + + if gear == ropeG then + ropeG = nil + elseif GetGearType(gear) == gtCase then + + if gear == crateG then + crateG = nil + -- rAlpha = 255 + end + + for i = 1, #rCirc do + if rCirc[i] == getGearValue(gear,"CIRC") then + DeleteVisualGear(rCirc[i]) + table.remove(rCirc, i) + end + end + + trackDeletion(gear) + + end + +end + +function onAmmoStoreInit() + + for i, w in pairs(ropeWeps) do + SetAmmo(w, 0, 0, 0, 1) + end + + for i, w in pairs(groundWeps) do + SetAmmo(w, 0, 0, 0, 1) + end + + for i, w in pairs(crazyWeps) do + SetAmmo(w, 0, 0, 0, 1) + end + + SetAmmo(amRope, 9, 0, 0, 0) + SetAmmo(amSkip, 9, 0, 0, 0) + +end diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Tracker.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Tracker.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,295 @@ +-- Library for keeping track of gears in the game +-- and running functions on them +-- also keeps track of clans and teams + +local trackingTeams = false +local resurrecting = false +local gears = {} +local teams = {} +local clans = {} +local resurrectedHogs = {} +local gearValues = {} +local teamValues = {} +local clanValues = {} + +-- Registers when a gear is added +function trackGear(gear) + table.insert(gears, gear) + if trackingTeams and GetGearType(gear) == gtResurrector then + resurrecting = true + elseif resurrecting and GetGearType(gear) == gtHedgehog then + table.insert(resurrectedHogs, gear) + end +end + +-- Registers when a gear is deleted +function trackDeletion(gear) + gearValues[gear] = nil + for k, g in ipairs(gears) do + if g == gear then + table.remove(gears, k) + break + end + end + if trackingTeams and GetGearType(gear) == gtHedgehog then + hogs = teams[GetHogTeamName(gear)] + if hogs ~= nil then + if table.maxn(hogs) == 1 then + hogs = nil + else + for k, hog in ipairs(hogs) do + if hog == gear then + table.remove(hogs, k) + break + end + end + end + end + elseif resurrecting and GetGearType(gear) == gtResurrector then + for k, gear in ipairs(resurrectedHogs) do + team = GetHogTeamName(gear) + if teams[team] == nil then + teams[team] = {} + end + table.insert(teams[team], gear) + end + resurrecting = false + resurrectedHogs = {} + end +end + +-- Start to keep track of teams +function trackTeams() + if not trackingTeams then + trackingTeams = true + for k, gear in ipairs(gears) do + if GetGearType(gear) == gtHedgehog then + team = GetHogTeamName(gear) + if teams[team] == nil then + teams[team] = { gear } + clans[team] = GetHogClan(gear) + else + table.insert(teams[team], gear) + end + end + end + end +end + +-- Registers when a hog is hidden +function trackHiding(gear) + for k, g in ipairs(gears) do + if g == gear then + table.remove(gears, k) + break + end + end + + if trackingTeams then + hogs = teams[GetHogTeamName(gear)] + + if hogs ~= nil then + if table.maxn(hogs) == 1 then + hogs = nil + else + for k, hog in ipairs(hogs) do + if hog == gear then + table.remove(hogs, k) + break + end + end + end + end + end +end + +-- Registers when a hog is restored +function trackRestoring(gear) + table.insert(gears, gear) + + if trackingTeams then + team = GetHogTeamName(gear) + if teams[team] == nil then + teams[team] = {} + end + table.insert(teams[team], gear) + end +end + +-- Get a value for a specific gear +function getGearValue(gear, key) + if gearValues[gear] ~= nil then + return gearValues[gear][key] + end + return nil +end + +-- Set a value for a specific gear +function setGearValue(gear, key, value) + found = false + for id, values in pairs(gearValues) do + if id == gear then + values[key] = value + found = true + end + end + if not found then + gearValues[gear] = { [key] = value } + end +end + +-- Increase a value for a specific gear +function increaseGearValue(gear, key) + for id, values in pairs(gearValues) do + if id == gear then + values[key] = values[key] + 1 + end + end +end + +-- Decrease a value for a specific gear +function decreaseGearValue(gear, key) + for id, values in pairs(gearValues) do + if id == gear then + values[key] = values[key] - 1 + end + end +end + +-- Get a value for a specific team +function getTeamValue(team, key) + if teamValues[team] ~= nil then + return teamValues[team][key] + end + return nil +end + +-- Set a value for a specific team +function setTeamValue(team, key, value) + found = false + for name, values in pairs(teamValues) do + if name == team then + values[key] = value + found = true + end + end + if not found then + teamValues[team] = { [key] = value } + end +end + +-- Increase a value for a specific team +function increaseTeamValue(team, key) + for name, values in pairs(teamValues) do + if name == team then + values[key] = values[key] + 1 + end + end +end + +-- Decrease a value for a specific team +function decreaseTeamValue(team, key) + for name, values in pairs(teamValues) do + if name == team then + values[key] = values[key] - 1 + end + end +end + +-- Get a value for a specific clan +function getClanValue(clan, key) + if clanValues[clan] ~= nil then + return clanValues[clan][key] + end + return nil +end + +-- Set a value for a specific clan +function setClanValue(clan, key, value) + found = false + for num, values in ipairs(clanValues) do + if num == clan then + values[key] = value + found = true + end + end + if not found then + clanValues[clan] = { [key] = value } + end +end + +-- Increase a value for a specific clan +function increaseClanValue(clan, key) + for num, values in ipairs(clanValues) do + if num == clan then + values[key] = values[key] + 1 + end + end +end + +-- Decrease a value for a specific clan +function decreaseClanValue(clan, key) + for num, values in ipairs(clanValues) do + if num == clan then + values[key] = values[key] - 1 + end + end +end + +-- Run a function on all tracked gears +function runOnGears(func) + for k, gear in ipairs(gears) do + func(gear) + end +end + +-- Run a function on all tracked hogs +function runOnHogs(func) + for k, hogs in pairs(teams) do + for m, hog in ipairs(hogs) do + func(hog) + end + end +end + +-- Run a function on hogs in a team +function runOnHogsInTeam(func, team) + if teams[team] ~= nil then + for k, hog in ipairs(teams[team]) do + func(hog) + end + end +end + +-- Run a function on hogs in other teams +function runOnHogsInOtherTeams(func, team) + for k, hogs in pairs(teams) do + if k ~= team then + for m, hog in ipairs(hogs) do + func(hog) + end + end + end +end + +-- Run a function on hogs in a clan +function runOnHogsInClan(func, clan) + for i = 1, table.maxn(clans) do + if clans[i] == clan then + for k, hog in ipairs(teams[i]) do + func(hog) + end + end + end +end + +-- Run a function on hogs in other clans +function runOnHogsInOtherClans(func, clan) + for i = 1, table.maxn(clans) do + if clans[i] ~= clan then + for k, hog in ipairs(teams[i]) do + func(hog) + end + end + end +end diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Scripts/Utils.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Utils.lua Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,22 @@ +-- Library for miscellaneous utilitiy functions + +-- Check if a gear is inside a box +function gearIsInBox(gear, x, y, w, h) + gx, gy = GetGearPosition(gear) + if gx >= x and gy >= y and gx <= x + w and gy <= y + h then + return true + end + return false +end + +-- Check if a gear is inside a circle +function gearIsInCircle(gear, x, y, r, useRadius) + gx, gy = GetGearPosition(gear) + if useRadius then + r = r + GetGearRadius(gear) + end + if r ^ 2 >= (x - gx) ^ 2 + (y - gy) ^ 2 then + return true + end + return false +end diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/TARDIS.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/TARDIS.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/beep.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/beep.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/beewater.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/beewater.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Amazing.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Amazing.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Brilliant.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Brilliant.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Bugger.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Bugger.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Bungee.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Bungee.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Cutitout.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Cutitout.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Drat.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Drat.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Excellent.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Excellent.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Fire.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Fire.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Gonnagetyou.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Gonnagetyou.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Grenade.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Grenade.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Hmm.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Hmm.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Justyouwait.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Justyouwait.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Leavemealone.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Leavemealone.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Ohdear.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Ohdear.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Ouch.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Ouch.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Perfect.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Perfect.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Revenge.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Revenge.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Runaway.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Runaway.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Solong.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Solong.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Thisoneismine.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Thisoneismine.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Watchthis.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Watchthis.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Whatthe.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Whatthe.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Whoopsee.ogg Binary file project_files/Android-build/SDL-android-project/assets/Data/Sounds/voices/Classic/Whoopsee.ogg has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/button.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/button.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/button.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/res/drawable-mdpi/button.xml Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/button_disabled.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/button_disabled.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/button_focused.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/button_focused.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/button_focused_disabled.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/button_focused_disabled.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/button_normal.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/button_normal.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown.xml Sat Aug 18 18:11:04 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown_disabled.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown_disabled.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown_focused.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown_focused.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown_focused_disabled.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown_focused_disabled.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown_normal.9.png Binary file project_files/Android-build/SDL-android-project/res/drawable-mdpi/dropdown_normal.9.png has changed diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/RoomActivity.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/RoomActivity.java Sat Aug 18 18:08:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/RoomActivity.java Sat Aug 18 18:11:04 2012 +0200 @@ -2,6 +2,7 @@ import org.hedgewars.hedgeroid.R; import org.hedgewars.hedgeroid.Datastructures.Team; +import org.hedgewars.hedgeroid.Datastructures.TeamInGame; import org.hedgewars.hedgeroid.NetplayStateFragment.NetplayStateListener; import org.hedgewars.hedgeroid.netplay.Netplay; import org.hedgewars.hedgeroid.netplay.Netplay.State; @@ -76,7 +77,7 @@ } public void onTeamAddDialogSubmitted(Team newTeam) { - netplay.sendAddTeam(newTeam); + netplay.sendAddTeam(newTeam, TeamInGame.getUnusedOrRandomColorIndex(netplay.roomTeamlist.getMap().values())); } public RoomStateManager getRoomStateManager() { diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java Sat Aug 18 18:08:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java Sat Aug 18 18:11:04 2012 +0200 @@ -477,7 +477,7 @@ try { SDLActivity.synchronizedNativeInit(new String[] { String.valueOf(port), String.valueOf(surfaceWidth), String.valueOf(surfaceHeight), - "0", "en.txt", Base64.encodeToString(playerName.getBytes("UTF-8"), 0), "1", "1", "1", path, "" }); + Integer.toString(0x40+0x10+0x100+0x2), "en.txt", Base64.encodeToString(playerName.getBytes("UTF-8"), 0), "1", "1", "1", path, "" }); } catch (UnsupportedEncodingException e) { throw new AssertionError(e); // never happens } diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SettingsFragment.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SettingsFragment.java Sat Aug 18 18:08:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SettingsFragment.java Sat Aug 18 18:11:04 2012 +0200 @@ -56,6 +56,7 @@ } catch (IOException e) { Toast.makeText(getActivity().getApplicationContext(), R.string.error_missing_sdcard_or_files, Toast.LENGTH_LONG).show(); getActivity().finish(); + return null; } Collections.sort(styles, String.CASE_INSENSITIVE_ORDER); diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/TeamlistFragment.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/TeamlistFragment.java Sat Aug 18 18:08:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/TeamlistFragment.java Sat Aug 18 18:11:04 2012 +0200 @@ -96,7 +96,7 @@ } public void onColorClicked(TeamInGame team) { - netplay.sendTeamColorIndex(team.team.name, (team.ingameAttribs.colorIndex+1)%TeamIngameAttributes.TEAM_COLORS.length); + netplay.changeTeamColorIndex(team.team.name, (team.ingameAttribs.colorIndex+1)%TeamIngameAttributes.TEAM_COLORS.length); } public void onHogcountClicked(TeamInGame team) { @@ -104,7 +104,7 @@ if(newHogCount>Team.HEDGEHOGS_PER_TEAM) { newHogCount = 1; } - netplay.sendTeamHogCount(team.team.name, newHogCount); + netplay.changeTeamHogCount(team.team.name, newHogCount); } public void onTeamClicked(TeamInGame team) { diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java Sat Aug 18 18:08:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java Sat Aug 18 18:11:04 2012 +0200 @@ -80,7 +80,7 @@ public final MessageLog lobbyChatlog; public final MessageLog roomChatlog; public final ObservableTreeMap roomTeamlist = new ObservableTreeMap(); - private final Map roomRequestedTeams = new TreeMap(); + private final Map roomRequestedTeams = new TreeMap(); private final List gameMessageListeners = new LinkedList(); private final List runGameListeners = new LinkedList(); @@ -176,13 +176,27 @@ public void sendCreateRoom(String name) { sendToNet(MSG_SEND_CREATE_ROOM, name); } public void sendLeaveRoom(String message) { sendToNet(MSG_SEND_LEAVE_ROOM, message); } public void sendKick(String player) { sendToNet(MSG_SEND_KICK, player); } - public void sendAddTeam(Team newTeam) { - roomRequestedTeams.put(newTeam.name, newTeam); - sendToNet(MSG_SEND_ADD_TEAM, newTeam); + public void sendAddTeam(Team newTeam, int colorIndex) { + TeamIngameAttributes tia = new TeamIngameAttributes(playerName, colorIndex, TeamIngameAttributes.DEFAULT_HOG_COUNT, false); + TeamInGame newTeamInGame = new TeamInGame(newTeam, tia); + roomRequestedTeams.put(newTeam.name, newTeamInGame); + sendToNet(MSG_SEND_ADD_TEAM, newTeamInGame); } public void sendRemoveTeam(String teamName) { sendToNet(MSG_SEND_REMOVE_TEAM, teamName); } - public void sendTeamColorIndex(String teamName, int colorIndex) { sendToNet(MSG_SEND_TEAM_COLOR_INDEX, colorIndex, teamName); } - public void sendTeamHogCount(String teamName, int hogCount) { sendToNet(MSG_SEND_TEAM_HOG_COUNT, hogCount, teamName); } + public void changeTeamColorIndex(String teamName, int colorIndex) { + if(isChief()) { + sendToNet(MSG_SEND_TEAM_COLOR_INDEX, colorIndex, teamName); + TeamInGame team = roomTeamlist.get(teamName); + roomTeamlist.put(teamName, team.withAttribs(team.ingameAttribs.withColorIndex(colorIndex))); + } + } + public void changeTeamHogCount(String teamName, int hogCount) { + if(isChief()) { + sendToNet(MSG_SEND_TEAM_HOG_COUNT, hogCount, teamName); + TeamInGame team = roomTeamlist.get(teamName); + roomTeamlist.put(teamName, team.withAttribs(team.ingameAttribs.withHogCount(hogCount))); + } + } public void sendEngineMessage(byte[] engineMessage) { sendToNet(MSG_SEND_ENGINE_MESSAGE, engineMessage); } public void sendRoundFinished(boolean withoutError) { sendToNet(MSG_SEND_ROUND_FINISHED, Boolean.valueOf(withoutError)); } public void sendToggleReady() { sendToNet(MSG_SEND_TOGGLE_READY); } @@ -419,15 +433,14 @@ break; } case MSG_TEAM_ADDED: { - Team newTeam = (Team)msg.obj; - int colorIndex = TeamInGame.getUnusedOrRandomColorIndex(roomTeamlist.getMap().values()); - TeamIngameAttributes attrs = new TeamIngameAttributes(playerName, colorIndex, TeamIngameAttributes.DEFAULT_HOG_COUNT, true); - TeamInGame tig = new TeamInGame(newTeam, attrs); - roomTeamlist.put(newTeam.name, tig); + TeamInGame newTeam = (TeamInGame)msg.obj; if(isChief()) { - sendTeamColorIndex(newTeam.name, attrs.colorIndex); - sendTeamHogCount(newTeam.name, attrs.hogCount); + int freeColor = TeamInGame.getUnusedOrRandomColorIndex(roomTeamlist.getMap().values()); + sendToNet(MSG_SEND_TEAM_HOG_COUNT, newTeam.ingameAttribs.hogCount, newTeam.team.name); + sendToNet(MSG_SEND_TEAM_COLOR_INDEX, freeColor, newTeam.team.name); + newTeam = newTeam.withAttribs(newTeam.ingameAttribs.withColorIndex(freeColor)); } + roomTeamlist.put(newTeam.team.name, newTeam); break; } case MSG_TEAM_DELETED: { @@ -435,15 +448,12 @@ break; } case MSG_TEAM_ACCEPTED: { - Team requestedTeam = roomRequestedTeams.remove(msg.obj); + TeamInGame requestedTeam = roomRequestedTeams.remove(msg.obj); if(requestedTeam!=null) { - int colorIndex = TeamInGame.getUnusedOrRandomColorIndex(roomTeamlist.getMap().values()); - TeamIngameAttributes attrs = new TeamIngameAttributes(playerName, colorIndex, TeamIngameAttributes.DEFAULT_HOG_COUNT, false); - TeamInGame tig = new TeamInGame(requestedTeam, attrs); - roomTeamlist.put(requestedTeam.name, tig); + roomTeamlist.put(requestedTeam.team.name, requestedTeam); if(isChief()) { - sendTeamColorIndex(requestedTeam.name, attrs.colorIndex); - sendTeamHogCount(requestedTeam.name, attrs.hogCount); + // Not strictly necessary, but QtFrontend does it... + sendToNet(MSG_SEND_TEAM_HOG_COUNT, requestedTeam.ingameAttribs.hogCount, requestedTeam.team.name); } } else { Log.e("Netplay", "Got accepted message for team that was never requested."); @@ -453,8 +463,16 @@ case MSG_TEAM_COLOR_CHANGED: { TeamInGame oldEntry = roomTeamlist.get((String)msg.obj); if(oldEntry != null) { - TeamIngameAttributes newAttribs = oldEntry.ingameAttribs.withColorIndex(msg.arg1); - roomTeamlist.put(oldEntry.team.name, oldEntry.withAttribs(newAttribs)); + /* + * If we are chief, we ignore colors from the outside. They only come from the server + * when someone adds a team then, and we override that choice anyway. + * Worse, that color message arrives *after* we have overridden the color, so it would + * re-override it right back. + */ + if(!isChief()) { + TeamIngameAttributes newAttribs = oldEntry.ingameAttribs.withColorIndex(msg.arg1); + roomTeamlist.put(oldEntry.team.name, oldEntry.withAttribs(newAttribs)); + } } else { Log.e("Netplay", "Color update for unknown team "+msg.obj); } diff -r 57d343ee382f -r 75ba91f14ed5 project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/ThreadedNetConnection.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/ThreadedNetConnection.java Sat Aug 18 18:08:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/ThreadedNetConnection.java Sat Aug 18 18:11:04 2012 +0200 @@ -11,7 +11,7 @@ import org.hedgewars.hedgeroid.R; import org.hedgewars.hedgeroid.Datastructures.MapRecipe; import org.hedgewars.hedgeroid.Datastructures.Scheme; -import org.hedgewars.hedgeroid.Datastructures.Team; +import org.hedgewars.hedgeroid.Datastructures.TeamInGame; import org.hedgewars.hedgeroid.Datastructures.Weaponset; import org.hedgewars.hedgeroid.frontlib.Flib; import org.hedgewars.hedgeroid.frontlib.Frontlib; @@ -283,7 +283,7 @@ private final TeamCallback teamAddedCb = new TeamCallback() { public void callback(Pointer context, TeamPtr team) { - sendFromNet(MSG_TEAM_ADDED, team.deref().team); + sendFromNet(MSG_TEAM_ADDED, team.deref()); } }; @@ -468,7 +468,7 @@ break; } case MSG_SEND_ADD_TEAM: { - FLIB.flib_netconn_send_addTeam(conn, TeamPtr.createJavaOwned((Team)msg.obj)); + FLIB.flib_netconn_send_addTeam(conn, TeamPtr.createJavaOwned((TeamInGame)msg.obj)); break; } case MSG_SEND_REMOVE_TEAM: { @@ -483,15 +483,11 @@ break; } case MSG_SEND_TEAM_COLOR_INDEX: { - if(FLIB.flib_netconn_send_teamColor(conn, (String)msg.obj, msg.arg1)==0) { - sendFromNet(MSG_TEAM_COLOR_CHANGED, msg.arg1, msg.obj); - } + FLIB.flib_netconn_send_teamColor(conn, (String)msg.obj, msg.arg1); break; } case MSG_SEND_TEAM_HOG_COUNT: { - if(FLIB.flib_netconn_send_teamHogCount(conn, (String)msg.obj, msg.arg1)==0) { - sendFromNet(MSG_HOG_COUNT_CHANGED, msg.arg1, msg.obj); - } + FLIB.flib_netconn_send_teamHogCount(conn, (String)msg.obj, msg.arg1); break; } case MSG_SEND_ENGINE_MESSAGE: {