Merge branch 'master' into digileg-runtime

This commit is contained in:
Poojawa
2018-03-19 21:33:50 -05:00
committed by GitHub
1329 changed files with 2726 additions and 1986 deletions
@@ -286,6 +286,7 @@
.["mainsettings"]["teamsize"]["value"] = newtemplate.teamsize
.["mainsettings"]["mission"]["value"] = newtemplate.mission
.["mainsettings"]["polldesc"]["value"] = newtemplate.polldesc
.["mainsettings"]["open_armory"]["value"] = newtemplate.opendoors ? "Yes" : "No"
/datum/admins/proc/equipAntagOnDummy(mob/living/carbon/human/dummy/mannequin, datum/antagonist/antag)
@@ -352,6 +353,7 @@
"mission" = list("desc" = "Mission", "type" = "string", "value" = ertemplate.mission),
"polldesc" = list("desc" = "Ghost poll description", "string" = "text", "value" = ertemplate.polldesc),
"enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(CONFIG_GET(flag/enforce_human_authority) ? "Yes" : "No")]"),
"open_armory" = list("desc" = "Open armory doors", "type" = "boolean", "value" = "[(ertemplate.opendoors ? "Yes" : "No")]"),
)
)
@@ -374,6 +376,7 @@
ertemplate.mission = prefs["mission"]["value"]
ertemplate.polldesc = prefs["polldesc"]["value"]
ertemplate.enforce_human = prefs["enforce_human"]["value"] == "Yes" ? TRUE : FALSE
ertemplate.opendoors = prefs["open_armory"]["value"] == "Yes" ? TRUE : FALSE
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null)
var/teamSpawned = FALSE
@@ -109,16 +109,12 @@ GLOBAL_LIST_EMPTY(antagonists)
/datum/antagonist/proc/give_antag_moodies()
if(!antag_moodlet)
return
GET_COMPONENT_FROM(mood, /datum/component/mood, owner.current)
if(mood)
mood.add_event("antag_moodlet", antag_moodlet)
owner.current.SendSignal(COMSIG_ADD_MOOD_EVENT, "antag_moodlet", antag_moodlet)
/datum/antagonist/proc/clear_antag_moodies()
if(!antag_moodlet)
return
GET_COMPONENT_FROM(mood, /datum/component/mood, owner.current)
if(mood)
mood.add_event("antag_moodlet")
owner.current.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "antag_moodlet")
//Returns the team antagonist belongs to if any.
/datum/antagonist/proc/get_team()
@@ -1,7 +1,7 @@
/datum/surgery/organ_extraction
name = "experimental dissection"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert)
possible_locs = list("chest")
possible_locs = list(BODY_ZONE_CHEST)
ignore_clothes = 1
/datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target)
@@ -11,7 +11,7 @@
if(alert("Are we sure we wish to kill ourself and create a headslug?",,"Yes", "No") == "No")
return
var/datum/mind/M = user.mind
var/list/organs = user.getorganszone("head", 1)
var/list/organs = user.getorganszone(BODY_ZONE_HEAD, 1)
for(var/obj/item/organ/I in organs)
I.Remove(user, 1)
@@ -43,9 +43,9 @@
return
var/limb_regen = 0
if(user.active_hand_index % 2 == 0) //we regen the arm before changing it into the weapon
limb_regen = user.regenerate_limb("r_arm", 1)
limb_regen = user.regenerate_limb(BODY_ZONE_R_ARM, 1)
else
limb_regen = user.regenerate_limb("l_arm", 1)
limb_regen = user.regenerate_limb(BODY_ZONE_L_ARM, 1)
if(limb_regen)
user.visible_message("<span class='warning'>[user]'s missing arm reforms, making a loud, grotesque sound!</span>", "<span class='userdanger'>Your arm regrows, making a loud, crunchy sound and giving you great pain!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
user.emote("scream")
@@ -307,7 +307,7 @@
for(var/obj/item/I in H.held_items)
if(I.is_sharp())
C.visible_message("<span class='danger'>[H] impales [C] with [H.p_their()] [I.name]!</span>", "<span class='userdanger'>[H] impales you with [H.p_their()] [I.name]!</span>")
C.apply_damage(I.force, BRUTE, "chest")
C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST)
H.do_item_attack_animation(C, used_item = I)
H.add_mob_blood(C)
playsound(get_turf(H),I.hitsound,75,1)
@@ -1,36 +1,36 @@
/obj/effect/proc_holder/changeling/revive
name = "Revive"
desc = "We regenerate, healing all damage from our form."
helptext = "Does not regrow lost organs or a missing head."
req_stat = DEAD
always_keep = TRUE
ignores_fakedeath = TRUE
//Revive from revival stasis
/obj/effect/proc_holder/changeling/revive/sting_action(mob/living/carbon/user)
user.cure_fakedeath("changeling")
user.revive(full_heal = 1)
var/list/missing = user.get_missing_limbs()
missing -= "head" // headless changelings are funny
if(missing.len)
playsound(user, 'sound/magic/demon_consume.ogg', 50, 1)
user.visible_message("<span class='warning'>[user]'s missing limbs \
reform, making a loud, grotesque sound!</span>",
"<span class='userdanger'>Your limbs regrow, making a \
loud, crunchy sound and giving you great pain!</span>",
"<span class='italics'>You hear organic matter ripping \
and tearing!</span>")
user.emote("scream")
user.regenerate_limbs(0, list("head"))
user.regenerate_organs()
to_chat(user, "<span class='notice'>We have revived ourselves.</span>")
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
changeling.purchasedpowers -= src
return TRUE
/obj/effect/proc_holder/changeling/revive/can_be_used_by(mob/living/user)
if((user.stat != DEAD) && !(user.has_trait(TRAIT_FAKEDEATH)))
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
changeling.purchasedpowers -= src
return 0
/obj/effect/proc_holder/changeling/revive
name = "Revive"
desc = "We regenerate, healing all damage from our form."
helptext = "Does not regrow lost organs or a missing head."
req_stat = DEAD
always_keep = TRUE
ignores_fakedeath = TRUE
//Revive from revival stasis
/obj/effect/proc_holder/changeling/revive/sting_action(mob/living/carbon/user)
user.cure_fakedeath("changeling")
user.revive(full_heal = 1)
var/list/missing = user.get_missing_limbs()
missing -= BODY_ZONE_HEAD // headless changelings are funny
if(missing.len)
playsound(user, 'sound/magic/demon_consume.ogg', 50, 1)
user.visible_message("<span class='warning'>[user]'s missing limbs \
reform, making a loud, grotesque sound!</span>",
"<span class='userdanger'>Your limbs regrow, making a \
loud, crunchy sound and giving you great pain!</span>",
"<span class='italics'>You hear organic matter ripping \
and tearing!</span>")
user.emote("scream")
user.regenerate_limbs(0, list(BODY_ZONE_HEAD))
user.regenerate_organs()
to_chat(user, "<span class='notice'>We have revived ourselves.</span>")
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
changeling.purchasedpowers -= src
return TRUE
/obj/effect/proc_holder/changeling/revive/can_be_used_by(mob/living/user)
if((user.stat != DEAD) && !(user.has_trait(TRAIT_FAKEDEATH)))
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
changeling.purchasedpowers -= src
return 0
. = ..()
@@ -48,7 +48,7 @@
to_chat(user, "<span class='heavy_brass'>\"Do you have a hole in your head? You're about to.\"</span>")
to_chat(user, "<span class='userdanger'>The helmet tries to drive a spike through your head as you scramble to remove it!</span>")
user.emote("scream")
user.apply_damage(30, BRUTE, "head")
user.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
user.adjustBrainLoss(30)
addtimer(CALLBACK(user, /mob/living.proc/dropItemToGround), src, 1) //equipped happens before putting stuff on(but not before picking items up), 1). thus, we need to wait for it to be on before forcing it off.
@@ -114,7 +114,7 @@
to_chat(user, "<span class='heavy_brass'>\"I think this armor is too hot for you to handle.\"</span>")
to_chat(user, "<span class='userdanger'>The curiass emits a burst of flame as you scramble to get it off!</span>")
user.emote("scream")
user.apply_damage(15, BURN, "chest")
user.apply_damage(15, BURN, BODY_ZONE_CHEST)
user.adjust_fire_stacks(2)
user.IgniteMob()
addtimer(CALLBACK(user, /mob/living.proc/dropItemToGround, src, TRUE), 1)
@@ -175,8 +175,8 @@
to_chat(user, "<span class='heavy_brass'>\"Did you like having arms?\"</span>")
to_chat(user, "<span class='userdanger'>The gauntlets suddenly squeeze tight, crushing your arms before you manage to get them off!</span>")
user.emote("scream")
user.apply_damage(7, BRUTE, "l_arm")
user.apply_damage(7, BRUTE, "r_arm")
user.apply_damage(7, BRUTE, BODY_ZONE_L_ARM)
user.apply_damage(7, BRUTE, BODY_ZONE_R_ARM)
addtimer(CALLBACK(user, /mob/living.proc/dropItemToGround, src, TRUE), 1)
/obj/item/clothing/shoes/clockwork
@@ -225,6 +225,6 @@
to_chat(user, "<span class='heavy_brass'>\"Let's see if you can dance with these.\"</span>")
to_chat(user, "<span class='userdanger'>The treads turn searing hot as you scramble to get them off!</span>")
user.emote("scream")
user.apply_damage(7, BURN, "l_leg")
user.apply_damage(7, BURN, "r_leg")
user.apply_damage(7, BURN, BODY_ZONE_L_LEG)
user.apply_damage(7, BURN, BODY_ZONE_R_LEG)
addtimer(CALLBACK(user, /mob/living.proc/dropItemToGround, src, TRUE), 1)
@@ -143,8 +143,8 @@
playsound(get_turf(user), 'sound/weapons/sear.ogg', 50, 1)
user.dropItemToGround(src)
user.emote("scream")
user.apply_damage(5, BURN, "l_arm")
user.apply_damage(5, BURN, "r_arm")
user.apply_damage(5, BURN, BODY_ZONE_L_ARM)
user.apply_damage(5, BURN, BODY_ZONE_R_ARM)
return 0
if(!is_servant_of_ratvar(user))
to_chat(user, "<span class='warning'>The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away.</span>")
@@ -79,7 +79,7 @@
if(I.flags_inv & HIDEHAIR) //they're wearing a mask that covers their skull
to_chat(user, "<span class='warning'>[H]'s head is covered, remove [H.wear_mask] first!</span>")
return
var/obj/item/bodypart/head/HE = H.get_bodypart("head")
var/obj/item/bodypart/head/HE = H.get_bodypart(BODY_ZONE_HEAD)
if(!HE) //literally headless
to_chat(user, "<span class='warning'>[H] has no head, and thus no mind to claim!</span>")
return
@@ -64,7 +64,7 @@
squirrel.emote("scream")
playsound(squirrel, 'sound/effects/splat.ogg', 50, TRUE)
playsound(squirrel, 'sound/misc/desceration-03.ogg', 50, TRUE)
squirrel.apply_damage(20, BRUTE, "chest")
squirrel.apply_damage(20, BRUTE, BODY_ZONE_CHEST)
mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off
buckle_mob(squirrel, TRUE)
else
@@ -96,7 +96,7 @@
if(!do_after(user, 300, target = user))
user.visible_message("<span class='warning'>[user] slides back down [src]!</span>")
user.emote("scream")
user.apply_damage(10, BRUTE, "chest")
user.apply_damage(10, BRUTE, BODY_ZONE_CHEST)
playsound(user, 'sound/misc/desceration-03.ogg', 50, TRUE)
wiggle_wiggle = FALSE
return
+2 -2
View File
@@ -385,9 +385,9 @@
user.whisper(invocation, language = /datum/language/common)
if(health_cost)
if(user.active_hand_index == 1)
user.apply_damage(health_cost, BRUTE, "l_arm")
user.apply_damage(health_cost, BRUTE, BODY_ZONE_L_ARM)
else
user.apply_damage(health_cost, BRUTE, "r_arm")
user.apply_damage(health_cost, BRUTE, BODY_ZONE_R_ARM)
if(uses <= 0)
qdel(src)
else if(source)
+3 -3
View File
@@ -57,7 +57,7 @@
"<span class='cultlarge'>\"You shouldn't play with sharp things. You'll poke someone's eye out.\"</span>")
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.apply_damage(rand(force/2, force), BRUTE, pick("l_arm", "r_arm"))
H.apply_damage(rand(force/2, force), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
else
user.adjustBruteLoss(rand(force/2,force))
return
@@ -79,7 +79,7 @@
to_chat(user, "<span class='cultlarge'>\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"</span>")
to_chat(user, "<span class='userdanger'>A horrible force yanks at your arm!</span>")
user.emote("scream")
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
user.apply_damage(30, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
user.dropItemToGround(src)
/obj/item/twohanded/required/cult_bastard
@@ -147,7 +147,7 @@
to_chat(user, "<span class='cultlarge'>\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"</span>")
to_chat(user, "<span class='userdanger'>A horrible force yanks at your arm!</span>")
user.emote("scream")
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
user.apply_damage(30, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
user.dropItemToGround(src, TRUE)
user.Knockdown(50)
return
+1 -1
View File
@@ -114,7 +114,7 @@ This file contains the cult dagger and rune list code
user.visible_message("<span class='warning'>[user] [user.blood_volume ? "cuts open their arm and begins writing in their own blood":"begins sketching out a strange design"]!</span>", \
"<span class='cult'>You [user.blood_volume ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.</span>")
if(user.blood_volume)
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm"))
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
var/scribe_mod = initial(rune_to_scribe.scribe_delay)
if(istype(get_turf(user), /turf/open/floor/engine/cult))
scribe_mod *= 0.5
+1 -1
View File
@@ -637,7 +637,7 @@ structure_check() searches for nearby cultist structures required for the invoca
"<span class='cult italic'>You channel [carbon_user ? "your life ":""]energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.</span>")
if(carbon_user)
var/mob/living/carbon/C = user
C.apply_damage(2, BRUTE, pick("l_arm", "r_arm"))
C.apply_damage(2, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
/obj/effect/rune/wall/proc/spread_density()
for(var/R in GLOB.wall_runes)
@@ -325,6 +325,7 @@
var/text = "<br><span class='header'>The syndicate operatives were:</span>"
var/purchases = ""
var/TC_uses = 0
LAZYINITLIST(GLOB.uplink_purchase_logs_by_key)
for(var/I in members)
var/datum/mind/syndicate = I
var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[syndicate.key]
@@ -321,6 +321,7 @@
var/TC_uses = 0
var/uplink_true = FALSE
var/purchases = ""
LAZYINITLIST(GLOB.uplink_purchase_logs_by_key)
var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[owner.key]
if(H)
TC_uses = H.total_spent
@@ -263,7 +263,7 @@
target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
return
if(user.zone_selected == "chest")
if(user.zone_selected == BODY_ZONE_CHEST)
if(voodoo_link)
target = null
voodoo_link.forceMove(drop_location())
@@ -274,24 +274,24 @@
if(target && cooldown < world.time)
switch(user.zone_selected)
if("mouth")
if(BODY_ZONE_PRECISE_MOUTH)
var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text)
target.say(wgw)
log_game("[user][user.key] made [target][target.key] say [wgw] with a voodoo doll.")
if("eyes")
if(BODY_ZONE_PRECISE_EYES)
user.set_machine(src)
user.reset_perspective(target)
spawn(100)
user.reset_perspective(null)
user.unset_machine()
if("r_leg","l_leg")
if(BODY_ZONE_R_LEG,BODY_ZONE_L_LEG)
to_chat(user, "<span class='notice'>You move the doll's legs around.</span>")
var/turf/T = get_step(target,pick(GLOB.cardinals))
target.Move(T)
if("r_arm","l_arm")
if(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM)
target.click_random_mob()
GiveHint(target)
if("head")
if(BODY_ZONE_HEAD)
to_chat(user, "<span class='notice'>You smack the doll's head with your hand.</span>")
target.Dizzy(10)
to_chat(target, "<span class='warning'>You suddenly feel as if your head was hit with a hammer!</span>")
+141 -141
View File
@@ -1,142 +1,142 @@
/obj/item/device/assembly/mousetrap
name = "mousetrap"
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon_state = "mousetrap"
materials = list(MAT_METAL=100)
attachable = 1
var/armed = 0
/obj/item/device/assembly/mousetrap/examine(mob/user)
..()
if(armed)
to_chat(user, "The mousetrap is armed!")
else
to_chat(user, "The mousetrap is not armed.")
/obj/item/device/assembly/mousetrap/activate()
if(..())
armed = !armed
if(!armed)
if(ishuman(usr))
var/mob/living/carbon/human/user = usr
if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50))
to_chat(user, "<span class='warning'>Your hand slips, setting off the trigger!</span>")
pulse(0)
update_icon()
if(usr)
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
/obj/item/device/assembly/mousetrap/describe()
return "The pressure switch is [armed?"primed":"safe"]."
/obj/item/device/assembly/mousetrap/update_icon()
if(armed)
icon_state = "mousetraparmed"
else
icon_state = "mousetrap"
if(holder)
holder.update_icon()
/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet")
if(!armed)
return
var/obj/item/bodypart/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H.has_trait(TRAIT_PIERCEIMMUNE))
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
armed = 0
update_icon()
pulse(0)
return 0
switch(type)
if("feet")
if(!H.shoes)
affecting = H.get_bodypart(pick("l_leg", "r_leg"))
H.Knockdown(60)
if("l_hand", "r_hand")
if(!H.gloves)
affecting = H.get_bodypart(type)
H.Stun(60)
if(affecting)
if(affecting.receive_damage(1, 0))
H.update_damage_overlays()
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
visible_message("<span class='boldannounce'>SPLAT!</span>")
M.splat()
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
armed = 0
update_icon()
pulse(0)
/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user)
if(!armed)
to_chat(user, "<span class='notice'>You arm [src].</span>")
else
if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50))
var/which_hand = "l_hand"
if(!(user.active_hand_index % 2))
which_hand = "r_hand"
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking their fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
return
to_chat(user, "<span class='notice'>You disarm [src].</span>")
armed = !armed
update_icon()
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user)
if(armed)
if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50))
var/which_hand = "l_hand"
if(!(user.active_hand_index % 2))
which_hand = "r_hand"
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking their fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
return
..()
/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj)
if(armed)
if(ismob(AM))
var/mob/MM = AM
if(!(MM.movement_type & FLYING))
if(ishuman(AM))
var/mob/living/carbon/H = AM
if(H.m_intent == MOVE_INTENT_RUN)
triggered(H)
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
"<span class='warning'>You accidentally step on [src]</span>")
else if(ismouse(MM))
triggered(MM)
else if(AM.density) // For mousetrap grenades, set off by anything heavy
triggered(AM)
..()
/obj/item/device/assembly/mousetrap/on_found(mob/finder)
if(armed)
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking their fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand")
return 1 //end the search!
return 0
/obj/item/device/assembly/mousetrap/hitby(A as mob|obj)
if(!armed)
return ..()
visible_message("<span class='warning'>[src] is triggered by [A].</span>")
triggered(null)
/obj/item/device/assembly/mousetrap/armed
icon_state = "mousetraparmed"
/obj/item/device/assembly/mousetrap
name = "mousetrap"
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon_state = "mousetrap"
materials = list(MAT_METAL=100)
attachable = 1
var/armed = 0
/obj/item/device/assembly/mousetrap/examine(mob/user)
..()
if(armed)
to_chat(user, "The mousetrap is armed!")
else
to_chat(user, "The mousetrap is not armed.")
/obj/item/device/assembly/mousetrap/activate()
if(..())
armed = !armed
if(!armed)
if(ishuman(usr))
var/mob/living/carbon/human/user = usr
if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50))
to_chat(user, "<span class='warning'>Your hand slips, setting off the trigger!</span>")
pulse(0)
update_icon()
if(usr)
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
/obj/item/device/assembly/mousetrap/describe()
return "The pressure switch is [armed?"primed":"safe"]."
/obj/item/device/assembly/mousetrap/update_icon()
if(armed)
icon_state = "mousetraparmed"
else
icon_state = "mousetrap"
if(holder)
holder.update_icon()
/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet")
if(!armed)
return
var/obj/item/bodypart/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H.has_trait(TRAIT_PIERCEIMMUNE))
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
armed = 0
update_icon()
pulse(0)
return 0
switch(type)
if("feet")
if(!H.shoes)
affecting = H.get_bodypart(pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
H.Knockdown(60)
if(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND)
if(!H.gloves)
affecting = H.get_bodypart(type)
H.Stun(60)
if(affecting)
if(affecting.receive_damage(1, 0))
H.update_damage_overlays()
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
visible_message("<span class='boldannounce'>SPLAT!</span>")
M.splat()
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
armed = 0
update_icon()
pulse(0)
/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user)
if(!armed)
to_chat(user, "<span class='notice'>You arm [src].</span>")
else
if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50))
var/which_hand = BODY_ZONE_PRECISE_L_HAND
if(!(user.active_hand_index % 2))
which_hand = BODY_ZONE_PRECISE_R_HAND
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking their fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
return
to_chat(user, "<span class='notice'>You disarm [src].</span>")
armed = !armed
update_icon()
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user)
if(armed)
if((user.has_trait(TRAIT_DUMB) || user.has_trait(TRAIT_CLUMSY)) && prob(50))
var/which_hand = BODY_ZONE_PRECISE_L_HAND
if(!(user.active_hand_index % 2))
which_hand = BODY_ZONE_PRECISE_R_HAND
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking their fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
return
..()
/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj)
if(armed)
if(ismob(AM))
var/mob/MM = AM
if(!(MM.movement_type & FLYING))
if(ishuman(AM))
var/mob/living/carbon/H = AM
if(H.m_intent == MOVE_INTENT_RUN)
triggered(H)
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
"<span class='warning'>You accidentally step on [src]</span>")
else if(ismouse(MM))
triggered(MM)
else if(AM.density) // For mousetrap grenades, set off by anything heavy
triggered(AM)
..()
/obj/item/device/assembly/mousetrap/on_found(mob/finder)
if(armed)
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking their fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
triggered(finder, (finder.active_hand_index % 2 == 0) ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND)
return 1 //end the search!
return 0
/obj/item/device/assembly/mousetrap/hitby(A as mob|obj)
if(!armed)
return ..()
visible_message("<span class='warning'>[src] is triggered by [A].</span>")
triggered(null)
/obj/item/device/assembly/mousetrap/armed
icon_state = "mousetraparmed"
armed = 1
@@ -146,8 +146,6 @@
if(temperature_scale > 0)
var/o2 = cached_gases[/datum/gas/oxygen] ? cached_gases[/datum/gas/oxygen][MOLES] : 0
oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale
if (o2 > cached_gases[/datum/gas/plasma][MOLES]*PLASMA_OXYGEN_FULLBURN)
plasma_burn_rate = (cached_gases[/datum/gas/plasma][MOLES]*temperature_scale)/PLASMA_BURN_RATE_DELTA
if(o2 / cached_gases[/datum/gas/plasma][MOLES] > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium.
super_saturation = TRUE
if(o2 > cached_gases[/datum/gas/plasma][MOLES]*PLASMA_OXYGEN_FULLBURN)
@@ -87,4 +87,4 @@
if(pipe_air.temperature > heat_limit + 1)
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest")
buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BODY_ZONE_CHEST)
+2 -2
View File
@@ -1069,7 +1069,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
undershirt = random_undershirt(gender)
if("socks")
socks = random_socks()
if("eyes")
if(BODY_ZONE_PRECISE_EYES)
eye_color = random_eye_color()
if("s_tone")
skin_tone = random_skin_tone()
@@ -1211,7 +1211,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_socks)
socks = new_socks
if("eyes")
if(BODY_ZONE_PRECISE_EYES)
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null
if(new_eyes)
eye_color = sanitize_hexcolor(new_eyes)
+1 -1
View File
@@ -116,7 +116,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost, togglemidroundantag)()
return C.prefs.toggles & MIDROUND_ANTAG
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggletitlemusic)()
set name = "Hear/Silence LobbyMusic"
set name = "Hear/Silence Lobby Music"
set category = "Preferences"
set desc = "Hear Music In Lobby"
usr.client.prefs.toggles ^= SOUND_LOBBY
+1 -3
View File
@@ -21,9 +21,7 @@
if(damagetype & SHAME)
adjustStaminaLoss(200)
suiciding = FALSE
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(mood)
mood.add_event("shameful_suicide", /datum/mood_event/shameful_suicide)
SendSignal(COMSIG_ADD_MOOD_EVENT, "shameful_suicide", /datum/mood_event/shameful_suicide)
return
var/damage_mod = 0
for(var/T in list(BRUTELOSS, FIRELOSS, TOXLOSS, OXYLOSS))
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/clothing/head
name = "head"
name = BODY_ZONE_HEAD
icon = 'icons/obj/clothing/hats.dmi'
icon_state = "top_hat"
item_state = "that"
+1 -1
View File
@@ -79,7 +79,7 @@
if(M.stat == DEAD && heart && world.time - M.timeofdeath < DEFIB_TIME_LIMIT * 10)
heart_strength = "<span class='boldannounce'>a faint, fluttery</span>"
var/diagnosis = (body_part == "chest" ? "You hear [heart_strength] pulse and [lung_strength] respiration." : "You faintly hear [heart_strength] pulse.")
var/diagnosis = (body_part == BODY_ZONE_CHEST ? "You hear [heart_strength] pulse and [lung_strength] respiration." : "You faintly hear [heart_strength] pulse.")
user.visible_message("[user] places [src] against [M]'s [body_part] and listens attentively.", "<span class='notice'>You place [src] against [M]'s [body_part]. [diagnosis]</span>")
return
return ..(M,user)
+2 -2
View File
@@ -254,9 +254,9 @@
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
belt = /obj/item/storage/belt/soulstone/full
belt = /obj/item/storage/belt/soulstone/full/chappy
backpack_contents = list(/obj/item/storage/box/engineer=1,
/obj/item/storage/box/holy_grenades=1,
/obj/item/grenade/chem_grenade/holy=1,
/obj/item/nullrod=1,
/obj/item/clothing/mask/gas/sechailer=1,
/obj/item/gun/energy/e_gun=1,
+2 -2
View File
@@ -22,8 +22,8 @@
/obj/item/clothing/shoes/suicide_act(mob/living/carbon/user)
if(rand(2)>1)
user.visible_message("<span class='suicide'>[user] begins tying \the [src] up waaay too tightly! It looks like [user.p_theyre()] trying to commit suicide!</span>")
var/obj/item/bodypart/l_leg = user.get_bodypart("l_leg")
var/obj/item/bodypart/r_leg = user.get_bodypart("r_leg")
var/obj/item/bodypart/l_leg = user.get_bodypart(BODY_ZONE_L_LEG)
var/obj/item/bodypart/r_leg = user.get_bodypart(BODY_ZONE_R_LEG)
if(l_leg)
l_leg.dismember()
playsound(user,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
+2 -6
View File
@@ -82,16 +82,12 @@
/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot)
. = ..()
if(user.mind && user.mind.assigned_role == "Clown")
GET_COMPONENT_FROM(mood, /datum/component/mood, user)
if(mood)
mood.clear_event("noshoes")
user.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "noshoes")
/obj/item/clothing/shoes/clown_shoes/dropped(mob/user)
. = ..()
if(user.mind && user.mind.assigned_role == "Clown")
GET_COMPONENT_FROM(mood, /datum/component/mood, user)
if(mood)
mood.add_event("noshoes", /datum/mood_event/noshoes)
user.SendSignal(COMSIG_ADD_MOOD_EVENT, "noshoes", /datum/mood_event/noshoes)
/obj/item/clothing/shoes/clown_shoes/jester
name = "jester shoes"
+1 -1
View File
@@ -149,7 +149,7 @@
var/hit_reflect_chance = 40
/obj/item/clothing/suit/armor/laserproof/IsReflect(def_zone)
if(!(def_zone in list("chest", "groin"))) //If not shot where ablative is covering you, you don't get the reflection bonus!
if(!(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN))) //If not shot where ablative is covering you, you don't get the reflection bonus!
return 0
if (prob(hit_reflect_chance))
return 1
+1 -6
View File
@@ -870,12 +870,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
//Rare audio
if("creepy")
//These sounds are (mostly) taken from Hidden: Source
var/static/list/hallucinations_creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\
'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
target.playsound_local(null, pick(hallucinations_creepyasssounds), 50, 1)
target.playsound_local(null, pick(CREEPY_SOUNDS), 50, 1)
if("ratvar")
target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100)
sleep(150)
@@ -393,7 +393,7 @@
return BRUTELOSS
/obj/item/reagent_containers/food/drinks/soda_cans/attack(mob/M, mob/user)
if(M == user && !src.reagents.total_volume && user.a_intent == INTENT_HARM && user.zone_selected == "head")
if(M == user && !src.reagents.total_volume && user.a_intent == INTENT_HARM && user.zone_selected == BODY_ZONE_HEAD)
user.visible_message("<span class='warning'>[user] crushes the can of [src] on [user.p_their()] forehead!</span>", "<span class='notice'>You crush the can of [src] on your forehead.</span>")
playsound(user.loc,'sound/weapons/pierce.ogg', rand(10,50), 1)
var/obj/item/trash/can/crushed_can = new /obj/item/trash/can(user.loc)
@@ -67,7 +67,7 @@
armor_block = H.run_armor_check(affecting, "melee","","",armour_penetration) // For normal attack damage
//If they have a hat/helmet and the user is targeting their head.
if(istype(H.head, /obj/item/clothing/head) && affecting == "head")
if(istype(H.head, /obj/item/clothing/head) && affecting == BODY_ZONE_HEAD)
headarmor = H.head.armor.melee
else
headarmor = 0
@@ -78,7 +78,7 @@
else
//Only humans can have armor, right?
armor_block = target.run_armor_check(affecting, "melee")
if(affecting == "head")
if(affecting == BODY_ZONE_HEAD)
armor_duration = duration + force
//Apply the damage!
@@ -87,7 +87,7 @@
// You are going to knock someone out for longer if they are not wearing a helmet.
var/head_attack_message = ""
if(affecting == "head" && istype(target, /mob/living/carbon/))
if(affecting == BODY_ZONE_HEAD && istype(target, /mob/living/carbon/))
head_attack_message = " on the head"
//Knockdown the target for the duration that we calculated and divide it by 5.
if(armor_duration)
+3 -9
View File
@@ -23,21 +23,15 @@
if(foodtype & H.dna.species.toxic_food)
to_chat(H,"<span class='warning'>What the hell was that thing?!</span>")
H.adjust_disgust(25 + 30 * fraction)
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
if(mood)
mood.add_event("toxic_food", /datum/mood_event/disgusting_food)
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
else if(foodtype & H.dna.species.disliked_food)
to_chat(H,"<span class='notice'>That didn't taste very good...</span>")
H.adjust_disgust(11 + 15 * fraction)
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
if(mood)
mood.add_event("gross_food", /datum/mood_event/gross_food)
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
else if(foodtype & H.dna.species.liked_food)
to_chat(H,"<span class='notice'>I love this taste!</span>")
H.adjust_disgust(-5 + -2.5 * fraction)
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
if(mood)
mood.add_event("fav_food", /datum/mood_event/favorite_food)
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
else
if(foodtype & H.dna.species.toxic_food)
to_chat(H, "<span class='warning'>You don't feel so good...</span>")
@@ -56,9 +56,7 @@
if(!H.creamed) // one layer at a time
H.add_overlay(creamoverlay)
H.creamed = TRUE
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
if(mood)
mood.add_event("creampie", /datum/mood_event/creampie)
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "creampie", /datum/mood_event/creampie)
qdel(src)
/obj/item/reagent_containers/food/snacks/pie/cream/nostun
@@ -142,7 +142,7 @@ God bless America.
var/mob/living/carbon/C = user.pulling
user.visible_message("<span class = 'danger'>[user] dunks [C]'s face in [src]!</span>")
reagents.reaction(C, TOUCH)
C.apply_damage(min(30, reagents.total_volume), BURN, "head")
C.apply_damage(min(30, reagents.total_volume), BURN, BODY_ZONE_HEAD)
reagents.remove_any((reagents.total_volume/2))
C.Knockdown(60)
user.changeNext_move(CLICK_CD_MELEE)
+1 -1
View File
@@ -125,7 +125,7 @@
user.visible_message("<span class='suicide'>[user] is beheading [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
var/obj/item/bodypart/BP = C.get_bodypart("head")
var/obj/item/bodypart/BP = C.get_bodypart(BODY_ZONE_HEAD)
if(BP)
BP.drop_limb()
playsound(src,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
@@ -30,6 +30,34 @@
hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD, DIAG_CIRCUIT_HUD) //diagnostic hud overlays
max_integrity = 50
armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
anchored = FALSE
var/can_anchor = TRUE
var/detail_color = COLOR_ASSEMBLY_BLACK
var/list/color_whitelist = list( //This is just for checking that hacked colors aren't in the save data.
COLOR_ASSEMBLY_BLACK,
COLOR_FLOORTILE_GRAY,
COLOR_ASSEMBLY_BGRAY,
COLOR_ASSEMBLY_WHITE,
COLOR_ASSEMBLY_RED,
COLOR_ASSEMBLY_ORANGE,
COLOR_ASSEMBLY_BEIGE,
COLOR_ASSEMBLY_BROWN,
COLOR_ASSEMBLY_GOLD,
COLOR_ASSEMBLY_YELLOW,
COLOR_ASSEMBLY_GURKHA,
COLOR_ASSEMBLY_LGREEN,
COLOR_ASSEMBLY_GREEN,
COLOR_ASSEMBLY_LBLUE,
COLOR_ASSEMBLY_BLUE,
COLOR_ASSEMBLY_PURPLE
)
/obj/item/device/electronic_assembly/examine(mob/user)
. = ..()
if(can_anchor)
to_chat(user, "<span class='notice'>The anchoring bolts [anchored ? "are" : "can be"] <b>wrenched</b> in place and the maintainence panel [opened ? "can be" : "is"] <b>screwed</b> in place.</span>")
else
to_chat(user, "<span class='notice'>The maintainence panel [opened ? "can be" : "is"] <b>screwed</b> in place.</span>")
/obj/item/device/electronic_assembly/proc/check_interactivity(mob/user)
return user.canUseTopic(src, BE_CLOSE)
@@ -233,6 +261,12 @@
icon_state = initial(icon_state) + "-open"
else
icon_state = initial(icon_state)
cut_overlays()
if(detail_color == COLOR_ASSEMBLY_BLACK) //Black colored overlay looks almost but not exactly like the base sprite, so just cut the overlay and avoid it looking kinda off.
return
var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/assemblies/electronic_setups.dmi', "[icon_state]-color")
detail_overlay.color = detail_color
add_overlay(detail_overlay)
/obj/item/device/electronic_assembly/examine(mob/user)
..()
@@ -357,24 +391,38 @@
return TRUE
/obj/item/device/electronic_assembly/attackby(obj/item/I, mob/living/user)
if(can_anchor && default_unfasten_wrench(user, I, 20))
return
if(istype(I, /obj/item/integrated_circuit))
if(!user.canUnEquip(I))
return FALSE
if(try_add_component(I, user))
interact(user)
return TRUE
else
for(var/obj/item/integrated_circuit/input/S in assembly_components)
S.attackby_react(I,user,user.a_intent)
return ..()
else if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger))
if(opened)
interact(user)
return TRUE
else
to_chat(user, "<span class='warning'>[src]'s hatch is closed, so you can't fiddle with the internal components.</span>")
for(var/obj/item/integrated_circuit/input/S in assembly_components)
S.attackby_react(I,user,user.a_intent)
return ..()
else if(istype(I, /obj/item/stock_parts/cell))
if(!opened)
to_chat(user, "<span class='warning'>[src]'s hatch is closed, so you can't put anything inside.</span>")
return FALSE
to_chat(user, "<span class='warning'>[src]'s hatch is closed, so you can't access \the [src]'s power supplier.</span>")
for(var/obj/item/integrated_circuit/input/S in assembly_components)
S.attackby_react(I,user,user.a_intent)
return ..()
if(battery)
to_chat(user, "<span class='warning'>[src] already has \a [battery] installed. Remove it first if you want to replace it.</span>")
return FALSE
for(var/obj/item/integrated_circuit/input/S in assembly_components)
S.attackby_react(I,user,user.a_intent)
return ..()
var/obj/item/stock_parts/cell = I
user.transferItemToLoc(I, loc)
cell.forceMove(src)
@@ -384,6 +432,10 @@
to_chat(user, "<span class='notice'>You slot \the [cell] inside \the [src]'s power supplier.</span>")
interact(user)
return TRUE
else if(istype(I, /obj/item/device/integrated_electronics/detailer))
var/obj/item/device/integrated_electronics/detailer/D = I
detail_color = D.detail_color
update_icon()
else
for(var/obj/item/integrated_circuit/input/S in assembly_components)
S.attackby_react(I,user,user.a_intent)
@@ -471,6 +523,17 @@
return acting_object.drop_location()
/obj/item/device/electronic_assembly/attack_tk(mob/user)
if(anchored)
return
..()
/obj/item/device/electronic_assembly/attack_hand(mob/user)
if(anchored)
attack_self(user)
return
..()
/obj/item/device/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves.
name = "type-a electronic assembly"
@@ -489,6 +552,16 @@
icon_state = "setup_small_simple"
desc = "It's a case, for building small electronics with. This one has a simple design."
/obj/item/device/electronic_assembly/hook
name = "type-e electronic assembly"
icon_state = "setup_small_hook"
desc = "It's a case, for building small electronics with. This one looks like it has a belt clip, but it's purely decorative."
/obj/item/device/electronic_assembly/pda
name = "type-f electronic assembly"
icon_state = "setup_small_pda"
desc = "It's a case, for building small electronics with. This one resembles a PDA."
/obj/item/device/electronic_assembly/medium
name = "electronic mechanism"
icon_state = "setup_medium"
@@ -515,6 +588,16 @@
icon_state = "setup_medium_med"
desc = "It's a case, for building medium-sized electronics with. This one resembles some type of medical apparatus."
/obj/item/device/electronic_assembly/medium/gun
name = "type-e electronic mechanism"
icon_state = "setup_medium_gun"
desc = "It's a case, for building medium-sized electronics with. This one resembles a gun, or some type of tool, if you're feeling optimistic."
/obj/item/device/electronic_assembly/medium/radio
name = "type-f electronic mechanism"
icon_state = "setup_medium_radio"
desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio."
/obj/item/device/electronic_assembly/large
name = "electronic machine"
icon_state = "setup_large"
@@ -522,23 +605,6 @@
w_class = WEIGHT_CLASS_BULKY
max_components = IC_MAX_SIZE_BASE * 4
max_complexity = IC_COMPLEXITY_BASE * 4
anchored = FALSE
/obj/item/device/electronic_assembly/large/attackby(obj/item/O, mob/user)
if(default_unfasten_wrench(user, O, 20))
return
..()
/obj/item/device/electronic_assembly/large/attack_tk(mob/user)
if(anchored)
return
..()
/obj/item/device/electronic_assembly/large/attack_hand(mob/user)
if(anchored)
attack_self(user)
return
..()
/obj/item/device/electronic_assembly/large/default
name = "type-a electronic machine"
@@ -558,6 +624,16 @@
icon_state = "setup_large_arm"
desc = "It's a case, for building large electronics with. This one resembles a robotic arm."
/obj/item/device/electronic_assembly/large/tall
name = "type-e electronic machine"
icon_state = "setup_large_tall"
desc = "It's a case, for building large electronics with. This one has a tall design."
/obj/item/device/electronic_assembly/large/industrial
name = "type-f electronic machine"
icon_state = "setup_large_industrial"
desc = "It's a case, for building large electronics with. This one resembles some kind of industrial machinery."
/obj/item/device/electronic_assembly/drone
name = "electronic drone"
icon_state = "setup_drone"
@@ -566,6 +642,7 @@
max_components = IC_MAX_SIZE_BASE * 3
max_complexity = IC_COMPLEXITY_BASE * 3
allowed_circuit_action_flags = IC_ACTION_MOVEMENT | IC_ACTION_COMBAT | IC_ACTION_LONG_RANGE
can_anchor = FALSE
/obj/item/device/electronic_assembly/drone/can_move()
return TRUE
@@ -577,3 +654,75 @@
name = "type-b electronic drone"
icon_state = "setup_drone_arms"
desc = "It's a case, for building mobile electronics with. This one is armed and dangerous."
/obj/item/device/electronic_assembly/drone/secbot
name = "type-c electronic drone"
icon_state = "setup_drone_secbot"
desc = "It's a case, for building mobile electronics with. This one resembles a Securitron."
/obj/item/device/electronic_assembly/drone/medbot
name = "type-d electronic drone"
icon_state = "setup_drone_medbot"
desc = "It's a case, for building mobile electronics with. This one resembles a Medibot."
/obj/item/device/electronic_assembly/drone/genbot
name = "type-e electronic drone"
icon_state = "setup_drone_genbot"
desc = "It's a case, for building mobile electronics with. This one has a generic bot design."
/obj/item/device/electronic_assembly/drone/android
name = "type-f electronic drone"
icon_state = "setup_drone_android"
desc = "It's a case, for building mobile electronics with. This one has a hominoid design."
/obj/item/device/electronic_assembly/wallmount
name = "wall-mounted electronic assembly"
icon_state = "setup_wallmount_medium"
desc = "It's a case, for building medium-sized electronics with. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on."
w_class = WEIGHT_CLASS_NORMAL
max_components = IC_MAX_SIZE_BASE * 2
max_complexity = IC_COMPLEXITY_BASE * 2
/obj/item/device/electronic_assembly/wallmount/heavy
name = "heavy wall-mounted electronic assembly"
icon_state = "setup_wallmount_large"
desc = "It's a case, for building large electronics with. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on."
w_class = WEIGHT_CLASS_BULKY
max_components = IC_MAX_SIZE_BASE * 4
max_complexity = IC_COMPLEXITY_BASE * 4
/obj/item/device/electronic_assembly/wallmount/light
name = "light wall-mounted electronic assembly"
icon_state = "setup_wallmount_small"
desc = "It's a case, for building small electronics with. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on."
w_class = WEIGHT_CLASS_SMALL
max_components = IC_MAX_SIZE_BASE
max_complexity = IC_COMPLEXITY_BASE
/obj/item/device/electronic_assembly/wallmount/proc/mount_assembly(turf/on_wall, mob/user) //Yeah, this is admittedly just an abridged and kitbashed version of the wallframe attach procs.
if(get_dist(on_wall,user)>1)
return
var/ndir = get_dir(on_wall, user)
if(!(ndir in GLOB.cardinals))
return
var/turf/T = get_turf(user)
if(!isfloorturf(T))
to_chat(user, "<span class='warning'>You cannot place [src] on this spot!</span>")
return
if(gotwallitem(T, ndir))
to_chat(user, "<span class='warning'>There's already an item on this wall!</span>")
return
playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
user.visible_message("[user.name] attaches [src] to the wall.",
"<span class='notice'>You attach [src] to the wall.</span>",
"<span class='italics'>You hear clicking.</span>")
user.dropItemToGround(src)
switch(ndir)
if(NORTH)
pixel_y = -31
if(SOUTH)
pixel_y = 31
if(EAST)
pixel_x = -31
if(WEST)
pixel_x = 31
@@ -0,0 +1,47 @@
/obj/item/device/integrated_electronics/detailer
name = "assembly detailer"
desc = "A combination autopainter and flash anodizer designed to give electronic assemblies a colorful, wear-resistant finish."
icon = 'icons/obj/assemblies/electronic_tools.dmi'
icon_state = "detailer"
flags_1 = CONDUCT_1 | NOBLUDGEON_1
w_class = WEIGHT_CLASS_SMALL
var/data_to_write = null
var/accepting_refs = FALSE
var/detail_color = COLOR_ASSEMBLY_WHITE
var/list/color_list = list(
"black" = COLOR_ASSEMBLY_BLACK,
"gray" = COLOR_FLOORTILE_GRAY,
"machine gray" = COLOR_ASSEMBLY_BGRAY,
"white" = COLOR_ASSEMBLY_WHITE,
"red" = COLOR_ASSEMBLY_RED,
"orange" = COLOR_ASSEMBLY_ORANGE,
"beige" = COLOR_ASSEMBLY_BEIGE,
"brown" = COLOR_ASSEMBLY_BROWN,
"gold" = COLOR_ASSEMBLY_GOLD,
"yellow" = COLOR_ASSEMBLY_YELLOW,
"gurkha" = COLOR_ASSEMBLY_GURKHA,
"light green" = COLOR_ASSEMBLY_LGREEN,
"green" = COLOR_ASSEMBLY_GREEN,
"light blue" = COLOR_ASSEMBLY_LBLUE,
"blue" = COLOR_ASSEMBLY_BLUE,
"purple" = COLOR_ASSEMBLY_PURPLE
)
/obj/item/device/integrated_electronics/detailer/Initialize()
.=..()
update_icon()
/obj/item/device/integrated_electronics/detailer/update_icon()
cut_overlays()
var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/assemblies/electronic_tools.dmi', "detailer-color")
detail_overlay.color = detail_color
add_overlay(detail_overlay)
/obj/item/device/integrated_electronics/detailer/attack_self(mob/user)
var/color_choice = input(user, "Select color.", "Assembly Detailer") as null|anything in color_list
if(!color_list[color_choice])
return
if(!in_range(src, user))
return
detail_color = color_list[color_choice]
update_icon()
@@ -3,6 +3,7 @@
// Saves type, modified name and modified inputs (if any) to a list
// The list is converted to JSON down the line.
//"Special" is not verified at any point except for by the circuit itself.
/obj/item/integrated_circuit/proc/save()
var/list/component_params = list()
var/init_name = initial(name)
@@ -38,8 +39,14 @@
if(saved_inputs.len)
component_params["inputs"] = saved_inputs
var/special = save_special()
if(special)
component_params["special"] = special
return component_params
/obj/item/integrated_circuit/proc/save_special()
return
// Verifies a list of component parameters
// Returns null on success, error name on failure
@@ -100,7 +107,11 @@
pin.write_data_to_pin(input_value)
// TODO: support for special input types, such as internal refs and maybe typepaths
if(component_params["special"])
load_special(component_params["special"])
/obj/item/integrated_circuit/proc/load_special(special_data)
return
// Saves type and modified name (if any) to a list
// The list is converted to JSON down the line.
@@ -118,16 +129,21 @@
if(opened)
assembly_params["opened"] = TRUE
// Save modified color
if(initial(detail_color) != detail_color)
assembly_params["detail_color"] = detail_color
return assembly_params
// Verifies a list of assembly parameters
// Returns null on success, error name on failure
/obj/item/device/electronic_assembly/proc/verify_save(list/assembly_params)
// Validate name
// Validate name and color
if(assembly_params["name"] && !reject_bad_name(assembly_params["name"], TRUE))
return "Bad assembly name."
if(assembly_params["detail_color"] && !(assembly_params["detail_color"] in color_whitelist))
return "Bad assembly color."
// Loads assembly parameters from a list
// Doesn't verify any of the parameters it loads, this is the job of verify_save()
@@ -139,7 +155,11 @@
// Load panel status
if(assembly_params["opened"])
opened = TRUE
update_icon()
if(assembly_params["detail_color"])
detail_color = assembly_params["detail_color"]
update_icon()
@@ -84,6 +84,16 @@
var/datum/integrated_io/O = outputs[1]
O.push_data()
/obj/item/integrated_circuit/memory/constant/save_special()
var/datum/integrated_io/O = outputs[1]
if(istext(O.data) || isnum(O.data))
return O.data
/obj/item/integrated_circuit/memory/constant/load_special(special_data)
var/datum/integrated_io/O = outputs[1]
if(istext(special_data) || isnum(special_data))
O.data = special_data
/obj/item/integrated_circuit/memory/constant/attack_self(mob/user)
var/datum/integrated_io/O = outputs[1]
if(!user.IsAdvancedToolUser())
@@ -345,10 +345,14 @@
/obj/item/integrated_circuit/output/diagnostic_hud
name = "AR interface"
desc = "Takes an icon name as an input, and will update the status hud when data is written to it."
extended_desc = "Takes an icon name as an input, and will update the status hud when data is written to it, this means it can change the icon and have the icon stay that way even if the circuit is removed. The acceptable inputs are 'alert' and 'move'. Any input other than that will return the icon to its default state. The danger warning and offline status will appear over any input from this circuit."
extended_desc = "Takes an icon name as an input, and will update the status hud when data is written to it, this means it can change the icon and have the icon stay that way even if the circuit is removed. The acceptable inputs are 'alert', 'move', 'working', 'patrol', 'called', and 'heart'. Any input other than that will return the icon to its default state."
var/list/icons = list(
"alert" = "hudalert",
"move" = "hudmove"
"move" = "hudmove",
"working" = "hudworkingleft",
"patrol" = "hudpatrolleft",
"called" = "hudcalledleft",
"heart" = "hudsentientleft"
)
complexity = 1
icon_state = "led"
+1
View File
@@ -13,6 +13,7 @@ Assistant
access = list() //See /datum/job/assistant/get_access()
minimal_access = list() //See /datum/job/assistant/get_access()
outfit = /datum/outfit/job/assistant
antag_rep = 10
/datum/job/assistant/get_access()
+2 -2
View File
@@ -69,8 +69,8 @@ Head of Personnel
minimal_player_age = 10
exp_requirements = 180
exp_type = EXP_TYPE_CREW
// exp_type_department = EXP_TYPE_SUPPLY - CITADEL CHANGE
antag_rep = 16
//exp_type_department = EXP_TYPE_SUPPLY - CITADEL CHANGE
antag_rep = 20
outfit = /datum/outfit/job/hop
+15 -15
View File
@@ -11,7 +11,7 @@ Quartermaster
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#d7b088"
antag_rep = 12
antag_rep = 17
outfit = /datum/outfit/job/quartermaster
@@ -42,7 +42,7 @@ Cargo Technician
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dcba97"
antag_rep = 4
antag_rep = 14
outfit = /datum/outfit/job/cargo_tech
@@ -71,7 +71,7 @@ Shaft Miner
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dcba97"
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/miner
@@ -150,12 +150,12 @@ Bartender
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
antag_rep = 4
antag_rep = 14
outfit = /datum/outfit/job/bartender
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS)
minimal_access = list(ACCESS_BAR)
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/bartender
@@ -184,12 +184,12 @@ Cook
supervisors = "the head of personnel"
selection_color = "#bbe291"
var/cooks = 0 //Counts cooks amount
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/cook
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE)
minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE)
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/cook
name = "Cook"
@@ -237,12 +237,12 @@ Botanist
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#bbe291"
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/botanist
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE)
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE)
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
// Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS
// Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT
// Given Morgue access because they have a viable means of cloning.
@@ -277,12 +277,12 @@ Janitor
supervisors = "the head of personnel"
selection_color = "#bbe291"
var/global/janitors = 0
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/janitor
access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS)
minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS)
access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/janitor
name = "Janitor"
+4 -4
View File
@@ -11,7 +11,7 @@ Clown
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
antag_rep = 4
antag_rep = 14
outfit = /datum/outfit/job/clown
@@ -73,7 +73,7 @@ Mime
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
antag_rep = 4
antag_rep = 14
outfit = /datum/outfit/job/mime
@@ -124,7 +124,7 @@ Curator
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
antag_rep = 4
antag_rep = 14
outfit = /datum/outfit/job/curator
@@ -170,7 +170,7 @@ Lawyer
supervisors = "the head of personnel"
selection_color = "#dddddd"
var/lawyers = 0 //Counts lawyer amount
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/lawyer
@@ -12,7 +12,7 @@ Chaplain
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
antag_rep = 4
antag_rep = 14
outfit = /datum/outfit/job/chaplain
+7 -7
View File
@@ -17,7 +17,7 @@ Chief Engineer
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_ENGINEERING
antag_rep = 16
antag_rep = 20
outfit = /datum/outfit/job/ce
@@ -77,14 +77,14 @@ Station Engineer
selection_color = "#fff5cc"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/engineer
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT)
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT)
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/engineer
name = "Station Engineer"
@@ -134,13 +134,13 @@ Atmospheric Technician
selection_color = "#fff5cc"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/atmos
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS)
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION)
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/atmos
name = "Atmospheric Technician"
+7 -7
View File
@@ -17,7 +17,7 @@ Chief Medical Officer
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_MEDICAL
antag_rep = 16
antag_rep = 20
outfit = /datum/outfit/job/cmo
@@ -60,12 +60,12 @@ Medical Doctor
spawn_positions = 3
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/doctor
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING)
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/doctor
name = "Medical Doctor"
@@ -98,7 +98,7 @@ Chemist
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/chemist
@@ -134,12 +134,12 @@ Geneticist
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/geneticist
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE)
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH)
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/geneticist
name = "Geneticist"
@@ -171,7 +171,7 @@ Virologist
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/virologist
+3 -3
View File
@@ -17,7 +17,7 @@ Research Director
exp_type_department = EXP_TYPE_SCIENCE
exp_requirements = 180
exp_type = EXP_TYPE_CREW
antag_rep = 16
antag_rep = 20
outfit = /datum/outfit/job/rd
@@ -73,7 +73,7 @@ Scientist
selection_color = "#ffeeff"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/scientist
@@ -108,7 +108,7 @@ Roboticist
selection_color = "#ffeeff"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
antag_rep = 8
antag_rep = 17
outfit = /datum/outfit/job/roboticist
+11 -11
View File
@@ -30,11 +30,11 @@ Head of Security
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS)
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS)
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/hos
name = "Head of Security"
@@ -77,12 +77,12 @@ Warden
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
antag_rep = 16
antag_rep = 20
outfit = /datum/outfit/job/warden
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS) //SEE /DATUM/JOB/WARDEN/GET_ACCESS()
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //SEE /DATUM/JOB/WARDEN/GET_ACCESS()
/datum/job/warden/get_access()
var/list/L = list()
@@ -130,12 +130,12 @@ Detective
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
antag_rep = 12
antag_rep = 20
outfit = /datum/outfit/job/detective
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS)
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS)
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/detective
name = "Detective"
@@ -181,12 +181,12 @@ Security Officer
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
antag_rep = 12
antag_rep = 20
outfit = /datum/outfit/job/security
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS()
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS()
/datum/job/officer/get_access()
+1 -1
View File
@@ -14,7 +14,7 @@ AI
minimal_player_age = 30
exp_requirements = 180
exp_type = EXP_TYPE_CREW
antag_rep = 12
antag_rep = 20
/datum/job/ai/equip(mob/living/carbon/human/H)
return H.AIize(FALSE)
+1 -3
View File
@@ -206,9 +206,7 @@
if(dat)
user << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
GET_COMPONENT_FROM(mood, /datum/component/mood, user)
if(mood)
mood.add_event("book_nerd", /datum/mood_event/book_nerd)
user.SendSignal(COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd)
onclose(user, "book")
else
to_chat(user, "<span class='notice'>This book is completely blank!</span>")
+1
View File
@@ -244,6 +244,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
/obj/docking_port/mobile/auxillary_base
name = "auxillary base"
id = "colony_drop"
timid = FALSE
//Reminder to map-makers to set these values equal to the size of your base.
dheight = 4
dwidth = 4
+3 -3
View File
@@ -5,7 +5,7 @@
throw_speed = 3
throw_range = 5
layer = ABOVE_MOB_LAYER
zone = "head"
zone = BODY_ZONE_HEAD
slot = ORGAN_SLOT_BRAIN
vital = TRUE
attack_verb = list("attacked", "slapped", "whacked")
@@ -112,7 +112,7 @@
add_fingerprint(user)
if(user.zone_selected != "head")
if(user.zone_selected != BODY_ZONE_HEAD)
return ..()
if((C.head && (C.head.flags_cover & HEADCOVERSEYES)) || (C.wear_mask && (C.wear_mask.flags_cover & MASKCOVERSEYES)) || (C.glasses && (C.glasses.flags_1 & GLASSESCOVERSEYES)))
@@ -122,7 +122,7 @@
//since these people will be dead M != usr
if(!C.getorgan(/obj/item/organ/brain))
if(!C.get_bodypart("head") || !user.temporarilyRemoveItemFromInventory(src))
if(!C.get_bodypart(BODY_ZONE_HEAD) || !user.temporarilyRemoveItemFromInventory(src))
return
var/msg = "[C] has [src] inserted into [C.p_their()] head by [user]."
if(C == user)
@@ -30,7 +30,7 @@
name = "plasma vessel"
icon_state = "plasma"
w_class = WEIGHT_CLASS_NORMAL
zone = "chest"
zone = BODY_ZONE_CHEST
slot = "plasmavessel"
alien_powers = list(/obj/effect/proc_holder/alien/plant, /obj/effect/proc_holder/alien/transfer)
@@ -104,7 +104,7 @@
/obj/item/organ/alien/hivenode
name = "hive node"
icon_state = "hivenode"
zone = "head"
zone = BODY_ZONE_HEAD
slot = "hivenode"
w_class = WEIGHT_CLASS_TINY
var/recent_queen_death = 0 //Indicates if the queen died recently, aliens are heavily weakened while this is active.
@@ -156,7 +156,7 @@
/obj/item/organ/alien/resinspinner
name = "resin spinner"
icon_state = "stomach-x"
zone = "mouth"
zone = BODY_ZONE_PRECISE_MOUTH
slot = "resinspinner"
alien_powers = list(/obj/effect/proc_holder/alien/resin)
@@ -164,7 +164,7 @@
/obj/item/organ/alien/acid
name = "acid gland"
icon_state = "acid"
zone = "mouth"
zone = BODY_ZONE_PRECISE_MOUTH
slot = "acidgland"
alien_powers = list(/obj/effect/proc_holder/alien/acid)
@@ -172,7 +172,7 @@
/obj/item/organ/alien/neurotoxin
name = "neurotoxin gland"
icon_state = "neurotox"
zone = "mouth"
zone = BODY_ZONE_PRECISE_MOUTH
slot = "neurotoxingland"
alien_powers = list(/obj/effect/proc_holder/alien/neurotoxin)
@@ -180,7 +180,7 @@
/obj/item/organ/alien/eggsac
name = "egg sac"
icon_state = "eggsac"
zone = "groin"
zone = BODY_ZONE_PRECISE_GROIN
slot = "eggsac"
w_class = WEIGHT_CLASS_BULKY
alien_powers = list(/obj/effect/proc_holder/alien/lay_egg)
@@ -56,7 +56,7 @@
if(stage == 5 && prob(50))
for(var/datum/surgery/S in owner.surgeries)
if(S.location == "chest" && istype(S.get_surgery_step(), /datum/surgery_step/manipulate_organs))
if(S.location == BODY_ZONE_CHEST && istype(S.get_surgery_step(), /datum/surgery_step/manipulate_organs))
AttemptGrow(0)
return
AttemptGrow()
@@ -131,7 +131,7 @@
return FALSE
var/mob/living/carbon/target = M
// gotta have a head to be implanted (no changelings or sentient plants)
if(!target.get_bodypart("head"))
if(!target.get_bodypart(BODY_ZONE_HEAD))
return FALSE
if(target.getorgan(/obj/item/organ/alien/hivenode) || target.getorgan(/obj/item/organ/body_egg/alien_embryo))
@@ -208,7 +208,7 @@
Die()
icon_state = "[initial(icon_state)]_impregnated"
var/obj/item/bodypart/chest/LC = target.get_bodypart("chest")
var/obj/item/bodypart/chest/LC = target.get_bodypart(BODY_ZONE_CHEST)
if((!LC || LC.status != BODYPART_ROBOTIC) && !target.getorgan(/obj/item/organ/body_egg/alien_embryo))
new /obj/item/organ/body_egg/alien_embryo(target)
+3 -6
View File
@@ -29,7 +29,7 @@
var/obj/item/I = user.get_active_held_item()
if(I && I.force)
var/d = rand(round(I.force / 4), I.force)
var/obj/item/bodypart/BP = get_bodypart("chest")
var/obj/item/bodypart/BP = get_bodypart(BODY_ZONE_CHEST)
if(BP.receive_damage(d, 0))
update_damage_overlays()
visible_message("<span class='danger'>[user] attacks [src]'s stomach wall with the [I.name]!</span>", \
@@ -755,17 +755,14 @@
//called when we get cuffed/uncuffed
/mob/living/carbon/proc/update_handcuffed()
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(handcuffed)
drop_all_held_items()
stop_pulling()
throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed)
if(mood)
mood.add_event("handcuffed", /datum/mood_event/handcuffed)
SendSignal(COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed)
else
clear_alert("handcuffed")
if(mood)
mood.clear_event("handcuffed")
SendSignal(COMSIG_CLEAR_MOOD_EVENT, "handcuffed")
update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed.
update_inv_handcuffed()
update_hud_handcuffed()
@@ -97,7 +97,7 @@
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
user.add_mob_blood(src)
if(affecting.body_zone == "head")
if(affecting.body_zone == BODY_ZONE_HEAD)
if(wear_mask)
wear_mask.add_mob_blood(src)
update_inv_wear_mask()
@@ -195,7 +195,7 @@
var/list/things_to_ruin = shuffle(bodyparts.Copy())
for(var/B in things_to_ruin)
var/obj/item/bodypart/bodypart = B
if(bodypart.body_zone == "head" || bodypart.body_zone == "chest")
if(bodypart.body_zone == BODY_ZONE_HEAD || bodypart.body_zone == BODY_ZONE_CHEST)
continue
if(!affecting || ((affecting.get_damage() / affecting.max_damage) < (bodypart.get_damage() / bodypart.max_damage)))
affecting = bodypart
@@ -277,9 +277,7 @@
else
M.visible_message("<span class='notice'>[M] hugs [src] to make [p_them()] feel better!</span>", \
"<span class='notice'>You hug [src] to make [p_them()] feel better!</span>")
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(mood)
mood.add_event("hug", /datum/mood_event/hug)
SendSignal(COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug)
AdjustStun(-60)
AdjustKnockdown(-60)
AdjustUnconscious(-60)
@@ -371,7 +369,7 @@
if(damage_type != BRUTE && damage_type != BURN)
return
damage_amount *= 0.5 //0.5 multiplier for balance reason, we don't want clothes to be too easily destroyed
if(!def_zone || def_zone == "head")
if(!def_zone || def_zone == BODY_ZONE_HEAD)
var/obj/item/clothing/hit_clothes
if(wear_mask)
hit_clothes = wear_mask
+1 -1
View File
@@ -35,7 +35,7 @@
qdel(O) //so the brain isn't transfered to the head when the head drops.
continue
var/org_zone = check_zone(O.zone) //both groin and chest organs.
if(org_zone == "chest")
if(org_zone == BODY_ZONE_CHEST)
O.Remove(src)
O.forceMove(Tsec)
O.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
+2 -2
View File
@@ -28,12 +28,12 @@
appears_dead = 1
if(getorgan(/obj/item/organ/brain))
msg += "<span class='deadsay'>[t_He] [t_is] limp and unresponsive, with no signs of life.</span>\n"
else if(get_bodypart("head"))
else if(get_bodypart(BODY_ZONE_HEAD))
msg += "<span class='deadsay'>It appears that [t_his] brain is missing...</span>\n"
var/list/missing = get_missing_limbs()
for(var/t in missing)
if(t=="head")
if(t==BODY_ZONE_HEAD)
msg += "<span class='deadsay'><B>[t_His] [parse_zone(t)] is missing!</B></span>\n"
continue
msg += "<span class='warning'><B>[t_His] [parse_zone(t)] is missing!</B></span>\n"
@@ -131,14 +131,14 @@
msg += " and [t_his] soul has departed"
msg += "...</span>\n"
if(get_bodypart("head") && !getorgan(/obj/item/organ/brain))
if(get_bodypart(BODY_ZONE_HEAD) && !getorgan(/obj/item/organ/brain))
msg += "<span class='deadsay'>It appears that [t_his] brain is missing...</span>\n"
var/temp = getBruteLoss() //no need to calculate each of these twice
msg += "<span class='warning'>"
var/list/missing = list("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg")
var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
missing -= BP.body_zone
@@ -149,12 +149,12 @@
var/l_limbs_missing = 0
var/r_limbs_missing = 0
for(var/t in missing)
if(t=="head")
if(t==BODY_ZONE_HEAD)
msg += "<span class='deadsay'><B>[t_His] [parse_zone(t)] is missing!</B><span class='warning'>\n"
continue
if(t == "l_arm" || t == "l_leg")
if(t == BODY_ZONE_L_ARM || t == BODY_ZONE_L_LEG)
l_limbs_missing++
else if(t == "r_arm" || t == "r_leg")
else if(t == BODY_ZONE_R_ARM || t == BODY_ZONE_R_LEG)
r_limbs_missing++
msg += "<B>[capitalize(t_his)] [parse_zone(t)] is missing!</B>\n"
@@ -32,6 +32,7 @@
/mob/living/carbon/human/ComponentInitialize()
. = ..()
if(!CONFIG_GET(flag/disable_human_mood))
AddComponent(/datum/component/mood)
@@ -229,9 +230,7 @@
usr.visible_message("[usr] successfully rips [I] out of their [L.name]!","<span class='notice'>You successfully remove [I] from your [L.name].</span>")
if(!has_embedded_objects())
clear_alert("embeddedobject")
GET_COMPONENT_FROM(mood, /datum/component/mood, usr)
if(mood)
mood.clear_event("embeddedobject")
usr.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "embedded")
return
if(href_list["item"])
@@ -660,9 +659,7 @@
return
src.visible_message("[src] performs CPR on [C.name]!", "<span class='notice'>You perform CPR on [C.name].</span>")
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(mood)
mood.add_event("perform_cpr", /datum/mood_event/perform_cpr)
SendSignal(COMSIG_ADD_MOOD_EVENT, "perform_cpr", /datum/mood_event/perform_cpr)
C.cpr_time = world.time
add_logs(src, C, "CPRed")
@@ -144,9 +144,7 @@
I.forceMove(src)
L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier)
visible_message("<span class='danger'>[I] embeds itself in [src]'s [L.name]!</span>","<span class='userdanger'>[I] embeds itself in your [L.name]!</span>")
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(mood)
mood.add_event("embedded", /datum/mood_event/embedded)
SendSignal(COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
hitpush = FALSE
skipcatch = TRUE //can't catch the now embedded item
@@ -203,10 +201,10 @@
dna.species.spec_attack_hand(H, src)
/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M)
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
if(M.a_intent == INTENT_HELP)
..() //shaking
return 0
@@ -253,7 +251,7 @@
return 0
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor_block = run_armor_check(affecting, "melee","","",10)
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
@@ -288,7 +286,7 @@
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
@@ -299,12 +297,12 @@
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
if(check_shields(M, damage, "the [M.name]", MELEE_ATTACK, M.armour_penetration))
return FALSE
var/dam_zone = dismembering_strike(M, pick("chest", "l_hand", "r_hand", "l_leg", "r_leg"))
var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
if(!dam_zone) //Dismemberment successful
return TRUE
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration)
apply_damage(damage, M.melee_damage_type, affecting, armor)
@@ -318,13 +316,13 @@
if(check_shields(M, damage, "the [M.name]"))
return 0
var/dam_zone = dismembering_strike(M, pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg"))
var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
if(!dam_zone) //Dismemberment successful
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
@@ -334,7 +332,7 @@
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
var/obj/item/bodypart/temp = get_bodypart(pick("chest", "chest", "chest", "head"))
var/obj/item/bodypart/temp = get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_HEAD))
if(temp)
var/update = 0
var/dmg = rand(M.force/2, M.force)
@@ -416,7 +414,7 @@
var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3.
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
if(prob(50/severity) && !prob(getarmor(BP, "bomb")) && BP.body_zone != "head" && BP.body_zone != "chest")
if(prob(50/severity) && !prob(getarmor(BP, "bomb")) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST)
BP.brute_dam = BP.max_damage
BP.dismember()
max_limb_loss--
@@ -428,7 +426,7 @@
if(stat == DEAD)
return
show_message("<span class='userdanger'>The blob attacks you!</span>")
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
@@ -489,7 +487,7 @@
var/list/inventory_items_to_kill = list()
var/acidity = acidpwr * min(acid_volume*0.005, 0.1)
//HEAD//
if(!bodyzone_hit || bodyzone_hit == "head") //only if we didn't specify a zone or if that zone is the head.
if(!bodyzone_hit || bodyzone_hit == BODY_ZONE_HEAD) //only if we didn't specify a zone or if that zone is the head.
var/obj/item/clothing/head_clothes = null
if(glasses)
head_clothes = glasses
@@ -509,14 +507,14 @@
else
to_chat(src, "<span class='notice'>Your [head_clothes.name] protects your head and face from the acid!</span>")
else
. = get_bodypart("head")
. = get_bodypart(BODY_ZONE_HEAD)
if(.)
damaged += .
if(ears)
inventory_items_to_kill += ears
//CHEST//
if(!bodyzone_hit || bodyzone_hit == "chest")
if(!bodyzone_hit || bodyzone_hit == BODY_ZONE_CHEST)
var/obj/item/clothing/chest_clothes = null
if(w_uniform)
chest_clothes = w_uniform
@@ -530,7 +528,7 @@
else
to_chat(src, "<span class='notice'>Your [chest_clothes.name] protects your body from the acid!</span>")
else
. = get_bodypart("chest")
. = get_bodypart(BODY_ZONE_CHEST)
if(.)
damaged += .
if(wear_id)
@@ -544,7 +542,7 @@
//ARMS & HANDS//
if(!bodyzone_hit || bodyzone_hit == "l_arm" || bodyzone_hit == "r_arm")
if(!bodyzone_hit || bodyzone_hit == BODY_ZONE_L_ARM || bodyzone_hit == BODY_ZONE_R_ARM)
var/obj/item/clothing/arm_clothes = null
if(gloves)
arm_clothes = gloves
@@ -562,16 +560,16 @@
else
to_chat(src, "<span class='notice'>Your [arm_clothes.name] protects your arms and hands from the acid!</span>")
else
. = get_bodypart("r_arm")
. = get_bodypart(BODY_ZONE_R_ARM)
if(.)
damaged += .
. = get_bodypart("l_arm")
. = get_bodypart(BODY_ZONE_L_ARM)
if(.)
damaged += .
//LEGS & FEET//
if(!bodyzone_hit || bodyzone_hit == "l_leg" || bodyzone_hit == "r_leg" || bodyzone_hit == "feet")
if(!bodyzone_hit || bodyzone_hit == BODY_ZONE_L_LEG || bodyzone_hit == BODY_ZONE_R_LEG || bodyzone_hit == "feet")
var/obj/item/clothing/leg_clothes = null
if(shoes)
leg_clothes = shoes
@@ -588,10 +586,10 @@
else
to_chat(src, "<span class='notice'>Your [leg_clothes.name] protects your legs and feet from the acid!</span>")
else
. = get_bodypart("r_leg")
. = get_bodypart(BODY_ZONE_R_LEG)
if(.)
damaged += .
. = get_bodypart("l_leg")
. = get_bodypart(BODY_ZONE_L_LEG)
if(.)
damaged += .
@@ -600,7 +598,7 @@
for(var/obj/item/bodypart/affecting in damaged)
affecting.receive_damage(acidity, 2*acidity)
if(affecting.name == "head")
if(affecting.name == BODY_ZONE_HEAD)
if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement
affecting.receive_damage(acidity, 2*acidity)
emote("scream")
@@ -645,7 +643,7 @@
visible_message("[src] examines [p_them()]self.", \
"<span class='notice'>You check yourself for injuries.</span>")
var/list/missing = list("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg")
var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
for(var/X in bodyparts)
var/obj/item/bodypart/LB = X
missing -= LB.body_zone
@@ -732,7 +730,7 @@
var/list/torn_items = list()
//HEAD//
if(!def_zone || def_zone == "head")
if(!def_zone || def_zone == BODY_ZONE_HEAD)
var/obj/item/clothing/head_clothes = null
if(glasses)
head_clothes = glasses
@@ -748,7 +746,7 @@
torn_items += ears
//CHEST//
if(!def_zone || def_zone == "chest")
if(!def_zone || def_zone == BODY_ZONE_CHEST)
var/obj/item/clothing/chest_clothes = null
if(w_uniform)
chest_clothes = w_uniform
@@ -758,7 +756,7 @@
torn_items += chest_clothes
//ARMS & HANDS//
if(!def_zone || def_zone == "l_arm" || def_zone == "r_arm")
if(!def_zone || def_zone == BODY_ZONE_L_ARM || def_zone == BODY_ZONE_R_ARM)
var/obj/item/clothing/arm_clothes = null
if(gloves)
arm_clothes = gloves
@@ -770,7 +768,7 @@
torn_items += arm_clothes
//LEGS & FEET//
if(!def_zone || def_zone == "l_leg" || def_zone == "r_leg")
if(!def_zone || def_zone == BODY_ZONE_L_LEG || def_zone == BODY_ZONE_R_LEG)
var/obj/item/clothing/leg_clothes = null
if(shoes)
leg_clothes = shoes
@@ -55,7 +55,7 @@
return if_no_face
if( head && (head.flags_inv&HIDEFACE) )
return if_no_face //Likewise for hats
var/obj/item/bodypart/O = get_bodypart("head")
var/obj/item/bodypart/O = get_bodypart(BODY_ZONE_HEAD)
if( !O || (has_trait(TRAIT_DISFIGURED)) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name ) //disfigured. use id-name if possible
return if_no_face
return real_name
+5 -10
View File
@@ -85,18 +85,15 @@
to_chat(src, "<span class='notice'>You don't feel like harming anybody.</span>")
a_intent_change(INTENT_HELP)
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if (getBrainLoss() >= 60 && stat == CONSCIOUS)
if(mood)
mood.add_event("brain_damage", /datum/mood_event/brain_damage)
if (getBrainLoss() >= 60 && !incapacitated(TRUE))
SendSignal(COMSIG_ADD_MOOD_EVENT, "brain_damage", /datum/mood_event/brain_damage)
if(prob(3))
if(prob(25))
emote("drool")
else
say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"))
else
if(mood)
mood.clear_event("brain_damage")
SendSignal(COMSIG_CLEAR_MOOD_EVENT, "brain_damage")
/mob/living/carbon/human/handle_mutations_and_radiation()
if(!dna || !dna.species.handle_mutations_and_radiation(src))
@@ -343,9 +340,7 @@
visible_message("<span class='danger'>[I] falls out of [name]'s [BP.name]!</span>","<span class='userdanger'>[I] falls out of your [BP.name]!</span>")
if(!has_embedded_objects())
clear_alert("embeddedobject")
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(mood)
mood.clear_event("embedded")
SendSignal(COMSIG_CLEAR_MOOD_EVENT, "embedded")
/mob/living/carbon/human/proc/handle_active_genes()
for(var/datum/mutation/human/HM in dna.mutations)
@@ -474,4 +469,4 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
#undef THERMAL_PROTECTION_ARM_LEFT
#undef THERMAL_PROTECTION_ARM_RIGHT
#undef THERMAL_PROTECTION_HAND_LEFT
#undef THERMAL_PROTECTION_HAND_RIGHT
#undef THERMAL_PROTECTION_HAND_RIGHT
+33 -50
View File
@@ -221,7 +221,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
tail = new mutanttail()
tail.Insert(C)
if(C.get_bodypart("head"))
if(C.get_bodypart(BODY_ZONE_HEAD))
if(eyes && (replace_current || !should_have_eyes))
eyes.Remove(C,1)
QDEL_NULL(eyes)
@@ -315,7 +315,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour)
H.remove_overlay(HAIR_LAYER)
var/obj/item/bodypart/head/HD = H.get_bodypart("head")
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
if(!HD) //Decapitated
return
@@ -458,7 +458,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/list/standing = list()
var/obj/item/bodypart/head/HD = H.get_bodypart("head")
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
if(HD && !(H.has_trait(TRAIT_HUSK)))
// lipstick
@@ -526,7 +526,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!mutant_bodyparts)
return
var/obj/item/bodypart/head/HD = H.get_bodypart("head")
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
if("tail_lizard" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || (!H.dna.features["taur"] == "None"))
@@ -897,7 +897,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return 0
if( !(I.slot_flags & SLOT_MASK) )
return 0
if(!H.get_bodypart("head"))
if(!H.get_bodypart(BODY_ZONE_HEAD))
return 0
return equip_delay_self_check(I, H, bypass_equip_delay_self)
if(slot_neck)
@@ -942,7 +942,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.belt)
return 0
var/obj/item/bodypart/O = H.get_bodypart("chest")
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
if(!disable_warning)
@@ -956,7 +956,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return 0
if( !(I.slot_flags & SLOT_EYES) )
return 0
if(!H.get_bodypart("head"))
if(!H.get_bodypart(BODY_ZONE_HEAD))
return 0
return equip_delay_self_check(I, H, bypass_equip_delay_self)
if(slot_head)
@@ -964,7 +964,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return 0
if( !(I.slot_flags & SLOT_HEAD) )
return 0
if(!H.get_bodypart("head"))
if(!H.get_bodypart(BODY_ZONE_HEAD))
return 0
return equip_delay_self_check(I, H, bypass_equip_delay_self)
if(slot_ears)
@@ -972,7 +972,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return 0
if( !(I.slot_flags & SLOT_EARS) )
return 0
if(!H.get_bodypart("head"))
if(!H.get_bodypart(BODY_ZONE_HEAD))
return 0
return equip_delay_self_check(I, H, bypass_equip_delay_self)
if(slot_w_uniform)
@@ -985,7 +985,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.wear_id)
return 0
var/obj/item/bodypart/O = H.get_bodypart("chest")
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
if(!disable_warning)
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>")
@@ -999,7 +999,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.l_store)
return 0
var/obj/item/bodypart/O = H.get_bodypart("l_leg")
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_L_LEG)
if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
if(!disable_warning)
@@ -1015,7 +1015,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.r_store)
return 0
var/obj/item/bodypart/O = H.get_bodypart("r_leg")
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_R_LEG)
if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
if(!disable_warning)
@@ -1124,14 +1124,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
// THEY HUNGER
var/hunger_rate = HUNGER_FACTOR
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
if(mood)
switch(mood.mood) //Alerts do_after delay based on how happy you are
if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3)
hunger_rate *= 0.9
if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4)
hunger_rate *= 0.8
if(MOOD_LEVEL_HAPPY4 to INFINITY)
hunger_rate *= 0.7
if(mood && mood.sanity > SANITY_DISTURBED)
hunger_rate *= min(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75
if(H.satiety > 0)
H.satiety--
@@ -1166,31 +1160,24 @@ GLOBAL_LIST_EMPTY(roundstart_races)
to_chat(H, "<span class='notice'>You no longer feel vigorous.</span>")
H.metabolism_efficiency = 1
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
switch(H.nutrition)
if(NUTRITION_LEVEL_FULL to INFINITY)
if(mood)
mood.add_event("nutrition", /datum/mood_event/nutrition/fat)
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/fat)
H.throw_alert("nutrition", /obj/screen/alert/fat)
if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL)
if(mood)
mood.add_event("nutrition", /datum/mood_event/nutrition/wellfed)
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/wellfed)
H.clear_alert("nutrition")
if( NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED)
if(mood)
mood.add_event("nutrition", /datum/mood_event/nutrition/fed)
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/fed)
H.clear_alert("nutrition")
if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED)
if(mood)
mood.clear_event("nutrition")
H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "nutrition")
H.clear_alert("nutrition")
if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
if(mood)
mood.add_event("nutrition", /datum/mood_event/nutrition/hungry)
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/hungry)
H.throw_alert("nutrition", /obj/screen/alert/hungry)
if(0 to NUTRITION_LEVEL_STARVING)
if(mood)
mood.add_event("nutrition", /datum/mood_event/nutrition/starving)
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "nutrition", /datum/mood_event/nutrition/starving)
H.throw_alert("nutrition", /obj/screen/alert/starving)
/datum/species/proc/update_health_hud(mob/living/carbon/human/H)
@@ -1300,12 +1287,12 @@ GLOBAL_LIST_EMPTY(roundstart_races)
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
if(mood && !flight) //How can depression slow you down if you can just fly away from your problems?
switch(mood.mood)
if(-INFINITY to MOOD_LEVEL_SAD4)
switch(mood.sanity)
if(SANITY_INSANE to SANITY_CRAZY)
. += 1.5
if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3)
if(SANITY_CRAZY to SANITY_UNSTABLE)
. += 1
if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2)
if(SANITY_UNSTABLE to SANITY_DISTURBED)
. += 0.5
if(H.has_trait(TRAIT_FAT))
@@ -1584,7 +1571,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
user.add_mob_blood(H)
switch(hit_area)
if("head")
if(BODY_ZONE_HEAD)
if(H.stat == CONSCIOUS && armor_block < 50)
if(prob(I.force))
H.visible_message("<span class='danger'>[H] has been knocked senseless!</span>", \
@@ -1614,7 +1601,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.glasses.add_mob_blood(H)
H.update_inv_glasses()
if("chest")
if(BODY_ZONE_CHEST)
if(H.stat == CONSCIOUS && armor_block < 50)
if(prob(I.force))
H.visible_message("<span class='danger'>[H] has been knocked down!</span>", \
@@ -1728,13 +1715,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX))
// +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt.
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTHEAT))
//Body temperature is too hot.
var/burn_damage
if(mood)
mood.clear_event("cold")
mood.add_event("hot", /datum/mood_event/hot)
H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "cold")
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot)
switch(H.bodytemperature)
if(BODYTEMP_HEAT_DAMAGE_LIMIT to 400)
H.throw_alert("temp", /obj/screen/alert/hot, 1)
@@ -1754,9 +1739,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.apply_damage(burn_damage, BURN)
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !(GLOB.mutations_list[COLDRES] in H.dna.mutations))
if(mood)
mood.clear_event("hot")
mood.add_event("cold", /datum/mood_event/cold)
H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "hot")
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold)
switch(H.bodytemperature)
if(200 to BODYTEMP_COLD_DAMAGE_LIMIT)
H.throw_alert("temp", /obj/screen/alert/cold, 1)
@@ -1770,9 +1754,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
H.clear_alert("temp")
if(mood)
mood.clear_event("cold")
mood.clear_event("hot")
H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "cold")
H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "hot")
var/pressure = environment.return_pressure()
var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
@@ -1866,7 +1849,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.adjust_bodytemperature(11)
else
H.adjust_bodytemperature(BODYTEMP_HEATING_MAX + (H.fire_stacks * 12))
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
/datum/species/proc/CanIgniteMob(mob/living/carbon/human/H)
if(H.has_trait(TRAIT_NOFIRE))
@@ -26,7 +26,7 @@
/datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
. = ..()
H.flags_1 &= ~HEAR_1
var/obj/item/bodypart/head/head = H.get_bodypart("head")
var/obj/item/bodypart/head/head = H.get_bodypart(BODY_ZONE_HEAD)
if(head)
head.drop_limb()
head.flags_1 = HEAR_1
@@ -42,14 +42,14 @@
myhead = null
DR.owner = null
qdel(DR)
H.regenerate_limb("head",FALSE)
H.regenerate_limb(BODY_ZONE_HEAD,FALSE)
..()
/datum/species/dullahan/spec_life(mob/living/carbon/human/H)
if(QDELETED(myhead))
myhead = null
H.gib()
var/obj/item/bodypart/head/head2 = H.get_bodypart("head")
var/obj/item/bodypart/head/head2 = H.get_bodypart(BODY_ZONE_HEAD)
if(head2)
myhead = null
H.gib()
@@ -59,13 +59,13 @@
regenerate_limbs.UpdateButtonIcon()
/datum/species/jelly/proc/Cannibalize_Body(mob/living/carbon/human/H)
var/list/limbs_to_consume = list("r_arm", "l_arm", "r_leg", "l_leg") - H.get_missing_limbs()
var/list/limbs_to_consume = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - H.get_missing_limbs()
var/obj/item/bodypart/consumed_limb
if(!limbs_to_consume.len)
H.losebreath++
return
if(H.get_num_legs()) //Legs go before arms
limbs_to_consume -= list("r_arm", "l_arm")
limbs_to_consume -= list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM)
consumed_limb = H.get_bodypart(pick(limbs_to_consume))
consumed_limb.drop_limb()
to_chat(H, "<span class='userdanger'>Your [consumed_limb] is drawn back into your body, unable to maintain its shape!</span>")
@@ -208,7 +208,7 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_inv_glasses()
remove_overlay(GLASSES_LAYER)
if(!get_bodypart("head")) //decapitated
if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated
return
if(client && hud_used)
@@ -235,7 +235,7 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_inv_ears()
remove_overlay(EARS_LAYER)
if(!get_bodypart("head")) //decapitated
if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated
return
if(client && hud_used)
+2 -5
View File
@@ -144,7 +144,6 @@
//OXYGEN
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(O2_partialpressure < safe_oxy_min) //Not enough oxygen
if(prob(20))
emote("gasp")
@@ -157,8 +156,7 @@
adjustOxyLoss(3)
failed_last_breath = 1
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
if(mood)
mood.add_event("suffocation", /datum/mood_event/suffocation)
SendSignal(COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation)
else //Enough oxygen
failed_last_breath = 0
@@ -166,8 +164,7 @@
adjustOxyLoss(-5)
oxygen_used = breath_gases[/datum/gas/oxygen][MOLES]
clear_alert("not_enough_oxy")
if(mood)
mood.clear_event("suffocation")
SendSignal(COMSIG_CLEAR_MOOD_EVENT, "suffocation")
breath_gases[/datum/gas/oxygen][MOLES] -= oxygen_used
breath_gases[/datum/gas/carbon_dioxide][MOLES] += oxygen_used
@@ -162,4 +162,4 @@
I.take_damage(fire_stacks, BURN, "fire", 0)
adjust_bodytemperature(BODYTEMP_HEATING_MAX)
SendSignal(COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
@@ -7,10 +7,10 @@
/mob/living/carbon/monkey/attack_paw(mob/living/M)
if(..()) //successful monkey bite.
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
if(M.limb_destroyer)
dismembering_strike(M, affecting.body_zone)
if(stat != DEAD)
@@ -24,7 +24,7 @@
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
apply_damage(damage, BRUTE, affecting)
/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M)
@@ -52,7 +52,7 @@
"<span class='userdanger'>[M] has knocked out [name]!</span>", null, 5)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
apply_damage(damage, BRUTE, affecting)
add_logs(M, src, "attacked")
@@ -92,7 +92,7 @@
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
add_logs(M, src, "attacked")
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful
return 1
apply_damage(damage, BRUTE, affecting)
@@ -123,12 +123,12 @@
. = ..()
if(.)
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
var/dam_zone = dismembering_strike(M, pick("chest", "l_hand", "r_hand", "l_leg", "r_leg"))
var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
if(!dam_zone) //Dismemberment successful
return TRUE
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
apply_damage(damage, M.melee_damage_type, affecting)
/mob/living/carbon/monkey/attack_slime(mob/living/simple_animal/slime/M)
@@ -136,17 +136,17 @@
var/damage = rand(5, 35)
if(M.is_adult)
damage = rand(20, 40)
var/dam_zone = dismembering_strike(M, pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg"))
var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
if(!dam_zone) //Dismemberment successful
return 1
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart("chest")
affecting = get_bodypart(BODY_ZONE_CHEST)
apply_damage(damage, BRUTE, affecting)
/mob/living/carbon/monkey/acid_act(acidpwr, acid_volume, bodyzone_hit)
. = 1
if(!bodyzone_hit || bodyzone_hit == "head")
if(!bodyzone_hit || bodyzone_hit == BODY_ZONE_HEAD)
if(wear_mask)
if(!(wear_mask.resistance_flags & UNACIDABLE))
wear_mask.acid_act(acidpwr, acid_volume)
@@ -192,7 +192,7 @@
var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3.
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
if(prob(50/severity) && BP.body_zone != "chest")
if(prob(50/severity) && BP.body_zone != BODY_ZONE_CHEST)
BP.brute_dam = BP.max_damage
BP.dismember()
max_limb_loss--
@@ -15,7 +15,7 @@
/mob/living/carbon/monkey/update_hair()
remove_overlay(HAIR_LAYER)
var/obj/item/bodypart/head/HD = get_bodypart("head")
var/obj/item/bodypart/head/HD = get_bodypart(BODY_ZONE_HEAD)
if(!HD) //Decapitated
return
@@ -42,17 +42,14 @@
/mob/living/carbon/adjust_drugginess(amount)
druggy = max(druggy+amount, 0)
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(druggy)
overlay_fullscreen("high", /obj/screen/fullscreen/high)
throw_alert("high", /obj/screen/alert/high)
if(mood)
mood.add_event("high", /datum/mood_event/drugs/high)
SendSignal(COMSIG_ADD_MOOD_EVENT, "high", /datum/mood_event/drugs/high)
else
clear_fullscreen("high")
clear_alert("high")
if(mood)
mood.clear_event("high")
SendSignal(COMSIG_CLEAR_MOOD_EVENT, "high")
/mob/living/carbon/set_drugginess(amount)
druggy = max(amount, 0)
@@ -115,7 +115,7 @@
/mob/living/carbon/update_inv_wear_mask()
remove_overlay(FACEMASK_LAYER)
if(!get_bodypart("head")) //Decapitated
if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated
return
if(client && hud_used && hud_used.inv_slots[slot_wear_mask])
@@ -159,7 +159,7 @@
/mob/living/carbon/update_inv_head()
remove_overlay(HEAD_LAYER)
if(!get_bodypart("head")) //Decapitated
if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated
return
if(client && hud_used && hud_used.inv_slots[slot_back])
+3 -8
View File
@@ -446,8 +446,8 @@
/mob/living/proc/get_organ_target()
var/mob/shooter = src
var/t = shooter.zone_selected
if ((t in list( "eyes", "mouth" )))
t = "head"
if ((t in list( BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH )))
t = BODY_ZONE_HEAD
var/def_zone = ran_zone(t)
return def_zone
@@ -984,9 +984,6 @@
"<span class='userdanger'>You're set on fire!</span>")
new/obj/effect/dummy/fire(src)
throw_alert("fire", /obj/screen/alert/fire)
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(mood)
mood.add_event("on_fire", /datum/mood_event/on_fire)
update_fire()
return TRUE
return FALSE
@@ -998,9 +995,7 @@
for(var/obj/effect/dummy/fire/F in src)
qdel(F)
clear_alert("fire")
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
if(mood)
mood.clear_event("on_fire")
SendSignal(COMSIG_CLEAR_MOOD_EVENT, "on_fire")
update_fire()
/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person
+1 -1
View File
@@ -64,7 +64,7 @@
/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE)
if(istype(AM, /obj/item))
var/obj/item/I = AM
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
var/zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest
var/dtype = BRUTE
var/volume = I.get_volume_by_throwforce_and_or_w_class()
dtype = I.damtype
+10 -5
View File
@@ -67,11 +67,16 @@
if(incapacitated())
return
var/dat = "Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.<BR> \
<UL><LI>You can also click on the word to preview it.</LI>\
<LI>You can only say 30 words for every announcement.</LI>\
<LI>Do not use punctuation as you would normally, if you want a pause you can use the full stop and comma characters by separating them with spaces, like so: 'Alpha . Test , Bravo'.</LI></UL>\
<font class='bad'>WARNING:</font><BR>Misuse of the announcement system will get you job banned.<HR>"
var/dat = {"
<font class='bad'>WARNING:</font> Misuse of the announcement system will get you job banned.<BR><BR>
Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.<BR>
<UL><LI>You can also click on the word to PREVIEW it.</LI>
<LI>You can only say 30 words for every announcement.</LI>
<LI>Do not use punctuation as you would normally, if you want a pause you can use the full stop and comma characters by separating them with spaces, like so: 'Alpha . Test , Bravo'.</LI>
<LI>Numbers are in word format, e.g. eight, sixty, etc </LI>
<LI>Sound effects begin with an 's' before the actual word, e.g. scensor</LI>
<LI>Use Ctrl+F to see if a word exists in the list.</LI></UL><HR>
"}
var/index = 0
for(var/word in GLOB.vox_sounds)
File diff suppressed because it is too large Load Diff
@@ -641,12 +641,12 @@
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/damage = rand(5,15)
H.apply_damage(2*damage, BRUTE, "head", run_armor_check("head", "melee"))
H.apply_damage(2*damage, BRUTE, "chest", run_armor_check("chest", "melee"))
H.apply_damage(0.5*damage, BRUTE, "l_leg", run_armor_check("l_leg", "melee"))
H.apply_damage(0.5*damage, BRUTE, "r_leg", run_armor_check("r_leg", "melee"))
H.apply_damage(0.5*damage, BRUTE, "l_arm", run_armor_check("l_arm", "melee"))
H.apply_damage(0.5*damage, BRUTE, "r_arm", run_armor_check("r_arm", "melee"))
H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, "melee"))
H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, "melee"))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, "melee"))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, "melee"))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, "melee"))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, "melee"))
var/turf/T = get_turf(src)
T.add_mob_blood(H)
@@ -85,7 +85,7 @@
var/armorval = 0
if(def_zone)
if(def_zone == "head")
if(def_zone == BODY_ZONE_HEAD)
if(inventory_head)
armorval = inventory_head.armor.getRating(type)
else
@@ -139,7 +139,7 @@
return
var/remove_from = href_list["remove_inv"]
switch(remove_from)
if("head")
if(BODY_ZONE_HEAD)
if(inventory_head)
inventory_head.forceMove(drop_location())
inventory_head = null
@@ -168,7 +168,7 @@
var/add_to = href_list["add_inv"]
switch(add_to)
if("head")
if(BODY_ZONE_HEAD)
place_on_head(usr.get_active_held_item(),usr)
if("back")
@@ -231,9 +231,7 @@
return
if(!item_to_add)
user.visible_message("[user] pets [src].","<span class='notice'>You rest your hand on [src]'s head for a moment.</span>")
GET_COMPONENT_FROM(mood, /datum/component/mood, user)
if(mood)
mood.add_event("pet_corgi", /datum/mood_event/pet_corgi)
user.SendSignal(COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi)
return
if(user && !user.temporarilyRemoveItemFromInventory(item_to_add))
@@ -616,9 +614,7 @@
if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454
new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "yaps happily!")
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood)
mood.add_event("pet_corgi", /datum/mood_event/pet_corgi)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi)
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
emote("me", 1, "growls!")
@@ -252,7 +252,7 @@ Difficulty: Hard
if(!faction_check_mob(L))
to_chat(L, "<span class='userdanger'>[src] rends you!</span>")
playsound(T, attack_sound, 100, 1, -1)
var/limb_to_hit = L.get_bodypart(pick("head", "chest", "r_arm", "l_arm", "r_leg", "l_leg"))
var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
L.apply_damage(25, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration))
sleep(3)
@@ -628,7 +628,7 @@ Difficulty: Hard
flash_color(L.client, "#660099", 1)
playsound(L,'sound/weapons/sear.ogg', 50, 1, -4)
to_chat(L, "<span class='userdanger'>You're struck by a [name]!</span>")
var/limb_to_hit = L.get_bodypart(pick("head", "chest", "r_arm", "l_arm", "r_leg", "l_leg"))
var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
var/armor = L.run_armor_check(limb_to_hit, "melee", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 50, "Your armor was penetrated by [src]!")
L.apply_damage(damage, BURN, limb_to_hit, armor)
if(ishostile(L))
@@ -65,7 +65,7 @@
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick.
var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down
var/parrot_dam_zone = list("chest", "head", "l_arm", "l_leg", "r_arm", "r_leg") //For humans, select a bodypart to attack
var/parrot_dam_zone = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG) //For humans, select a bodypart to attack
var/parrot_speed = 5 //"Delay in world ticks between movement." according to byond. Yeah, that's BS but it does directly affect movement. Higher number = slower.
var/parrot_lastmove = null //Updates/Stores position of the parrot while it's moving
+22 -22
View File
@@ -16,22 +16,22 @@
/proc/check_zone(zone)
if(!zone)
return "chest"
return BODY_ZONE_CHEST
switch(zone)
if("eyes")
zone = "head"
if("mouth")
zone = "head"
if("l_hand")
zone = "l_arm"
if("r_hand")
zone = "r_arm"
if("l_foot")
zone = "l_leg"
if("r_foot")
zone = "r_leg"
if("groin")
zone = "chest"
if(BODY_ZONE_PRECISE_EYES)
zone = BODY_ZONE_HEAD
if(BODY_ZONE_PRECISE_MOUTH)
zone = BODY_ZONE_HEAD
if(BODY_ZONE_PRECISE_L_HAND)
zone = BODY_ZONE_L_ARM
if(BODY_ZONE_PRECISE_R_HAND)
zone = BODY_ZONE_R_ARM
if(BODY_ZONE_PRECISE_L_FOOT)
zone = BODY_ZONE_L_LEG
if(BODY_ZONE_PRECISE_R_FOOT)
zone = BODY_ZONE_R_LEG
if(BODY_ZONE_PRECISE_GROIN)
zone = BODY_ZONE_CHEST
return zone
@@ -45,22 +45,22 @@
var/t = rand(1, 18) // randomly pick a different zone, or maybe the same one
switch(t)
if(1)
return "head"
return BODY_ZONE_HEAD
if(2)
return "chest"
return BODY_ZONE_CHEST
if(3 to 6)
return "l_arm"
return BODY_ZONE_L_ARM
if(7 to 10)
return "r_arm"
return BODY_ZONE_R_ARM
if(11 to 14)
return "l_leg"
return BODY_ZONE_L_LEG
if(15 to 18)
return "r_leg"
return BODY_ZONE_R_LEG
return zone
/proc/above_neck(zone)
var/list/zones = list("head", "mouth", "eyes")
var/list/zones = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_PRECISE_EYES)
if(zones.Find(zone))
return 1
else
+11 -11
View File
@@ -282,12 +282,12 @@
var/next_in_line
switch(mob.zone_selected)
if("head")
next_in_line = "eyes"
if("eyes")
next_in_line = "mouth"
if(BODY_ZONE_HEAD)
next_in_line = BODY_ZONE_PRECISE_EYES
if(BODY_ZONE_PRECISE_EYES)
next_in_line = BODY_ZONE_PRECISE_MOUTH
else
next_in_line = "head"
next_in_line = BODY_ZONE_HEAD
var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
selector.set_selected_zone(next_in_line, mob)
@@ -300,7 +300,7 @@
return
var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
selector.set_selected_zone("r_arm", mob)
selector.set_selected_zone(BODY_ZONE_R_ARM, mob)
/client/verb/body_chest()
set name = "body-chest"
@@ -310,7 +310,7 @@
return
var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
selector.set_selected_zone("chest", mob)
selector.set_selected_zone(BODY_ZONE_CHEST, mob)
/client/verb/body_l_arm()
set name = "body-l-arm"
@@ -320,7 +320,7 @@
return
var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
selector.set_selected_zone("l_arm", mob)
selector.set_selected_zone(BODY_ZONE_L_ARM, mob)
/client/verb/body_r_leg()
set name = "body-r-leg"
@@ -330,7 +330,7 @@
return
var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
selector.set_selected_zone("r_leg", mob)
selector.set_selected_zone(BODY_ZONE_R_LEG, mob)
/client/verb/body_groin()
set name = "body-groin"
@@ -340,7 +340,7 @@
return
var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
selector.set_selected_zone("groin", mob)
selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob)
/client/verb/body_l_leg()
set name = "body-l-leg"
@@ -350,7 +350,7 @@
return
var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
selector.set_selected_zone("l_leg", mob)
selector.set_selected_zone(BODY_ZONE_L_LEG, mob)
/client/verb/toggle_walk_run()
set name = "toggle-walk-run"
+4 -4
View File
@@ -17,7 +17,7 @@
var/obj/item/cavity_object
var/obj/item/bodypart/chest/CH = get_bodypart("chest")
var/obj/item/bodypart/chest/CH = get_bodypart(BODY_ZONE_CHEST)
if(CH.cavity_item)
cavity_object = CH.cavity_item
CH.cavity_item = null
@@ -107,7 +107,7 @@
var/obj/item/organ/I = X
I.Insert(O, 1)
var/obj/item/bodypart/chest/torso = O.get_bodypart("chest")
var/obj/item/bodypart/chest/torso = O.get_bodypart(BODY_ZONE_CHEST)
if(cavity_object)
torso.cavity_item = cavity_object //cavity item is given to the new chest
cavity_object.forceMove(O)
@@ -167,7 +167,7 @@
var/obj/item/cavity_object
var/obj/item/bodypart/chest/CH = get_bodypart("chest")
var/obj/item/bodypart/chest/CH = get_bodypart(BODY_ZONE_CHEST)
if(CH.cavity_item)
cavity_object = CH.cavity_item
CH.cavity_item = null
@@ -266,7 +266,7 @@
I.Insert(O, 1)
var/obj/item/bodypart/chest/torso = get_bodypart("chest")
var/obj/item/bodypart/chest/torso = get_bodypart(BODY_ZONE_CHEST)
if(cavity_object)
torso.cavity_item = cavity_object //cavity item is given to the new chest
cavity_object.forceMove(O)
+1 -1
View File
@@ -23,7 +23,7 @@
user.visible_message("<span class='suicide'>[user] is beheading [user.p_them()]self with [src.name]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
var/obj/item/bodypart/BP = C.get_bodypart("head")
var/obj/item/bodypart/BP = C.get_bodypart(BODY_ZONE_HEAD)
if(BP)
BP.drop_limb()
playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
@@ -233,9 +233,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
if(M.z == z)
SEND_SOUND(M, 'sound/magic/charge.ogg')
to_chat(M, "<span class='boldannounce'>You feel reality distort for a moment...</span>")
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood)
mood.add_event("delam", /datum/mood_event/delam)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "delam", /datum/mood_event/delam)
if(combined_gas > MOLE_PENALTY_THRESHOLD)
investigate_log("has collapsed into a singularity.", INVESTIGATE_SUPERMATTER)
if(T)
@@ -486,7 +484,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
if(iscarbon(user))
var/mob/living/carbon/C = user
to_chat(C, "<span class='userdanger'>That was a really dumb idea.</span>")
var/obj/item/bodypart/head/rip_u = C.get_bodypart("head")
var/obj/item/bodypart/head/rip_u = C.get_bodypart(BODY_ZONE_HEAD)
rip_u.dismember(BURN) //nice try jedi
/obj/machinery/power/supermatter_shard/attack_paw(mob/user)
+4 -4
View File
@@ -138,7 +138,7 @@
return
if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
return
if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected)
if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected)
return
if(istype(user))//Check if the user can use the gun, if the user isn't alive(turrets) assume it can.
@@ -151,7 +151,7 @@
return
if(flag)
if(user.zone_selected == "mouth")
if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH)
handle_suicide(user, target, params)
return
@@ -161,7 +161,7 @@
if(istype(user))
if (user.has_trait(TRAIT_CLUMSY) && prob(40))
to_chat(user, "<span class='userdanger'>You shoot yourself in the foot with [src]!</span>")
var/shot_leg = pick("l_leg", "r_leg")
var/shot_leg = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
process_fire(user, user, FALSE, params, shot_leg)
user.dropItemToGround(src, TRUE)
return
@@ -429,7 +429,7 @@
semicd = TRUE
if(!do_mob(user, target, 120) || user.zone_selected != "mouth")
if(!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)
if(user)
if(user == target)
user.visible_message("<span class='notice'>[user] decided not to shoot.</span>")
+1 -1
View File
@@ -159,7 +159,7 @@
sleep(25)
if(user.is_holding(src))
var/turf/T = get_turf(user)
process_fire(user, user, FALSE, null, "head")
process_fire(user, user, FALSE, null, BODY_ZONE_HEAD)
user.visible_message("<span class='suicide'>[user] blows [user.p_their()] brain[user.p_s()] out with [src]!</span>")
var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE)
B.Remove(user)
@@ -218,7 +218,7 @@
playsound(user, fire_sound, 50, 1)
var/zone = check_zone(user.zone_selected)
var/obj/item/bodypart/affecting = H.get_bodypart(zone)
if(zone == "head" || zone == "eyes" || zone == "mouth")
if(zone == BODY_ZONE_HEAD || zone == BODY_ZONE_PRECISE_EYES || zone == BODY_ZONE_PRECISE_MOUTH)
shoot_self(user, affecting)
else
user.visible_message("<span class='danger'>[user.name] cowardly fires [src] at [user.p_their()] [affecting.name]!</span>", "<span class='userdanger'>You cowardly fire [src] at your [affecting.name]!</span>", "<span class='italics'>You hear a gunshot!</span>")
@@ -228,7 +228,7 @@
user.visible_message("<span class='danger'>*click*</span>")
playsound(src, "gun_dry_fire", 30, 1)
/obj/item/gun/ballistic/revolver/russian/proc/shoot_self(mob/living/carbon/human/user, affecting = "head")
/obj/item/gun/ballistic/revolver/russian/proc/shoot_self(mob/living/carbon/human/user, affecting = BODY_ZONE_HEAD)
user.apply_damage(300, BRUTE, affecting)
user.visible_message("<span class='danger'>[user.name] fires [src] at [user.p_their()] head!</span>", "<span class='userdanger'>You fire [src] at your head!</span>", "<span class='italics'>You hear a gunshot!</span>")
@@ -349,7 +349,7 @@
/obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user)
if((user.has_trait(TRAIT_CLUMSY)) || (user.mind && user.mind.assigned_role == "Clown"))
return ..()
if(process_fire(user, user, FALSE, null, "head"))
if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD))
user.visible_message("<span class='warning'>[user] somehow manages to shoot [user.p_them()]self in the face!</span>", "<span class='userdanger'>You somehow shoot yourself in the face! How the hell?!</span>")
user.emote("scream")
user.drop_all_held_items()
@@ -332,7 +332,7 @@
return
if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
return
if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected)
if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected)
return
if(!passthrough && (aiming_time > aiming_time_fire_threshold))
return
+1 -1
View File
@@ -105,7 +105,7 @@
if(get_bodypart(hit_zone))
return hit_zone
else //when a limb is missing the damage is actually passed to the chest
return "chest"
return BODY_ZONE_CHEST
/obj/item/projectile/proc/prehit(atom/target)
return TRUE
@@ -18,9 +18,7 @@
do_sparks(1, TRUE, src)
else if(iscarbon(target))
var/mob/living/carbon/C = target
GET_COMPONENT_FROM(mood, /datum/component/mood, C)
if(mood)
mood.add_event("tased", /datum/mood_event/tased)
C.SendSignal(COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased)
if(C.dna && C.dna.check_mutation(HULK))
C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE))
+1 -3
View File
@@ -303,9 +303,7 @@
need_mob_update += R.addiction_act_stage4(C)
if(40 to INFINITY)
to_chat(C, "<span class='notice'>You feel like you've gotten over your need for [R.name].</span>")
GET_COMPONENT_FROM(mood, /datum/component/mood, C)
if(mood)
mood.clear_event("[R.id]_addiction")
C.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "[R.id]_addiction")
cached_addictions.Remove(R)
addiction_tick++
if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates.
+5 -15
View File
@@ -91,39 +91,29 @@
/datum/reagent/proc/overdose_start(mob/living/M)
to_chat(M, "<span class='userdanger'>You feel like you took too much of [name]!</span>")
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood)
mood.add_event("[id]_overdose", /datum/mood_event/drugs/overdose, name)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/overdose, name)
return
/datum/reagent/proc/addiction_act_stage1(mob/living/M)
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood)
mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_light, name)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_light, name)
if(prob(30))
to_chat(M, "<span class='notice'>You feel like having some [name] right about now.</span>")
return
/datum/reagent/proc/addiction_act_stage2(mob/living/M)
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood)
mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_medium, name)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_medium, name)
if(prob(30))
to_chat(M, "<span class='notice'>You feel like you need [name]. You just can't get enough.</span>")
return
/datum/reagent/proc/addiction_act_stage3(mob/living/M)
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood)
mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_severe, name)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_severe, name)
if(prob(30))
to_chat(M, "<span class='danger'>You have an intense craving for [name].</span>")
return
/datum/reagent/proc/addiction_act_stage4(mob/living/M)
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood)
mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_critical, name)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/withdrawal_critical, name)
if(prob(30))
to_chat(M, "<span class='boldannounce'>You're not feeling good at all! You really need some [name].</span>")
return
@@ -6,9 +6,8 @@
var/trippy = TRUE //Does this drug make you trip?
/datum/reagent/drug/on_mob_delete(mob/living/M)
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood && trippy)
mood.clear_event("[id]_high")
if(trippy)
M.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "[id]_high")
/datum/reagent/drug/space_drugs
name = "Space drugs"
@@ -29,9 +28,7 @@
/datum/reagent/drug/space_drugs/overdose_start(mob/living/M)
to_chat(M, "<span class='userdanger'>You start tripping hard!</span>")
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood)
mood.add_event("[id]_overdose", /datum/mood_event/drugs/overdose, name)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/drugs/overdose, name)
/datum/reagent/drug/space_drugs/overdose_process(mob/living/M)
if(M.hallucination < volume && prob(20))
@@ -52,9 +49,7 @@
if(prob(1))
var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.")
to_chat(M, "<span class='notice'>[smoke_message]</span>")
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
if(mood)
mood.add_event("smoked", /datum/mood_event/drugs/smoked, name)
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/drugs/smoked, name)
M.AdjustStun(-20, 0)
M.AdjustKnockdown(-20, 0)
M.AdjustUnconscious(-20, 0)
@@ -214,7 +214,7 @@
id = "spaceacillin"
description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with."
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.5 * REAGENTS_METABOLISM
metabolization_rate = 0.1 * REAGENTS_METABOLISM
//Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects.
/datum/reagent/medicine/silver_sulfadiazine

Some files were not shown because too many files have changed in this diff Show More