Skip to content

Commit

Permalink
Merge upstream 01.03.2024 (#1056)
Browse files Browse the repository at this point in the history
## Changelog

:cl:
add: Мерж оффов
add: Для локалок добавлена возможность быстрого экспорта JSON-файлов
персонажей и DMI-файла, содержащего спрайты персонажей
add: Сварка теперь может зажечь незажжённую сигарету в чужом рту
add: Добавлены ящики с Disabler SMG, их можно купить в Карго, в них
содержатся 2 Disabler SMG - новый тип двуручного скорострельного
дизейблер-оружия
add: Добавлен симптом Cranial Hypertrichosis для advanced microbes,
ведет себя аналогично Hairgrownium
add: Добавлен новый модуль для модьсюта - модуль дымовой гранаты,
доступен в Uplink и illegal tech
add: Добавлен новый трейт, "Sleight of hand" (ловкость рук) для бармена
tweak: Бармен больше не владеет дзюдо, вместо этого он владеет "Sleight
of hand"
tweak: Headslug теперь доступен всем генокрадам по умолчанию, но может
быть выполнен только один раз за поглощение
tweak: Способности генокрадов не могут быть использованы в течении 10
секунд после возрождения с помощью стазиса
tweak: Добавлены названия и описания ко многим пулям и ящикам с
патронами
tweak: Автоматический отчет коронера, создаваемый при использовании
ручки на сканере аутопсии (существует с 2017 года), был улучшен и
уточнен
tweak: В письме теперь указывается должность получателя при осмотре
tweak: При ударе кого-либо выключенным батоном теперь вызывается
анимация
tweak: Переписывает и уточняет сообщение Плачущего ангела, когда его
превращает волшебник, использующий "Flesh to stone" и палочку "Animate"
tweak: Сообщение PM to-... было перемещено из категории Unsorted в
категорию Admin PMs
tweak: Фотографии теперь можно сжигать с помощью любого горящего
предмета (сварка, зажигалка и т.д.)
tweak: Дым больше не убивает тайлы Блоба
tweak: Автонаведение шоковых имплантатов сильно снижено
tweak: Скорость броска дизармом от шоковых имплантов снижена
tweak: Изолированные перчатки блокируют бросок дизармом от шоковых
имплантатов, но не выносливость
tweak: Ксеноморфы больше не тратят дополнительные 2 секунды на
принудительное применение таблеток/пластырей, поздравляем, если вы
заметили разницу
fix: Ксеноморфы больше не будут отправляться в null в некоторых странных
ситуациях
fix: Исправлены патчи с лишней инъекцией и реакцией на применение
fix: Исправлены таблетки, реагирующие на реагенты с гораздо меньшей
долей, чем перенесенный объем в большинстве случаев
fix: Исправлены патчи мгновенного применения, не уведомляющие цель
fix: Chemmasters больше не будут получать хит при откручивании
fix: Граб теперь можно усилить, когда нападающий пристегнут
spellcheck: При попытке наложить патчи на КПБ больше не упоминается
невозможность их накормить
/:cl:

<!-- Оба :cl:'а должны быть на месте, что-бы чейнджлог работал! Вы
можете написать свой ник справа от первого :cl:, если хотите. Иначе
будет использован ваш ник на ГитХабе. -->
<!-- Вы можете использовать несколько записей с одинаковым префиксом
(Они используются только для иконки в игре) и удалить ненужные. Помните,
что чейнджлог должен быть понятен обычным игроком. -->
<!-- Если чейнджлог не влияет на игроков(например, это рефактор), вы
можете исключить всю секцию. -->
  • Loading branch information
Legendaxe authored Mar 1, 2024
2 parents 76f6911 + 5e84a73 commit d42b1f3
Show file tree
Hide file tree
Showing 65 changed files with 558 additions and 260 deletions.
14 changes: 7 additions & 7 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -788,7 +788,7 @@ Each role inherits the lower role's responsibilities (IE: Headcoders also have c
`Headcoders` are the overarching "administrators" of the repository. People included in this role are:

* [farie82](https://github.com/farie82)
* [Charliminator](https://github.com/hal9000PR)
* [S34N](https://github.com/S34NW)
* [SteelSlayer](https://github.com/SteelSlayer)

---
Expand All @@ -797,21 +797,21 @@ Each role inherits the lower role's responsibilities (IE: Headcoders also have c


* [AffectedArc07](https://github.com/AffectedArc07)
* [Charliminator](https://github.com/hal9000PR)
* [lewcc](https://github.com/lewcc)
* [S34N](https://github.com/S34NW)

---

`Review Team` members are people who are denoted as having reviews which can affect mergeability status. People included in this role are:

* [lewcc](https://github.com/lewcc)
* [S34N](https://github.com/S34NW)
* [Sirryan2002](https://github.com/Sirryan2002)
* [Contrabang](https://github.com/Contrabang)
* [Burzah](https://github.com/Burzah)
* [Charliminator](https://github.com/hal9000PR)
* [Contrabang](https://github.com/Contrabang)
* [DGamerL](https://github.com/DGamerL)
* [Warriorstar](https://github.com/warriorstar-orion)
* [Henri215](https://github.com/Henri215)
* [lewcc](https://github.com/lewcc)
* [Sirryan2002](https://github.com/Sirryan2002)
* [Warriorstar](https://github.com/warriorstar-orion)

---

Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ jobs:
python tools/ci/unticked_files.py ${GITHUB_WORKSPACE}
python tools/ci/illegal_dme_files.py ${GITHUB_WORKSPACE}
python -m tools.ci.check_icon_conflicts
python -m tools.ci.check_icon_dupenames
python -m tools.maplint.source --github
DREAMCHECKER_EXIT_CODE=0
~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1 || DREAMCHECKER_EXIT_CODE=$?
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/power_defines.dm
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,5 @@
#define APC_IS_CHARGING 1
/// APC battery is at 100%
#define APC_FULLY_CHARGED 2

#define KW *1000
1 change: 1 addition & 0 deletions code/__HELPERS/trait_helpers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
//***** MIND TRAITS *****/
#define TRAIT_HOLY "is_holy" // The mob is holy in regards to religion
#define TRAIT_TABLE_LEAP "table_leap"
#define TRAIT_SLEIGHT_OF_HAND "sleight_of_hand"

//***** ITEM AND MOB TRAITS *****//
/// Show what machine/door wires do when held.
Expand Down
1 change: 1 addition & 0 deletions code/_globalvars/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(

/datum/mind = list(
"TRAIT_HOLY" = TRAIT_HOLY,
"TRAIT_SLEIGHT_OF_HAND" = TRAIT_SLEIGHT_OF_HAND,
"TRAIT_TABLE_LEAP" = TRAIT_TABLE_LEAP
),

Expand Down
13 changes: 9 additions & 4 deletions code/_onclick/click_override.dm
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
var/atom/beam_from = user
var/atom/target_atom = A

for(var/i in 0 to 3)
for(var/i in 0 to 2) //3 attempts. Shocks at the clicked source, tries to find a mob in 1 tile, then choses a random tile 1 away to try again. As such, can only hit a mob 2 tiles away from the click
beam_from.Beam(target_atom, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = 6)
if(isliving(target_atom))
var/mob/living/L = target_atom
Expand All @@ -81,7 +81,12 @@
L.apply_damage(60, STAMINA)
L.Jitter(10 SECONDS)
var/atom/throw_target = get_edge_target_turf(user, get_dir(user, get_step_away(L, user)))
L.throw_at(throw_target, powergrid / 100000, powergrid / 100000) //100 kW in grid throws 1 tile, 200 throws 2, etc.
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.gloves && H.gloves.siemens_coefficient == 0) //No throwing with insulated gloves (you still get stamina however)
break
L.throw_at(throw_target, powergrid / (150 KW), powergrid / (300 KW)) //150 kW in grid throws 1 tile, 300 throws 2, etc.

else
add_attack_logs(user, L, "electrocuted with[P.unlimited_power ? " unlimited" : null] power bio-chip")
if(P.unlimited_power)
Expand All @@ -90,13 +95,13 @@
electrocute_mob(L, C.powernet, P)
break
var/list/next_shocked = list()
for(var/mob/M in range(3, target_atom)) //Try to jump to a mob first
for(var/mob/M in range(1, target_atom)) //Try to jump to a mob first
if(M == user || isobserver(M))
continue
next_shocked.Add(M)
break //Break this so it gets the closest, thank you
if(!length(next_shocked)) //No mob? Random bullshit go, try to get closer to a mob with luck
for(var/atom/movable/AM in orange(3, target_atom))
for(var/atom/movable/AM in orange(1, target_atom))
if(AM == user || iseffect(AM) || isobserver(AM))
continue
next_shocked.Add(AM)
Expand Down
49 changes: 49 additions & 0 deletions code/datums/diseases/advance/symptoms/hair.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
//////////////////////////////////////
Cranial Hypertrichosis
Very very Noticeable.
Decreases resistance slightly.
Decreases stage speed.
Reduced transmittability
Intense Level.
BONUS
Makes the mob grow massive hair, regardless of gender.
//////////////////////////////////////
*/

/datum/symptom/hair
name = "Cranial Hypertrichosis"
stealth = -3
resistance = -1
stage_speed = -3
transmittable = -1
level = 4
severity = 1

/datum/symptom/hair/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
if(!ishuman(A.affected_mob))
return
var/mob/living/carbon/human/H = A.affected_mob
if(H.dna.species.bodyflags & BALD)
return
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
if(!istype(head_organ))
return
switch(A.stage)
if(1, 2, 3)
to_chat(H, "<span class='warning'>Your scalp itches.</span>")
head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
else
to_chat(H, "<span class='warning'>Hair bursts forth from your scalp!</span>")
var/datum/sprite_accessory/tmp_hair_style = GLOB.hair_styles_full_list["Very Long Hair"]

if(head_organ.dna.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them.
head_organ.h_style = "Very Long Hair"
else //Otherwise, give them a random hair style.
head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
H.update_hair()
8 changes: 8 additions & 0 deletions code/datums/uplink_items/uplink_general.dm
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 5
surplus = 10

/datum/uplink_item/suits/smoke_grenade
name = "Smoke Grenade Module"
desc = "A module that dispenses primed smoke grenades to disperse crowds."
reference = "SGM"
item = /obj/item/mod/module/dispenser/smoke
cost = 10
surplus = 10

/datum/uplink_item/device_tools/binary
name = "Binary Translator Key"
desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary. To talk on the binary channel, type :+ before your radio message."
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#define KW *1000
#define PULSEDEMON_REMOTE_DRAIN_MULTIPLIER 5

#define PD_UPGRADE_HIJACK_SPEED "Speed"
Expand Down Expand Up @@ -484,4 +483,3 @@
return FALSE
return TRUE

#undef KW
2 changes: 1 addition & 1 deletion code/game/gamemodes/scoreboard.dm
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ GLOBAL_VAR(scoreboard) // Variable to save the scoreboard string once it's been


/datum/scoreboard/proc/check_station_player(mob/M)
if(!is_station_level(M.z) || M.stat < DEAD)
if(!is_station_level(M.z) || M.stat != DEAD)
return
if(isAI(M))
dead_ai = TRUE
Expand Down
4 changes: 1 addition & 3 deletions code/game/jobs/job/support.dm
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,8 @@
singlemutcheck(H, GLOB.soberblock, MUTCHK_FORCED)
H.dna.default_blocks.Add(GLOB.soberblock)
H.check_mutations = 1
var/datum/martial_art/judo/under_siege/bouncer_delight = new
bouncer_delight.teach(H)
ADD_TRAIT(H.mind, TRAIT_TABLE_LEAP, ROUNDSTART_TRAIT)

ADD_TRAIT(H.mind, TRAIT_SLEIGHT_OF_HAND, ROUNDSTART_TRAIT)

/datum/job/chef
title = "Chef"
Expand Down
35 changes: 21 additions & 14 deletions code/game/objects/items/devices/autopsy.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
var/target_name = null
var/target_UID = null
var/timeofdeath = null
var/target_rank = null

/obj/item/autopsy_scanner/Destroy()
QDEL_LIST_ASSOC_VAL(wdata)
Expand Down Expand Up @@ -66,23 +67,28 @@
if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V))
chemtraces += V

/obj/item/autopsy_scanner/examine(mob/user)
. = ..()
if(Adjacent(user))
. += "<span class='notice'>You can use a pen on it to quickly write a coroner's report.</span>"

/obj/item/autopsy_scanner/attackby(obj/item/P, mob/user)
if(is_pen(P))
var/dead_name = input("Insert name of deceased individual")
var/dead_rank = input("Insert rank of deceased individual")
var/dead_tod = input("Insert time of death")
var/dead_cause = input("Insert cause of death")
var/dead_chems = input("Insert any chemical traces")
var/dead_notes = input("Insert any relevant notes")
var/obj/item/paper/R = new(user.loc)
R.name = "Official Coroner's Report - [dead_name]"
R.info = "<b>[SSmapping.map_datum.fluff_name] - Coroner's Report</b><br><br><b>Name of Deceased:</b> [dead_name]</br><br><b>Rank of Deceased:</b> [dead_rank]<br><br><b>Time of Death:</b> [dead_tod]<br><br><b>Cause of Death:</b> [dead_cause]<br><br><b>Trace Chemicals:</b> [dead_chems]<br><br><b>Additional Coroner's Notes:</b> [dead_notes]<br><br><b>Coroner's Signature:</b> <span class=\"paper_field\">"
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(10)
user.put_in_hands(R)
else
if(!is_pen(P))
return ..()

var/dead_name = tgui_input_text(user, "Insert name of deceased individual", default = target_name, title = "Coroner's Report", max_length = 60)
var/rank = tgui_input_text(user, "Insert rank of deceased individual", default = target_rank, title = "Coroner's Report", max_length = 60)
var/tod = tgui_input_text(user, "Insert time of death", default = station_time_timestamp("hh:mm", timeofdeath), title = "Coroner's Report", max_length = 60)
var/cause = tgui_input_text(user, "Insert cause of death", title = "Coroner's Report", max_length = 60)
var/chems = tgui_input_text(user, "Insert any chemical traces", multiline = TRUE, title = "Coroner's Report")
var/notes = tgui_input_text(user, "Insert any relevant notes", multiline = TRUE, title = "Coroner's Report")
var/obj/item/paper/R = new(user.loc)
R.name = "Official Coroner's Report - [dead_name]"
R.info = "<b><center>[station_name()] - Coroner's Report</b></center><br><br><b>Name of Deceased:</b> [dead_name]</br><br><b>Rank of Deceased:</b> [rank]<br><br><b>Time of Death:</b> [tod]<br><br><b>Cause of Death:</b> [cause]<br><br><b>Trace Chemicals:</b> [chems]<br><br><b>Additional Coroner's Notes:</b> [notes]<br><br><b>Coroner's Signature:</b> <span class=\"paper_field\">"
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, TRUE)
sleep(1 SECONDS)
user.put_in_hands(R)

/obj/item/autopsy_scanner/attack_self(mob/user)
var/scan_data = ""

Expand Down Expand Up @@ -161,6 +167,7 @@
if(target_UID != M.UID())
target_UID = M.UID()
target_name = M.name
target_rank = M.get_assignment(if_no_id = "Unknown", if_no_job = null)
wdata.Cut()
chemtraces.Cut()
timeofdeath = null
Expand Down
14 changes: 14 additions & 0 deletions code/game/objects/items/tools/welder.dm
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,20 @@
return
remove_fuel(0.5)

/obj/item/weldingtool/attack(mob/living/carbon/M, mob/living/carbon/user)
// For lighting other people's cigarettes.
var/obj/item/clothing/mask/cigarette/cig = M?.wear_mask
if(!istype(cig) || user.zone_selected != "mouth" || !tool_enabled)
return ..()

if(M == user)
cig.attackby(src, user)
return

cig.light("<span class='notice'>[user] holds out [src] out for [M], and casually lights [cig]. What a badass.</span>")
playsound(src, 'sound/items/lighter/light.ogg', 25, TRUE)
M.update_inv_wear_mask()

/obj/item/weldingtool/use_tool(atom/target, user, delay, amount, volume, datum/callback/extra_checks)
target.add_overlay(GLOB.welding_sparks)
var/did_thing = ..()
Expand Down
5 changes: 0 additions & 5 deletions code/game/objects/items/weapons/grenades/smokebomb.dm
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,5 @@
src.smoke.start()
sleep(10)
src.smoke.start()

for(var/obj/structure/blob/B in view(8,src))
var/damage = round(30/(get_dist(B,src)+1))
B.take_damage(damage, BURN, MELEE, 0)
sleep(80)
qdel(src)
return
1 change: 1 addition & 0 deletions code/game/objects/items/weapons/storage/belt.dm
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,7 @@
..()
if(amount != length(contents))
update_icon()
orient2hud(user) // Update the displayed items and their counts

/obj/item/storage/belt/holster
name = "shoulder holster"
Expand Down
1 change: 1 addition & 0 deletions code/game/objects/items/weapons/stunbaton.dm
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@
return ..() // Whack them too if in harm intent

if(!turned_on)
user.do_attack_animation(L)
L.visible_message("<span class='warning'>[user] has prodded [L] with [src]. Luckily it was off.</span>",
"<span class='danger'>[L == user ? "You prod yourself" : "[user] has prodded you"] with [src]. Luckily it was off.</span>")
return
Expand Down
7 changes: 7 additions & 0 deletions code/game/objects/mail.dm
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
var/list/job_list = list()
/// The real name required to open the letter
var/recipient
/// The job of the recipient
var/recipient_job
var/has_been_scanned = FALSE

/obj/item/envelope/suicide_act(mob/user)
Expand Down Expand Up @@ -49,11 +51,16 @@
if(mail_attracted_people.assigned_role in job_list)
recipient = mail_attracted_people.current.real_name
name = "letter to [recipient]"
recipient_job = lowertext(mail_attracted_people.assigned_role)
return
if(!admin_spawned)
log_debug("Failed to find a new name to assign to [src]!")
qdel(src)

/obj/item/envelope/examine(mob/user)
. = ..()
. += "This letter is addressed to [recipient], the [recipient_job]."

/obj/item/envelope/security
icon_state = "mail_sec"
possible_contents = list(/obj/item/food/snacks/donut/sprinkles,
Expand Down
12 changes: 12 additions & 0 deletions code/modules/admin/admin_verbs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,9 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list(
spawn(1) // This setting exposes the profiler for people with R_VIEWRUNTIMES. They must still have it set in cfg/admin.txt
control_freak = 0

if(is_connecting_from_localhost())
verbs += /client/proc/export_current_character


/client/proc/remove_admin_verbs()
verbs.Remove(
Expand Down Expand Up @@ -1055,3 +1058,12 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list(
show_blurb(about_to_be_banned, 15, message, null, "center", "center", message_color, null, null, 1)
log_admin("[key_name(src)] sent an admin alert to [key_name(about_to_be_banned)] with custom message [message].")
message_admins("[key_name(src)] sent an admin alert to [key_name(about_to_be_banned)] with custom message [message].")


/client/proc/export_current_character()
set name = "Export Character DMI/JSON"
set category = "Admin"

if(ishuman(mob))
var/mob/living/carbon/human/H = mob
H.export_dmi_json()
2 changes: 1 addition & 1 deletion code/modules/admin/verbs/adminpm.dm
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@
var/ping_link = check_rights(R_ADMIN, 0, mob) ? "(<a href='?src=[pm_tracker.UID()];ping=[C.key]'>PING</a>)" : ""
var/window_link = "(<a href='?src=[pm_tracker.UID()];newtitle=[C.key]'>WINDOW</a>)"
var/alert_link = check_rights(R_ADMIN, FALSE, mob) ? " (<a href='?src=[pm_tracker.UID()];adminalert=[C.mob.UID()]'>ALERT</a>)" : ""
to_chat(src, "<span class='pmsend'>[send_pm_type][type] to-<b>[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]</b>: [emoji_msg]</span> [ping_link] [window_link][alert_link]")
to_chat(src, "<span class='pmsend'>[send_pm_type][type] to-<b>[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]</b>: [emoji_msg]</span> [ping_link] [window_link][alert_link]", MESSAGE_TYPE_ADMINPM)

/*if(holder && !C.holder)
C.last_pm_recieved = world.time
Expand Down
3 changes: 3 additions & 0 deletions code/modules/antagonists/changeling/changeling_power.dm
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
if(HAS_TRAIT(user, TRAIT_FAKEDEATH) && !bypass_fake_death)
to_chat(user, "<span class='warning'>We are incapacitated.</span>")
return FALSE
if(!cling.can_use_powers)
to_chat(owner, "<span class='warning'>Our cells are repairing themselves, we are unable to use our powers!</span>")
return FALSE
return TRUE

// Transform the target to the chosen dna. Used in transform.dm and tiny_prick.dm (handy for changes since it's the same thing done twice)
Expand Down
4 changes: 4 additions & 0 deletions code/modules/antagonists/changeling/datum_changeling.dm
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@
var/datum/action/changeling/sting/chosen_sting
/// If the changeling is in the process of regenerating from their fake death.
var/regenerating = FALSE
/// Did changeling use headslug?
var/headslugged = FALSE
/// Can you use abilities due to a recent revival?
var/can_use_powers = TRUE
blurb_text_color = COLOR_PURPLE
blurb_text_outline_width = 1

Expand Down
4 changes: 4 additions & 0 deletions code/modules/antagonists/changeling/powers/absorb.dm
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,10 @@
target_cling.absorbed_dna.len = 1
target_cling.absorbed_count = 0

if(cling.headslugged)
cling.headslugged = FALSE
to_chat(user, "<span class='boldnotice'>By absorbing [target], we are once again strong enough to turn into a headslug.</span>")

cling.chem_charges = min(cling.chem_charges + 10, cling.chem_storage)

cling.is_absorbing = FALSE
Expand Down
Loading

0 comments on commit d42b1f3

Please sign in to comment.