InitNewGame(); require("layered_bar") math.randomseed( os.time() ) mapvar.enemies = { { name = "btard_hw", score = 1 }, { name = "superbtard_hw", score = 3 }, { name = "slowpoke_hw", score = 3 }, { name = "slowpoke-moonwalking_hw", score = 4 }, { name = "technopoke_hw", score = 4 }, { name = "small_orb_hw", score = 5 }, } mapvar.wave = { score = math.floor(3*difficulty), enemies_left = 0, boss = false, } mapvar.items = { { name = "wakabamark", score = 1 }, { name = "ammo", score = 1 }, { name = "vegetable1", score = 2 }, { name = "vegetable2", score = 3 }, { name = "vegetable3", score = 5 }, { name = "bonus-circle", score = 5 }, { name = "bonus-square", score = 5 }, { name = "bonus-line", score = 5 }, { name = "bonus-diamond", score = 5 }, { name = "bonus-triangle", score = 5 }, } mapvar.spawnpoints = { {-131, 584}, {1468, 584}, {601, -669}, {677, -164}, {601, -669}, {2258, -201}, {3808, -671}, } mapvar.itemspawns = { {689, -22}, {-136, 580}, {3401, -954}, {2581, -1363}, {844, -896} } mapvar.FatherOfAllMonsters = CreateSprite("phys-empty", -9000, 9000) SetCamUseBounds( true ) SetCamBounds( -90000, 90000, -90000, 816) death = CreateItem("generic-death-area", -90000, 816) GroupObjects( death, CreateItem("generic-death-area", 90000, 900) ) local LEVEL = {} require("routines") CONFIG.backcolor_r = 0; CONFIG.backcolor_g = 0; CONFIG.backcolor_b = 0; LoadConfig(); dofile("levels/halloween.lua") local env = CreateEnvironment("default_environment", -9001, -9001) SetDefaultEnvironment(env) local rib = CreateRibbonObj( "ribbon-details", 0.080000, -0.080000, -553, 19, -1.1, true ) SetObjAnim( rib, "hangman", false ) SetRibbonObjRepitition( rib, false, false ) rib = CreateRibbonObj( "ribbon-details", 0.080000, -0.080000, -736, 12, -1.1, true ) SetObjAnim( rib, "hangman", false ) SetRibbonObjRepitition( rib, false, false ) rib = CreateRibbonObj( "ribbon-details", 0.080000, -0.080000, 1799, 180, -1.1, true ) SetObjAnim( rib, "hangman", false ) SetRibbonObjRepitition( rib, false, false ) rib = CreateRibbonObj( "ribbon-details", 0.080000, -0.080000, 3441, 89, -1.1, true ) SetObjAnim( rib, "smile", false ) SetRibbonObjRepitition( rib, false, false ) rib = CreateRibbonObj( "ribbon-details", 0.080000, -0.080000, 134, -195, -1.1, true ) SetObjAnim( rib, "smile", false ) SetRibbonObjRepitition( rib, false, false ) rib = CreateRibbonObj( "ribbon-details", 0.080000, -0.080000, -543, 52, -1.1, true ) SetObjAnim( rib, "owl", false ) SetRibbonObjRepitition( rib, false, false ) rib = CreateRibbonObj( "ribbon-details", 0.080000, -0.080000, 1869, 42, -1.1, true ) SetObjAnim( rib, "branch", false ) SetRibbonObjRepitition( rib, false, false ) rib = CreateRibbonObj( "ribbon-details", 0.080000, -0.080000, 3620, 93, -1.1, true ) SetObjAnim( rib, "owl", false ) SetRibbonObjRepitition( rib, false, false ) rib = CreateRibbonObj( "ribbon-details", 0.080000, -0.080000, 3939, 71, -1.1, true ) SetObjAnim( rib, "branch", false ) SetRibbonObjRepitition( rib, false, false ) SetCamAttachedObj(GetPlayer().id); -- Цепляем камеру к объекту SetCamAttachedAxis(true, true); -- Камера смещается только по оси X SetCamFocusOnObjPos(constants.CamFocusBottomCenter); -- Камера следит за серединой ниднего края объекта -- При смене анимаций y-координата нижнего края не меняется, таким образом, камера не пляшет при, например, приседании SetCamObjOffset(0, 60); -- Задаем смещении камеры относительно объекта function CreatePlatform( platform, coords, loop ) local wpsize = 16 local first = CreateWaypoint( coords[1][1], coords[1][2], wpsize, wpsize ) local second = CreateWaypoint( coords[2][1], coords[2][2], wpsize, wpsize ) SetNextWaypoint( first, second ) local last = second local now = 0 for i=3, #coords do now = CreateWaypoint( coords[i][1], coords[i][2], wpsize, wpsize ) SetNextWaypoint( last, now ) last = now end if loop then SetNextWaypoint( last, first ) else for i=#coords-1,2,-1 do now = CreateWaypoint( coords[i][1], coords[i][2], wpsize, wpsize ) SetNextWaypoint( last, now ) last = now end SetNextWaypoint( last, first ) end SetEnemyWaypoint( CreateEnemy(platform, coords[1][1], coords[1][2]), second ) end --local rib = CreateRibbonObj("ribbon-details", 0, 0, x, y, -1, false) --ObjSetAnim( rib, "hangman" ) mapvar.wp = {} mapvar.wp.info = {} mapvar.wp.wtoi = {} mapvar.next_wp = 1 mapvar.log = {} function wp_reached( id, waypoint ) local old = mapvar.wp.wtoi[ waypoint ] local possible = {} local pl = GetPlayer() if not pl then return 0 end local dist local min = nil local obj local target local wp = mapvar.wp.info[old] local en = GetObject( id ) local t if wp.teleport then if ( math.random(1, 10) < 2 ) then --mapvar.log[id]:write( "Random teleport.\n" ) local rnd = math.random(1, #wp.next) target = GetObject( mapvar.wp[wp.next[rnd]] ) t = wp.next[rnd] else for key, value in pairs( wp.next ) do obj = GetObject( mapvar.wp[value] ) dist = ( math.pow(obj.aabb.p.y-pl.aabb.p.x, 2) + math.pow(obj.aabb.p.y-pl.aabb.p.y, 2) ) if (not target or dist < min) and (obj.id ~= waypoint) then min = dist target = obj t = value end end end wp = mapvar.wp.info[t] CreateParticleSystem( "pteleporthw", en.aabb.p.x, en.aabb.p.y ) CreateParticleSystem( "pteleporthw", target.aabb.p.x, target.aabb.p.y ) PlaySnd( "morph.ogg", false, en.aabb.p.x, en.aabb.p.y ) PlaySnd( "morph.ogg", false, target.aabb.p.x, target.aabb.p.y ) SetObjPos( id, target.aabb.p.x, target.aabb.p.y ) target = nil end for key, value in pairs( wp.next ) do obj = GetObject( mapvar.wp[value] ) dist = ( math.pow(obj.aabb.p.y-pl.aabb.p.x, 2) + math.pow(obj.aabb.p.y-pl.aabb.p.y, 2) ) if (not target or dist < min) and ( obj.id ~= waypoint ) and not ( mapvar.wp.info[value].air ) then min = dist target = obj t = value end end return target.id end function RegisterWaypoint( data ) local d = data or {} local coord = { d[1] or 0, d[2] or 0 } local s = d.size or { 8, 8 } local f = d.from or {} local t = d.to or {} local a = d.in_air or false local id = d.id or mapvar.next_wp local tp = d.teleport or false local m = d.misc or nil mapvar.wp[id] = CreateWaypoint( coord[1], coord[2], s[1], s[2], wp_reached ) mapvar.wp.wtoi[mapvar.wp[id]] = id mapvar.wp.info[ id ] = { next = {}, air = a, teleport = tp, misc = m } for key, value in pairs( f ) do table.insert(mapvar.wp.info[ value ].next, id) end for key, value in pairs( t ) do table.insert(mapvar.wp.info[ id ].next, value) end if id == mapvar.next_mp then mapvar.next_wp = mapvar.next_wp + 1 end return id end CreatePlatform( "hw_fp", { {390, -143}, {392, -645} }, true ) CreatePlatform( "hw_fp", { {969, -932}, {2243, -1337} }, true ) CreatePlatform( "hw_fp", { {3136, -667}, {3136, -223} }, true ) CreatePlatform( "hw_fp", { {2587, -691}, {2587, -1081} }, true ) local wp = {} RegisterWaypoint { id = 1, -357, -24 } --1 Левый край RegisterWaypoint { id = 2, 505, 452, from={1} } --2 Левый край, низ RegisterWaypoint { id = 3, -395, 452, from={2}, to = {16, 17, 21, 38, 39, 40, 26}, teleport=true } --3 Левый край, телепортер (!) RegisterWaypoint { id = 4, -175, 462, from={3} } --4 Подвал башни, левый тупик RegisterWaypoint { id = 5, 392, -12, from={1}, to = {1} } --5 Башня, низ RegisterWaypoint { id = 6, 380, -325, from={5}, to = {5}, in_air = true } --6 Башня, воздух RegisterWaypoint { id = 7, 75, -255, from={6}, to = {6}, in_air = true } --7 Башня, левая платформа RegisterWaypoint { id = 8, 600, -652, to = {1} } --8 Башня, место появления RegisterWaypoint { id = 9, 1421, -14, from={5}, to = {5} } --9 Дыра в подвал, слева RegisterWaypoint { id = 10, 1623, -14, from={}, to = {} } --10 Дыра в подвал, справа RegisterWaypoint { id = 11, 1512, -62, from={9, 10}, to = {9, 10}, in_air = true } --11 Над дырой в подвал RegisterWaypoint { id = 12, 1522, 184, from={9, 10, 11}, to = {18} } --12 Подвал, ящик под дырой. RegisterWaypoint { id = 13, 2251, -162, from={}, to = {10} } --13 Внутренний двор, место появления. --!@!@ RegisterWaypoint { id = 14, 1162, 230, from={12}, to = {} } --14 Подвал, место появления под двором RegisterWaypoint { id = 15, 1449, 256, from={14}, to = {4, 21, 38, 39, 40, 26}, teleport=true } --15 Подвал, правый верхний телепортер (!) RegisterWaypoint { id = 16, 985, 256, from={14}, to = {4, 21, 38, 39, 40, 26}, teleport=true } --16 Подвал, левый верхний телепортер (!) RegisterWaypoint { id = 17, 762, 256, from={16}, to = {} } --17 Подвал, после телепорта слева RegisterWaypoint { id = 18, 1581, 256, from={15}, to = {} } --18 Подвал, после телепорта справа RegisterWaypoint { id = 19, 238, 249, from={15}, to = {} } --19 Подвал, над местом падения RegisterWaypoint { id = 20, 198, 607, from={17}, to = {21} } --20 Подвал, место падения RegisterWaypoint { id = 21, -109, 585, from={4}, to = {20} } --21 Подвал, левое место появления RegisterWaypoint { id = 22, 321, 601, from={20}, to = {4, 16, 17, 39, 40, 26}, teleport=true } --22 Подвал, левый телепортер рядом с ямой-ловушкой (!) RegisterWaypoint { id = 23, 491, 601, from={20}, to = {4, 16, 17, 38, 40, 26}, teleport=true } --23 Подвал, правый телепортер рядом с ямой-ловушкой (!) RegisterWaypoint { id = 24, 1176, 592, from={}, to = {16, 17, 21, 38, 39, 26}, teleport=true } --24 Подвал, телепортер босса (!) RegisterWaypoint { id = 25, 2858, 240, from={18}, to = {16, 17, 21, 38, 39, 40, 26}, teleport=true } --25 Подвал правой башни, телепортер (!) RegisterWaypoint { id = 26, 77, -895, from={23}, to = {8} } --26 Левая башня, крыша RegisterWaypoint { id = 27, 2574, -1522, from={23}, to = {12} } --27 Правая башня, крыша RegisterWaypoint { id = 28, 3198, -83, from={}, to = {} } --28 Правая башня, верхняя платформа, у ящиков RegisterWaypoint { id = 29, 3772, -83, from={26}, to = {} } --29 Правая башня, верхняя платформа, дальний край RegisterWaypoint { id = 30, 4056, -96, from={26}, to = {}, teleport=true, misc = {sniperpoke = true} } --30 Точка для слоупоков (i) RegisterWaypoint { id = 31, 3810, -663, from={}, to = {32, 33} } --31 Правая башня, место появления RegisterWaypoint { id = 32, 4131, -663, from={31}, to = {16, 17, 38, 39, 40, 26}, teleport=true } --32 Правая башня, телепортер внутри (!) RegisterWaypoint { id = 33, 3301, -663, from={31}, to = {27} } --33 Правая башня, справа от дыры в пыло RegisterWaypoint { id = 34, 3003, -663, from={}, to = {28} } --34 Правая башня, слева от дыры в пыло RegisterWaypoint { id = 35, 2580, -663, from={34}, to = {34} } --35 ЛД рядом с фонтаном RegisterWaypoint { id = 36, 2986, -1166, from={32}, to = {35, 18} } --36 Правая башня, верхняя башня RegisterWaypoint { id = 37, 3228, -907, from={36}, to = {35} } --37 Правая башня, средний коридор RegisterWaypoint { id = 38, 321, 601, from={}, to = {22} } RegisterWaypoint { id = 39, 491, 601, from={}, to = {23, 24} } RegisterWaypoint { id = 40, 1176, 592, from={}, to = {24, 23} } function map_trigger( id, trigger ) if trigger == 666 then SetObjDead( id ) ContinueBoss() return end ObjectPushInt( id, trigger ) local pl = GetPlayer() local nc = { 1870, 581 } if not trigger or trigger < 1 or trigger > 6 then trigger = math.random(1, 6) end if math.random(1,20) ~= 13 or trigger == 3 then if trigger == 1 then nc = { -178, 459 } elseif trigger == 2 then nc = { -94, -885 } elseif trigger == 3 then nc = { 4058, -97 } elseif trigger == 4 then nc = { 2564, -1502 } elseif trigger == 5 then nc = { 852, 192 } elseif trigger == 6 then nc = { 2129, -154 } end end CreateParticleSystem( "pteleporthw", pl.aabb.p.x, pl.aabb.p.y ) CreateParticleSystem( "pteleporthw", nc[1], nc[2] ) PlaySnd( "morph.ogg", false ) SetObjPos( pl.id, nc[1], nc[2] ) end trigger = CreateItem("hw_teleporter", -451, 411) GroupObjects( trigger, CreateItem("hw_teleporter", -361, 500) ) ObjectPushInt( trigger, 1 ) trigger = CreateItem("hw_teleporter", 1650, 533) GroupObjects( trigger, CreateItem("hw_teleporter", 1721, 642) ) ObjectPushInt( trigger, 2 ) trigger = CreateItem("hw_teleporter", 1775, 552) GroupObjects( trigger, CreateItem("hw_teleporter", 1834, 644) ) ObjectPushInt( trigger, 3 ) trigger = CreateItem("hw_teleporter", 2840, 223) GroupObjects( trigger, CreateItem("hw_teleporter", 2900, 296) ) ObjectPushInt( trigger, 4 ) trigger = CreateItem("hw_teleporter", 4103, -696) GroupObjects( trigger, CreateItem("hw_teleporter", 4170, -616) ) ObjectPushInt( trigger, 5 ) trigger = CreateItem("hw_teleporter", 3525, -940) GroupObjects( trigger, CreateItem("hw_teleporter", 3583, -856) ) ObjectPushInt( trigger, 6 ) function set_respawn_point(id) local obj = GetObject(id) SetPlayerRevivePoint(obj.aabb.p.x, obj.aabb.p.y) end trigger = CreateItem("generic-respawn-point", 84, -51) GroupObjects( trigger, CreateItem("generic-respawn-point", 149, 5) ) trigger = CreateItem("generic-respawn-point", 3509, -740) GroupObjects( trigger, CreateItem("generic-respawn-point", 3580, -670) ) trigger = CreateItem("generic-respawn-point", 2551, -1400) GroupObjects( trigger, CreateItem("generic-respawn-point", 2619, -1343) ) trigger = CreateItem("generic-respawn-point", 1134, 352) GroupObjects( trigger, CreateItem("generic-respawn-point", 1206, 446) ) function Spawn_thread( location, enemies ) local enemy local i for i=1, #enemies do CreateParticleSystem( "pteleporthw", location[1], location[2] ) PlaySnd( "morph.ogg", false, location[1], location[2] ) enemy = CreateEnemy( enemies[i], location[1], location[2], nil, nil, mapvar.FatherOfAllMonsters ) if enemies[i] == "small_orb_hw" then table.insert(mapvar.wave.immortal_enemies, enemy) end table.insert(mapvar.wave.enemies, enemy) Wait(1000) end end function StartWave() mapvar.wave.immortal_enemies = {} mapvar.wave.enemies = {} mapvar.wave.items = {} mapvar.wave.number = (mapvar.wave.number or 0) + 1 mapvar.start_time = Loader.time mapvar.next_check = Loader.time + 10 local scrore local enemies if mapvar.wave.boss then StartBoss() return end for key, value in pairs( mapvar.spawnpoints ) do enemies = {} score = mapvar.wave.score while score > 0 do rnd = math.random( 1, #mapvar.enemies ) while mapvar.enemies[rnd].score > score do rnd = rnd + 1 if rnd > #mapvar.enemies then rnd = 1 end end table.insert( enemies, mapvar.enemies[rnd].name ) score = score - mapvar.enemies[rnd].score if mapvar.enemies[rnd].name ~= "small_orb_hw" then mapvar.wave.enemies_left = mapvar.wave.enemies_left + 1 end end Resume( NewMapThread( Spawn_thread ), value, enemies ) end for key, value in pairs( mapvar.itemspawns ) do score = mapvar.wave.score while score > 0 do rnd = math.random( 1, #mapvar.items ) while mapvar.items[rnd].score > score do rnd = rnd + 1 if rnd > #mapvar.items then rnd = 1 end end score = score - mapvar.items[rnd].score table.insert(mapvar.wave.items, CreateItem(mapvar.items[rnd].name, value[1] + math.random(-10, 10), value[2] + math.random(-10, 0)) ) end end mapvar.bar = LayeredBar.create() mapvar.bar.pmin = 0 mapvar.bar.pmax = mapvar.wave.enemies_left mapvar.bar:init_default( { {color ={102/255, 37/255, 1/255, 1} }, {color={174/255, 63/255, 0, 1}} }, "WAVE "..mapvar.wave.number) end function EndWave( start ) if not start then Wait( 5000 ) for key, value in pairs(mapvar.wave.immortal_enemies or {}) do SetObjAnim( value, "die", false ) end for key, value in pairs(mapvar.wave.items or {}) do SetObjDead( value ) end for key, value in pairs(mapvar.widgets or {}) do if key ~= "announcement" then DestroyWidget( value ) end end end if not mapvar.widgets.announcement then mapvar.widgets.announcement = CreateWidget( constants.wt_Picture, "announcement", nil, 34, 112, 1, 1 ) WidgetSetFocusable(mapvar.widgets.announcement, false) WidgetSetSprite( mapvar.widgets.announcement, "hw_announcements" ) end if mapvar.wave.number and mapvar.wave.number % 5 == 0 then mapvar.wave.boss = true end if mapvar.wave.boss then WidgetSetAnim( mapvar.widgets.announcement, "boss" ) else WidgetSetAnim( mapvar.widgets.announcement, "normal" ) end for i=1,3 do WidgetSetVisible( mapvar.widgets.announcement, true ) Wait( 300 ) WidgetSetVisible( mapvar.widgets.announcement, false ) Wait( 300 ) end mapvar.wave.score = math.floor( (mapvar.wave.score * 1.5) + 0.5 ) StartWave() end mapvar.deadandgone = {} function hw_enemy_dead(id) mapvar.wave.enemies_left = mapvar.wave.enemies_left - 1 mapvar.bar:setLayerVal(mapvar.wave.enemies_left, 2) if mapvar.wave.enemies_left == 0 then Resume( NewMapThread(EndWave) ) mapvar.bar:destroy() end for key, value in pairs(mapvar.enemies) do if value == id then table.remove(mapvar.enemies, key) break end end if mapvar.widgets[id] then mapvar.deadandgone[id] = true DestroyWidget( mapvar.widgets[id] ) mapvar.widgets[id] = nil end end mapvar.widgets = {} function ololo_ghost_hurt(id) mapvar.bar:setLayerVal( GetCharHealth(id), mapvar.boss_lives_left+1 ) end function ololo_ghost_death(id) mapvar.bar:setLayerVal( 0, mapvar.boss_lives_left+1 ) mapvar.boss_lives_left = mapvar.boss_lives_left - 1 if ( mapvar.boss_lives_left == 0 ) then SetObjAnim( id, "final_death", false ) mapvar.kills = (mapvar.kills or 0) + 1 mapvar.score = (mapvar.score or 0) + 1000 EndBoss() end end function StartBoss() mapvar.wp1 = CreateWaypoint(705, 556, 16, 16, boss_wp ) mapvar.wp2 = CreateWaypoint(1578, 556, 16, 16, boss_wp ) mapvar.wp3 = CreateWaypoint(1578, 422, 16, 16, boss_wp ) mapvar.wp4 = CreateWaypoint(705, 422, 16, 16, boss_wp ) mapvar.boss_platform = CreateEnemy( "hw_fp", 364, 647 ) mapvar.boss_lives = math.floor(mapvar.wave.number / 5) + 1 if mapvar.boss_lives == 1 then mapvar.boss_lives = 2 end trigger = CreateItem("generic-trigger", 334, 550) GroupObjects( trigger, CreateItem("generic-trigger", 493, 782) ) ObjectPushInt( trigger, 666 ) end function ContinueBoss() mapvar.boss = CreateEnemy( "ololo_ghost", 1176, 556 ) SetEnemyWaypoint( mapvar.boss, mapvar.wp1 ) --DestroyWidget( mapvar.BossPointer ) mapvar.bar = LayeredBar.create() mapvar.bar.pmin = 0 mapvar.bar.pmax = 200 local colors = { {color={0,0,0,0}} } for i=1,mapvar.boss_lives do table.insert( colors, {color={254/255 * i/mapvar.boss_lives , 102/255 * i/mapvar.boss_lives, 0, 1}} ) end SetPlayerRevivePoint( 1171, 422 ) mapvar.boss_lives_left = mapvar.boss_lives mapvar.bar:init_default( colors, "OLOLO GHOST") end function EndBoss() mapvar.bar:destroy() SetObjDead( mapvar.boss_platform ) SetObjDead( mapvar.wp1 ) SetObjDead( mapvar.wp2 ) SetObjDead( mapvar.wp3 ) SetObjDead( mapvar.wp4 ) Resume( NewMapThread(EndWave) ) mapvar.wave.boss = false end function boss_wp(id, wp) SetObjAnim(id, "move", true) if wp == mapvar.wp1 then if (math.random(10)>5) then return mapvar.wp2 else return mapvar.wp4 end elseif wp == mapvar.wp2 then if (math.random(10)>5) then return mapvar.wp1 else return mapvar.wp3 end elseif wp == mapvar.wp3 then if (math.random(10)>5) then return mapvar.wp4 else return mapvar.wp2 end else if (math.random(10)>5) then return mapvar.wp3 else return mapvar.wp1 end end end if not vars or not vars.music or vars.music == "CHIPTUNE" then PlayBackMusic( "music/nsmpr_choice.it" ) else PlayBackMusic( "music/nsmpr_EpilepticMarch.ogg" ) end ---------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------- LEVEL.started = false function LEVEL.cleanUp() if mapvar.bar then mapvar.bar:destroy() end for key, value in pairs( mapvar.widgets ) do DestroyWidget( value ) end LEVEL.started = false end function LEVEL.MapScript(player) local enemy local cx, cy = GetCamPos() local angle local v local pnt1, pnt2 if Loader.time > 1 and not LEVEL.started then LEVEL.started = true Resume( NewMapThread(EndWave), true ) end --if mapvar.wave.enemies_left > 0 and mapvar.wave.enemies_left <= 5 and Loader.time - mapvar.wave.start_time > 15 then --if Loader.time - (mapvar.wave.start_time or Loader.time) > 15 then local enemies = GetChildren(mapvar.FatherOfAllMonsters) or {} if (not mapvar.wave.next_check or Loader.time > mapvar.wave.next_check) and not mapvar.wave.boss then mapvar.wave.next_check = Loader.time + 10000 if not mapvar.wave.next_check then mapvar.wave.last_score = mapvar.kills return else if (mapvar.kills or 0) <= (mapvar.wave.last_score or 0) then local wp = GetNearestWaypoint( player.id ) --local wp = player if not mapvar.wave.enemies then return end local enc = #mapvar.wave.enemies/3 local enl = 0 for key, value in pairs( enemies ) do if value.aabb.p.x < -734 or value.aabb.p.x > 4531 or value.aabb.p.y > 840 then SetObjPos( value.id, wp.aabb.p.x, wp.aabb.p.y ) enl = enl + 1 end end if ( #enemies > 0 ) then mapvar.last_teleported = (mapvar.last_teleported or 0)+1 if mapvar.last_teleported > #enemies then mapvar.last_teleported = 1 end SetObjPos( enemies[mapvar.last_teleported].id, wp.aabb.p.x, wp.aabb.p.y ) CreateParticleSystem( "pteleporthw", wp.aabb.p.x, wp.aabb.p.y ) PlaySnd( "morph.ogg", false, wp.aabb.p.x, wp.aabb.p.y ) end else mapvar.last_teleported = 0 mapvar.wave.last_score = (mapvar.kills or 0) end end end end function LEVEL.WeaponBonus() end function LEVEL.placeSecrets() end function LEVEL.removeSecrets() end function LEVEL.SetLoader(l) LEVEL.missionStarter = l --Log("Set loader ", l == nil and "nil" or "l") end return LEVEL