# HG changeset patch # User mikade # Date 1337465306 -7200 # Node ID b20dfa82f4534937935c2c30a10a12dcdff82d39 # Parent f5a5578be66b417cb5a624bfe964a7a9184b5e62 + Trivial update. + Script for managing WxW, AFR, and Surf'n'Crate shoppa-variants. diff -r f5a5578be66b -r b20dfa82f453 share/hedgewars/Data/Missions/Training/User_Mission_-_Rope_Knock_Challenge.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Rope_Knock_Challenge.lua Sat May 19 17:15:12 2012 +0200 +++ b/share/hedgewars/Data/Missions/Training/User_Mission_-_Rope_Knock_Challenge.lua Sun May 20 00:08:26 2012 +0200 @@ -45,7 +45,7 @@ {"sheepluva", "zoo_Sheep",false}, {"Smaxx", "NoHat",false}, {"shadowzero", "NoHat",false}, - {"Star and Moon", "NoHat",false}, + {"Star and Moon", "SparkleSuperFun",false}, {"The 24", "NoHat",false}, {"TLD", "NoHat",false}, {"Tiyuri", "sf_ryu",false}, diff -r f5a5578be66b -r b20dfa82f453 share/hedgewars/Data/Scripts/Multiplayer/WxW.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Scripts/Multiplayer/WxW.cfg Sun May 20 00:08:26 2012 +0200 @@ -0,0 +1,2 @@ +Shoppa +Shoppa diff -r f5a5578be66b -r b20dfa82f453 share/hedgewars/Data/Scripts/Multiplayer/WxW.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua Sun May 20 00:08:26 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(band(0xFFFFFFFF, bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLeft+gmLJump+gmPrecise+gmRight+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon))) + 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(band(0xFFFFFFFF, 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