e4s-sdk/gamedata/scripts/smart_terrain_control.script
2026-06-17 23:06:51 +03:00

120 lines
3.5 KiB
Text

-- Ñîñòîÿíèå ñìàðòòåððåéíà
-- Ìîæåò áûòü òðåõ âèäîâ: normal, danger, alarm
-- normal - âñå êàê îáû÷íî, áåç îãðàíè÷åíèé
-- danger - â çîíå êîíòðîëÿ íàõîäèòñÿ èãðîê ñ îðóæèåì. Íóæíî çàïåðåòü äâåðè è ïðåäëîæèòü åìó óáèðàòüñÿ
-- alarm - èãðîê àòàêîâàë ñìàðò. Íóæíî çàïåðåòü äâåðè è ïîäîæäàòü âðåìÿ.
NORMAL = 0
DANGER = 1
ALARM = 2
current_smart_id = nil
local ALARM_TIME = 2*60*60
class "CBaseOnActorControl"
function CBaseOnActorControl:__init(smart, ini, section)
self.noweap_zone = utils.cfg_get_string(ini, section, "noweap_zone", self, true, "")
self.ignore_zone = utils.cfg_get_string(ini, section, "ignore_zone", self, false, "")
self.alarm_start_sound = xr_logic.parse_condlist(smart, section, "alarm_start_sound", utils.cfg_get_string(ini, section, "alarm_start_sound", self, false, "") )
self.alarm_stop_sound = xr_logic.parse_condlist(smart, section, "alarm_stop_sound", utils.cfg_get_string(ini, section, "alarm_stop_sound", self, false, "") )
self.smart = smart
self.status = NORMAL
end
function CBaseOnActorControl:update()
--printf("%s alarm status [%s]", self.smart:name(), self.status)
if self.status == ALARM then
if game.get_game_time():diffSec(self.alarm_time) < ALARM_TIME then
--printf("TIME %s", game.get_game_time():diffSec(self.alarm_time))
return
end
local sound = xr_logic.pick_section_from_condlist(db.actor, self.smart, self.alarm_stop_sound)
--printf("SOUND = %s", tostring(sound))
--' Îçâó÷êà íà êîíåö àòàêè
if sound ~= nil then
xr_sound.set_sound_play(db.actor:id(), sound)
end
for squad_id,squad in pairs(sim_board.get_sim_board().smarts[self.smart.id].squads) do
game_relations.set_squad_goodwill(squad_id, "neutral")
end
end
if self:get_actor_treat() == true then
self.status = DANGER
else
self.status = NORMAL
end
end
-- Âîçâðàùàåò ñòàòóñ óãðîæàåò ëè èãðîê ñìàðòó èëè íåò (íàõîäèòñÿ ëè ñ îðóæèåì â ïðåäåëàõ íîâåàïîí çîíû).
function CBaseOnActorControl:get_actor_treat()
local zone = db.zone_by_name[self.noweap_zone]
if zone == nil then
return false
end
if not zone:inside(db.actor:position()) then
if current_smart_id == self.smart.id then
current_smart_id = nil
end
return false
else
current_smart_id = self.smart.id
end
if isWeapon(db.actor:active_item()) then
return true
end
return false
end
-- Óñòàíàâëèâàåò, ÷òî èãðîê àòàêîâàë ñìàðò
function CBaseOnActorControl:actor_attack()
if self.status ~= ALARM then
local sound = xr_logic.pick_section_from_condlist(db.actor, self.smart, self.alarm_start_sound)
--' Îçâó÷êà íà íà÷àëî àòàêè.
if sound ~= nil then
xr_sound.set_sound_play(db.actor:id(), sound)
end
for squad_id,squad in pairs(sim_board.get_sim_board().smarts[self.smart.id].squads) do
game_relations.set_squad_goodwill(squad_id, "enemy")
end
end
self.status = ALARM
self.alarm_time = game.get_game_time()
end
function CBaseOnActorControl:get_status()
return self.status
end
-- ÍÅ ÇÀÁÛÒÜ ÑÅÉÂ ËÎÀÄ
function CBaseOnActorControl:save(packet)
set_save_marker(packet, "save", false, "CBaseOnActorControl")
packet:w_u8(self.status)
utils.w_CTime(packet, self.alarm_time)
set_save_marker(packet, "save", true, "CBaseOnActorControl")
end
function CBaseOnActorControl:load(packet)
set_save_marker(packet, "load", false, "CBaseOnActorControl")
self.status = packet:r_u8()
self.alarm_time = utils.r_CTime(packet)
set_save_marker(packet, "load", true, "CBaseOnActorControl")
end