mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-21 11:07:12 +01:00
* adds antaghud icon * TGUI bundle build dont push changes i didnt stage challenge 2025 (IMPOSSIBLE) * Adds organ repair passive * Description fix * Runs prettier * Fixes desc 2 * Fix revert * Remove vamp text * Fix some CI + Partial refactor * Fixes CI * Fixes gamemodes I messed with * Moves these procs over * Description fix again * Add back limit requiring drainees to have ckeys * Adds terminator icon * Update code/datums/status_effects/buffs.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Update code/modules/surgery/organs/augments_internal.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/modules/antagonists/mind_flayer/powers/flayer_stealth_powers.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * More lewv review * Clamps the EMP severity * Fixes "surveilance" typos * The TODO is gone and can't hurt me anymore * Update code/modules/antagonists/mind_flayer/flayer_datum.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/game/objects/items/weapons/pneumaticCannon.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/game/objects/items/weapons/stunbaton.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * More lewc reviews * Update code/modules/antagonists/_common/antag_datum.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/modules/antagonists/_common/antag_datum.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/modules/antagonists/mind_flayer/flayer_datum.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/modules/antagonists/mind_flayer/flayer_datum.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/modules/antagonists/mind_flayer/flayer_datum.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/modules/antagonists/mind_flayer/flayer_datum.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/modules/antagonists/mind_flayer/flayer_power.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Fixes some camera bug issues + lewc reviews * Update code/modules/antagonists/mind_flayer/powers/flayer_passives.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Update code/modules/antagonists/mind_flayer/flayer_power.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Updates a comment and fixes whitespace * Autodocs flayerprod * Update code/modules/antagonists/mind_flayer/powers/flayer_mobility_powers.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * qdel things we dont need anymore + typing an argument of add_abillity * Remove debug log * Update code/modules/antagonists/mind_flayer/flayer_power.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * Slightly buffs, and fixes GC issues of tether * I no longer feel i am a mindflayer * Fixes formatting of greeting * Better greeting * Worlds shittiest sprite * Don't need this TODO anymore * Fixes double description * Changes the wording on the borg laws * and bundle too * The cannon uses shrapnel now * Initial style changes * Ratios for brain damage * Adds a chemical to test for flayerism * Fixes the brain damage ratios * Abilities are purchasable again * Updates TGUI properly * im sorry linter * Steam smoke * Hi bundle * Re-abstracts this proc post syndi orgs * Fixes gamemode logic post cling round removal * I WONT FORGET IT THIS TIME * Fix name of steam ability * I'm a fool * Fixes processed passives + removes debug message * Fixes updating abilities inside UI * Better description for quicksilver form * First part lewc review * Remove debug thingy * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Fixes defines + GCs weapon spells * We don't need this * Eyes GC properly * Update code/modules/antagonists/mind_flayer/powers/flayer_mobility_powers.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * adds better logging to the assimilate * Adds parenthesis Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> * TGUI Bundle Rebuild * Fixes and Reworks TGUI * Cleaner JS and Fixes * adds anti-snitching clause to borg laws * changes the span for the borg messages * No holoparasites * Puts baton silence in line with glare * Fixes total_swarms_gathered * Nuke old trait * Gun no longer not stuck * Rejuv clears delayed knockdown * Some weapon ability fixes * Makes radio enable timers not counterintuitive * Fixes beepsky runtimes * Makes naming more consistent * Adds one-click-antag * Adds the mind flayer toggle (doesn't technically work) * Adds flayers to check_antagonist * Gives IDs to the status effects * Also this one * Makes retracting work again if it's in your offhand * Fixes pacification tech levels * Grapple is a weapon ability now, nullifcation retracts implants * Fixed descriptions * Adds some pizzaz to torque enhancer * This actually needs to be like this * Moves a helper proc over to a helper proc file * Extra admin visibility * Nukes the wacky flayer mob * Makes silicon administrative access more sane * Terminator form better description * Makes rejuv set stamina to 0 * Various price increases * AAAAAAAAAAAAA * Better feedback + logging on cyborg subversion * Swarm purchase display (temp fix) * Makes mindflayer sounds more silent * UI improvements * Various mindflayer fixes * Typo * More fixes * Fixes innates from being stupid * Forgot to add this check earlier * Oh this is how you add things to the protolathe * Changes some description and upgrade messages * Allows you to drain people beyond your limit * Fixes some weapon upgrade issues * Fix CI * Fixes some draining issues * More UI Tweaks and QoL * Fixes most of the issues * text * Fixes * Adds a radio jamming option to intruder * Gives obfusciation to jammer ability * Small passive cleanup * Fixes Search and Adds Ability Stages to UI * Adds freebie abilities * Restructuring chain and adding blackbox * Tgui polish * Small fix for traceroute * Fixes one click antag * Increases EMP resistance cost * Changes the pneumatic cannon into a shotgun * Slightly lower static * Fixed innate building rendering in upgrades * Fixes icon and description * Consistency * Punctuation fix. * Quick reboot + terminator form synergy * Adds safety deleting * Fix level for torque * Fixes a bad bug * Update code/game/gamemodes/objective.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Aaaaaaaaaaa * Makes torque a martial art and some martial arts safeties * Replaces vortex arm with barrier * Fix paths * Adds torque knockdown * Part 1 lewc review * HIIIII SQUIDWARD I'M IN YOUR BRANCH NOW * Removes flak cannon * Flayer respects mindshielding now on vamp+cling * Fixes EMP resist * More fixes * DGL review * Contra review * Clean up weapon powers * Various tweaks * Borg hand slight improvements * Parent call needs to be after this * Fixes stuff * Adds a new proc that is called when a spell is purchased * NEW SPRITES WOOOO * Traceroute update * Slightly lower traceroute cost * Formatting * Oops * Wow this could've been bad * Overclock small buff * Reduces cost of 1st level EMP immunity * Lewc review * TGUI Bundle Rebuild * Fix barricades * Lewc review * Okay FINE qwerty I'll change this * Traceroute thingy * I am an idiot * First part * Lewc review * Forgor this one * Last bits * Update code/game/objects/items/control_wand.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Update code/modules/antagonists/mind_flayer/powers/flayer_mobility_powers.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Null * Static-ness * Update code/game/gamemodes/changeling/traitor_chan.dm Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Update code/__DEFINES/mindflayer_defines.dm Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Last bits --------- Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> Co-authored-by: DGamerL <daan.lyklema@gmail.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>
394 lines
12 KiB
Plaintext
394 lines
12 KiB
Plaintext
/obj/item/organ/internal
|
|
origin_tech = "biotech=3"
|
|
force = 1
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
throwforce = 0
|
|
var/slot
|
|
// DO NOT add slots with matching names to different zones - it will break internal_organs_slot list!
|
|
var/non_primary = 0
|
|
var/unremovable = FALSE //Whether it shows up as an option to remove during surgery.
|
|
/// An associated list of organ datums that this organ has.
|
|
var/list/datum/organ/organ_datums
|
|
|
|
/obj/item/organ/internal/New(mob/living/carbon/holder)
|
|
..()
|
|
if(istype(holder))
|
|
insert(holder)
|
|
|
|
/obj/item/organ/internal/Initialize(mapload)
|
|
. = ..()
|
|
if(!organ_datums)
|
|
return
|
|
var/list/temp_list = organ_datums.Copy()
|
|
organ_datums = list()
|
|
for(var/path in temp_list)
|
|
var/datum/organ/organ_datum = new path(src)
|
|
if(!organ_datum.organ_tag)
|
|
stack_trace("There was an organ datum [organ_datum] ([organ_datum.type]), that had no organ tag.")
|
|
continue
|
|
organ_datums[organ_datum.organ_tag] = organ_datum
|
|
|
|
/obj/item/organ/internal/Destroy()
|
|
if(owner) // we have to remove BEFORE organ_datums are qdel'd, or we can just live even if our heart organ got deleted
|
|
remove(owner, TRUE)
|
|
QDEL_LIST_ASSOC_VAL(organ_datums) // The removal from internal_organ_datums should be handled when the organ is removed
|
|
. = ..()
|
|
|
|
/obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0, dont_remove_slot = 0)
|
|
if(!iscarbon(M) || owner == M)
|
|
return
|
|
|
|
var/obj/item/organ/internal/replaced = M.get_organ_slot(slot)
|
|
if(replaced)
|
|
if(dont_remove_slot)
|
|
non_primary = 1
|
|
else
|
|
replaced.remove(M, special = 1)
|
|
|
|
owner = M
|
|
|
|
M.internal_organs |= src
|
|
M.internal_organs_slot[slot] = src
|
|
|
|
for(var/organ_tag in organ_datums)
|
|
var/datum/organ/new_organ = organ_datums[organ_tag]
|
|
M.internal_organ_datums[new_organ.organ_tag] = new_organ
|
|
new_organ.on_insert(M)
|
|
|
|
var/obj/item/organ/external/parent
|
|
if(ishuman(M))
|
|
var/mob/living/carbon/human/H = M
|
|
parent = H.get_organ(check_zone(parent_organ))
|
|
H.update_int_organs()
|
|
if(!istype(parent))
|
|
stack_trace("[src] attempted to insert into a [parent_organ], but [parent_organ] wasn't an organ! [atom_loc_line(M)]")
|
|
else
|
|
parent.internal_organs |= src
|
|
loc = null
|
|
for(var/X in actions)
|
|
var/datum/action/A = X
|
|
A.Grant(M)
|
|
if(vital)
|
|
M.update_stat("Vital organ inserted")
|
|
STOP_PROCESSING(SSobj, src)
|
|
if(owner.stat == DEAD)
|
|
ADD_TRAIT(src, TRAIT_ORGAN_INSERTED_WHILE_DEAD, "[UID()]")
|
|
RegisterSignal(owner, COMSIG_LIVING_DEFIBBED, PROC_REF(on_revival))
|
|
|
|
|
|
// Removes the given organ from its owner.
|
|
// Returns the removed object, which is usually just itself
|
|
// However, you MUST set the object's positiion yourself when you call this!
|
|
/obj/item/organ/internal/remove(mob/living/carbon/M, special = 0)
|
|
if(!owner)
|
|
stack_trace("\'remove\' called on [src] without an owner! Mob: [M], [atom_loc_line(M)]")
|
|
SEND_SIGNAL(owner, COMSIG_CARBON_LOSE_ORGAN)
|
|
REMOVE_TRAIT(src, TRAIT_ORGAN_INSERTED_WHILE_DEAD, "[UID()]")
|
|
UnregisterSignal(owner, COMSIG_LIVING_DEFIBBED)
|
|
|
|
owner = null
|
|
if(M)
|
|
M.internal_organs -= src
|
|
if(M.internal_organs_slot[slot] == src)
|
|
M.internal_organs_slot.Remove(slot)
|
|
|
|
|
|
for(var/removal_tag in organ_datums)
|
|
if(M.internal_organ_datums[removal_tag] == organ_datums[removal_tag])
|
|
M.internal_organ_datums -= removal_tag
|
|
var/datum/organ/removed = organ_datums[removal_tag]
|
|
removed.on_remove(M)
|
|
|
|
// Lets see if we have any backup organ datums from other internal organs.
|
|
for(var/obj/item/organ/internal/backup_organ in M.internal_organs)
|
|
for(var/replacement_tag in backup_organ.organ_datums)
|
|
if(M.internal_organ_datums[replacement_tag]) // some other organ is already covering it
|
|
continue
|
|
var/datum/organ/replacement_organ = backup_organ.organ_datums[replacement_tag]
|
|
M.internal_organ_datums[replacement_organ.organ_tag] = replacement_organ
|
|
replacement_organ.on_replace(M)
|
|
|
|
if(vital && !special)
|
|
if(M.stat != DEAD)//safety check!
|
|
M.death()
|
|
|
|
if(ishuman(M))
|
|
var/mob/living/carbon/human/H = M
|
|
var/obj/item/organ/external/parent = H.get_organ(check_zone(parent_organ))
|
|
if(!istype(parent))
|
|
stack_trace("[src] attempted to remove from a [parent_organ], but [parent_organ] didn't exist! [atom_loc_line(M)]")
|
|
else
|
|
parent.internal_organs -= src
|
|
H.update_int_organs()
|
|
|
|
for(var/X in actions)
|
|
var/datum/action/A = X
|
|
A.Remove(M)
|
|
START_PROCESSING(SSobj, src)
|
|
if(destroy_on_removal && !QDELETED(src))
|
|
qdel(src)
|
|
return
|
|
return src
|
|
|
|
/obj/item/organ/internal/emp_act(severity)
|
|
if(!is_robotic() || emp_proof)
|
|
return
|
|
|
|
var/we_done = FALSE
|
|
for(var/organ_tag in organ_datums)
|
|
var/datum/organ/borgan = organ_datums[organ_tag]
|
|
if(borgan.on_successful_emp())
|
|
we_done = TRUE
|
|
|
|
if(we_done)
|
|
return
|
|
|
|
// No EMP handling was done, lets just give em damage
|
|
switch(severity)
|
|
if(EMP_HEAVY)
|
|
receive_damage(20, 1)
|
|
if(EMP_LIGHT)
|
|
receive_damage(7, 1)
|
|
if(EMP_WEAKENED)
|
|
receive_damage(3, 1)
|
|
|
|
/obj/item/organ/internal/replaced(mob/living/carbon/human/target)
|
|
insert(target)
|
|
|
|
/obj/item/organ/internal/necrotize(update_sprite, ignore_vital_death = FALSE)
|
|
for(var/organ_tag in organ_datums) // let the organ datums handle first
|
|
var/datum/organ/dead_organ = organ_datums[organ_tag]
|
|
dead_organ.on_necrotize()
|
|
return ..()
|
|
|
|
/obj/item/organ/internal/item_action_slot_check(slot, mob/user)
|
|
return
|
|
|
|
/obj/item/organ/internal/proc/on_find(mob/living/finder)
|
|
return
|
|
|
|
/obj/item/organ/internal/proc/on_life()
|
|
return
|
|
|
|
//abstract proc called by carbon/death()
|
|
/obj/item/organ/internal/proc/on_owner_death()
|
|
return
|
|
|
|
/obj/item/organ/internal/proc/prepare_eat()
|
|
if(is_robotic())
|
|
return //no eating cybernetic implants!
|
|
var/obj/item/food/organ/S = new
|
|
S.name = name
|
|
S.desc = desc
|
|
S.icon = icon
|
|
S.icon_state = icon_state
|
|
S.origin_tech = origin_tech
|
|
S.w_class = w_class
|
|
|
|
for(var/organ_tag in organ_datums)
|
|
var/datum/organ/delicious = organ_datums[organ_tag]
|
|
delicious.on_prepare_eat(S)
|
|
|
|
return S
|
|
|
|
/obj/item/organ/internal/attempt_become_organ(obj/item/organ/external/parent,mob/living/carbon/human/H)
|
|
if(parent_organ != parent.limb_name)
|
|
return FALSE
|
|
insert(H)
|
|
return TRUE
|
|
|
|
// Rendering!
|
|
/obj/item/organ/internal/proc/render()
|
|
return
|
|
|
|
/obj/item/organ/internal/attack(mob/living/carbon/M, mob/user)
|
|
if(M == user && ishuman(user))
|
|
var/mob/living/carbon/human/H = user
|
|
var/obj/item/food/S = prepare_eat()
|
|
if(S)
|
|
H.drop_item()
|
|
H.put_in_active_hand(S)
|
|
S.attack(H, H)
|
|
qdel(src)
|
|
else
|
|
..()
|
|
|
|
/****************************************************
|
|
INTERNAL ORGANS DEFINES
|
|
****************************************************/
|
|
|
|
|
|
// Brain is defined in brain_item.dm.
|
|
|
|
/obj/item/organ/internal/robotize(make_tough)
|
|
if(!is_robotic())
|
|
var/list/states = icon_states('icons/obj/surgery.dmi') //Insensitive to specially-defined icon files for species like the Drask or whomever else. Everyone gets the same robotic heart.
|
|
if(slot == "heart" && ("[slot]-c-on" in states) && ("[slot]-c-off" in states)) //Give the robotic heart its robotic heart icons if they exist.
|
|
var/obj/item/organ/internal/heart/H = src
|
|
H.icon = icon('icons/obj/surgery.dmi')
|
|
H.base_icon_state = "[slot]-c"
|
|
H.dead_icon = "[slot]-c-off"
|
|
H.update_icon()
|
|
else if("[slot]-c" in states) //Give the robotic organ its robotic organ icons if they exist.
|
|
icon = icon('icons/obj/surgery.dmi')
|
|
icon_state = "[slot]-c"
|
|
name = "cybernetic [slot]"
|
|
..() //Go apply all the organ flags/robotic statuses.
|
|
|
|
/obj/item/organ/internal/appendix
|
|
name = "appendix"
|
|
icon_state = "appendix"
|
|
organ_tag = "appendix"
|
|
parent_organ = "groin"
|
|
slot = "appendix"
|
|
var/inflamed = 0
|
|
|
|
/obj/item/organ/internal/appendix/remove(mob/living/carbon/M, special = 0)
|
|
for(var/datum/disease/appendicitis/A in M.viruses)
|
|
A.cure()
|
|
inflamed = 1
|
|
update_icon()
|
|
. = ..()
|
|
|
|
/obj/item/organ/internal/appendix/insert(mob/living/carbon/M, special = 0)
|
|
..()
|
|
if(inflamed)
|
|
M.AddDisease(new /datum/disease/appendicitis)
|
|
|
|
/obj/item/organ/internal/appendix/prepare_eat()
|
|
var/obj/S = ..()
|
|
if(inflamed)
|
|
S.reagents.add_reagent("????", 5)
|
|
return S
|
|
|
|
|
|
//debug and adminbus....
|
|
|
|
/obj/item/organ/internal/honktumor
|
|
name = "banana tumor"
|
|
desc = "A tiny yellow mass shaped like..a banana?"
|
|
icon_state = "honktumor"
|
|
origin_tech = "biotech=1"
|
|
w_class = WEIGHT_CLASS_TINY
|
|
parent_organ = "head"
|
|
slot = "brain_tumor"
|
|
destroy_on_removal = TRUE
|
|
|
|
var/organhonked = 0
|
|
var/suffering_delay = 900
|
|
var/datum/component/squeak
|
|
|
|
/obj/item/organ/internal/honktumor/insert(mob/living/carbon/M, special = 0)
|
|
..()
|
|
M.dna.SetSEState(GLOB.clumsyblock, TRUE, TRUE)
|
|
M.dna.SetSEState(GLOB.comicblock, TRUE, TRUE)
|
|
singlemutcheck(M, GLOB.clumsyblock, MUTCHK_FORCED)
|
|
singlemutcheck(M, GLOB.comicblock, MUTCHK_FORCED)
|
|
organhonked = world.time
|
|
M.AddElement(/datum/element/waddling)
|
|
squeak = M.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50, falloff_exponent = 20)
|
|
|
|
/obj/item/organ/internal/honktumor/remove(mob/living/carbon/M, special = 0)
|
|
M.dna.SetSEState(GLOB.clumsyblock, FALSE)
|
|
M.dna.SetSEState(GLOB.comicblock, FALSE)
|
|
singlemutcheck(M, GLOB.clumsyblock, MUTCHK_FORCED)
|
|
singlemutcheck(M, GLOB.comicblock, MUTCHK_FORCED)
|
|
M.RemoveElement(/datum/element/waddling)
|
|
QDEL_NULL(squeak)
|
|
return ..()
|
|
|
|
/obj/item/organ/internal/honktumor/on_life()
|
|
if(organhonked < world.time)
|
|
organhonked = world.time + suffering_delay
|
|
to_chat(owner, "<font color='red' size='7'>HONK</font>")
|
|
owner.SetSleeping(0)
|
|
owner.Stuttering(40 SECONDS)
|
|
owner.Deaf(30 SECONDS)
|
|
owner.Weaken(6 SECONDS)
|
|
SEND_SOUND(owner, sound('sound/items/airhorn.ogg'))
|
|
if(prob(30))
|
|
owner.Stun(20 SECONDS)
|
|
owner.Paralyse(8 SECONDS)
|
|
else
|
|
owner.Jitter(1000 SECONDS)
|
|
|
|
if(ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
if(isobj(H.shoes))
|
|
var/thingy = H.shoes
|
|
if(H.unEquip(H.shoes))
|
|
walk_away(thingy,H,15,2)
|
|
spawn(20)
|
|
if(thingy)
|
|
walk(thingy,0)
|
|
|
|
/obj/item/organ/internal/honktumor/cursed
|
|
unremovable = TRUE
|
|
|
|
/obj/item/organ/internal/honktumor/cursed/on_life() //No matter what you do, no matter who you are, no matter where you go, you're always going to be a fat, stuttering dimwit.
|
|
..()
|
|
owner.setBrainLoss(80, use_brain_mod = FALSE)
|
|
owner.set_nutrition(9000)
|
|
owner.overeatduration = 9000
|
|
|
|
|
|
/obj/item/organ/internal/honkbladder
|
|
name = "honk bladder"
|
|
desc = "a air filled sac that produces honking noises."
|
|
icon_state = "honktumor"//Not making a new icon
|
|
origin_tech = "biotech=1"
|
|
w_class = WEIGHT_CLASS_TINY
|
|
parent_organ = "groin"
|
|
slot = "honk_bladder"
|
|
destroy_on_removal = TRUE
|
|
|
|
var/datum/component/squeak
|
|
|
|
/obj/item/organ/internal/honkbladder/insert(mob/living/carbon/M, special = 0)
|
|
|
|
squeak = M.AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50, falloff_exponent = 20)
|
|
|
|
/obj/item/organ/internal/honkbladder/remove(mob/living/carbon/M, special = 0)
|
|
QDEL_NULL(squeak)
|
|
return ..()
|
|
|
|
/obj/item/organ/internal/beard
|
|
name = "beard organ"
|
|
desc = "Let they who is worthy wear the beard of Thorbjorndottir."
|
|
icon_state = "liver"
|
|
origin_tech = "biotech=1"
|
|
w_class = WEIGHT_CLASS_TINY
|
|
parent_organ = "head"
|
|
slot = "hair_organ"
|
|
|
|
/obj/item/organ/internal/beard/on_life()
|
|
|
|
if(!owner)
|
|
return
|
|
|
|
if(ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
var/obj/item/organ/external/head/head_organ = H.get_organ("head") // damn well better have a head if you have a beard
|
|
if(!(head_organ.h_style == "Very Long Hair" || head_organ.h_style == "Mohawk"))
|
|
if(prob(10))
|
|
head_organ.h_style = "Mohawk"
|
|
else
|
|
head_organ.h_style = "Very Long Hair"
|
|
head_organ.hair_colour = "#D8C078"
|
|
H.update_hair()
|
|
if(!(head_organ.f_style == "Very Long Beard"))
|
|
head_organ.f_style = "Very Long Beard"
|
|
head_organ.facial_colour = "#D8C078"
|
|
H.update_fhair()
|
|
|
|
/obj/item/organ/internal/handle_germs()
|
|
..()
|
|
if(germ_level >= INFECTION_LEVEL_TWO)
|
|
if(prob(3)) //about once every 30 seconds
|
|
receive_damage(1, silent = prob(30))
|
|
|
|
/obj/item/organ/internal/proc/on_revival() //The goal of this proc / trait is to prevent one implanting organs in a corpse, in order to remove them with the organ extractor. Has to be legitimently implanted, or on just a living person, which has risk
|
|
SIGNAL_HANDLER
|
|
REMOVE_TRAIT(src, TRAIT_ORGAN_INSERTED_WHILE_DEAD, "[UID()]")
|
|
UnregisterSignal(owner, COMSIG_LIVING_DEFIBBED)
|