Skip to content

Commit

Permalink
Refactor: Sechailer dispatch (#807)
Browse files Browse the repository at this point in the history
<!-- Пишите **НИЖЕ** заголовков и **ВЫШЕ** комментариев, иначе что то
может пойти не так. -->
<!-- Вы можете прочитать Contributing.MD, если хотите узнать больше. -->

Closes #462

## Что этот PR делает
- Рефактор (в силу моих знаний, скорее всего "де-рефактор" LUL),
повышение читаемости и чистоты кода (нет).
 - Добавление влияния ЕМП воздействия (уход на перезарядку).
- Теперь диспатч срабатывает только при наличии рации с каналом службы
безопасности.

Вещи, которые я не завершил по тем или иным причинам:
 - Таймер не обновляется в рэальном времени в уведомлении (не критично)
- Нет проверки на то, выключен ли канал Security (оно впрочем никуда не
отправит, но ебучий звук воспроизводиться будет, также как и не будет
уведомления о том что канал выключен)

## Почему это хорошо для игры
Ну а чо нет

## Изображения изменений

![image](https://github.com/ss220club/Paradise-SS220/assets/20109643/07e3f4f7-6ac9-46e3-85c9-89dad494e863)

## Тестирование
Проверял в игре

## Changelog

:cl:
tweak: Диспатч секьюрити газмаски теперь уходит на перезарядку при ЭМИ
tweak: Диспатч теперь возможен только при наличии рации с каналом службы
безопасности
tweak: Текст диспатча был изменен и допереведен
/:cl:

<!-- Оба :cl:'а должны быть на месте, что-бы чейнджлог работал! Вы
можете написать свой ник справа от первого :cl:, если хотите. Иначе
будет использован ваш ник на ГитХабе. -->
<!-- Вы можете использовать несколько записей с одинаковым префиксом
(Они используются только для иконки в игре) и удалить ненужные. Помните,
что чейнджлог должен быть понятен обычным игроком. -->
<!-- Если чейнджлог не влияет на игроков(например, это рефактор), вы
можете исключить всю секцию. -->
  • Loading branch information
dj-34 authored Dec 10, 2023
1 parent 8120a47 commit fc8c87b
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 26 deletions.
93 changes: 67 additions & 26 deletions modular_ss220/sechailer/code/sechailer.dm
Original file line number Diff line number Diff line change
@@ -1,32 +1,36 @@
GLOBAL_LIST_EMPTY(sechailers)

/datum/action/item_action/dispatch
name = "Signal dispatch"
desc = "Opens up a quick select wheel for reporting crimes, including your current location, to your fellow security officers."
name = "Signal Dispatch"
desc = "Открывает колесо быстрого выбора для сообщения о преступлениях, включая ваше текущее местоположение."
button_icon_state = "dispatch"
icon_icon = 'modular_ss220/sechailer/icons/sechailer.dmi'
use_itemicon = FALSE

/obj/item/clothing/mask/gas/sechailer
name = "\improper security gas mask"
var/obj/item/radio/radio //For engineering alerts.
var/dispatch_cooldown = 250
var/last_dispatch = 0
var/obj/item/radio/radio // For dispatch to work
var/dispatch_cooldown = 25 SECONDS
var/on_cooldown = FALSE
var/emped = FALSE
var/static/list/available_dispatch_messages = list(
"502 (Убийство)",
"101 (Сопротивление Аресту)",
"308 (Вторжение)",
"305 (Мятеж)",
"402 (Нападение на Офицера)")
actions_types = list(/datum/action/item_action/dispatch, /datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase)

/obj/item/clothing/mask/gas/sechailer/hos
name = "\improper head of security's SWAT mask"
actions_types = list(/datum/action/item_action/dispatch, /datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase)
actions_types = list(/datum/action/item_action/dispatch, /datum/action/item_action/halt, /datum/action/item_action/selectphrase)

/obj/item/clothing/mask/gas/sechailer/warden
name = "\improper warden's SWAT mask"
actions_types = list(/datum/action/item_action/dispatch, /datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase)
actions_types = list(/datum/action/item_action/dispatch, /datum/action/item_action/halt, /datum/action/item_action/selectphrase)

/obj/item/clothing/mask/gas/sechailer/swat
actions_types = list(/datum/action/item_action/dispatch, /datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase)
actions_types = list(/datum/action/item_action/dispatch, /datum/action/item_action/halt, /datum/action/item_action/selectphrase)

/obj/item/clothing/mask/gas/sechailer/blue
actions_types = list(/datum/action/item_action/dispatch, /datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase)
actions_types = list(/datum/action/item_action/dispatch, /datum/action/item_action/halt, /datum/action/item_action/selectphrase)

/obj/item/clothing/mask/gas/sechailer/Destroy()
qdel(radio)
Expand All @@ -41,25 +45,62 @@ GLOBAL_LIST_EMPTY(sechailers)
radio.config(list("Security" = 0))
radio.follow_target = src


/obj/item/clothing/mask/gas/sechailer/proc/dispatch(mob/user)
var/area/A = get_area(src)
if(world.time < last_dispatch + dispatch_cooldown)
to_chat(user, "<span class='notice'>Dispatch radio broadcasting systems are recharging.</span>")
return FALSE
var/list/options = list()
for(var/option in list("502 (Убийство)", "101 (Сопротивление Аресту)", "308 (Вторжение)", "305 (Мятеж)", "402 (Нападение на Офицера)")) //Just hardcoded for now!
options[option] = image(icon = 'modular_ss220/sechailer/icons/menu.dmi', icon_state = option)
var/message = show_radial_menu(user, src, options)
for(var/option in available_dispatch_messages)
available_dispatch_messages[option] = image(icon = 'modular_ss220/sechailer/icons/menu.dmi', icon_state = option)
var/message = show_radial_menu(user, src, available_dispatch_messages)
var/location_name = get_location_name(src, TRUE) // get_location_name works better as Affected says

if(!message)
return FALSE
radio.autosay("Диспетчер, [user], код [message] в [A], запрашивается помощь.", src, "Security", list(z))
last_dispatch = world.time
return
if(on_cooldown)
var/list/cooldown_info = list("Ожидайте. Система оповещения ")
if(emped)
cooldown_info += "в защитном режиме, "
else
cooldown_info += "перезаряжается, "
// Cooldown not updating realtime, and i don't want to rewrite it just for the sake of it
cooldown_info += "примерное время восстановления: [dispatch_cooldown / 10] секунд."
to_chat(user, span_notice(cooldown_info.Join()))
return

on_cooldown = TRUE
addtimer(CALLBACK(src, PROC_REF(reboot)), dispatch_cooldown)
// This code if fucking hell, but it works as intended
for(var/atom/movable/hailer in GLOB.sechailers)
if(hailer.loc && ismob(hailer.loc))
playsound(hailer.loc, "modular_ss220/sechailer/sound/dispatch_please_respond.ogg", 55, FALSE)
var/security_channel_found = FALSE
if(!hailer.loc || !ismob(hailer.loc))
continue
// Check if mob has a radio, then check if the radio has the right channels
for(var/obj/item/radio/my_radio in user)
for(var/chan in 1 to length(my_radio.channels))
var/channel_name = my_radio.channels[chan]
if(channel_name == DEPARTMENT_SECURITY)
security_channel_found = TRUE
break
if(security_channel_found)
radio.autosay("Центр, Код [message], офицер [user] запрашивает помощь в [location_name].", "Система Оповещения", DEPARTMENT_SECURITY, list(z))
playsound(hailer.loc, 'modular_ss220/sechailer/sound/dispatch_please_respond.ogg', 55, FALSE)
break
else
to_chat(user, span_warning("Внимание: Невозможно установить соединение с каналом службы безопасности, требуется подключение!"))
playsound(hailer.loc, 'modular_ss220/sechailer/sound/radio_static.ogg', 30, TRUE)

/obj/item/clothing/mask/gas/sechailer/proc/reboot()
on_cooldown = FALSE
emped = FALSE

/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, actiontype)
. = ..()
if(actiontype == /datum/action/item_action/dispatch)
dispatch(user)

/obj/item/clothing/mask/gas/sechailer/emp_act(severity)
if(on_cooldown)
return
on_cooldown = TRUE
emped = TRUE
addtimer(CALLBACK(src, PROC_REF(reboot)), dispatch_cooldown)
if(ishuman(loc))
var/mob/living/carbon/human/user = loc
to_chat(user, span_userdanger("Обнаружен электромагнитный импульс, система оповещения отключена для сохранения работоспособности..."))
Binary file added modular_ss220/sechailer/sound/radio_static.ogg
Binary file not shown.

0 comments on commit fc8c87b

Please sign in to comment.