--=================================================================================================================================================================
-- Berkyt's Map Win Condition
-- By BERKYT
-- Links: VK: https://vk.com/b_e_r_k_y_t Discord: https://discord.gg/amMreCC YouTube: https://www.youtube.com/channel/UCaPBjmrAYO6p-ksHNaymwLg?view_as=subscriber
-- The script is distributed freely, provided that the author of the script is indicated - BERKYT
--=================================================================================================================================================================
function bm_OnGameSetup()
for i=1, World_GetPlayerCount() do
if i ~= 3 then
g_table_players["player_"..i] = World_GetPlayerAt(i-1)
end
end
g_count_ad = 1
g_table_sgroup_enemies =
{
}
g_table_squad_stuck =
{
}
g_table_squad_reinforcement_timers =
{
}
--Timer
g_timer_wave = 0
g_timer_re = 0
g_timer_to_win = -1
g_interval_squad_stuck = 0
g_time_squad_stuck = 0
--Waves
g_num_waves = 1
g_number_wave = 0
--Music
g_id_track = nil
g_check_music_playing = false
g_check_wave_alive = false
end
function bm_init()
print(" Initing Berkyt's Map Scar... ")
bm_OnGameSetup()
bm_Test()
bm_deleteHq()
bm_Start_map()
bm_SetSGroupOfWavesFromTable()
bm_CreateTableTimersSquadStuck()
bm_CreateTableTimersReinforcement()
bm_SetSGroupOfReinforcementsFromTable()
Cpu_Enable(g_Player3, false)
Rule_Add(bm_Rule_EndGameWin)
Rule_Add(bm_Rule_EndGameLose)
Rule_AddOneShot(bm_Sberbank, 30)
Rule_AddInterval(bm_Advertising, 7 * 60)
Rule_AddInterval(bm_CheckingEndWave, 1)
print(" Success")
end
Scar_AddInit(bm_init)
function bm_Start_map()
Fade_Start(5, true)
Util_MissionTitle("By: BERKYT")
end
-- This function created by SWayfarer
function bm_deleteHq()
local i1 = 0
local eg = "rjgrfjlrefvrfgftgb"
local sg = "brjrfgbkfgnf3243re"
if (Marker_Exists("mkr_BERKYT_script_deleteEntities", "basic_marker")) then
for i1 = 1, World_GetPlayerCount() do
Player_GetAllEntitiesNearMarker(World_GetPlayerAt(i1 - 1), eg, "mkr_BERKYT_script_deleteEntities")
EGroup_DestroyAllEntities(eg)
EGroup_Destroy(eg)
end
else
print(" (Error) Can't remove entities because special marker not exists!")
end
if (Marker_Exists("mkr_BERKYT_script_deleteSquads", "basic_marker")) then
for i1 = 1, World_GetPlayerCount() do
Player_GetAllSquadsNearMarker(World_GetPlayerAt(i1 - 1), sg, "mkr_BERKYT_script_deleteSquads")
SGroup_DestroyAllSquads(sg)
SGroup_Destroy(sg)
end
else
print(" (Error) Can't remove squads because special marker not exists!")
end
end
--
function bm_Advertising()
if(g_count_ad == 1) then
bm_Site_En()
elseif(g_count_ad == 2) then
bm_VKontakte()
elseif(g_count_ad == 3) then
bm_Sberbank()
elseif(g_count_ad == 4) then
bm_WebMoney()
g_count_ad = 0
end
g_count_ad = g_count_ad + 1
end
function bm_WebMoney()
Util_MissionTitle("If you want to thank the author for the script, then here's how to do it: WebMoney: R515364081475(RUB) or Z262863085617(USD)(Check ReadMe - file)")
end
function bm_Sberbank()
Util_MissionTitle("If you want to thank the author for the script, then here's how to do it: Sberbank: 5469 4000 2976 6750 (Check ReadMe - file)")
end
function bm_VKontakte()
Util_MissionTitle("VKontakte: https://vk.com/club177090833 (Check ReadMe - file)")
end
function bm_Site_En()
if World_GetRand(0, 1) == 1 then
Util_MissionTitle("Visit my website and receive exclusive information!(Check ReadMe - file)")
else
Util_MissionTitle("Visit my website and receive exclusive information! Link: http://bit.ly/3glPSP7")
end
end
function bm_Site_Ru()
Util_MissionTitle("???????? ??? ???? ? ????????? ???????????? ??????????!(????????? 'ReadMe' - ????)")
end
function bm_Print(...)
local line = ""
for i = 1, arg.n do
line = line .. " " ..tostring(arg[i])
end
print(" { "..line.." }")
end
function bm_LengthTable(table)
local len = 0
if type(table) == "table" then
for _ in table do
len = len + 1
end
return tonumber(len)
else
return nil
end
end
function bm_TurnOnMusicWhenAttack(player)
local name_race = Player_GetRaceName(player)
local table_playlist =
{
["chaos_marine_race"] =
{
"MU_IG_STR_Chaos", "MU_IG_STR_Chaos_perc", "MU_IG_STR_Chaos_perc_brass",
"MU_IG_STR_Chaos_perc_str", "MU_IG_STR_Chaos_perc_voice"
},
["eldar_race"] =
{
"MU_IG_STR_Eldar", "MU_IG_STR_Eldar_perc",
"MU_IG_STR_Eldar_perc_brass", "MU_IG_STR_Eldar_perc_str"
},
["guard_race"] =
{
"MU_IG_STR_ImpGd_perc_brass", "MU_IG_STR_ImpGd", "MU_IG_STR_ImpGd_perc",
"MU_IG_STR_ImpGd_perc_str", "MU_IG_STR_ImpGd_perc_voice"
},
["necron_race"] =
{
"MU_IG_THEME_Nightbringer", "MU_IG_STR_Necron", "MU_IG_STR_Necron_perc",
"MU_IG_STR_Necron_perc_brass", "MU_IG_STR_Necron_perc_str"
},
["ork_race"] =
{
"MU_IG_STR_Ork", "MU_IG_STR_Ork_perc", "MU_IG_STR_Ork_perc_str",
"MU_IG_STR_Ork_perc_brass", "music_msd5o", "music_msd1"
},
["space_marine_race"] =
{
"MU_IG_STR_SpaceMarine", "MU_IG_STR_SpaceMarine_perc",
"MU_IG_STR_SpaceMarine_perc_brass", "MU_IG_STR_SpaceMarine_perc_str"
},
["tau_race"] =
{
"MU_IG_STR_Tau", "MU_IG_RAC_Tau", "MU_IG_STR_Tau_perc",
"MU_IG_STR_Tau_perc_str", "MU_IG_STR_Tau_perc_brass"
},
["dark_eldar_race"] =
{
"MU_IG_STR_darkeldar_perc_str", "MU_IG_STR_darkeldar",
"MU_IG_STR_darkeldar_perc", "MU_IG_STR_darkeldar_perc_brass"
},
["sisters_race"] =
{
"mu_ig_str_sisters", "mu_ig_str_sisters_perc_str", "mu_ig_str_sisters_perc_voice"
},
["default"] =
{
"MU_IG_STR_Tau", "MU_IG_STR_Chaos", "MU_IG_STR_Eldar",
"MU_IG_STR_ImpGd_perc_brass", "MU_IG_THEME_Nightbringer",
"MU_IG_STR_Ork", "MU_IG_STR_SpaceMarine", "MU_IG_STR_darkeldar_perc_str", "mu_ig_str_sisters"
}
}
for key in table_playlist do
if key == name_race then
Sound_PlaylistPlayNow(PC_Music, table_playlist[key][World_GetRand(1, bm_LengthTable(table_playlist[key]))])
g_check_music_playing = true
return
end
end
Sound_PlaylistPlayNow(PC_Music, table_playlist["default"][World_GetRand(1, bm_LengthTable(table_playlist["default"]))])
end
function bm_Rule_EndGameWin()
if g_num_waves > bm_LengthTable(g_table_warriors.waves) and
bm_SGroup_GetAvgHealthFromTable(sg_table_type_unit) <= 0
then
World_SetGameOver()
end
end
function bm_Rule_EndGameLose()
local building_exceptions =
{
"chaos_armoury",
"chaos_listening_post",
"chaos_mine_field",
"chaos_plasma_generator",
"chaos_thermo_plasma_generator",
"chaos_turret_bolter",
"eldar_advanced_warp_generator",
"eldar_listening_post",
"eldar_mine_field",
"eldar_soul_shrine",
"eldar_support_platform_scatterlaser",
"eldar_warp_generator",
"ork_bigger_generator",
"ork_generator",
"ork_gork_totem",
"ork_mine_field",
"ork_pile_o_guns",
"ork_waagh_banner",
"space_marine_armoury",
"space_marine_generator",
"space_marine_listening_post",
"space_marine_mine_field",
"space_marine_turret_bolter",
"space_marine_thermo_generator",
"guard_listening_post",
"guard_mines",
"guard_plasma_generator",
"guard_tactica",
"guard_thermo_plasma",
"guard_turret_heavy_bolter",
"necron_listening_post",
"necron_summoning_core",
"necron_plasma_generator",
"necron_energy_core",
"necron_greater_summoning_core",
"necron_forbidden_archive",
"necron_thermoplasma_generator",
"necron_turret",
"tau_listening_post",
"tau_research_building",
"tau_shrine_of_kauyon",
"tau_shrine_of_montka",
"tau_shrine_of_purpose",
"tau_thermoplasma_generator",
"tau_turret_sp",
"tau_plasma_generator",
"sisters_thermo_plasma",
"sisters_plasma_generator",
"sisters_turret_flamer",
"sisters_holy_reliquary",
"sisters_listening_post",
"sisters_mines",
"sisters_sanctuary",
"dark_eldar_haemonculus_laboratory",
"dark_eldar_listening_post",
"dark_eldar_plasma_generator",
"dark_eldar_slave_caravel",
"dark_eldar_soul_cage",
"dark_eldar_thermo_plasma",
"dark_eldar_wych_cult_arena"
}
for key, player in pairs(g_table_players) do
if Player_IsAlive(player) then
if Player_HasBuildingsExcept(player, building_exceptions) == false then
Player_Kill(player)
end
end
end
end
function bm_CreateTableTimersSquadStuck()
for key_wave, table_waves in pairs(g_table_warriors.waves) do
g_table_squad_stuck[key_wave] = {}
for key in table_waves do
g_table_squad_stuck[key_wave][key] = 0
--bm_Print(g_table_squad_stuck[key_wave][key])
end
end
end
function bm_CreateTableTimersReinforcement()
for player in g_table_players do
g_table_squad_reinforcement_timers[player] = 0
--bm_Print("g_table_squad_reinforcement_timers[player] =",g_table_squad_reinforcement_timers[player])
end
end
function bm_CheckingSquadStuck(key_wave, key_type, sg_wave_troops_team)
local time_wait = 90
SGroup_CreateIfNotFound(sg_wave_troops_team)
if SGroup_IsUnderAttack(sg_wave_troops_team, false) == false then
g_table_squad_stuck[key_wave][key_type] = g_table_squad_stuck[key_wave][key_type] + 1
--bm_Print(g_table_squad_stuck[key_wave][key_type])
if g_table_squad_stuck[key_wave][key_type] >= time_wait then
SGroup_DestroyAllSquads(sg_wave_troops_team)
g_table_squad_stuck[key_wave][key_type] = 0
end
else
g_table_squad_stuck[key_wave][key_type] = 0
end
end
function bm_SearchForAPlayerInTableByIndex(var)
for key in g_table_players do
local int_key = tonumber(string.sub(tostring(key), 8))
if int_key == var then
return g_table_players[key]
end
end
end
function bm_Timer()
sg_table_type_unit = g_table_sgroup_enemies["wave_"..g_number_wave + 1]
if g_number_wave ~= 0 then
sg_table_type_unit = g_table_sgroup_enemies["wave_"..g_number_wave]
end
if bm_SGroup_GetAvgHealthFromTable(sg_table_type_unit) <= 0 then
g_timer_wave = g_timer_wave + 1
--bm_Print("g_timer_wave = ", g_timer_wave)
if g_timer_wave > g_interval + 1 then
g_timer_wave = 0
end
end
for player in g_table_sgroup_players do
SGroup_CreateIfNotFound(g_table_sgroup_players[player])
if SGroup_GetAvgHealth(g_table_sgroup_players[player]) <= 0 then
g_table_squad_reinforcement_timers[player] = g_table_squad_reinforcement_timers[player] + 1
--bm_Print("g_table_squad_reinforcement_timers[player] =",g_table_squad_reinforcement_timers[player])
if g_table_squad_reinforcement_timers[player] > g_t_interval_reinforcement + 1 then
g_table_squad_reinforcement_timers[player] = 0
end
end
end
end
function bm_SetSGroupOfWavesFromTable()
for key_wave, table_waves in pairs(g_table_warriors.waves) do
g_table_sgroup_enemies[key_wave] = {}
for key in table_waves do
g_table_sgroup_enemies[key_wave][key] = "sg_Attack_Warriors_"..key
SGroup_CreateIfNotFound("sg_Attack_Warriors_"..key)
end
end
end
function bm_SetSGroupOfReinforcementsFromTable()
for item in g_table_players do
g_table_sgroup_players[item] = "sg_Reinforcements_Warriors_"..string.sub(tostring(item), 8)
end
end
function bm_SGroup_GetAvgHealthFromTable(table_wave)
local sum_health = 0
for key in table_wave do
sum_health = sum_health + SGroup_GetAvgHealth(table_wave[key])
end
--bm_Print("sum_health=", sum_health)
return sum_health
end
function bm_CheckingEndWave()
local sg_table_type_unit = g_table_sgroup_enemies["wave_"..g_number_wave + bm_SmartIncrement()]
if bm_SGroup_GetAvgHealthFromTable(sg_table_type_unit) <= 0 and g_check_wave_alive then
g_check_wave_alive = false
Util_MissionTitle("You did it! But it's too early to relax. A new attack is about to begin!")
end
end
function bm_SGroup_IsEmptyTable(table_wave)
local sum_health = 0
for key in table_wave do
if SGroup_IsEmpty(table_wave[key]) then
return true
end
end
return false
end
function bm_SmartIncrement()
local increment = 0
if g_number_wave == 0 then
increment = increment + 1
return increment
end
return increment
end
function bm_CreateWaves()
sg_table_type_unit = g_table_sgroup_enemies["wave_"..g_number_wave + bm_SmartIncrement()]
if bm_SGroup_GetAvgHealthFromTable(sg_table_type_unit) > 0 then
for key_type in sg_table_type_unit do
bm_CheckingSquadStuck("wave_"..g_number_wave + bm_SmartIncrement(), key_type, sg_table_type_unit[key_type])
end
end
if g_timer_wave >= g_interval and
bm_SGroup_IsEmptyTable(sg_table_type_unit) and
bm_SGroup_GetAvgHealthFromTable(sg_table_type_unit) <= 0
then
g_timer_wave = 0
g_check_wave_alive = true
bm_TurnOnMusicWhenAttack(g_Player3)
Util_MissionTitle("Wave number "..g_num_waves)
if bm_SGroup_GetAvgHealthFromTable(sg_table_type_unit) <= 0 then
for key_wave, table_types in pairs(g_table_warriors.waves) do
if type(table_types) == "table" and tonumber(string.sub(key_wave, 6)) == g_num_waves then
for key_j, table_items in pairs(table_types) do
Util_CreateSquadsAtMarkerEx(g_Player3, g_table_sgroup_enemies[key_wave][key_j],
table_items[1], "mkr_wave_"..World_GetRand(1, g_attack_point),
table_items[2],
table_items[3])
if table_items[4][1] ~= "default" or table_items[4][2] ~= nil then
Squad_ForceUpgradeWeapons(
SGroup_GetSpawnedSquadAt(
SGroup_FromName(g_table_sgroup_enemies[key_wave][key_j]), 1),
table_items[4][1],
table_items[4][2])
end
if table_items[5] then
SGroup_AddLeaders(g_table_sgroup_enemies[key_wave][key_j])
end
Cmd_AttackMoveMarker(g_table_sgroup_enemies[key_wave][key_j],
"mkr_to_player_"..World_GetRand(1, bm_LengthTable(g_table_players)))
end
end
end
end
g_num_waves = g_num_waves + 1
g_number_wave = g_number_wave + 1
end
end
function bm_SpawnReinforcement()
--bm_Print("g_table_squad_reinforcement_timers[player] =",g_table_squad_reinforcement_timers[player])
for player in g_table_players do
local num_player = tonumber(string.sub(tostring(player), 8))
if num_player > 3 then
num_player = num_player - 1
end
if g_table_squad_reinforcement_timers[player] == g_t_interval_reinforcement then
g_table_squad_reinforcement_timers[player] = 0
SGroup_CreateIfNotFound(g_table_sgroup_players[player])
if SGroup_IsEmpty(g_table_sgroup_players[player]) and SGroup_GetAvgHealth(g_table_sgroup_players[player]) <= 0 then
for key_i, table_i in pairs(g_table_warriors.reinforcements) do
if bm_SearchForAPlayerInTableByIndex(
tonumber(string.sub(tostring(key_i), 25))) == g_table_players[player]
then
for key_j, table_j in pairs(table_i) do
bm_Print(g_table_players[player], g_table_sgroup_players[player])
Util_CreateSquadsAtMarkerEx(g_table_players[player], g_table_sgroup_players[player],
table_j[1], "mkr_reinforcement_"..num_player,
table_j[2],
table_j[3])
end
SGroup_AddLeaders(g_table_sgroup_players[player])
end
end
Ping_Marker ("mkr_reinforcement_"..num_player, false)
Util_MissionTitle("Reinforcements have arrived!")
end
end
end
end
function bm_Test()
if Debug_mod then
FOW_RevealAll()
Util_CreateSquadsAtMarkerEx(g_table_players.player_1,
"230948720398414887023984723094781811520", "guard_squad_baneblade", "mkr_to_player_1", 4, 1)
end
end