Skip to content

Commit

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

## Что этот PR делает

Вводит новую расу: Гигантские бронированные серпентиды.
За основу брались ГБСы с Сыра, но с крупными доработками\изменениями,
попытками перенести механизмы на органы и конечности (по возможности -
для дальнейшего экспорт на Бандастейшен). Цель - сделать вид, целиком и
полностью зависящий от химических веществ в его теле, угрожающего
внешнего вида, крупнее обычных игровых рас (не считая антагонистов виде
императрицы чужих).

Более подробная информация представлена в файле: 

https://docs.google.com/document/d/1vhrtJ_1wvjaCTutJ58-3pfUjhT5XeRG5hBgRThsJtqM/edit

Данную расу старался делать по возможности модульно и расширяемо - для
возможного изменения других рас в рамках идеи по глобальному реворку рас
Парадайза. Возможно потребуется разбирать на отдельные ПРы.

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

Новая уникальная раса, выделяющаяся среди прочих с небольшими
изменениями (фур-сьютов) достаточно значительным набором характеристик и
особенностей.


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

## Тестирование

Локальный сервер - проверялось функционирование
Сервер Блэк - проверка функционирования в бою (были выловлены и убраны
некоторые критические ошибки)

## Changelog

:cl:
add: Добавлена новая раса - Гигантские бронированные серпентиды.
/:cl:

<!-- Оба :cl:'а должны быть на месте, что-бы чейнджлог работал! Вы
можете написать свой ник справа от первого :cl:, если хотите. Иначе
будет использован ваш ник на ГитХабе. -->
<!-- Вы можете использовать несколько записей с одинаковым префиксом
(Они используются только для иконки в игре) и удалить ненужные. Помните,
что чейнджлог должен быть понятен обычным игроком. -->
<!-- Если чейнджлог не влияет на игроков(например, это рефактор), вы
можете исключить всю секцию. -->

## Summary by Sourcery

Introduce the Giant Armored Serpentid race.

New Features:
- Added the Giant Armored Serpentid race, a large, serpentine insectoid
species known for its unique organs and durable carapace.

Tests:
- Tested the race\'s functionality on a local server and a Black server
to identify and fix critical errors.

---------

Co-authored-by: Kar4es <odnakotrove@gmail.com>
  • Loading branch information
msw7007 and Kar4es authored Jan 20, 2025
1 parent 3dc32e4 commit 1e33cd9
Show file tree
Hide file tree
Showing 94 changed files with 19,788 additions and 33 deletions.
16,883 changes: 16,883 additions & 0 deletions _maps/map_files220/RandomRuins/SpaceRuins/sierra_1_4.dmm

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions code/__DEFINES/modular_ss220/_ss220.dm
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@
// TODO: someday preferences will use TGUI and you will probably be able to move it to modular_ss220\_defines220\code\preferences_defines.dm
/// Interacts with the toggles220 bitflag
#define PREFTOGGLE_TOGGLE220 220

/// called by /datum/component/mob_overlay_shift/proc/get_list(mob/component_holder, overlay, list/info_data) : (/datum/component/mob_overlay_shift)
#define COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST "mob_get_overlay_shifts_list" // SS220 EDIT
2 changes: 1 addition & 1 deletion code/datums/chatmessage.dm
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@
message.plane = GAME_PLANE
message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART
message.alpha = 0
message.pixel_y = owner.bound_height * 0.95
message.pixel_y = owner.bound_height * 0.95 + owner.chat_message_y_offset // SS220 EDIT
message.maptext_width = CHAT_MESSAGE_WIDTH
message.maptext_height = mheight
message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5
Expand Down
2 changes: 1 addition & 1 deletion code/modules/mob/living/carbon/human/human_mob.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1338,7 +1338,7 @@
if(eyes)
eyes_icon = eyes.generate_icon()
else //Error 404: Eyes not found!
eyes_icon = new('icons/mob/human_face.dmi', dna.species.eyes)
eyes_icon = new(dna.species.eyes_icon, dna.species.eyes) // SS220 EDIT
eyes_icon.Blend("#800000", ICON_ADD)

return eyes_icon
Expand Down
91 changes: 86 additions & 5 deletions code/modules/mob/living/carbon/human/human_update_icons.dm
Original file line number Diff line number Diff line change
Expand Up @@ -729,6 +729,14 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
else
new_glasses = mutable_appearance('icons/mob/clothing/eyes.dmi', "[glasses.icon_state]", layer = -GLASSES_LAYER)

// SS220 EDIT START - Species overlay shift
. = list()
SEND_SIGNAL(src, COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST, "head", .)
if(length(.) > 0)
new_glasses.pixel_x += .["shift_x"]
new_glasses.pixel_y += .["shift_y"]
// SS220 EDIT END

var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style]
var/obj/item/clothing/glasses/G = glasses
if(istype(G) && G.over_mask) //If the user's used the 'wear over mask' verb on the glasses.
Expand Down Expand Up @@ -770,7 +778,15 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
left_ear_item_state = "[left_ear_item_state]_l"
left_ear_icon = l_ear.icon_override

overlays_standing[LEFT_EAR_LAYER] = mutable_appearance(left_ear_icon, left_ear_item_state, layer = -LEFT_EAR_LAYER)
// SS220 EDIT START - Species overlay shift
var/mutable_appearance/standing = mutable_appearance(left_ear_icon, left_ear_item_state, layer = -LEFT_EAR_LAYER)
. = list()
SEND_SIGNAL(src, COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST, "head", .)
if(length(.) > 0)
standing.pixel_x += .["shift_x"]
standing.pixel_y += .["shift_y"]
overlays_standing[LEFT_EAR_LAYER] = standing
// SS220 EDIT END

if(r_ear)
update_hud_r_ear(r_ear)
Expand All @@ -785,7 +801,15 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
right_ear_icon = "[right_ear_item_state]_l"
right_ear_icon = r_ear.icon_override

overlays_standing[RIGHT_EAR_LAYER] = mutable_appearance(right_ear_icon, right_ear_item_state, layer = -RIGHT_EAR_LAYER)
// SS220 EDIT START - Species overlay shift
var/mutable_appearance/standing = mutable_appearance(right_ear_icon, right_ear_item_state, layer = -RIGHT_EAR_LAYER)
. = list()
SEND_SIGNAL(src, COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST, "head", .)
if(length(.) > 0)
standing.pixel_x += .["shift_x"]
standing.pixel_y += .["shift_y"]
overlays_standing[RIGHT_EAR_LAYER] = standing
// SS220 EDIT END

apply_overlay(LEFT_EAR_LAYER)
apply_overlay(RIGHT_EAR_LAYER)
Expand Down Expand Up @@ -888,6 +912,15 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
standing.overlays += bloodsies
standing.alpha = head.alpha
standing.color = head.color

// SS220 EDIT START - Species overlay shift
. = list()
SEND_SIGNAL(src, COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST, "head", .)
if(length(.) > 0)
standing.pixel_x += .["shift_x"]
standing.pixel_y += .["shift_y"]
// SS220 EDIT END

overlays_standing[HEAD_LAYER] = standing
apply_overlay(HEAD_LAYER)

Expand Down Expand Up @@ -934,13 +967,25 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
if(!t_state)
t_state = belt.icon_state

// SS220 EDIT START создание единой переменной и ее изменения через логические проверки
var/mutable_appearance/standing
if(belt.icon_override)
t_state = "[t_state]_be"
overlays_standing[overlay_layer] = mutable_appearance(belt.icon_override, "[t_state]", layer = -overlay_layer)
standing = mutable_appearance(belt.icon_override, "[t_state]", layer = -overlay_layer)
else if(belt.sprite_sheets && belt.sprite_sheets[dna.species.sprite_sheet_name])
overlays_standing[overlay_layer] = mutable_appearance(belt.sprite_sheets[dna.species.sprite_sheet_name], "[t_state]", layer = -overlay_layer)
standing = mutable_appearance(belt.sprite_sheets[dna.species.sprite_sheet_name], "[t_state]", layer = -overlay_layer)
else
overlays_standing[overlay_layer] = mutable_appearance('icons/mob/clothing/belt.dmi', "[t_state]", layer = -overlay_layer)
standing = mutable_appearance('icons/mob/clothing/belt.dmi', "[t_state]", layer = -overlay_layer)

// SS220 EDIT - вызов сдвигов
. = list()
SEND_SIGNAL(src, COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST, "belt", .)
if(length(.) > 0)
standing.pixel_x += .["shift_x"]
standing.pixel_y += .["shift_y"]

overlays_standing[overlay_layer] = standing
// SS220 EDIT END

apply_overlay(BELT_LAYER)
apply_overlay(SPECIAL_BELT_LAYER)
Expand Down Expand Up @@ -1057,6 +1102,15 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)

standing.alpha = wear_mask.alpha
standing.color = wear_mask.color

// SS220 EDIT START - Species overlay shift
. = list()
SEND_SIGNAL(src, COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST, "head", .)
if(length(.) > 0)
standing.pixel_x += .["shift_x"]
standing.pixel_y += .["shift_y"]
// SS220 EDIT END

overlays_standing[FACEMASK_LAYER] = standing
apply_overlay(FACEMASK_LAYER)

Expand Down Expand Up @@ -1108,6 +1162,15 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
//create the image
standing.alpha = back.alpha
standing.color = back.color

// SS220 EDIT START - Species overlay shift
. = list()
SEND_SIGNAL(src, COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST, "back", .)
if(length(.) > 0)
standing.pixel_x += .["shift_x"]
standing.pixel_y += .["shift_y"]
// SS220 EDIT END

overlays_standing[BACK_LAYER] = standing
apply_overlay(BACK_LAYER)

Expand Down Expand Up @@ -1141,6 +1204,15 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
else
standing = mutable_appearance(r_hand.righthand_file, "[t_state]", layer = -R_HAND_LAYER, color = r_hand.color)
standing = center_image(standing, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension)

// SS220 EDIT START - Species overlay shift
. = list()
SEND_SIGNAL(src, COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST, "inhand", .)
if(length(.) > 0)
standing.pixel_x += .["shift_x"]
standing.pixel_y += .["shift_y"]
// SS220 EDIT END

overlays_standing[R_HAND_LAYER] = standing
apply_overlay(R_HAND_LAYER)

Expand All @@ -1161,6 +1233,15 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
else
standing = mutable_appearance(l_hand.lefthand_file, "[t_state]", layer = -L_HAND_LAYER, color = l_hand.color)
standing = center_image(standing, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension)

// SS220 EDIT START - Species overlay shift
. = list()
SEND_SIGNAL(src, COMSIG_MOB_GET_OVERLAY_SHIFTS_LIST, "inhand", .)
if(length(.) > 0)
standing.pixel_x += .["shift_x"]
standing.pixel_y += .["shift_y"]
// SS220 EDIT END

overlays_standing[L_HAND_LAYER] = standing
apply_overlay(L_HAND_LAYER)

Expand Down
2 changes: 1 addition & 1 deletion code/modules/paperwork/photocopier.dm
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@
to_chat(copymob, "<span class='notice'>Something smells toasty...</span>")
if(ishuman(copymob)) //Suit checks are in check_mob
var/mob/living/carbon/human/H = copymob
temp_img = icon('icons/obj/butts.dmi', H.dna.species.butt_sprite)
temp_img = icon(H.dna.species.butt_sprite_icon, H.dna.species.butt_sprite) // SS220 EDIT. Original: temp_img = icon('icons/obj/butts.dmi', H.dna.species.butt_sprite)
else if(isdrone(copymob))
temp_img = icon('icons/obj/butts.dmi', "drone")
else if(isnymph(copymob))
Expand Down
1 change: 1 addition & 0 deletions config/example/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,7 @@ active_space_ruins = [
"_maps/map_files220/RandomRuins/SpaceRuins/convoy_ambush.dmm",
"_maps/map_files220/RandomRuins/SpaceRuins/voxraiders_1.dmm",
"_maps/map_files220/RandomRuins/SpaceRuins/spacehotel.dmm",
"_maps/map_files220/RandomRuins/SpaceRuins/sierra_1_4.dmm",

### The following ruins are based from past pre-spawned Zlevel content ###
"_maps/map_files/RandomRuins/SpaceRuins/abandonedtele.dmm",
Expand Down
7 changes: 7 additions & 0 deletions modular_ss220/_defines220/code/signals_atom.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,10 @@
#define COMSIG_CLIMBED_ON "climb_on"
/// called by /datum/emote/living/dance/run_emote() : (/datum/component/clumsy_climb)
#define COMSIG_DANCED_ON "dance_on"
/// called by /datum/species/spec_attack_hand() : (/datum/component/gadom_cargo) (/datum/component/gadom_living)
#define COMSIG_GADOM_UNLOAD "gadom_unload"
/// called by /datum/surgery_step/finish_carapace/end_step() : (/datum/component/carapace_shell)
#define COMSIG_SURGERY_REPAIR "surgery_repair"
/// called by /datum/surgery/bone_repair/carapace_shell/can_start() : (/datum/component/carapace_shell)
#define COMSIG_SURGERY_STOP "surgery_stop"
#define SURGERY_STOP (1<<0)
13 changes: 13 additions & 0 deletions modular_ss220/_defines220/code/signals_mob/signals_mob_carbon.dm
Original file line number Diff line number Diff line change
@@ -1 +1,14 @@
// Signals for /mob/living/carbon
/// called by /mob/equip_to_slot() : (/datum/component/mob_overlay_shift)
#define COMSIG_MOB_ON_EQUIP "mob_on_equip"

/// called by /mob/ClickOn() : (/datum/component/mob_overlay_shift)
#define COMSIG_MOB_ON_CLICK "mob_on_click"

/// called by /datum/species/spec_attack_hand() /mob/living/carbon/human/MouseDrop_T() /mob/MouseDrop() : (/datum/component/gadom_cargo) (/datum/component/gadom_living)
#define COMSIG_GADOM_CAN_GRAB "gadom_can_grab"
#define GADOM_CAN_GRAB (1 << 0)

/// called by datum/component/gadom_living/proc/try_load_mob() : (/datum/component/gadom_cargo)
/// called by datum/component/gadom_cargo/proc/try_load_cargo() : (/datum/component/gadom_living)
#define COMSIG_GADOM_LOAD "gadom_load"
19 changes: 19 additions & 0 deletions modular_ss220/_defines220/code/signals_obj.dm
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,22 @@

/// from base of /obj/item/card/id: (list/access)
#define COMSIG_ID_GET_ACCESS "id_get_access"

/// called by /obj/item/organ/external/receive_damage() : (/datum/component/carapace)
#define COMSIG_LIMB_RECEIVE_DAMAGE "limb_receive_damage"
/// called by /obj/item/organ/external/heal_damage() : (/datum/component/carapace)
#define COMSIG_LIMB_HEAL_DAMAGE "limb_heal_damage"
/// called by /obj/item/organ/internal/cyberimp/arm/Extend() /obj/item/organ/internal/cyberimp/arm/Retract() : (/datum/element/paired_implants)
#define COMSIG_DOUBLEIMP_SYNCHONIZE "doubleimp_synchonize"
/// called by /obj/item/organ/internal/remove() /obj/item/organ/internal/insert() : (/datum/element/paired_implants)
#define COMSIG_DOUBLEIMP_ACTION_REBUILD "doubleimp_action_rebuild"
/// called by /obj/item/organ/internal/ui_action_click() : (/datum/component/organ_action)
#define COMSIG_ORGAN_GROUP_ACTION_CALL "organ_group_action_call"
/// called by /obj/item/organ/internal/remove() /obj/item/organ/internal/insert() : (/datum/component/organ_action)
#define COMSIG_ORGAN_GROUP_ACTION_RESORT "organ_group_action_resort"
/// called by /obj/item/organ/internal/process() : (/datum/component/organ_toxin_damage)
#define COMSIG_ORGAN_TOX_HANDLE "organ_tox_handle"
/// called by /obj/item/organ/internal/process() : (/datum/component/chemistry_organ)
#define COMSIG_ORGAN_ON_LIFE "organ_on_life"
/// called by /obj/item/organ/internal/ears/serpentid/switch_mode() /obj/item/organ/internal/eyes/serpentid/switch_mode() /obj/item/organ/internal/kidneys/serpentid/switch_mode() : (/datum/component/chemistry_organ)
#define COMSIG_ORGAN_CHANGE_CHEM_CONSUPTION "organ_change_chem_consumption"
12 changes: 12 additions & 0 deletions modular_ss220/_defines220/code/species.dm
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,15 @@
#define MATERIAL_CLASS_SOAP 3
#define MATERIAL_CLASS_RAD 4
#define MATERIAL_CLASS_PLASMA 5

/// Базовое время погрузки ящиков/мобов на куклу
#define GADOM_BASIC_LOAD_TIMER 2 SECONDS

#define isserpentid(A) (is_species(A, /datum/species/serpentid))

/// Трейт ТТСа для робо рас
#define TTS_TRAIT_ROBOTIZE "tts_trait_robotize"

/mob/living/carbon/human
var/atom/movable/loaded = null
var/mob/living/passenger = null
1 change: 1 addition & 0 deletions modular_ss220/_misc/code/ss220_general_config.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@
. = ..()
ss220_misc = new()
safe_load(ss220_misc, "ss220_misc_configuration")
GLOB.blocked_chems += list("serpadrone")
1 change: 1 addition & 0 deletions modular_ss220/_signals220/_signals220.dme
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@
#include "code/signals_mob/signals_mob_silicon.dm"
#include "code/signals_mob/signals_mob_simple.dm"
#include "code/signals_obj.dm"
#include "code/species.dm"
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
// Signals for /mob/living/carbon
// Расширение прока для переноса ящика на моба
/mob/living/carbon/human/MouseDrop_T(atom/movable/AM, mob/user)
if(SEND_SIGNAL(usr, COMSIG_GADOM_CAN_GRAB) & GADOM_CAN_GRAB)
SEND_SIGNAL(usr, COMSIG_GADOM_LOAD, user, AM)
. = .. ()
31 changes: 31 additions & 0 deletions modular_ss220/_signals220/code/signals_mob/signals_mob_main.dm
Original file line number Diff line number Diff line change
@@ -1 +1,32 @@
// Signals for /mob
// Вызов сигнала при экипировке любой вещи
/mob/equip_to_slot(obj/item/W, slot, initial = FALSE)
. = ..()
SEND_SIGNAL(src, COMSIG_MOB_ON_EQUIP, W, slot, initial)

// Вызов сигнала при повоторе через ctrl+wasd
/mob/facedir(ndir)
. = ..()
SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, ndir)

// Вызов сигнала при повороте через ЛКМы
/mob/ClickOn(atom/A, params)
. = ..()
SEND_SIGNAL(src, COMSIG_MOB_ON_CLICK, A, params)

// Расширение для пристегивания моба
/mob/MouseDrop(mob/M as mob, src_location, over_location, src_control, over_control, params)
if((M != usr) || !istype(M))
..()
return
if(usr == src)
return
if(!Adjacent(usr))
return
if(IsFrozen(src) && !is_admin(usr))
to_chat(usr, span_boldannounce("Interacting with admin-frozen players is not permitted."))
return
if((SEND_SIGNAL(usr, COMSIG_GADOM_CAN_GRAB) & GADOM_CAN_GRAB))
SEND_SIGNAL(usr, COMSIG_GADOM_LOAD, usr, src)
return
. = ..()
43 changes: 43 additions & 0 deletions modular_ss220/_signals220/code/signals_obj.dm
Original file line number Diff line number Diff line change
@@ -1,3 +1,46 @@
/obj/obj_destruction(damage_flag)
SEND_SIGNAL(src, COMSIG_OBJ_DESTRUCTION, damage_flag)
. = ..()

/obj/item/attack(mob/living/M, mob/living/user, def_zone)
. = .. ()
SEND_SIGNAL(src, COMSIG_MOB_ITEM_ATTACK, M, user, def_zone)

/obj/item/organ/external/receive_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list(), ignore_resists = FALSE, updating_health = TRUE)
. = ..()
SEND_SIGNAL(src, COMSIG_LIMB_RECEIVE_DAMAGE, brute, burn, sharp, used_weapon, forbidden_limbs, ignore_resists, updating_health)

/obj/item/organ/external/heal_damage(brute, burn, internal = 0, robo_repair = 0, updating_health = TRUE)
. = ..()
SEND_SIGNAL(src, COMSIG_LIMB_HEAL_DAMAGE, brute, burn, internal, robo_repair, updating_health)

/obj/item/organ/internal/cyberimp/arm/Retract()
. = .. ()
SEND_SIGNAL(src, COMSIG_DOUBLEIMP_SYNCHONIZE)

/obj/item/organ/internal/cyberimp/arm/Extend()
. = .. ()
SEND_SIGNAL(src, COMSIG_DOUBLEIMP_SYNCHONIZE)

/obj/item/organ/internal/insert(mob/living/carbon/M, special = 0, dont_remove_slot = 0)
. = .. ()
SEND_SIGNAL(src, COMSIG_ORGAN_GROUP_ACTION_RESORT)
SEND_SIGNAL(src, COMSIG_DOUBLEIMP_ACTION_REBUILD)

/obj/item/organ/internal/remove(mob/living/carbon/M, special = 0)
. = .. ()
SEND_SIGNAL(src, COMSIG_ORGAN_GROUP_ACTION_RESORT)
SEND_SIGNAL(src, COMSIG_DOUBLEIMP_ACTION_REBUILD)

/obj/item/organ/internal/ui_action_click()
SEND_SIGNAL(src, COMSIG_ORGAN_GROUP_ACTION_CALL, user = owner)

/obj/item/organ/internal/process()
SEND_SIGNAL(src, COMSIG_ORGAN_TOX_HANDLE)
SEND_SIGNAL(src, COMSIG_ORGAN_ON_LIFE)
. = .. ()

/atom/movable/screen/alert/Click()
if(isliving(usr) && ..())
SEND_SIGNAL(usr, COMSIG_GADOM_UNLOAD)
. = ..()
5 changes: 5 additions & 0 deletions modular_ss220/_signals220/code/species.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Расширение прока на отстегивание ящика
/datum/species/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
if((SEND_SIGNAL(H, COMSIG_GADOM_CAN_GRAB) & GADOM_CAN_GRAB) && H.loaded)
SEND_SIGNAL(H, COMSIG_GADOM_UNLOAD)
. = .. ()
Loading

0 comments on commit 1e33cd9

Please sign in to comment.