This commit is contained in:
Ghommie
2020-02-05 04:34:54 +01:00
146 changed files with 1190 additions and 1257 deletions

View File

@@ -343,12 +343,12 @@ GLOBAL_PROTECT(admin_verbs_hideable)
set category = "Admin"
set name = "Aghost"
if(!holder)
return
return FALSE
if(isobserver(mob))
//re-enter
var/mob/dead/observer/ghost = mob
if(!ghost.mind || !ghost.mind.current) //won't do anything if there is no body
return
return FALSE
if(!ghost.can_reenter_corpse)
log_admin("[key_name(usr)] re-entered corpse")
message_admins("[key_name_admin(usr)] re-entered corpse")
@@ -357,6 +357,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin Reenter") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else if(isnewplayer(mob))
to_chat(src, "<font color='red'>Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.</font>")
return FALSE
else
//ghostize
log_admin("[key_name(usr)] admin ghosted.")
@@ -366,7 +367,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
if(body && !body.key)
body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus
SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin Ghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return TRUE
/client/proc/invisimin()
set name = "Invisimin"

View File

@@ -137,7 +137,8 @@ GLOBAL_LIST(round_end_notifiees)
return "The Database is not enabled!"
GLOB.bunker_passthrough |= ckey(params)
GLOB.bunker_passthrough[ckey(params)] = world.realtime
SSpersistence.SavePanicBunker() //we can do this every time, it's okay
log_admin("[sender.friendly_name] has added [params] to the current round's bunker bypass list.")
message_admins("[sender.friendly_name] has added [params] to the current round's bunker bypass list.")
return "[params] has been added to the current round's bunker bypass list."

View File

@@ -1983,8 +1983,8 @@
var/atom/movable/AM = locate(href_list["adminplayerobservefollow"])
var/client/C = usr.client
if(!isobserver(usr))
C.admin_ghost()
if(!isobserver(usr) && !C.admin_ghost())
return
var/mob/dead/observer/A = C.mob
A.ManualFollow(AM)
@@ -2006,8 +2006,8 @@
var/z = text2num(href_list["Z"])
var/client/C = usr.client
if(!isobserver(usr))
C.admin_ghost()
if(!isobserver(usr) && !C.admin_ghost())
return
sleep(2)
C.jumptocoord(x,y,z)

View File

@@ -58,7 +58,7 @@
if(isorgan(organ))
O = organ
O.Remove(C)
O.Remove()
else
I = organ
I.removed(C)

View File

@@ -24,6 +24,8 @@
return
GLOB.bunker_passthrough |= ckey(ckeytobypass)
GLOB.bunker_passthrough[ckey(ckeytobypass)] = world.realtime
SSpersistence.SavePanicBunker() //we can do this every time, it's okay
log_admin("[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
message_admins("[key_name_admin(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
send2irc("Panic Bunker", "[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
@@ -37,6 +39,7 @@
return
GLOB.bunker_passthrough -= ckey(ckeytobypass)
SSpersistence.SavePanicBunker()
log_admin("[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.")
message_admins("[key_name_admin(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.")
send2irc("Panic Bunker", "[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.")

View File

@@ -33,7 +33,7 @@
if(IC)
user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "<span class='notice'>You pull [IC] out of [target]'s [target_zone].</span>")
user.put_in_hands(IC)
IC.Remove(target)
IC.Remove()
return 1
else
to_chat(user, "<span class='warning'>You don't find anything in [target]'s [target_zone]!</span>")

View File

@@ -73,13 +73,14 @@
active_mind_control = FALSE
return TRUE
/obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = 0)
/obj/item/organ/heart/gland/Remove(special = FALSE)
active = 0
if(initial(uses) == 1)
uses = initial(uses)
var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
hud.remove_from_hud(owner)
clear_mind_control()
if(!QDELETED(owner))
var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
hud.remove_from_hud(owner)
clear_mind_control()
..()
/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)

View File

@@ -14,6 +14,7 @@
/obj/item/organ/heart/gland/access/proc/free_access(datum/source, obj/O)
return TRUE
/obj/item/organ/heart/gland/access/Remove(mob/living/carbon/M, special = 0)
UnregisterSignal(owner, COMSIG_MOB_ALLOWED)
..()
/obj/item/organ/heart/gland/access/Remove(special = FALSE)
if(!QDELETED(owner))
UnregisterSignal(owner, COMSIG_MOB_ALLOWED)
return ..()

View File

@@ -11,9 +11,10 @@
..()
ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
..()
/obj/item/organ/heart/gland/electric/Remove(special = FALSE)
if(!QDELETED(owner))
REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
return ..()
/obj/item/organ/heart/gland/electric/activate()
owner.visible_message("<span class='danger'>[owner]'s skin starts emitting electric arcs!</span>",\

View File

@@ -65,14 +65,14 @@
/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/organ/cyberimp/implant)
owner.visible_message("<span class='warning'>[owner] vomits up his [implant.name]!</span>", "<span class='userdanger'>You suddenly vomit up your [implant.name]!</span>")
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
implant.Remove(owner)
implant.Remove()
implant.forceMove(owner.drop_location())
/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver)
if(liver)
owner.visible_message("<span class='warning'>[owner] vomits up his [liver.name]!</span>", "<span class='userdanger'>You suddenly vomit up your [liver.name]!</span>")
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
liver.Remove(owner)
liver.Remove()
liver.forceMove(owner.drop_location())
else
to_chat(owner, "<span class='warning'>You feel a weird rumble in your bowels...</span>")
@@ -87,7 +87,7 @@
if(lungs)
owner.visible_message("<span class='warning'>[owner] vomits up his [lungs.name]!</span>", "<span class='userdanger'>You suddenly vomit up your [lungs.name]!</span>")
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
lungs.Remove(owner)
lungs.Remove()
lungs.forceMove(owner.drop_location())
else
to_chat(owner, "<span class='warning'>You feel a weird rumble inside your chest...</span>")
@@ -102,7 +102,7 @@
if(eyes)
owner.visible_message("<span class='warning'>[owner]'s [eyes.name] fall out of their sockets!</span>", "<span class='userdanger'>Your [eyes.name] fall out of their sockets!</span>")
playsound(owner, 'sound/effects/splat.ogg', 50, TRUE)
eyes.Remove(owner)
eyes.Remove()
eyes.forceMove(owner.drop_location())
else
to_chat(owner, "<span class='warning'>You feel a weird rumble behind your eye sockets...</span>")

View File

@@ -18,7 +18,7 @@
var/list/organs = user.getorganszone(BODY_ZONE_HEAD, 1)
for(var/obj/item/organ/I in organs)
I.Remove(user, 1)
I.Remove(TRUE)
explosion(get_turf(user), 0, 0, 2, 0, TRUE)
for(var/mob/living/carbon/human/H in range(2,user))

View File

@@ -22,7 +22,7 @@
if(!istype(O))
continue
O.Remove(user)
O.Remove()
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(0, toxic = TRUE)

View File

@@ -104,6 +104,6 @@
transfer_personality(H)
brainmob.fully_replace_character_name(null, "[braintype] [H.real_name]")
name = "[initial(name)] ([brainmob.name])"
B.Remove(H)
B.Remove()
qdel(B)
H.update_hair()

View File

@@ -52,6 +52,7 @@
if(2) //steal
var/datum/objective/steal/special/O = new /datum/objective/steal/special()
O.owner = owner
O.find_target()
objectives += O
if(3) //protect/kill

View File

@@ -100,10 +100,9 @@
if(M.mind)
M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null))
/obj/item/organ/heart/demon/Remove(mob/living/carbon/M, special = 0)
..()
if(M.mind)
M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl)
/obj/item/organ/heart/demon/Remove(special = FALSE)
owner?.mind?.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl)
return ..()
/obj/item/organ/heart/demon/Stop()
return 0 // Always beating.

View File

@@ -114,7 +114,7 @@
for(var/X in CM.internal_organs)
var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) //Pick a random direction to toss them in
var/obj/item/organ/O = X
O.Remove(CM) //Note that this isn't the same proc as for lists
O.Remove() //Note that this isn't the same proc as for lists
O.forceMove(T) //Move the organ outta the body
O.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away
sleep(1)

View File

@@ -514,7 +514,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey] && !(ckey in GLOB.bunker_passthrough))
log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
message_admins("<span class='adminnotice'>Failed Login: [key] - New account attempting to connect during panic bunker</span>")
to_chat(src, "<span class='notice'>You must first join the Discord to verify your account before joining this server.<br>To do so, read the rules and post a request in the #station-access-requests channel under the \"Main server\" category in the Discord server linked here: <a href='https://discord.gg/E6SQuhz'>https://discord.gg/E6SQuhz</a></span>") //CIT CHANGE - makes the panic bunker disconnect message point to the discord
to_chat(src, "<span class='notice'>You must first join the Discord to verify your account before joining this server.<br>To do so, read the rules and post a request in the #station-access-requests channel under the \"Main server\" category in the Discord server linked here: <a href='https://discord.gg/E6SQuhz'>https://discord.gg/E6SQuhz</a><br>If you have already done so, wait a few minutes then try again; sometimes the server needs to fully load before you can join.</span>") //CIT CHANGE - makes the panic bunker disconnect message point to the discord
var/list/connectiontopic_a = params2list(connectiontopic)
var/list/panic_addr = CONFIG_GET(string/panic_server_address)
if(panic_addr && !connectiontopic_a["redirect"])
@@ -538,6 +538,8 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
if(!account_join_date)
account_join_date = "Error"
account_age = -1
else if(ckey in GLOB.bunker_passthrough)
GLOB.bunker_passthrough -= ckey
qdel(query_client_in_db)
var/datum/DBQuery/query_get_client_age = SSdbcore.NewQuery("SELECT firstseen, DATEDIFF(Now(),firstseen), accountjoindate, DATEDIFF(Now(),accountjoindate) FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'")
if(!query_get_client_age.Execute())

View File

@@ -61,6 +61,9 @@
kill()
/datum/round_event/meteor_wave/announce(fake)
priority_announce(generateMeteorString(startWhen,TRUE,direction), "Meteor Alert", "meteors")
/proc/generateMeteorString(startWhen,syndiealert,direction)
var/directionstring
switch(direction)
if(NORTH)
@@ -71,7 +74,7 @@
directionstring = " towards starboard"
if(WEST)
directionstring = " towards port"
priority_announce("Meteors have been detected on collision course with the station[directionstring]. Estimated time until impact: [round((startWhen * SSevents.wait) / 10, 0.1)] seconds.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]", "Meteor Alert", "meteors")
return "Meteors have been detected on a collision course with the station[directionstring]. Estimated time until impact: [round((startWhen * SSevents.wait) / 10, 0.1)] seconds.[GLOB.singularity_counter && syndiealert ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]"
/datum/round_event/meteor_wave/tick()
if(ISMULTIPLE(activeFor, 3))

View File

@@ -895,7 +895,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
SEND_SOUND(target, get_announcer_sound("aimalf"))
if("meteors") //Meteors inbound!
to_chat(target, "<h1 class='alert'>Meteor Alert</h1>")
to_chat(target, "<br><br><span class='alert'>Meteors have been detected on collision course with the station. Estimated time until impact: [round(rand(180,360)/60)] minutes.</span><br><br>")
to_chat(target, "<br><br><span class='alert'>[generateMeteorString(rand(60, 90),FALSE,pick(GLOB.cardinals))]</span><br><br>")
SEND_SOUND(target, get_announcer_sound("meteors"))
if("supermatter")
SEND_SOUND(target, 'sound/magic/charge.ogg')

View File

@@ -244,6 +244,7 @@
/datum/reagent/consumable/spacemountainwind = 5
)
result = /obj/item/reagent_containers/food/snacks/snowcones/spacemountainwind
subcategory = CAT_ICE
/datum/crafting_recipe/food/pwrgame_sc
name = "Pwrgame snowcone"
@@ -273,4 +274,4 @@
/datum/reagent/colorful_reagent = 1 //Harder to make
)
result = /obj/item/reagent_containers/food/snacks/snowcones/rainbow
subcategory = CAT_ICE
subcategory = CAT_ICE

View File

@@ -59,7 +59,7 @@
/obj/machinery/seed_extractor/examine(mob/user)
. = ..()
if(in_range(user, src) || isobserver(user))
. += "<span class='notice'>The status display reads: Extracting <b>[seed_multiplier]</b> seed(s) per piece of produce.<br>Machine can store up to <b>[max_seeds]%</b> seeds.</span>"
. += "<span class='notice'>The status display reads: Extracting <b>[seed_multiplier]</b> seed(s) per piece of produce.<br>Machine can store up to <b>[max_seeds]</b> seeds.</span>"
/obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params)

View File

@@ -111,8 +111,8 @@
preserved(TRUE)
owner.visible_message("<span class='notice'>[src] stabilizes as it's inserted.</span>")
/obj/item/organ/regenerative_core/Remove(mob/living/carbon/M, special = 0)
if(!inert && !special)
/obj/item/organ/regenerative_core/Remove(special = FALSE)
if(!inert && !special && !QDELETED(owner))
owner.visible_message("<span class='notice'>[src] rapidly decays as it's removed.</span>")
go_inert()
return ..()

View File

@@ -55,16 +55,18 @@
//Update the body's icon so it doesnt appear debrained anymore
C.update_hair()
/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE)
..()
/obj/item/organ/brain/Remove(special = FALSE, no_id_transfer = FALSE)
. = ..()
var/mob/living/carbon/C = .
for(var/X in traumas)
var/datum/brain_trauma/BT = X
BT.on_lose(TRUE)
BT.owner = null
if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer)
if((!QDELETED(src) || C) && !no_id_transfer)
transfer_identity(C)
C.update_hair()
if(C)
C.update_hair()
/obj/item/organ/brain/prepare_eat()
return // Too important to eat.

View File

@@ -20,9 +20,10 @@
M.AddAbility(P)
/obj/item/organ/alien/Remove(mob/living/carbon/M, special = 0)
for(var/obj/effect/proc_holder/alien/P in alien_powers)
M.RemoveAbility(P)
/obj/item/organ/alien/Remove(special = FALSE)
if(owner)
for(var/obj/effect/proc_holder/alien/P in alien_powers)
owner.RemoveAbility(P)
..()
/obj/item/organ/alien/prepare_eat()
@@ -100,11 +101,11 @@
var/mob/living/carbon/alien/A = M
A.updatePlasmaDisplay()
/obj/item/organ/alien/plasmavessel/Remove(mob/living/carbon/M, special = 0)
..()
if(isalien(M))
var/mob/living/carbon/alien/A = M
/obj/item/organ/alien/plasmavessel/Remove(special = FALSE)
if(owner && isalien(owner))
var/mob/living/carbon/alien/A = owner
A.updatePlasmaDisplay()
return ..()
#define QUEEN_DEATH_DEBUFF_DURATION 2400
@@ -121,9 +122,10 @@
..()
M.faction |= ROLE_ALIEN
/obj/item/organ/alien/hivenode/Remove(mob/living/carbon/M, special = 0)
M.faction -= ROLE_ALIEN
..()
/obj/item/organ/alien/hivenode/Remove(special = FALSE)
if(owner)
owner.faction -= ROLE_ALIEN
return ..()
//When the alien queen dies, all aliens suffer a penalty as punishment for failing to protect her.
/obj/item/organ/alien/hivenode/proc/queen_death()

View File

@@ -230,7 +230,7 @@
dat += "<BR><B>Back:</B> <A href='?src=[REF(src)];item=[SLOT_BACK]'>[back ? back : "Nothing"]</A>"
if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank))
if(!HAS_TRAIT(src, TRAIT_NO_INTERNALS) && istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank))
dat += "<BR><A href='?src=[REF(src)];internal=1'>[internal ? "Disable Internals" : "Set Internals"]</A>"
if(handcuffed)
@@ -249,7 +249,7 @@
..()
//strip panel
if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
if(href_list["internal"])
if(href_list["internal"] && !HAS_TRAIT(src, TRAIT_NO_INTERNALS))
var/slot = text2num(href_list["internal"])
var/obj/item/ITEM = get_item_by_slot(slot)
if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS))
@@ -533,7 +533,7 @@
break //Guess we're out of organs!
var/obj/item/organ/guts = pick(internal_organs)
var/turf/T = get_turf(src)
guts.Remove(src)
guts.Remove()
guts.forceMove(T)
var/atom/throw_target = get_edge_target_turf(guts, dir)
guts.throw_at(throw_target, power, 4, src)
@@ -872,7 +872,7 @@
var/obj/item/organ/O = X
if(prob(50))
organs_amt++
O.Remove(src)
O.Remove()
O.forceMove(drop_location())
if(organs_amt)
to_chat(user, "<span class='notice'>You retrieve some of [src]\'s internal organs!</span>")

View File

@@ -43,7 +43,7 @@
continue
var/org_zone = check_zone(O.zone) //both groin and chest organs.
if(org_zone == BODY_ZONE_CHEST)
O.Remove(src)
O.Remove()
O.forceMove(Tsec)
O.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
else
@@ -55,7 +55,7 @@
if(no_organs && !istype(I, /obj/item/organ/brain))
qdel(I)
continue
I.Remove(src)
I.Remove()
I.forceMove(Tsec)
I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)

View File

@@ -189,21 +189,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(brain && (replace_current || !should_have_brain))
if(!brain.decoy_override)//Just keep it if it's fake
brain.Remove(C,TRUE,TRUE)
brain.Remove(TRUE,TRUE)
QDEL_NULL(brain)
if(should_have_brain && !brain)
brain = new mutant_brain()
brain.Insert(C, TRUE, TRUE)
if(heart && (!should_have_heart || replace_current))
heart.Remove(C,1)
heart.Remove(TRUE)
QDEL_NULL(heart)
if(should_have_heart && !heart)
heart = new mutant_heart()
heart.Insert(C)
if(lungs && (!should_have_lungs || replace_current))
lungs.Remove(C,1)
lungs.Remove(TRUE)
QDEL_NULL(lungs)
if(should_have_lungs && !lungs)
if(mutantlungs)
@@ -213,7 +213,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
lungs.Insert(C)
if(liver && (!should_have_liver || replace_current))
liver.Remove(C,1)
liver.Remove(TRUE)
QDEL_NULL(liver)
if(should_have_liver && !liver)
if(mutantliver)
@@ -223,7 +223,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
liver.Insert(C)
if(stomach && (!should_have_stomach || replace_current))
stomach.Remove(C,1)
stomach.Remove(TRUE)
QDEL_NULL(stomach)
if(should_have_stomach && !stomach)
if(mutantstomach)
@@ -233,14 +233,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
stomach.Insert(C)
if(appendix && (!should_have_appendix || replace_current))
appendix.Remove(C,1)
appendix.Remove(TRUE)
QDEL_NULL(appendix)
if(should_have_appendix && !appendix)
appendix = new()
appendix.Insert(C)
if(tail && (!should_have_tail || replace_current))
tail.Remove(C,1)
tail.Remove(TRUE)
QDEL_NULL(tail)
if(should_have_tail && !tail)
tail = new mutanttail()
@@ -248,21 +248,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(C.get_bodypart(BODY_ZONE_HEAD))
if(eyes && (replace_current || !should_have_eyes))
eyes.Remove(C,1)
eyes.Remove(TRUE)
QDEL_NULL(eyes)
if(should_have_eyes && !eyes)
eyes = new mutanteyes
eyes.Insert(C, TRUE)
if(ears && (replace_current || !should_have_ears))
ears.Remove(C,1)
ears.Remove(TRUE)
QDEL_NULL(ears)
if(should_have_ears && !ears)
ears = new mutantears
ears.Insert(C)
if(tongue && (replace_current || !should_have_tongue))
tongue.Remove(C,1)
tongue.Remove(TRUE)
QDEL_NULL(tongue)
if(should_have_tongue && !tongue)
tongue = new mutanttongue
@@ -272,7 +272,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/mutantorgan in old_species.mutant_organs)
var/obj/item/organ/I = C.getorgan(mutantorgan)
if(I)
I.Remove(C)
I.Remove()
QDEL_NULL(I)
for(var/path in mutant_organs)
@@ -1601,7 +1601,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
"<span class='danger'>\The [user] slaps \the [target]'s ass!</span>",\
"<span class='notice'>You slap [user == target ? "your" : "\the [target]'s"] ass!</span>",\
"You hear a slap."
)
)
return FALSE
else if(attacker_style && attacker_style.disarm_act(user,target))
return 1

View File

@@ -88,7 +88,7 @@
if(NT)
NT.Insert(H, drop_if_replaced = FALSE)
else
tail.Remove(H)
tail.Remove()
/proc/mass_purrbation()
for(var/M in GLOB.mob_list)

View File

@@ -31,14 +31,15 @@
/datum/species/mush/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(!H.dna.features["caps"])
H.dna.features["caps"] = "Round"
handle_mutant_bodyparts(H)
H.faction |= "mushroom"
mush = new()
mush.teach(H, TRUE)
if(!ishuman(C))
return
var/mob/living/carbon/human/H = C
if(!H.dna.features["caps"])
H.dna.features["caps"] = "Round"
handle_mutant_bodyparts(H)
H.faction |= "mushroom"
mush = new()
mush.teach(H, TRUE)
RegisterSignal(C, COMSIG_MOB_ON_NEW_MIND, .proc/on_new_mind)
/datum/species/mush/proc/on_new_mind(mob/owner)

View File

@@ -84,10 +84,10 @@
shadowwalk = SW
/obj/item/organ/brain/nightmare/Remove(mob/living/carbon/M, special = 0)
if(shadowwalk)
M.RemoveSpell(shadowwalk)
..()
/obj/item/organ/brain/nightmare/Remove(special = FALSE)
if(shadowwalk && owner)
owner.RemoveSpell(shadowwalk)
return ..()
/obj/item/organ/heart/nightmare
@@ -120,12 +120,12 @@
blade = new/obj/item/light_eater
M.put_in_hands(blade)
/obj/item/organ/heart/nightmare/Remove(mob/living/carbon/M, special = 0)
/obj/item/organ/heart/nightmare/Remove(special = FALSE)
respawn_progress = 0
if(blade && special != HEART_SPECIAL_SHADOWIFY)
M.visible_message("<span class='warning'>\The [blade] disintegrates!</span>")
if(!QDELETED(owner) && blade && special != HEART_SPECIAL_SHADOWIFY)
owner.visible_message("<span class='warning'>\The [blade] disintegrates!</span>")
QDEL_NULL(blade)
..()
return ..()
/obj/item/organ/heart/nightmare/Stop()
return 0
@@ -146,7 +146,7 @@
owner.revive(full_heal = TRUE)
if(!(owner.dna.species.id == "shadow" || owner.dna.species.id == "nightmare"))
var/mob/living/carbon/old_owner = owner
Remove(owner, HEART_SPECIAL_SHADOWIFY)
Remove(HEART_SPECIAL_SHADOWIFY)
old_owner.set_species(/datum/species/shadow)
Insert(old_owner, HEART_SPECIAL_SHADOWIFY)
to_chat(owner, "<span class='userdanger'>You feel the shadows invade your skin, leaping into the center of your chest! You're alive!</span>")

View File

@@ -334,9 +334,10 @@
var/obj/item/clothing/check
var/internals = FALSE
for(check in GET_INTERNAL_SLOTS(src))
if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
internals = TRUE
if(!HAS_TRAIT(src, TRAIT_NO_INTERNALS))
for(check in GET_INTERNAL_SLOTS(src))
if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
internals = TRUE
if(internal)
if(internal.loc != src)
internal = null

View File

@@ -38,7 +38,7 @@
var/obj/item/organ/tail/cat/tail = L.getorgan(/obj/item/organ/tail/cat)
if(!QDELETED(tail))
visible_message("[src] severs [L]'s tail in one swift swipe!", "<span class='notice'>You sever [L]'s tail in one swift swipe.</span>")
tail.Remove(L)
tail.Remove()
var/obj/item/organ/tail/cat/dropped_tail = new(target.drop_location())
dropped_tail.color = L.hair_color
return 1

View File

@@ -61,7 +61,7 @@
time++
if(time >= EGG_INCUBATION_TIME)
Pop()
Remove(owner)
Remove()
qdel(src)
/obj/item/organ/body_egg/changeling_egg/proc/Pop()

View File

@@ -87,7 +87,7 @@ proc/get_top_level_mob(var/mob/S)
to_chat(user, "You cannot send IC messages (muted).")
return FALSE
else if(!params)
var/subtle_emote = stripped_multiline_input("Choose an emote to display.", "Subtle", null, MAX_MESSAGE_LEN)
var/subtle_emote = stripped_multiline_input(user, "Choose an emote to display.", "Subtle", null, MAX_MESSAGE_LEN)
if(subtle_emote && !check_invalid(user, subtle_emote))
var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable")
switch(type)
@@ -109,7 +109,7 @@ proc/get_top_level_mob(var/mob/S)
if(!can_run_emote(user))
return FALSE
user.log_message(message, INDIVIDUAL_EMOTE_LOG)
user.log_message(message, LOG_EMOTE)
message = "<b>[user]</b> " + "<i>[message]</i>"
for(var/mob/M in GLOB.dead_mob_list)
@@ -123,10 +123,7 @@ proc/get_top_level_mob(var/mob/S)
user.audible_message(message=message,hearing_distance=1)
else
user.visible_message(message=message,self_message=message,vision_distance=1)
log_emote("[key_name(user)] : [message]")
message = null
emote_type = EMOTE_VISIBLE
///////////////// SUBTLE 2: NO GHOST BOOGALOO
@@ -173,16 +170,13 @@ proc/get_top_level_mob(var/mob/S)
if(!can_run_emote(user))
return FALSE
user.log_message(message, INDIVIDUAL_EMOTE_LOG)
user.log_message(message, LOG_SUBTLER)
message = "<b>[user]</b> " + "<i>[message]</i>"
if(emote_type == EMOTE_AUDIBLE)
user.audible_message(message=message,hearing_distance=1, ignored_mobs = GLOB.dead_mob_list)
else
user.visible_message(message=message,self_message=message,vision_distance=1, ignored_mobs = GLOB.dead_mob_list)
log_emote("[key_name(user)] : (SUBTLER) [message]")
message = null
///////////////// VERB CODE
/mob/living/verb/subtle()

View File

@@ -90,7 +90,7 @@
if(tr_flags & TR_KEEPORGANS)
for(var/X in O.internal_organs)
var/obj/item/organ/I = X
I.Remove(O, 1)
I.Remove(TRUE)
if(mind)
mind.transfer_to(O)
@@ -103,7 +103,7 @@
for(var/X in internal_organs)
var/obj/item/organ/I = X
int_organs += I
I.Remove(src, 1)
I.Remove(TRUE)
for(var/X in int_organs)
var/obj/item/organ/I = X
@@ -250,7 +250,7 @@
if(tr_flags & TR_KEEPORGANS)
for(var/X in O.internal_organs)
var/obj/item/organ/I = X
I.Remove(O, 1)
I.Remove(TRUE)
if(mind)
mind.transfer_to(O)
@@ -262,7 +262,7 @@
for(var/X in internal_organs)
var/obj/item/organ/I = X
int_organs += I
I.Remove(src, 1)
I.Remove(TRUE)
for(var/X in int_organs)
var/obj/item/organ/I = X

View File

@@ -14,6 +14,7 @@
var/charge = 0 // note %age conveted to actual charge in New
var/maxcharge = 1000
custom_materials = list(/datum/material/iron=700, /datum/material/glass=50)
var/start_charged = TRUE
grind_results = list(/datum/reagent/lithium = 15, /datum/reagent/iron = 5, /datum/reagent/silicon = 5)
var/rigged = FALSE // true if rigged to explode
var/chargerate = 100 //how much power is given every tick in a recharger
@@ -32,7 +33,8 @@
create_reagents(5, INJECTABLE | DRAINABLE)
if (override_maxcharge)
maxcharge = override_maxcharge
charge = maxcharge
if(start_charged)
charge = maxcharge
if(ratingdesc)
desc += " This one has a rating of [DisplayEnergy(maxcharge)], and you should not swallow it."
update_icon()
@@ -163,9 +165,8 @@
return rating * maxcharge
/* Cell variants*/
/obj/item/stock_parts/cell/empty/Initialize()
. = ..()
charge = 0
/obj/item/stock_parts/cell/empty
start_charged = FALSE
/obj/item/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargeable AA battery"
@@ -173,10 +174,8 @@
maxcharge = 500
custom_materials = list(/datum/material/glass=40)
/obj/item/stock_parts/cell/crap/empty/Initialize()
. = ..()
charge = 0
update_icon()
/obj/item/stock_parts/cell/crap/empty
start_charged = FALSE
/obj/item/stock_parts/cell/upgraded
name = "upgraded power cell"
@@ -195,10 +194,8 @@
maxcharge = 1250 //25/12/6 disabler/laser/taser shots.
custom_materials = list(/datum/material/glass=40)
/obj/item/stock_parts/cell/secborg/empty/Initialize()
. = ..()
charge = 0
update_icon()
/obj/item/stock_parts/cell/secborg/empty
start_charged = FALSE
/obj/item/stock_parts/cell/lascarbine
name = "laser carbine power supply"
@@ -231,10 +228,8 @@
maxcharge = 15000
chargerate = 2250
/obj/item/stock_parts/cell/high/empty/Initialize()
. = ..()
charge = 0
update_icon()
/obj/item/stock_parts/cell/high/empty
start_charged = FALSE
/obj/item/stock_parts/cell/super
name = "super-capacity power cell"
@@ -243,10 +238,8 @@
custom_materials = list(/datum/material/glass=300)
chargerate = 2000
/obj/item/stock_parts/cell/super/empty/Initialize()
. = ..()
charge = 0
update_icon()
/obj/item/stock_parts/cell/super/empty
start_charged = FALSE
/obj/item/stock_parts/cell/hyper
name = "hyper-capacity power cell"
@@ -255,10 +248,8 @@
custom_materials = list(/datum/material/glass=400)
chargerate = 3000
/obj/item/stock_parts/cell/hyper/empty/Initialize()
. = ..()
charge = 0
update_icon()
/obj/item/stock_parts/cell/hyper/empty
start_charged = FALSE
/obj/item/stock_parts/cell/bluespace
name = "bluespace power cell"
@@ -268,10 +259,8 @@
custom_materials = list(/datum/material/glass=600)
chargerate = 4000
/obj/item/stock_parts/cell/bluespace/empty/Initialize()
. = ..()
charge = 0
update_icon()
/obj/item/stock_parts/cell/bluespace/empty
start_charged = FALSE
/obj/item/stock_parts/cell/infinite
name = "infinite-capacity power cell!"
@@ -321,15 +310,13 @@
maxcharge = 500
rating = 3
/obj/item/stock_parts/cell/emproof/empty/Initialize()
. = ..()
charge = 0
update_icon()
/obj/item/stock_parts/cell/emproof/empty/ComponentInitialize()
/obj/item/stock_parts/cell/emproof/ComponentInitialize()
. = ..()
AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF)
/obj/item/stock_parts/cell/emproof/empty
start_charged = FALSE
/obj/item/stock_parts/cell/emproof/corrupt()
return
@@ -364,3 +351,22 @@
//found inside the inducers ordered from cargo.
/obj/item/stock_parts/cell/inducer_supply
maxcharge = 5000
/obj/item/stock_parts/cell/magnetic
name = "magrifle power supply"
maxcharge = 12000
chargerate = 600
/obj/item/stock_parts/cell/magnetic/empty
start_charged = FALSE
/obj/item/stock_parts/cell/magnetic/pistol
name = "magpistol power supply"
maxcharge = 6000
/obj/item/stock_parts/cell/magnetic/pistol/empty
start_charged = FALSE
/obj/item/stock_parts/cell/toymagburst
name = "toy mag burst rifle power supply"
maxcharge = 4000

View File

@@ -565,7 +565,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
to_chat(C, "<span class='userdanger'>That was a really dense idea.</span>")
C.visible_message("<span class='userdanger'>A bright flare of radiation is seen from [C]'s head, shortly before you hear a sickening sizzling!</span>")
var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs
rip_u.Remove(C)
rip_u.Remove()
qdel(rip_u)
return
return ..()

View File

@@ -136,7 +136,7 @@
to_chat(C, "<span class='userdanger'>That was a shockingly dumb idea.</span>")
C.visible_message("<span class='userdanger'>A bright flare of lightning is seen from [C]'s head, shortly before you hear a sickening sizzling!</span>")
var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs
rip_u.Remove(C)
rip_u.Remove()
qdel(rip_u)
return
return ..()

View File

@@ -0,0 +1,39 @@
/obj/item/ammo_casing/caseless/magnetic
desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
caliber = "mag"
icon_state = "mag-casing-live"
click_cooldown_override = 2.5
delay = 3
var/energy_cost = 200
/obj/item/ammo_casing/caseless/magnetic
projectile_type = /obj/item/projectile/bullet/magnetic
/obj/item/ammo_casing/caseless/magnetic/disabler
desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
projectile_type = /obj/item/projectile/bullet/magnetic/disabler
/obj/item/ammo_casing/caseless/magnetic/weak
desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
projectile_type = /obj/item/projectile/bullet/magnetic/weak
energy_cost = 125
/obj/item/ammo_casing/caseless/magnetic/weak/disabler
desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
projectile_type = /obj/item/projectile/bullet/magnetic/weak/disabler
energy_cost = 125
/obj/item/ammo_casing/caseless/magnetic/hyper
desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle."
caliber = "hypermag"
icon_state = "hyper-casing-live"
projectile_type = /obj/item/projectile/bullet/magnetic/hyper
pellets = 8
variance = 30
energy_cost = 1500
/obj/item/ammo_casing/caseless/magnetic/hyper/inferno
projectile_type = /obj/item/projectile/bullet/incendiary/mag_inferno
pellets = 1
variance = 0

View File

@@ -63,3 +63,8 @@
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
icon_state = "foamdart_riot"
custom_materials = list(/datum/material/iron = 1125)
/obj/item/ammo_casing/caseless/foam_dart/mag
name = "magfoam dart"
desc = "A foam dart with fun light-up projectiles powered by magnets!"
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag

View File

@@ -62,6 +62,14 @@
/obj/item/ammo_casing/energy/laser/redtag/hitscan/holy
projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan/holy
/obj/item/ammo_casing/energy/laser/magtag
projectile_type = /obj/item/projectile/beam/lasertag/mag
select_name = "magtag"
pellets = 3
variance = 30
e_cost = 1000
fire_sound = 'sound/weapons/magburst.ogg'
/obj/item/ammo_casing/energy/xray
projectile_type = /obj/item/projectile/beam/xray
e_cost = 50

View File

@@ -87,7 +87,14 @@
max_ammo = 40
custom_materials = list(/datum/material/iron = 500)
/obj/item/ammo_box/foambox/mag
name = "ammo box (Magnetic Foam Darts)"
icon = 'icons/obj/guns/toy.dmi'
icon_state = "foambox"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
max_ammo = 42
/obj/item/ammo_box/foambox/riot
icon_state = "foambox_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
custom_materials = list(/datum/material/iron = 50000)
custom_materials = list(/datum/material/iron = 50000)

View File

@@ -0,0 +1,34 @@
/obj/item/ammo_box/magazine/mmag
icon_state = "mediummagmag"
ammo_type = /obj/item/ammo_casing/caseless/magnetic/disabler
caliber = "mag"
max_ammo = 24
multiple_sprites = 2
/obj/item/ammo_box/magazine/mmag/lethal
name = "magrifle magazine (lethal)"
ammo_type = /obj/item/ammo_casing/caseless/magnetic
/obj/item/ammo_box/magazine/mmag/small
name = "magpistol magazine (non-lethal disabler)"
icon_state = "smallmagmag"
ammo_type = /obj/item/ammo_casing/caseless/magnetic/weak/disabler
max_ammo = 15
/obj/item/ammo_box/magazine/mmag/small/lethal
name = "magpistol magazine (lethal)"
ammo_type = /obj/item/ammo_casing/caseless/magnetic/weak
/obj/item/ammo_box/magazine/mhyper
name = "hyper-burst rifle magazine"
icon_state = "hypermag"
ammo_type = /obj/item/ammo_casing/caseless/magnetic/hyper
caliber = "hypermag"
desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 6 smaller shards which can absolutely puncture anything, but has rather short effective range."
max_ammo = 4
multiple_sprites = 4
/obj/item/ammo_box/magazine/mhyper/inferno
name = "hyper-burst rifle magazine (inferno)"
ammo_type = /obj/item/ammo_casing/caseless/magnetic/hyper/inferno
desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating massive amount of heat and light."

View File

@@ -57,3 +57,11 @@
/obj/item/ammo_box/magazine/toy/m762/riot
icon_state = "a762-riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
/obj/item/ammo_box/magazine/toy/foamag
name = "foam force magrifle magazine"
icon_state = "foamagmag"
max_ammo = 24
multiple_sprites = 2
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
custom_materials = list(/datum/material/iron = 200)

View File

@@ -5,3 +5,7 @@
/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
max_ammo = 5
/obj/item/ammo_box/magazine/internal/shot/toy/mag
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
max_ammo = 14

View File

@@ -163,7 +163,7 @@
user.visible_message("<span class='suicide'>[user] blows [user.p_their()] brain[user.p_s()] out with [src]!</span>")
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE)
B.Remove(user)
B.Remove()
B.forceMove(T)
if(iscarbon(user))
var/mob/living/carbon/C = user

View File

@@ -0,0 +1,103 @@
/obj/item/gun/ballistic/automatic/magrifle
name = "\improper Magnetic Rifle"
desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
icon_state = "magrifle"
item_state = "arg"
force = 10
slot_flags = NONE
mag_type = /obj/item/ammo_box/magazine/mmag
fire_sound = 'sound/weapons/magrifle.ogg'
can_suppress = FALSE
burst_size = 1
actions_types = null
fire_delay = 3
spread = 0
recoil = 0.1
casing_ejector = FALSE
inaccuracy_modifier = 0.5
dualwield_spread_mult = 1.4
weapon_weight = WEAPON_MEDIUM
var/obj/item/stock_parts/cell/cell
var/cell_type = /obj/item/stock_parts/cell/magnetic
/obj/item/gun/ballistic/automatic/magrifle/Initialize()
. = ..()
if(cell_type)
cell = new cell_type(src)
else
cell = new(src)
/obj/item/gun/ballistic/automatic/magrifle/examine(mob/user)
. = ..()
if(cell)
. += "<span class='notice'>[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.</span>"
else
. += "<span class='notice'>[src] doesn't seem to have a cell!</span>"
/obj/item/gun/ballistic/automatic/magrifle/can_shoot()
if(QDELETED(cell))
return 0
var/obj/item/ammo_casing/caseless/magnetic/shot = chambered
if(!shot)
return 0
if(cell.charge < shot.energy_cost * burst_size)
return 0
. = ..()
/obj/item/gun/ballistic/automatic/magrifle/shoot_live_shot()
var/obj/item/ammo_casing/caseless/magnetic/shot = chambered
cell.use(shot.energy_cost)
. = ..()
/obj/item/gun/ballistic/automatic/magrifle/emp_act(severity)
. = ..()
if(!(. & EMP_PROTECT_CONTENTS))
cell.use(round(cell.charge / severity))
/obj/item/gun/ballistic/automatic/magrifle/get_cell()
return cell
/obj/item/gun/ballistic/automatic/magrifle/nopin
pin = null
spawnwithmagazine = FALSE
cell_type = /obj/item/stock_parts/cell/magnetic/empty
/obj/item/gun/ballistic/automatic/magrifle/hyperburst
name = "\improper Hyper-Burst Rifle"
desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once."
icon_state = "hyperburst"
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/mhyper
fire_sound = 'sound/weapons/magburst.ogg'
fire_delay = 40
recoil = 2
weapon_weight = WEAPON_HEAVY
/obj/item/gun/ballistic/automatic/magrifle/hyperburst/update_icon()
..()
icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
///magpistol///
/obj/item/gun/ballistic/automatic/magrifle/pistol
name = "magpistol"
desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities."
icon_state = "magpistol"
fire_sound = 'sound/weapons/magpistol.ogg'
mag_type = /obj/item/ammo_box/magazine/mmag/small
fire_delay = 2
inaccuracy_modifier = 0.25
cell_type = /obj/item/stock_parts/cell/magnetic/pistol
/obj/item/gun/ballistic/automatic/magrifle/pistol/update_icon()
..()
cut_overlays()
if(magazine)
add_overlay("magpistol-magazine")
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
/obj/item/gun/ballistic/automatic/magrifle/pistol/nopin
pin = null
spawnwithmagazine = FALSE
cell_type = /obj/item/stock_parts/cell/magnetic/pistol/empty

View File

@@ -109,3 +109,36 @@
/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot
mag_type = /obj/item/ammo_box/magazine/toy/m762/riot
/obj/item/gun/ballistic/automatic/toy/magrifle
name = "foamag rifle"
desc = "A foam launching magnetic rifle. Ages 8 and up."
icon_state = "foamagrifle"
obj_flags = NONE
mag_type = /obj/item/ammo_box/magazine/toy/foamag
fire_sound = 'sound/weapons/magrifle.ogg'
burst_size = 1
actions_types = null
fire_delay = 3
spread = 60
recoil = 0.1
can_suppress = FALSE
inaccuracy_modifier = 0.5
weapon_weight = WEAPON_MEDIUM
dualwield_spread_mult = 1.4
w_class = WEIGHT_CLASS_BULKY
/obj/item/gun/ballistic/shotgun/toy/mag
name = "foam force magpistol"
desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up."
icon_state = "toymag"
item_state = "gun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag
fire_sound = 'sound/weapons/magpistol.ogg'
fire_delay = 2
recoil = 0.1
inaccuracy_modifier = 0.25
dualwield_spread_mult = 1.4
slot_flags = SLOT_BELT
w_class = WEIGHT_CLASS_NORMAL
weapon_weight = WEAPON_MEDIUM

View File

@@ -16,6 +16,19 @@
clumsy_check = 0
item_flags = NONE
/obj/item/gun/energy/laser/practice/hyperburst
name = "toy hyper-burst launcher"
desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems."
ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag)
icon_state = "toyburst"
obj_flags = NONE
fire_delay = 40
weapon_weight = WEAPON_HEAVY
selfcharge = EGUN_SELFCHARGE
charge_delay = 2
recoil = 2
cell_type = /obj/item/stock_parts/cell/toymagburst
/obj/item/gun/energy/laser/retro
name ="retro laser gun"
icon_state = "retro"

View File

@@ -146,6 +146,15 @@
if(M.wear_suit.type in suit_types)
M.adjustStaminaLoss(34)
/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor
icon_state = "magjectile-toy"
name = "lasertag magbolt"
movement_type = FLYING | UNSTOPPABLE //for penetration memes
range = 5 //so it isn't super annoying
light_range = 2
light_color = LIGHT_COLOR_YELLOW
eyeblur = 0
/obj/item/projectile/beam/lasertag/redtag
icon_state = "laser"
suit_types = list(/obj/item/clothing/suit/bluetag)

View File

@@ -0,0 +1,49 @@
/obj/item/projectile/bullet/magnetic
icon_state = "magjectile"
damage = 20
armour_penetration = 20
light_range = 3
speed = 0.6
range = 35
light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/magnetic/disabler
icon_state = "magjectile-nl" //nl stands for non-lethal
damage = 2
armour_penetration = 10
stamina = 20
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/bullet/magnetic/weak
damage = 15
armour_penetration = 10
light_range = 2
range = 25
/obj/item/projectile/bullet/magnetic/weak/disabler
damage = 2
stamina = 20
/obj/item/projectile/bullet/magnetic/hyper
damage = 10
armour_penetration = 20
stamina = 10
movement_type = FLYING | UNSTOPPABLE
range = 6
light_range = 1
light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/incendiary/mag_inferno
icon_state = "magjectile-large"
damage = 10
armour_penetration = 20
movement_type = FLYING | UNSTOPPABLE
range = 20
speed = 0.8
light_range = 4
light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/incendiary/mag_inferno/on_hit(atom/target, blocked = FALSE)
..()
explosion(target, -1, 0, 0, 1, 2, flame_range = 2)
return BULLET_ACT_HIT

View File

@@ -39,3 +39,10 @@
icon_state = "foamdart_riot_proj"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
stamina = 25
/obj/item/projectile/bullet/reusable/foam_dart/mag
name = "magfoam dart"
icon_state = "magjectile-toy"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
light_range = 2
light_color = LIGHT_COLOR_YELLOW

View File

@@ -197,7 +197,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if(HAS_TRAIT(M, TRAIT_BLIND))
if(eyes)
eyes.Remove(M)
eyes.Remove()
eyes.forceMove(get_turf(M))
to_chat(M, "<span class='userdanger'>You double over in pain as you feel your eyeballs liquify in your head!</span>")
M.emote("scream")

View File

@@ -64,12 +64,7 @@
reagents.reaction(target, TOUCH, fraction)
var/mob/M = target
var/R
if(reagents)
for(var/datum/reagent/A in src.reagents.reagent_list)
R += A.type + " ("
R += num2text(A.volume) + "),"
log_combat(user, M, "squirted", R)
log_combat(user, M, "squirted", reagents.log_list())
trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, "<span class='notice'>You transfer [trans] unit\s of the solution.</span>")

View File

@@ -181,7 +181,7 @@
/obj/item/reagent_containers/glass/beaker/flask/spouty
name = "flask with spout"
desc = "A flask with a spout! It can hold up to 120 units. Unable to withstand reagents of an extreme pH."
custom_materials = list(MAT_GLASS = 2500)
custom_materials = list(/datum/material/glass = 2500)
icon_state = "flaskspouty"
possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30,50,100,120)
volume = 120

View File

@@ -6,13 +6,13 @@
name = "Machine Design (AutoBottler)"
desc = "Allows for the construction of circuit boards used to build an Autobottler."
id = "autobottler"
materials = list(MAT_GLASS = 2000)
materials = list(/datum/material/glass = 2000)
build_path = /obj/item/circuitboard/machine/autobottler
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SERVICE
/datum/design/bottle
materials = list(MAT_GLASS = 1200)
materials = list(/datum/material/glass = 1200)
build_type = AUTOBOTTLER
category = list("Storge")
@@ -143,7 +143,7 @@
build_path = /obj/item/reagent_containers/food/drinks/bottle/grenadine/empty
/datum/design/bottle/export
materials = list(MAT_GLASS = 1200)
materials = list(/datum/material/glass = 1200)
build_type = AUTOBOTTLER
category = list("Brands")

View File

@@ -113,7 +113,7 @@
name = "Large Compressed Matter Cartridge"
id = "rcd_ammo_large"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 48000, MAT_GLASS = 32000)
materials = list(/datum/material/iron = 48000, /datum/material/glass = 32000)
build_path = /obj/item/rcd_ammo/large
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING

View File

@@ -141,7 +141,7 @@
name = "Rifle Bullet (7.62mm)"
id = "a762"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000) //need seclathe for clips
materials = list(/datum/material/iron = 5000) //need seclathe for clips
build_path = /obj/item/ammo_casing/a762
category = list("hacked", "Security")

View File

@@ -584,7 +584,7 @@
id = "foam_magrifle"
build_type = AUTOYLATHE
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/magrifle/toy
build_path = /obj/item/gun/ballistic/automatic/toy/magrifle
category = list("initial", "Rifles")
/datum/design/foam_hyperburst

View File

@@ -70,7 +70,7 @@
desc = "A device that can desynchronize the user from spacetime."
id = "desynchronizer"
build_type = PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_BLUESPACE = 1000)
materials = list(/datum/material/iron = 1000, /datum/material/glass = 500, /datum/material/silver = 1500, /datum/material/bluespace = 1000)
build_path = /obj/item/desynchronizer
category = list("Bluespace Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE

View File

@@ -28,7 +28,7 @@
desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
id = "ai_cam_upgrade"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 5000, MAT_GOLD = 15000, MAT_SILVER = 15000, MAT_DIAMOND = 20000, MAT_PLASMA = 10000)
materials = list(/datum/material/iron = 5000, /datum/material/glass = 5000, /datum/material/gold = 15000, /datum/material/silver = 15000, /datum/material/diamond = 20000, /datum/material/plasma = 10000)
build_path = /obj/item/surveillance_upgrade
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -51,7 +51,7 @@
desc = "Allows for the construction of a nanite communication remote."
id = "nanite_comm_remote"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 500, MAT_METAL = 500)
materials = list(/datum/material/glass = 500, /datum/material/iron = 500)
build_path = /obj/item/nanite_remote/comm
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE

View File

@@ -638,7 +638,7 @@
id = "borg_upgrade_premiumka"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/premiumka
materials = list(MAT_METAL=8000, MAT_GLASS=4000, MAT_TITANIUM=2000)
materials = list(/datum/material/iron=8000, /datum/material/glass=4000, /datum/material/titanium=2000)
construction_time = 120
category = list("Cyborg Upgrade Modules")

View File

@@ -178,7 +178,7 @@
id = "medspray"
build_path = /obj/item/reagent_containers/medspray
build_type = PROTOLATHE
materials = list(MAT_METAL = 2500, MAT_GLASS = 500)
materials = list(/datum/material/iron = 2500, /datum/material/glass = 500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
@@ -306,7 +306,7 @@
id = "defibrillator_compact"
build_type = PROTOLATHE
build_path = /obj/item/defibrillator/compact
materials = list(MAT_METAL = 16000, MAT_GLASS = 8000, MAT_SILVER = 6000, MAT_GOLD = 3000)
materials = list(/datum/material/iron = 16000, /datum/material/glass = 8000, /datum/material/silver = 6000, /datum/material/gold = 3000)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL

View File

@@ -281,7 +281,7 @@
desc = "A refill canister for Donksoft Toy Vendors."
id = "donksoft_refill"
build_type = PROTOLATHE
materials = list(MAT_METAL = 25000, MAT_GLASS = 15000, MAT_PLASMA = 20000, MAT_GOLD = 10000, MAT_SILVER = 10000)
materials = list(/datum/material/iron = 25000, /datum/material/glass = 15000, /datum/material/plasma = 20000, /datum/material/gold = 10000, /datum/material/silver = 10000)
build_path = /obj/item/vending_refill/donksoft
category = list("Equipment")
@@ -334,7 +334,7 @@
desc = "A spray bottle, with an unscrewable top."
id = "spraybottle"
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 200)
materials = list(/datum/material/iron = 3000, /datum/material/glass = 200)
build_path = /obj/item/reagent_containers/spray
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
@@ -344,7 +344,7 @@
desc = "A trap used to catch space bears and other legged creatures."
id = "beartrap"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_TITANIUM = 1000)
materials = list(/datum/material/iron = 5000, /datum/material/titanium = 1000)
build_path = /obj/item/restraints/legcuffs/beartrap
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
@@ -398,7 +398,7 @@
desc = "A holographic projector that creates holographic barriers that prevent changes in temperature conditions."
id = "holosignfirelock"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_GOLD = 1000, MAT_SILVER = 1000)
materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000)
build_path = /obj/item/holosign_creator/firelock
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -408,7 +408,7 @@
desc = "A holographic projector that creates holographic barriesr that prevent changes in atmospheric and temperature conditions."
id = "holosigncombifan"
build_type = PROTOLATHE
materials = list(MAT_METAL = 7500, MAT_GLASS = 2500, MAT_SILVER = 2500, MAT_GOLD = 2500, MAT_TITANIUM = 1750)
materials = list(/datum/material/iron = 7500, /datum/material/glass = 2500, /datum/material/silver = 2500, /datum/material/gold = 2500, /datum/material/titanium = 1750)
build_path = /obj/item/holosign_creator/combifan
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -428,7 +428,7 @@
desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases."
build_type = PROTOLATHE
build_path = /obj/item/holosign_creator/medical
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease)
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease)
id = "holobarrier_med"
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
@@ -508,57 +508,57 @@
desc = "A robust flashlight used by security."
id = "seclite"
build_type = PROTOLATHE
materials = list(MAT_METAL = 2500)
materials = list(/datum/material/iron = 2500)
build_path = /obj/item/flashlight/seclite
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/detective_scanner
name = "Forensic Scanner"
desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
id = "detective_scanner"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_GOLD = 2500, MAT_SILVER = 2000)
materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 2500, /datum/material/silver = 2000)
build_path = /obj/item/detective_scanner
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/pepperspray
name = "Pepper Spray"
desc = "Manufactured by UhangInc, used to blind and down an opponent quickly. Printed pepper sprays do not contain reagents."
id = "pepperspray"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 1000)
materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000)
build_path = /obj/item/reagent_containers/spray/pepper/empty
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/bola_energy
name = "Energy Bola"
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
id = "bola_energy"
build_type = PROTOLATHE
materials = list(MAT_SILVER = 500, MAT_PLASMA = 500, MAT_TITANIUM = 500)
materials = list(/datum/material/silver = 500, /datum/material/plasma = 500, /datum/material/titanium = 500)
build_path = /obj/item/restraints/legcuffs/bola/energy
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/zipties
name = "Zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
id = "zipties"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 250)
materials = list(/datum/material/plastic = 250)
build_path = /obj/item/restraints/handcuffs/cable/zipties
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/evidencebag
name = "Evidence Bag"
desc = "An empty evidence bag."
id = "evidencebag"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 100)
materials = list(/datum/material/plastic = 100)
build_path = /obj/item/evidencebag
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY

View File

@@ -7,7 +7,7 @@
desc = "Adds the computer frame and machine frame to the RCD."
id = "rcd_upgrade_frames"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000)
materials = list(/datum/material/iron = 5000, /datum/material/glass = 2500, /datum/material/silver = 1500, /datum/material/titanium = 2000)
build_path = /obj/item/rcd_upgrade/frames
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -17,7 +17,7 @@
desc = "Adds the simple circuits to the RCD."
id = "rcd_upgrade_simple_circuits"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000)
materials = list(/datum/material/iron = 5000, /datum/material/glass = 2500, /datum/material/silver = 1500, /datum/material/titanium = 2000)
build_path = /obj/item/rcd_upgrade/simple_circuits
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -27,7 +27,7 @@
desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly."
id = "rcd_loaded"
build_type = PROTOLATHE
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) // costs more than what it did in the autolathe, this one comes loaded.
materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) // costs more than what it did in the autolathe, this one comes loaded.
build_path = /obj/item/construction/rcd/loaded
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -37,7 +37,7 @@
desc = "A tool that can construct and deconstruct pipes on the fly."
id = "rpd"
build_type = PROTOLATHE
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500)
build_path = /obj/item/pipe_dispenser
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -47,7 +47,7 @@
desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit"
id = "handdrill"
build_type = PROTOLATHE
materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_TITANIUM = 2500)
materials = list(/datum/material/iron = 3500, /datum/material/silver = 1500, /datum/material/titanium = 2500)
build_path = /obj/item/screwdriver/power
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -58,7 +58,7 @@
id = "jawsoflife" // added one more requirment since the Jaws of Life are a bit OP
build_path = /obj/item/crowbar/power
build_type = PROTOLATHE
materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_TITANIUM = 3500)
materials = list(/datum/material/iron = 4500, /datum/material/silver = 2500, /datum/material/titanium = 3500)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -67,7 +67,7 @@
desc = "An experimental welder capable of self-fuel generation."
id = "exwelder"
build_type = PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_PLASMA = 1500, MAT_URANIUM = 200)
materials = list(/datum/material/iron = 1000, /datum/material/glass = 500, /datum/material/plasma = 1500, /datum/material/uranium = 200)
build_path = /obj/item/weldingtool/experimental
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
@@ -82,7 +82,7 @@
id = "alien_wrench"
build_path = /obj/item/wrench/abductor
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
materials = list(/datum/material/iron = 5000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 2000, /datum/material/diamond = 2000)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -92,7 +92,7 @@
id = "alien_wirecutters"
build_path = /obj/item/wirecutters/abductor
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
materials = list(/datum/material/iron = 5000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 2000, /datum/material/diamond = 2000)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -102,7 +102,7 @@
id = "alien_screwdriver"
build_path = /obj/item/screwdriver/abductor
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
materials = list(/datum/material/iron = 5000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 2000, /datum/material/diamond = 2000)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -112,7 +112,7 @@
id = "alien_crowbar"
build_path = /obj/item/crowbar/abductor
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
materials = list(/datum/material/iron = 5000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 2000, /datum/material/diamond = 2000)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -122,7 +122,7 @@
id = "alien_welder"
build_path = /obj/item/weldingtool/abductor
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
materials = list(/datum/material/iron = 5000, /datum/material/silver = 2500, /datum/material/plasma = 5000, /datum/material/titanium = 2000, /datum/material/diamond = 2000)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -132,7 +132,7 @@
id = "alien_multitool"
build_path = /obj/item/multitool/abductor
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000)
materials = list(/datum/material/iron = 5000, /datum/material/silver = 2500, /datum/material/plasma = 5000, /datum/material/titanium = 2000, /datum/material/diamond = 2000)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -146,7 +146,7 @@
id = "alien_scalpel"
build_path = /obj/item/scalpel/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
@@ -156,7 +156,7 @@
id = "alien_hemostat"
build_path = /obj/item/hemostat/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
@@ -166,7 +166,7 @@
id = "alien_retractor"
build_path = /obj/item/retractor/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
@@ -176,7 +176,7 @@
id = "alien_saw"
build_path = /obj/item/circular_saw/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
materials = list(/datum/material/iron = 10000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 1500)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
@@ -186,7 +186,7 @@
id = "alien_drill"
build_path = /obj/item/surgicaldrill/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
materials = list(/datum/material/iron = 10000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 1500)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
@@ -196,7 +196,7 @@
id = "alien_cautery"
build_path = /obj/item/cautery/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
@@ -210,7 +210,7 @@
desc = "A large surgery drape made of plastic."
id = "drapes"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 2500)
materials = list(/datum/material/plastic = 2500)
build_path = /obj/item/surgical_drapes
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
@@ -220,7 +220,7 @@
desc = "An almagation of rods and gears, able to function as both a surgical clamp and retractor. "
id = "retractor_adv"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_GOLD = 1000)
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 1500, /datum/material/gold = 1000)
build_path = /obj/item/retractor/advanced
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
@@ -230,7 +230,7 @@
desc = "It projects a high power laser used for medical applications."
id = "surgicaldrill_adv"
build_type = PROTOLATHE
materials = list(MAT_METAL = 2500, MAT_GLASS = 2500, MAT_SILVER = 6000, MAT_GOLD = 5500, MAT_DIAMOND = 3500)
materials = list(/datum/material/iron = 2500, /datum/material/glass = 2500, /datum/material/silver = 6000, /datum/material/gold = 5500, /datum/material/diamond = 3500)
build_path = /obj/item/surgicaldrill/advanced
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
@@ -240,7 +240,7 @@
desc = "An advanced scalpel which uses laser technology to cut."
id = "scalpel_adv"
build_type = PROTOLATHE
materials = list(MAT_METAL = 1500, MAT_GLASS = 1500, MAT_SILVER = 4000, MAT_GOLD = 2500)
materials = list(/datum/material/iron = 1500, /datum/material/glass = 1500, /datum/material/silver = 4000, /datum/material/gold = 2500)
build_path = /obj/item/scalpel/advanced
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE

View File

@@ -22,7 +22,7 @@
desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body."
id = "c38_trac"
build_type = PROTOLATHE
materials = list(MAT_METAL = 20000, MAT_SILVER = 5000, MAT_GOLD = 1000)
materials = list(/datum/material/iron = 20000, /datum/material/silver = 5000, /datum/material/gold = 1000)
build_path = /obj/item/ammo_box/c38/trac
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -32,7 +32,7 @@
desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload."
id = "c38_hotshot"
build_type = PROTOLATHE
materials = list(MAT_METAL = 20000, MAT_PLASMA = 5000)
materials = list(/datum/material/iron = 20000, /datum/material/plasma = 5000)
build_path = /obj/item/ammo_box/c38/hotshot
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -42,11 +42,49 @@
desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload."
id = "c38_iceblox"
build_type = PROTOLATHE
materials = list(MAT_METAL = 20000, MAT_PLASMA = 5000)
materials = list(/datum/material/iron = 20000, /datum/material/plasma = 5000)
build_path = /obj/item/ammo_box/c38/iceblox
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
//////////////////
//Mag-Rifle Mags//
//////////////////
/datum/design/mag_magrifle
name = "Magrifle Magazine (Lethal)"
desc = "A 24-round magazine for the Magrifle."
id = "mag_magrifle"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 8000, /datum/material/silver = 1000)
build_path = /obj/item/ammo_box/magazine/mmag/lethal
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_magrifle/nl
name = "Magrifle Magazine (Non-Lethal)"
desc = "A 24- round non-lethal magazine for the Magrifle."
id = "mag_magrifle_nl"
materials = list(/datum/material/iron = 6000, /datum/material/silver = 500, /datum/material/titanium = 500)
build_path = /obj/item/ammo_box/magazine/mmag
/datum/design/mag_magpistol
name = "Magpistol Magazine"
desc = "A 14 round magazine for the Magpistol."
id = "mag_magpistol"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 4000, /datum/material/silver = 500)
build_path = /obj/item/ammo_box/magazine/mmag/small/lethal
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_magpistol/nl
name = "Magpistol Magazine (Non-Lethal)"
desc = "A 14 round non-lethal magazine for the Magpistol."
id = "mag_magpistol_nl"
materials = list(/datum/material/iron = 3000, /datum/material/silver = 250, /datum/material/titanium = 250)
build_path = /obj/item/ammo_box/magazine/mmag/small
//////////////
//WT550 Mags//
//////////////
@@ -323,6 +361,26 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/magpistol
name = "Magpistol"
desc = "A weapon which fires ferromagnetic slugs."
id = "magpistol"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 7500, /datum/material/glass = 1000, /datum/material/uranium = 1000, /datum/material/titanium = 5000, /datum/material/silver = 2000)
build_path = /obj/item/gun/ballistic/automatic/magrifle/pistol/nopin
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/magrifle
name = "Magrifle"
desc = "An upscaled Magpistol in rifle form."
id = "magrifle"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 10000, /datum/material/glass = 2000, /datum/material/uranium = 2000, /datum/material/titanium = 10000, /datum/material/silver = 4000, /datum/material/gold = 2000)
build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
///////////
//Grenades/
///////////

View File

@@ -231,6 +231,7 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
export_price = 5000
/*
/datum/techweb_node/basic_meteor_defense
id = "basic_meteor_defense"
display_name = "Meteor Defense Research"
@@ -239,6 +240,7 @@
design_ids = list("meteor_defence", "meteor_console")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
export_price = 5000
*/
//datum/techweb_node/adv_meteor_defense
//id = "adv_meteor_defense"
@@ -695,6 +697,15 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
/datum/techweb_node/magnetic_weapons
id = "magnetic_weapons"
display_name = "Magnetic Weapons"
description = "Weapons using magnetic technology"
prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
design_ids = list("magrifle", "magpistol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
/datum/techweb_node/medical_weapons
id = "medical_weapons"
display_name = "Medical Weaponry"

View File

@@ -144,7 +144,7 @@
C.dropItemToGround(W)
for(var/X in C.internal_organs)
var/obj/item/organ/I = X
I.Remove(C)
I.Remove()
I.forceMove(body_turf)
var/wheres_wizdo = dir2text(get_dir(body_turf, item_turf))
if(wheres_wizdo)

View File

@@ -58,7 +58,7 @@
if(organ.owner)
// If this code ever runs I will be happy
log_combat(L, organ.owner, "magically removed [organ.name] from", addition="INTENT: [uppertext(L.a_intent)]")
organ.Remove(organ.owner)
organ.Remove()
else
while(!isturf(item_to_retrieve.loc) && infinite_recursion < 10) //if it's in something you get the whole thing.
if(isitem(item_to_retrieve.loc))

View File

@@ -62,7 +62,7 @@
var/org_zone = check_zone(O.zone)
if(org_zone != BODY_ZONE_CHEST)
continue
O.Remove(C)
O.Remove()
O.forceMove(T)
organ_spilled = 1
. += X
@@ -141,11 +141,11 @@
//when a limb is dropped, the internal organs are removed from the mob and put into the limb
/obj/item/organ/proc/transfer_to_limb(obj/item/bodypart/LB, mob/living/carbon/C)
Remove(C)
Remove()
forceMove(LB)
/obj/item/organ/brain/transfer_to_limb(obj/item/bodypart/head/LB, mob/living/carbon/human/C)
Remove(C) //Changeling brain concerns are now handled in Remove
Remove() //Changeling brain concerns are now handled in Remove
forceMove(LB)
LB.brain = src
if(brainmob)

View File

@@ -17,7 +17,7 @@
var/list/organs = M.getorganszone("head") + M.getorganszone("eyes") + M.getorganszone("mouth")
for(var/internal_organ in organs)
var/obj/item/organ/I = internal_organ
I.Remove(M)
I.Remove()
I.forceMove(T)
head.drop_limb()
qdel(head)

View File

@@ -136,7 +136,7 @@
"[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!",
"[user] successfully extracts something from [target]'s [parse_zone(target_zone)]!")
log_combat(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
I.Remove(target)
I.Remove()
I.forceMove(get_turf(target))
else
display_results(user, target, "<span class='notice'>You can't extract anything from [target]'s [parse_zone(target_zone)]!</span>",

View File

@@ -27,10 +27,11 @@
icon_state = "appendix"
name = "appendix"
/obj/item/organ/appendix/Remove(mob/living/carbon/M, special = 0)
for(var/datum/disease/appendicitis/A in M.diseases)
A.cure()
inflamed = TRUE
/obj/item/organ/appendix/Remove(special = FALSE)
if(owner)
for(var/datum/disease/appendicitis/A in owner.diseases)
A.cure()
inflamed = TRUE
update_icon()
..()

View File

@@ -54,7 +54,7 @@
to_chat(user, "<span class='notice'>You modify [src] to be installed on the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.</span>")
update_icon()
/obj/item/organ/cyberimp/arm/Remove(mob/living/carbon/M, special = 0)
/obj/item/organ/cyberimp/arm/Remove(special = FALSE)
Retract()
..()

View File

@@ -147,10 +147,10 @@
ion_trail = new
ion_trail.set_up(M)
/obj/item/organ/cyberimp/chest/thrusters/Remove(mob/living/carbon/M, special = 0)
/obj/item/organ/cyberimp/chest/thrusters/Remove(special = FALSE)
if(on)
toggle(silent = TRUE)
..()
toggle(TRUE)
return ..()
/obj/item/organ/cyberimp/chest/thrusters/ui_action_click()
toggle()
@@ -170,10 +170,11 @@
to_chat(owner, "<span class='notice'>You turn your thrusters set on.</span>")
else
ion_trail.stop()
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
owner.remove_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER)
if(!silent)
to_chat(owner, "<span class='notice'>You turn your thrusters set off.</span>")
if(!QDELETED(owner))
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
owner.remove_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER)
if(!silent)
to_chat(owner, "<span class='notice'>You turn your thrusters set off.</span>")
on = FALSE
update_icon()

View File

@@ -20,11 +20,11 @@
var/datum/atom_hud/H = GLOB.huds[HUD_type]
H.add_hud_to(M)
/obj/item/organ/cyberimp/eyes/hud/Remove(var/mob/living/carbon/M, var/special = 0)
if(HUD_type)
/obj/item/organ/cyberimp/eyes/hud/Remove(special = FALSE)
if(!QDELETED(owner) && HUD_type)
var/datum/atom_hud/H = GLOB.huds[HUD_type]
H.remove_hud_from(M)
..()
H.remove_hud_from(owner)
return ..()
/obj/item/organ/cyberimp/eyes/hud/medical
name = "Medical HUD implant"

View File

@@ -89,10 +89,10 @@
stored_items = list()
/obj/item/organ/cyberimp/brain/anti_drop/Remove(var/mob/living/carbon/M, special = 0)
/obj/item/organ/cyberimp/brain/anti_drop/Remove(special = FALSE)
if(active)
ui_action_click()
..()
return ..()
/obj/item/organ/cyberimp/brain/anti_stun

View File

@@ -104,13 +104,14 @@
H.dna.features["ears"] = "Cat"
H.update_body()
/obj/item/organ/ears/cat/Remove(mob/living/carbon/human/H, special = 0)
..()
if(istype(H))
/obj/item/organ/ears/cat/Remove(special = FALSE)
if(!QDELETED(owner) && ishuman(owner))
var/mob/living/carbon/human/H = owner
color = H.hair_color
H.dna.features["ears"] = "None"
H.dna.species.mutant_bodyparts -= "ears"
H.update_body()
return ..()
/obj/item/organ/ears/bronze
name = "tin ears"

View File

@@ -47,17 +47,19 @@
M.update_tint()
owner.update_sight()
/obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0)
/obj/item/organ/eyes/Remove(special = FALSE)
clear_eye_trauma()
. = ..()
if(ishuman(M) && eye_color)
var/mob/living/carbon/human/H = M
H.eye_color = old_eye_color
var/mob/living/carbon/C = .
if(C)
if(ishuman(C) && eye_color)
var/mob/living/carbon/human/H = C
H.eye_color = old_eye_color
if(!special)
H.dna.species.handle_body()
if(!special)
H.dna.species.handle_body()
if(!special)
M.update_tint()
M.update_sight()
C.update_tint()
C.update_sight()
/obj/item/organ/eyes/on_life()
..()
@@ -185,13 +187,13 @@
eye.update_brightness(M)
M.become_blind("flashlight_eyes")
/obj/item/organ/eyes/robotic/flashlight/Remove(var/mob/living/carbon/M, special = FALSE)
eye.on = FALSE
eye.update_brightness(M)
eye.forceMove(src)
M.cure_blind("flashlight_eyes")
..()
/obj/item/organ/eyes/robotic/flashlight/Remove(special = FALSE)
if(!QDELETED(owner))
eye.on = FALSE
eye.update_brightness(owner)
eye.forceMove(src)
owner.cure_blind("flashlight_eyes")
return ..()
// Welding shield implant
/obj/item/organ/eyes/robotic/shield
@@ -227,7 +229,7 @@
terminate_effects()
. = ..()
/obj/item/organ/eyes/robotic/glow/Remove(mob/living/carbon/M, special = FALSE)
/obj/item/organ/eyes/robotic/glow/Remove(special = FALSE)
terminate_effects()
. = ..()
@@ -236,7 +238,6 @@
deactivate(TRUE)
active = FALSE
clear_visuals(TRUE)
STOP_PROCESSING(SSfastprocess, src)
/obj/item/organ/eyes/robotic/glow/ui_action_click(owner, action)
if(istype(action, /datum/action/item_action/organ_action/toggle))
@@ -255,6 +256,8 @@
if(!C || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user)
return
var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num
if(!isnum(range))
return
set_distance(CLAMP(range, 0, max_light_beam_distance))
assume_rgb(C)

View File

@@ -28,10 +28,10 @@
else
icon_state = "[icon_base]-off"
/obj/item/organ/heart/Remove(mob/living/carbon/M, special = 0)
..()
/obj/item/organ/heart/Remove(special = FALSE)
if(!special)
addtimer(CALLBACK(src, .proc/stop_if_unowned), 120)
addtimer(CALLBACK(src, .proc/stop_if_unowned), 12 SECONDS)
return ..()
/obj/item/organ/heart/proc/stop_if_unowned()
if(!owner)
@@ -145,9 +145,9 @@ obj/item/organ/heart/slime
if(owner)
to_chat(owner, "<span class ='userdanger'>Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!</span>")
/obj/item/organ/heart/cursed/Remove(mob/living/carbon/M, special = 0)
..()
M.remove_client_colour(/datum/client_colour/cursed_heart_blood)
/obj/item/organ/heart/cursed/Remove(special = FALSE)
owner.remove_client_colour(/datum/client_colour/cursed_heart_blood)
return ..()
/datum/action/item_action/organ_action/cursed_heart
name = "Pump your blood"

View File

@@ -58,12 +58,12 @@
return S
//Just in case
/obj/item/organ/liver/Remove(mob/living/carbon/M, special = 0)
..()
if(!QDELETED(M))
M.remove_movespeed_modifier(LIVER_SWELLING_MOVE_MODIFY)
M.ResetBloodVol() //At the moment, this shouldn't allow application twice. You either have this OR a thirsty ferret.
sizeMoveMod(1, M)
/obj/item/organ/liver/Remove(special = FALSE)
if(!QDELETED(owner))
owner.remove_movespeed_modifier(LIVER_SWELLING_MOVE_MODIFY)
owner.ResetBloodVol() //At the moment, this shouldn't allow application twice. You either have this OR a thirsty ferret.
sizeMoveMod(1, owner)
return ..()
//Applies some of the effects to the patient.
/obj/item/organ/liver/proc/pharmacokinesis()

View File

@@ -33,7 +33,7 @@
var/obj/item/organ/replaced = M.getorganslot(slot)
if(replaced)
replaced.Remove(M, special = 1)
replaced.Remove(TRUE)
if(drop_if_replaced)
replaced.forceMove(get_turf(M))
else
@@ -54,21 +54,20 @@
return TRUE
//Special is for instant replacement like autosurgeons
/obj/item/organ/proc/Remove(mob/living/carbon/M, special = FALSE)
/obj/item/organ/proc/Remove(special = FALSE)
if(owner)
owner.internal_organs -= src
if(owner.internal_organs_slot[slot] == src)
owner.internal_organs_slot.Remove(slot)
if((organ_flags & ORGAN_VITAL) && !special && !(owner.status_flags & GODMODE))
owner.death()
for(var/X in actions)
var/datum/action/A = X
A.Remove(owner)
. = owner //for possible subtypes specific post-removal code.
owner = null
if(M)
M.internal_organs -= src
if(M.internal_organs_slot[slot] == src)
M.internal_organs_slot.Remove(slot)
if((organ_flags & ORGAN_VITAL) && !special && !(M.status_flags & GODMODE))
M.death()
for(var/X in actions)
var/datum/action/A = X
A.Remove(M)
START_PROCESSING(SSobj, src)
return TRUE
/obj/item/organ/proc/on_find(mob/living/finder)
return
@@ -185,7 +184,7 @@
if(owner)
// The special flag is important, because otherwise mobs can die
// while undergoing transformation into different mobs.
Remove(owner, TRUE)
Remove(TRUE)
return ..()
/obj/item/organ/attack(mob/living/carbon/M, mob/user)
@@ -338,7 +337,7 @@
T = new dna.species.mutanttongue()
else
T = new()
oT.Remove(src)
oT.Remove()
qdel(oT)
T.Insert(src)

View File

@@ -80,9 +80,9 @@
H.throw_alert("disgust", /obj/screen/alert/disgusted)
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgusted)
/obj/item/organ/stomach/Remove(mob/living/carbon/M, special = 0)
/obj/item/organ/stomach/Remove(special = FALSE)
var/mob/living/carbon/human/H = owner
if(istype(H))
if(H && istype(H))
H.clear_alert("disgust")
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust")
..()

View File

@@ -8,10 +8,10 @@
slot = ORGAN_SLOT_TAIL
var/tail_type = "None"
/obj/item/organ/tail/Remove(mob/living/carbon/human/H, special = 0)
..()
if(H && H.dna && H.dna.species)
H.dna.species.stop_wagging_tail(H)
/obj/item/organ/tail/Remove(special = FALSE)
if(owner?.dna?.species)
owner.dna.species.stop_wagging_tail(owner)
return ..()
/obj/item/organ/tail/cat
name = "cat tail"
@@ -26,13 +26,14 @@
H.dna.features["tail_human"] = tail_type
H.update_body()
/obj/item/organ/tail/cat/Remove(mob/living/carbon/human/H, special = 0)
..()
if(istype(H))
/obj/item/organ/tail/cat/Remove(special = FALSE)
if(!QDELETED(owner) && ishuman(owner))
var/mob/living/carbon/human/H = owner
H.dna.features["tail_human"] = "None"
H.dna.species.mutant_bodyparts -= "tail_human"
color = H.hair_color
H.update_body()
return ..()
/obj/item/organ/tail/lizard
name = "lizard tail"
@@ -54,12 +55,13 @@
H.dna.species.mutant_bodyparts |= "spines"
H.update_body()
/obj/item/organ/tail/lizard/Remove(mob/living/carbon/human/H, special = 0)
..()
if(istype(H))
/obj/item/organ/tail/lizard/Remove(special = FALSE)
if(!QDELETED(owner) && ishuman(owner))
var/mob/living/carbon/human/H = owner
H.dna.species.mutant_bodyparts -= "tail_lizard"
H.dna.species.mutant_bodyparts -= "spines"
color = "#" + H.dna.features["mcolor"]
tail_type = H.dna.features["tail_lizard"]
spines = H.dna.features["spines"]
H.update_body()
return ..()

View File

@@ -71,12 +71,13 @@
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
M.UnregisterSignal(M, COMSIG_MOB_SAY)
/obj/item/organ/tongue/Remove(mob/living/carbon/M, special = 0)
..()
if(say_mod && M.dna && M.dna.species)
M.dna.species.say_mod = initial(M.dna.species.say_mod)
UnregisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
M.RegisterSignal(M, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech)
/obj/item/organ/tongue/Remove(special = FALSE)
if(!QDELETED(owner))
if(say_mod && owner.dna?.species)
owner.dna.species.say_mod = initial(owner.dna.species.say_mod)
UnregisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
owner.RegisterSignal(owner, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech)
return ..()
/obj/item/organ/tongue/could_speak_in_language(datum/language/dt)
return is_type_in_typecache(dt, languages_possible)

View File

@@ -145,7 +145,7 @@
/datum/uplink_item/explosives/tearstache
name = "Teachstache Grenade"
desc = "A teargas grenade that launches sticky moustaches onto the face of anyone not wearing a clown or mime mask. The moustaches will \
remain attached to the face of all targets for one minute, preventing the use of breath masks and other such devices."
remain attached to the face of all targets for two minutes, preventing the use of breath masks and other such devices."
item = /obj/item/grenade/chem_grenade/teargas/moustache
cost = 3
surplus = 0

View File

@@ -27,13 +27,14 @@
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/organ/zombie_infection/Remove(mob/living/carbon/M, special = 0)
/obj/item/organ/zombie_infection/Remove(special = FALSE)
if(owner)
if(iszombie(owner) && old_species)
owner.set_species(old_species)
if(timer_id)
deltimer(timer_id)
. = ..()
STOP_PROCESSING(SSobj, src)
if(iszombie(M) && old_species)
M.set_species(old_species)
if(timer_id)
deltimer(timer_id)
STOP_PROCESSING(SSobj, src) //Required to be done after the parent call to avoid conflicts with organ decay.
/obj/item/organ/zombie_infection/on_find(mob/living/finder)
to_chat(finder, "<span class='warning'>Inside the head is a disgusting black \
@@ -44,7 +45,7 @@
if(!owner)
return
if(!(src in owner.internal_organs))
Remove(owner)
Remove()
if (causes_damage && !iszombie(owner) && owner.stat != DEAD)
owner.adjustToxLoss(1)
if (prob(10))