Сделал мод (скачать можно здесь) с рандомным спауном червей для одной карты. Увы, универсальный скрипт написать не могу, т.к. "ориентиры" (reference points, далее могу звать просто точками), подходящие для размещения червей (находятся на земле, свободны от зданий), приходится выискивать вручную. Хотелось бы получать их массив (хотя бы всех) средствами игры. Использовать ориентир "Random", который в некоторых скриптах юзается для указания места для мины/бочки, не получается - все черви размещаются в одном месте.
Часть точек рандомно заполняется телепортами, остальные используются как их точки назначения. После использования телепорт исчезает, также его можно разрушить и червь попадет на его место. За ход можно использовать сколь угодно телепортов.
Код
-- Random Spawn & Teleports mod -- by 4erver aka poxyxol96 -- http://wormsforts.ucoz.ru
function InitialiseLevel() LoadLevel("landscapes/MP/ScriptPack/M4.xom",true) FreeBuildPos = {"001", "003", "005", "006", "007", "008", "009", --7 --массив номеров buildHere для свободных мест --после удаления всех зданий (кроме маяков и крепостей) "0010", "0011", "0012", "0015", "0016", "0017", "0018", "0019", --7+8=15 "0020", "0021", "0022", "0024", "0025", "0026", "0027", "0028", --15+8=23 "0039", "0040", "0042", "0043", "0044", "0045", "0114", --23+7=30 --ниже указаны адреса башен: --"0030", "0034", "0035", "0037", "0056", "0120", "0067", "0070", "0071", "0072", "0108", "0109" } --30+12=36 --считаю число элементов массива --т.к. функции #, table.maxn и table.getn не работают :[ OtherWfRef = { "000", "001", "002", "000Outro" } --прочие wfRef (кроме CrateDrop, *Grail*), 4 шт. hasObject = {} --массив, хранящий инфу о наличии объекта на точке numPoints = 58 --число всех точек end
function PointByN(N, markObject, AddCrateId) --дать название точки по номеру (1-58) if markObject ~= nil then hasObject [N]= markObject end --как пометить наличие объекта if AddCrateId then crate.CrateId = N end --дать ящику номер if N <= 18 then return "wfRefCrateDrop"..N elseif (N > 18) and (N <= 54) then return "buildHere"..FreeBuildPos[N-18] elseif N > 54 then return "wfRef"..OtherWfRef[N-54] end end
function RandomPoint(markObject, AddCrateId) --дать название случайной точки local R = RandomRange(numPoints, true) while hasObject [r]do R = RandomRange(numPoints, true) end --чтоб не было неск объектов на 1 месте return PointByN(R, markObject, AddCrateId) end
function HideWormsNow() ObjData = GetDetailObjectData("holygrail") --скрыл измененный detail ObjData.IsVisible = false ObjData.IsCollidable = false RemoveBuilding( "buildHere0030" ) --убрал мешающие башни RemoveBuilding( "buildHere0034" ) RemoveBuilding( "buildHere0035" ) RemoveBuilding( "buildHere0037" ) RemoveBuilding( "buildHere0056" ) RemoveBuilding( "buildHere0120" ) RemoveBuilding( "buildHere0067" ) RemoveBuilding( "buildHere0070" ) RemoveBuilding( "buildHere0071" ) RemoveBuilding( "buildHere0072" ) RemoveBuilding( "buildHere0108" ) RemoveBuilding( "buildHere0109" ) if GetCurrentSchemeData().HotSeatTime == 500 then GetCurrentSchemeData().NumRandomMines = 0 end --откл мины при подготовке 5с if (GetCurrentSchemeData().Wins == 1) or (GetCurrentSchemeData().Wins == 3) then --при 1/3 раундах вкл тп local tpIndex = 1 --создание и размещение тп while tpIndex <= (numPoints - 16) do --используется число всех точек минус макс число червей if RandomRange(5, true) == 1 then --тп ставятся рандомно с опред шансом crate = CreateCrate() --создается триггер-ящик в виде мишени --при подборе которого происходит тп crate.Contents = kWF_TRIGGER_CRATE crate.NumContents = 1 -- amount in the crate use kWF_INFINITE_AMOUNT for infite crate.TeamDestructible = -1 -- -1 for all teams, otherwise the index of the team crate.WormCollectable = -1 -- -1 for all worms otherwise the index of the worm crate.TeamCollectable = -1 -- -1 for all teams, otherwise the index of the team crate.GroundSnap = true -- set to true for crate to be placed on the ground below spawn point. crate.FixedPosition = true -- set to true, crate will not move i.e. stays at spanw point crate.UXB = false -- whether crate is booby trapped crate.Destructible = true -- whether crate can be destroyed. crate.Pushable = false -- whether crate can be moved by weapons. crate.CollectableByPayload = false -- whether crate can be collected by roaming rounds e.g. rhino crate.Collectable = true -- whether crate can be collected) crate.Model = "Crate.Target" --модель - мишень crate.SpinBaby = true --мишень будет вращаться SpawnCrate( crate.Index, RandomPoint(true, true) ) --спавн end tpIndex = tpIndex + 1 end end if (GetCurrentSchemeData().Wins == 1) or (GetCurrentSchemeData().Wins == 2) then --при 1/2 раундах рандом спавн local hasObjectBackup = hasObject --бэкап массива доступности объектов т.к. можно будет тп на место спавна червя local playerIndex = 0 --размещение червей local wormIndex = 0 local player = GetPlayerData(playerIndex) while player.PlayerIndex ~= -1 do lastwormIndex = (wormIndex - 1) + player.NumberOfWorms while wormIndex <= lastwormIndex do MoveWorm( wormIndex, RandomPoint(true), false ) wormIndex = wormIndex + 1 end if playerIndex == 3 then break end playerIndex = playerIndex + 1 player = GetPlayerData(playerIndex) end hasObject = hasObjectBackup end end
function CrateCollected(CrateIndex,WormIndex) crate = GetCrateData(CrateIndex) if crate.Contents == kWF_TRIGGER_CRATE then --проверка на ящик-триггер MoveWorm( WormIndex, RandomPoint(), true ) hasObject[crate.CrateId] = false end collectgarbage() end
function CrateDestroyed(CrateIndex,WormIndex) --если уничтожить тп, червь переместится на его место crate = GetCrateData(CrateIndex) if crate.Contents == kWF_TRIGGER_CRATE then --проверка на ящик-триггер MoveWorm( WormIndex, PointByN(crate.CrateId, false), false ) end collectgarbage() end