Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into ninjasarecum
# Conflicts: # icons/mob/clothing/suit.dmi
This commit is contained in:
@@ -257,9 +257,8 @@
|
||||
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.ckey == banckey)
|
||||
playermob = M
|
||||
break
|
||||
|
||||
if(!playermob || M.client) // prioritise mobs with a client to stop the 'oops the dead body with no client got forwarded'
|
||||
playermob = M
|
||||
|
||||
banreason = "(MANUAL BAN) "+banreason
|
||||
|
||||
|
||||
@@ -43,14 +43,13 @@
|
||||
// This exists so Hardened/Silver Stake can't have a welding torch used on them.
|
||||
|
||||
/obj/item/stake/basic/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weldingtool))
|
||||
if(W.tool_behaviour == TOOL_WELDER)
|
||||
//if (amWelded)
|
||||
// to_chat(user, "<span class='warning'>This stake has already been treated with fire.</span>")
|
||||
// return
|
||||
//amWelded = TRUE
|
||||
// Weld it
|
||||
var/obj/item/weldingtool/WT = W
|
||||
if(WT.use(0))//remove_fuel(0,user))
|
||||
if(W.use(0))//remove_fuel(0,user))
|
||||
user.visible_message("[user.name] scorched the pointy end of [src] with the welding tool.", \
|
||||
"<span class='notice'>You scorch the pointy end of [src] with the welding tool.</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
|
||||
@@ -164,11 +164,11 @@
|
||||
if(istype(W, cutting_tool))
|
||||
to_chat(user, "<span class='notice'>This is a much more complex mechanical structure than you thought. You don't know where to begin cutting [src].</span>")
|
||||
return
|
||||
else if(anchored && istype(W, /obj/item/wrench)) // Can't unanchor unless owner.
|
||||
else if(anchored && W.tool_behaviour == TOOL_WRENCH) // Can't unanchor unless owner.
|
||||
to_chat(user, "<span class='danger'>The coffin won't come unanchored from the floor.</span>")
|
||||
return
|
||||
|
||||
if(locked && istype(W, /obj/item/crowbar))
|
||||
if(locked && W.tool_behaviour == TOOL_CROWBAR)
|
||||
var/pry_time = pryLidTimer * W.toolspeed // Pry speed must be affected by the speed of the tool.
|
||||
user.visible_message("<span class='notice'>[user] tries to pry the lid off of [src] with [W].</span>", \
|
||||
"<span class='notice'>You begin prying the lid off of [src] with [W]. This should take about [DisplayTimeText(pry_time)].</span>")
|
||||
|
||||
@@ -433,31 +433,21 @@
|
||||
destroy_objective.find_target()
|
||||
objectives += destroy_objective
|
||||
else
|
||||
if(prob(70))
|
||||
var/datum/objective/assassinate/once/kill_objective = new
|
||||
kill_objective.owner = owner
|
||||
if(team_mode) //No backstabbing while in a team
|
||||
kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1)
|
||||
else
|
||||
kill_objective.find_target()
|
||||
objectives += kill_objective
|
||||
|
||||
/*else
|
||||
var/datum/objective/maroon/maroon_objective = new
|
||||
maroon_objective.owner = owner
|
||||
if(team_mode)
|
||||
maroon_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1)
|
||||
else
|
||||
maroon_objective.find_target()
|
||||
objectives += maroon_objective*/
|
||||
var/datum/objective/assassinate/once/kill_objective = new
|
||||
kill_objective.owner = owner
|
||||
if(team_mode) //No backstabbing while in a team
|
||||
kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1)
|
||||
else
|
||||
kill_objective.find_target()
|
||||
objectives += kill_objective
|
||||
|
||||
if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible)
|
||||
var/datum/objective/escape/escape_with_identity/identity_theft = new
|
||||
identity_theft.owner = owner
|
||||
identity_theft.target = kill_objective.target
|
||||
identity_theft.update_explanation_text()
|
||||
objectives += identity_theft
|
||||
escape_objective_possible = FALSE
|
||||
if(!(locate(/datum/objective/escape) in objectives) && escape_objective_possible && prob(50))
|
||||
var/datum/objective/escape/escape_with_identity/identity_theft = new
|
||||
identity_theft.owner = owner
|
||||
identity_theft.target = kill_objective.target
|
||||
identity_theft.update_explanation_text()
|
||||
objectives += identity_theft
|
||||
escape_objective_possible = FALSE
|
||||
|
||||
if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible)
|
||||
if(prob(50))
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/attackby(obj/item/I, mob/user, params)
|
||||
if(is_servant_of_ratvar(user) && istype(I, /obj/item/wrench) && unanchored_icon)
|
||||
if(is_servant_of_ratvar(user) && I.tool_behaviour == TOOL_WRENCH && unanchored_icon)
|
||||
if(default_unfasten_wrench(user, I, 50) == SUCCESSFUL_UNFASTEN)
|
||||
update_anchored(user)
|
||||
return 1
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
return
|
||||
|
||||
/obj/structure/destructible/clockwork/wall_gear/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wrench))
|
||||
if(I.tool_behaviour == TOOL_WRENCH)
|
||||
default_unfasten_wrench(user, I, 10)
|
||||
return 1
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
else if(I.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='warning'>[src] needs to be unsecured to disassemble it!</span>")
|
||||
else
|
||||
|
||||
@@ -191,8 +191,6 @@ new /datum/disease_ability/symptom/powerful/youth
|
||||
/datum/disease_ability/action/sneeze
|
||||
name = "Voluntary Sneezing"
|
||||
actions = list(/datum/action/cooldown/disease_sneeze)
|
||||
cost = 2
|
||||
required_total_points = 3
|
||||
short_desc = "Force the host you are following to sneeze, spreading your infection to those in front of them."
|
||||
long_desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host.<br>Cooldown: 20 seconds"
|
||||
|
||||
@@ -229,8 +227,6 @@ new /datum/disease_ability/symptom/powerful/youth
|
||||
/datum/disease_ability/action/infect
|
||||
name = "Secrete Infection"
|
||||
actions = list(/datum/action/cooldown/disease_infect)
|
||||
cost = 2
|
||||
required_total_points = 3
|
||||
short_desc = "Cause all objects your host is touching to become infectious for a limited time, spreading your infection to anyone who touches them."
|
||||
long_desc = "Cause the host you are following to excrete an infective substance from their pores, causing all objects touching their skin to transmit your infection to anyone who touches them for the next 30 seconds. This includes the floor, if they are not wearing shoes, and any items they are holding, if they are not wearing gloves.<br>Cooldown: 40 seconds"
|
||||
|
||||
@@ -271,23 +267,20 @@ new /datum/disease_ability/symptom/powerful/youth
|
||||
//healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!)
|
||||
|
||||
/datum/disease_ability/symptom/mild
|
||||
cost = 2
|
||||
required_total_points = 4
|
||||
category = "Symptom (Weak)"
|
||||
|
||||
/datum/disease_ability/symptom/medium
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
category = "Symptom"
|
||||
|
||||
/datum/disease_ability/symptom/medium/heal
|
||||
cost = 5
|
||||
required_total_points = 5
|
||||
malefit = -1
|
||||
category = "Symptom (+)"
|
||||
|
||||
/datum/disease_ability/symptom/powerful
|
||||
cost = 4
|
||||
required_total_points = 16
|
||||
required_total_points = 10
|
||||
category = "Symptom (Strong)"
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal
|
||||
|
||||
@@ -566,7 +566,7 @@
|
||||
human_user.adjustBruteLoss(-10, FALSE)
|
||||
human_user.adjustFireLoss(-10, FALSE)
|
||||
human_user.adjustStaminaLoss(-10, FALSE)
|
||||
human_user.adjustToxLoss(-10, FALSE)
|
||||
human_user.adjustToxLoss(-10, FALSE, TRUE)
|
||||
human_user.adjustOxyLoss(-10)
|
||||
|
||||
/obj/effect/proc_holder/spell/pointed/manse_link
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
human_user.adjustBruteLoss(-6, FALSE)
|
||||
human_user.adjustFireLoss(-6, FALSE)
|
||||
human_user.adjustToxLoss(-6, FALSE)
|
||||
human_user.adjustToxLoss(-6, FALSE, TRUE)
|
||||
human_user.adjustOxyLoss(-6, FALSE)
|
||||
human_user.adjustStaminaLoss(-20)
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
switch(deconstruction_state)
|
||||
if(NUKESTATE_INTACT)
|
||||
if(istype(I, /obj/item/screwdriver/nuke))
|
||||
if(istype(I, /obj/item/screwdriver/nuke)) //Special case, cannot replace with tool_behavior
|
||||
to_chat(user, "<span class='notice'>You start removing [src]'s front panel's screws...</span>")
|
||||
if(I.use_tool(src, user, 60, volume=100))
|
||||
deconstruction_state = NUKESTATE_UNSCREWED
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
to_chat(user, "<span class='notice'>Picking up the swarmer may cause it to activate. You should be careful about this.</span>")
|
||||
|
||||
/obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/screwdriver) && user.a_intent != INTENT_HARM)
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent != INTENT_HARM)
|
||||
user.visible_message("<span class='warning'>[usr.name] deactivates [src].</span>",
|
||||
"<span class='notice'>After some fiddling, you find a way to disable [src]'s power source.</span>",
|
||||
"<span class='italics'>You hear clicking.</span>")
|
||||
|
||||
@@ -12,11 +12,10 @@
|
||||
mode = SSticker.mode
|
||||
assassin_prob = max(0,mode.threat_level-40)
|
||||
if(prob(assassin_prob))
|
||||
if(prob(assassin_prob))
|
||||
var/datum/objective/assassinate/once/kill_objective = new
|
||||
kill_objective.owner = T.owner
|
||||
kill_objective.find_target()
|
||||
T.add_objective(kill_objective)
|
||||
var/datum/objective/assassinate/once/kill_objective = new
|
||||
kill_objective.owner = T.owner
|
||||
kill_objective.find_target()
|
||||
T.add_objective(kill_objective)
|
||||
else
|
||||
var/list/weights = list()
|
||||
weights["sabo"] = length(subtypesof(/datum/sabotage_objective))
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/hidden_underwear = FALSE
|
||||
var/hidden_undershirt = FALSE
|
||||
var/hidden_socks = FALSE
|
||||
var/arousal_rate = 1
|
||||
|
||||
//Mob procs
|
||||
/mob/living/carbon/human/verb/underwear_toggle()
|
||||
@@ -20,29 +21,34 @@
|
||||
return
|
||||
if(confirm == "Top")
|
||||
hidden_undershirt = !hidden_undershirt
|
||||
log_message("[hidden_undershirt ? "removed" : "put on" ] [p_their()] undershirt.", LOG_EMOTE)
|
||||
|
||||
if(confirm == "Bottom")
|
||||
hidden_underwear = !hidden_underwear
|
||||
log_message("[hidden_underwear ? "removed" : "put on"] [p_their()] underwear.", LOG_EMOTE)
|
||||
|
||||
if(confirm == "Socks")
|
||||
hidden_socks = !hidden_socks
|
||||
log_message("[hidden_socks ? "removed" : "put on"] [p_their()] socks.", LOG_EMOTE)
|
||||
|
||||
if(confirm == "All")
|
||||
var/on_off = (hidden_undershirt || hidden_underwear || hidden_socks) ? FALSE : TRUE
|
||||
hidden_undershirt = on_off
|
||||
hidden_underwear = on_off
|
||||
hidden_socks = on_off
|
||||
log_message("[on_off ? "removed" : "put on"] all [p_their()] undergarments.", LOG_EMOTE)
|
||||
|
||||
update_body(TRUE)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/adjust_arousal(strength,aphro = FALSE,maso = FALSE) // returns all genitals that were adjust
|
||||
/mob/living/carbon/human/proc/adjust_arousal(strength, cause = "manual toggle", aphro = FALSE,maso = FALSE) // returns all genitals that were adjust
|
||||
var/list/obj/item/organ/genital/genit_list = list()
|
||||
if(!client?.prefs.arousable || (aphro && (client?.prefs.cit_toggles & NO_APHRO)) || (maso && !HAS_TRAIT(src, TRAIT_MASO)))
|
||||
return // no adjusting made here
|
||||
var/enabling = strength > 0
|
||||
for(var/obj/item/organ/genital/G in internal_organs)
|
||||
if(G.genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(strength*G.sensitivity))
|
||||
G.set_aroused_state(strength > 0)
|
||||
if(G.genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(abs(strength)*G.sensitivity * arousal_rate))
|
||||
G.set_aroused_state(enabling,cause)
|
||||
G.update_appearance()
|
||||
if(G.aroused_state)
|
||||
genit_list += G
|
||||
@@ -64,6 +70,7 @@
|
||||
return
|
||||
var/turfing = isturf(target)
|
||||
G.generate_fluid(R)
|
||||
log_message("Climaxed using [G] with [target]", LOG_EMOTE)
|
||||
if(spill && R.total_volume >= 5)
|
||||
R.reaction(turfing ? target : target.loc, TOUCH, 1, 0)
|
||||
if(!turfing)
|
||||
@@ -189,7 +196,7 @@
|
||||
return TRUE
|
||||
|
||||
//Here's the main proc itself
|
||||
/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
|
||||
/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE,cause = "") //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
|
||||
if(mb_cd_timer > world.time)
|
||||
if(!forced_climax) //Don't spam the message to the victim if forced to come too fast
|
||||
to_chat(src, "<span class='warning'>You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!</span>")
|
||||
@@ -202,6 +209,7 @@
|
||||
to_chat(src, "<span class='warning'>You can't do that while dead!</span>")
|
||||
return
|
||||
if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks
|
||||
log_message("was forced to climax by [cause]",LOG_EMOTE)
|
||||
for(var/obj/item/organ/genital/G in internal_organs)
|
||||
if(!CHECK_BITFIELD(G.genital_flags, CAN_CLIMAX_WITH)) //Skip things like wombs and testicles
|
||||
continue
|
||||
@@ -272,7 +280,6 @@
|
||||
var/obj/item/reagent_containers/fluid_container = pick_climax_container()
|
||||
if(fluid_container && available_rosie_palms(TRUE, /obj/item/reagent_containers))
|
||||
mob_fill_container(picked_organ, fluid_container)
|
||||
|
||||
mb_cd_timer = world.time + mb_cd_length
|
||||
|
||||
/mob/living/carbon/human/verb/climax_verb()
|
||||
|
||||
@@ -27,11 +27,12 @@
|
||||
if(do_update)
|
||||
update()
|
||||
|
||||
/obj/item/organ/genital/proc/set_aroused_state(new_state)
|
||||
/obj/item/organ/genital/proc/set_aroused_state(new_state,cause = "manual toggle")
|
||||
if(!(genital_flags & GENITAL_CAN_AROUSE))
|
||||
return FALSE
|
||||
if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state))
|
||||
aroused_state = new_state
|
||||
owner.log_message("[src]'s arousal was [new_state ? "enabled" : "disabled"] due to [cause]", LOG_EMOTE)
|
||||
return aroused_state
|
||||
|
||||
/obj/item/organ/genital/proc/update()
|
||||
@@ -76,11 +77,19 @@
|
||||
if(GEN_VISIBLE_ALWAYS)
|
||||
genital_flags |= GENITAL_THROUGH_CLOTHES
|
||||
if(owner)
|
||||
owner.log_message("Exposed their [src]",LOG_EMOTE)
|
||||
owner.exposed_genitals += src
|
||||
if(GEN_VISIBLE_NO_CLOTHES)
|
||||
if(owner)
|
||||
owner.log_message("Hid their [src] under clothes only",LOG_EMOTE)
|
||||
if(GEN_VISIBLE_NO_UNDIES)
|
||||
genital_flags |= GENITAL_UNDIES_HIDDEN
|
||||
if(owner)
|
||||
owner.log_message("Hid their [src] under underwear",LOG_EMOTE)
|
||||
if(GEN_VISIBLE_NEVER)
|
||||
genital_flags |= GENITAL_HIDDEN
|
||||
if(owner)
|
||||
owner.log_message("Hid their [src] completely",LOG_EMOTE)
|
||||
|
||||
if(update && owner && ishuman(owner)) //recast to use update genitals proc
|
||||
var/mob/living/carbon/human/H = owner
|
||||
|
||||
@@ -762,14 +762,14 @@
|
||||
/obj/machinery/airalarm/attackby(obj/item/W, mob/user, params)
|
||||
switch(buildstage)
|
||||
if(2)
|
||||
if(istype(W, /obj/item/wirecutters) && panel_open && wires.is_all_cut())
|
||||
if(W.tool_behaviour == TOOL_WIRECUTTER && panel_open && wires.is_all_cut())
|
||||
W.play_tool_sound(src)
|
||||
to_chat(user, "<span class='notice'>You cut the final wires.</span>")
|
||||
new /obj/item/stack/cable_coil(loc, 5)
|
||||
buildstage = 1
|
||||
update_icon()
|
||||
return
|
||||
else if(istype(W, /obj/item/screwdriver)) // Opening that Air Alarm up.
|
||||
else if(W.tool_behaviour == TOOL_SCREWDRIVER) // Opening that Air Alarm up.
|
||||
W.play_tool_sound(src)
|
||||
panel_open = !panel_open
|
||||
to_chat(user, "<span class='notice'>The wires have been [panel_open ? "exposed" : "unexposed"].</span>")
|
||||
@@ -781,7 +781,7 @@
|
||||
wires.interact(user)
|
||||
return
|
||||
if(1)
|
||||
if(istype(W, /obj/item/crowbar))
|
||||
if(W.tool_behaviour == TOOL_CROWBAR)
|
||||
user.visible_message("[user.name] removes the electronics from [src.name].",\
|
||||
"<span class='notice'>You start prying out the circuit...</span>")
|
||||
W.play_tool_sound(src)
|
||||
@@ -832,7 +832,7 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/wrench))
|
||||
if(W.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(user, "<span class='notice'>You detach \the [src] from the wall.</span>")
|
||||
W.play_tool_sound(src)
|
||||
new /obj/item/wallframe/airalarm( user.loc )
|
||||
|
||||
@@ -326,7 +326,7 @@
|
||||
|| default_deconstruction_crowbar(I))
|
||||
update_icon()
|
||||
return
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
else if(I.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
to_chat(user, "<span class='notice'>You can't access the maintenance panel while the pod is " \
|
||||
+ (on ? "active" : (occupant ? "full" : "open")) + ".</span>")
|
||||
return
|
||||
@@ -454,8 +454,10 @@
|
||||
return G.return_temperature()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/wrench/W)
|
||||
/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/W)
|
||||
. = ..()
|
||||
if(!W.tool_behaviour == TOOL_WRENCH)
|
||||
return
|
||||
if(.)
|
||||
SetInitDirections()
|
||||
var/obj/machinery/atmospherics/node = nodes[1]
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
to_chat(user, "<span class='notice'>[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [T]" : "You insert [T] into [src]"].</span>")
|
||||
replace_tank(user, FALSE, T)
|
||||
update_icon()
|
||||
else if(istype(W, /obj/item/wrench))
|
||||
else if(W.tool_behaviour == TOOL_WRENCH)
|
||||
if(!(stat & BROKEN))
|
||||
if(connected_port)
|
||||
disconnect()
|
||||
|
||||
@@ -18,6 +18,66 @@
|
||||
hitsound = 'sound/weapons/whip.ogg'
|
||||
icon_state = "whip"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/captain/jungle
|
||||
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/head/rice_hat/cursed // this was a stupid idea lmao
|
||||
name = "cursed rice hat"
|
||||
desc = "Welcome to the rice fields, motherfucker. This particular one seems to give you second thoughts about wearing it."
|
||||
|
||||
/obj/item/clothing/head/rice_hat/cursed/equipped(mob/M, slot)
|
||||
. = ..()
|
||||
if (slot == SLOT_HEAD)
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
else
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/clothing/head/rice_hat/cursed/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT)
|
||||
|
||||
/obj/item/clothing/head/rice_hat/cursed/proc/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message[1] != "*")
|
||||
var/list/temp_message = splittext(message, " ")
|
||||
var/list/pick_list = list()
|
||||
for(var/i in 1 to temp_message.len)
|
||||
pick_list += i
|
||||
for(var/i in 1 to abs(temp_message.len/3))
|
||||
var/H = pick(pick_list)
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":"))
|
||||
continue
|
||||
temp_message[H] = ninjaspeak(temp_message[H])
|
||||
pick_list -= H
|
||||
message = temp_message.Join(" ")
|
||||
|
||||
//The Alternate speech mod is now the main one.
|
||||
message = replacetext(message, "l", "r")
|
||||
message = replacetext(message, "rr", "ru")
|
||||
message = replacetext(message, "v", "b")
|
||||
message = replacetext(message, "f", "hu")
|
||||
message = replacetext(message, "'t", "")
|
||||
message = replacetext(message, "t ", "to ")
|
||||
message = replacetext(message, " I ", " ai ")
|
||||
message = replacetext(message, "th", "z")
|
||||
message = replacetext(message, "is", "izu")
|
||||
message = replacetext(message, "ziz", "zis")
|
||||
message = replacetext(message, "se", "su")
|
||||
message = replacetext(message, "br", "bur")
|
||||
message = replacetext(message, "ry", "ri")
|
||||
message = replacetext(message, "you", "yuu")
|
||||
message = replacetext(message, "ck", "cku")
|
||||
message = replacetext(message, "eu", "uu")
|
||||
message = replacetext(message, "ow", "au")
|
||||
message = replacetext(message, "are", "aa")
|
||||
message = replacetext(message, "ay", "ayu")
|
||||
message = replacetext(message, "ea", "ii")
|
||||
message = replacetext(message, "ch", "chi")
|
||||
message = replacetext(message, "than", "sen")
|
||||
message = replacetext(message, ".", "")
|
||||
message = lowertext(message)
|
||||
speech_args[SPEECH_MESSAGE] = message
|
||||
|
||||
//turfs
|
||||
|
||||
/turf/open/water/jungle
|
||||
@@ -41,4 +101,9 @@
|
||||
rare_pet_monkey_names = list("Sun Mukong", "Monkey Kong")
|
||||
|
||||
/mob/living/simple_animal/hostile/jungle/leaper/boss
|
||||
health = 450
|
||||
health = 550
|
||||
name = "Froggerosa"
|
||||
|
||||
/mob/living/simple_animal/hostile/gorilla/jungle
|
||||
tame = 1
|
||||
faction = list("neutral")
|
||||
|
||||
@@ -343,7 +343,6 @@
|
||||
|
||||
/datum/supply_pack/costumes_toys/randomised/tcg/generate()
|
||||
. = ..()
|
||||
var/cardpacktype
|
||||
var/list/cardtypes = subtypesof(/obj/item/cardpack)
|
||||
for(var/cardtype in cardtypes)
|
||||
var/obj/item/cardpack/pack = new cardtype(.)
|
||||
@@ -351,5 +350,5 @@
|
||||
cardtypes.Remove(cardtype)
|
||||
qdel(pack)
|
||||
for(var/i in 1 to 10)
|
||||
cardpacktype = pick(cardtypes)
|
||||
var/cardpacktype = pick(cardtypes)
|
||||
new cardpacktype(.)
|
||||
|
||||
@@ -221,6 +221,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/hide_ckey = FALSE //pref for hiding if your ckey shows round-end or not
|
||||
|
||||
var/list/tcg_cards = list()
|
||||
var/list/tcg_decks = list()
|
||||
|
||||
/datum/preferences/New(client/C)
|
||||
parent = C
|
||||
@@ -968,6 +969,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Breast Enlargement:</b> <a href='?_src_=prefs;preference=breast_enlargement'>[(cit_toggles & BREAST_ENLARGEMENT) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Penis Enlargement:</b> <a href='?_src_=prefs;preference=penis_enlargement'>[(cit_toggles & PENIS_ENLARGEMENT) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Hypno:</b> <a href='?_src_=prefs;preference=never_hypno'>[(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"]</a><br>"
|
||||
dat += "<b>Aphrodisiacs:</b> <a href='?_src_=prefs;preference=aphro'>[(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"]</a><br>"
|
||||
dat += "<b>Ass Slapping:</b> <a href='?_src_=prefs;preference=ass_slap'>[(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]</a><br>"
|
||||
dat += "<b>Automatic Wagging:</b> <a href='?_src_=prefs;preference=auto_wag'>[(cit_toggles & NO_AUTO_WAG) ? "Disabled" : "Enabled"]</a><br>"
|
||||
dat += "</tr></table>"
|
||||
|
||||
@@ -666,6 +666,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
else
|
||||
tcg_cards = list()
|
||||
|
||||
var/tcgdeckstr
|
||||
S["tcg_decks"] >> tcgdeckstr
|
||||
if(length(tcgdeckstr))
|
||||
tcg_decks = safe_json_decode(tcgdeckstr)
|
||||
else
|
||||
tcg_decks = list()
|
||||
|
||||
S["chosen_limb_id"] >> chosen_limb_id
|
||||
S["hide_ckey"] >> hide_ckey //saved per-character
|
||||
|
||||
@@ -1108,6 +1115,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
else
|
||||
S["tcg_cards"] << safe_json_encode(list())
|
||||
|
||||
if(length(tcg_decks))
|
||||
S["tcg_decks"] << safe_json_encode(tcg_decks)
|
||||
else
|
||||
S["tcg_decks"] << safe_json_encode(list())
|
||||
|
||||
cit_character_pref_save(S)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -311,7 +311,7 @@
|
||||
to_chat(user, "<span class = 'danger'>Install a new flash in [src]!</span>")
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/stunglasses/attackby(obj/item/W,mob/user)
|
||||
if (istype(W,/obj/item/screwdriver))
|
||||
if (W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
if (installed)
|
||||
installed.forceMove(get_turf(src))
|
||||
to_chat(user, "<span class = 'notice'>You remove [installed] from [src].</span>")
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
name = "fingerless insulated gloves"
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wirecutters))
|
||||
if(I.tool_behaviour == TOOL_WIRECUTTER)
|
||||
if(can_be_cut && icon_state == initial(icon_state))//only if not dyed
|
||||
to_chat(user, "<span class='notice'>You snip the fingertips off of [src].</span>")
|
||||
I.play_tool_sound(src)
|
||||
@@ -108,7 +108,7 @@
|
||||
..()
|
||||
|
||||
/obj/item/clothing/gloves/color/fyellow/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wirecutters))
|
||||
if(I.tool_behaviour == TOOL_WIRECUTTER)
|
||||
if(can_be_cut && icon_state == initial(icon_state))//only if not dyed
|
||||
to_chat(user, "<span class='notice'>You snip the fingertips off of [src].</span>")
|
||||
I.play_tool_sound(src)
|
||||
@@ -130,7 +130,7 @@
|
||||
strip_mod = 1.2
|
||||
|
||||
/obj/item/clothing/gloves/color/black/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wirecutters))
|
||||
if(I.tool_behaviour == TOOL_WIRECUTTER)
|
||||
if(can_be_cut && icon_state == initial(icon_state))//only if not dyed
|
||||
to_chat(user, "<span class='notice'>You snip the fingertips off of [src].</span>")
|
||||
I.play_tool_sound(src)
|
||||
|
||||
@@ -220,8 +220,8 @@
|
||||
parry_max_attacks = INFINITY
|
||||
parry_failed_cooldown_duration = 2.25 SECONDS
|
||||
parry_failed_stagger_duration = 2.25 SECONDS
|
||||
parry_cooldown = 3 SECONDS
|
||||
parry_failed_clickcd_duration = 0.5 SECONDS
|
||||
parry_cooldown = 0
|
||||
parry_failed_clickcd_duration = 0
|
||||
|
||||
/obj/item/clothing/gloves/botanic_leather
|
||||
name = "botanist's leather gloves"
|
||||
|
||||
@@ -313,7 +313,7 @@
|
||||
A.Grant(user)
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(I.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
if(F)
|
||||
for(var/obj/item/flashlight/seclite/S in src)
|
||||
to_chat(user, "<span class='notice'>You unscrew the seclite from [src].</span>")
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
jetpack = I
|
||||
to_chat(user, "<span class='notice'>You successfully install the jetpack into [src].</span>")
|
||||
return
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
else if(I.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
if(!jetpack)
|
||||
to_chat(user, "<span class='warning'>[src] has no jetpack installed.</span>")
|
||||
return
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
name = "canvas cloak"
|
||||
desc = "A rugged cloak made of canvas."
|
||||
icon_state = "cancloak"
|
||||
item_state = "cancloak"
|
||||
item_state = "cloak"
|
||||
var/list/poly_colors = list("#585858", "#373737", "#BEBEBE")
|
||||
|
||||
/obj/item/clothing/neck/cancloak/polychromic/ComponentInitialize()
|
||||
|
||||
@@ -496,7 +496,7 @@
|
||||
|
||||
/obj/item/clothing/suit/jacket/urbanjacket/polychromic/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/polychromic, list("#26321D", "#CBBDAF", "#292929"), 3)
|
||||
AddElement(/datum/element/polychromic, list("#3D4C31", "#CBBDAF", "#3B3B3B"), 3)
|
||||
|
||||
/obj/item/clothing/suit/jacket/letterman
|
||||
name = "letterman jacket"
|
||||
@@ -1040,6 +1040,12 @@
|
||||
icon_state = "wbreakpoly"
|
||||
item_state = "wbreakpoly"
|
||||
|
||||
/obj/item/clothing/suit/toggle/wbreakpoly/on_toggle(mob/user)
|
||||
if(suittoggled)
|
||||
to_chat(usr, "<span class='notice'>You zip up [src].</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You unzip [src].</span>")
|
||||
|
||||
/obj/item/clothing/suit/toggle/wbreakpoly/polychromic/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/polychromic, list("#464F65", "#916035", "#474747"), 3)
|
||||
|
||||
@@ -110,6 +110,9 @@
|
||||
suit_toggle(user)
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/suit/toggle/proc/on_toggle(mob/user) // override this, not suit_toggle, which does checks
|
||||
to_chat(usr, "<span class='notice'>You toggle [src]'s [togglename].</span>")
|
||||
|
||||
/obj/item/clothing/suit/toggle/ui_action_click()
|
||||
suit_toggle()
|
||||
|
||||
@@ -119,7 +122,7 @@
|
||||
if(!can_use(usr))
|
||||
return 0
|
||||
|
||||
to_chat(usr, "<span class='notice'>You toggle [src]'s [togglename].</span>")
|
||||
on_toggle(usr)
|
||||
if(src.suittoggled)
|
||||
src.icon_state = "[initial(icon_state)]"
|
||||
src.suittoggled = FALSE
|
||||
|
||||
@@ -11,7 +11,4 @@
|
||||
anomaly_path = /obj/effect/anomaly/bluespace
|
||||
|
||||
/datum/round_event/anomaly/anomaly_bluespace/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
else
|
||||
print_command_report("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Unstable bluespace anomaly")
|
||||
priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
@@ -12,7 +12,5 @@
|
||||
anomaly_path = /obj/effect/anomaly/flux
|
||||
|
||||
/datum/round_event/anomaly/anomaly_flux/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
else
|
||||
print_command_report("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].","Localized hyper-energetic flux wave")
|
||||
priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
|
||||
@@ -12,7 +12,4 @@
|
||||
anomaly_path = /obj/effect/anomaly/grav
|
||||
|
||||
/datum/round_event/anomaly/anomaly_grav/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
else
|
||||
print_command_report("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Gravitational anomaly")
|
||||
priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
@@ -11,7 +11,4 @@
|
||||
anomaly_path = /obj/effect/anomaly/pyro
|
||||
|
||||
/datum/round_event/anomaly/anomaly_pyro/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
else
|
||||
print_command_report("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Pyroclastic anomaly")
|
||||
priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
@@ -12,7 +12,4 @@
|
||||
anomaly_path = /obj/effect/anomaly/bhole
|
||||
|
||||
/datum/round_event/anomaly/anomaly_vortex/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
|
||||
else
|
||||
print_command_report("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name].","Vortex anomaly")
|
||||
priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
|
||||
|
||||
@@ -35,10 +35,7 @@
|
||||
source = initial(example.name)
|
||||
else if(originMachine)
|
||||
source = originMachine.name
|
||||
if(prob(50))
|
||||
priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert")
|
||||
else
|
||||
print_command_report("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Rampant brand intelligence")
|
||||
priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert")
|
||||
|
||||
/datum/round_event/brand_intelligence/start()
|
||||
for(var/obj/machinery/vending/V in GLOB.machines)
|
||||
|
||||
@@ -267,8 +267,8 @@
|
||||
var/sending_state = "lpad-beam"
|
||||
var/cargo_hold_id
|
||||
|
||||
/obj/machinery/piratepad/multitool_act(mob/living/user, obj/item/multitool/I)
|
||||
if (istype(I))
|
||||
/obj/machinery/piratepad/multitool_act(mob/living/user, obj/item/I)
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL)
|
||||
to_chat(user, "<span class='notice'>You register [src] in [I]s buffer.</span>")
|
||||
I.buffer = src
|
||||
return TRUE
|
||||
@@ -291,8 +291,8 @@
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I)
|
||||
if (istype(I) && istype(I.buffer,/obj/machinery/piratepad))
|
||||
/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/I)
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL && istype(I.buffer,/obj/machinery/piratepad))
|
||||
to_chat(user, "<span class='notice'>You link [src] with [I.buffer] in [I] buffer.</span>")
|
||||
pad = I.buffer
|
||||
return TRUE
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
if(ANTIDOTE_NEEDED)
|
||||
message = "Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples."
|
||||
title = "CentCom Research Initiatives"
|
||||
if (PIZZA_DELIVERY)
|
||||
if(PIZZA_DELIVERY)
|
||||
message = "Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead."
|
||||
title = "CentCom Spacepizza Division"
|
||||
if(ITS_HIP_TO)
|
||||
@@ -57,7 +57,7 @@
|
||||
title = "CentCom Security Division"
|
||||
bonus_points = 45000 //If you mess up, people die and the shuttle gets turned into swiss cheese
|
||||
if(DELTA_CRATES)
|
||||
message = "Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?."
|
||||
message = "Cargo: We have discovered a warehouse of DELTA locked crates. We can't store any more of them at CC, can you take them for us?"
|
||||
title = "CentCom Security Division"
|
||||
bonus_points = 25000 //If you mess up, people die and the shuttle gets turned into swiss cheese
|
||||
if(prob(50))
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
typepath = /datum/round_event/spacevine
|
||||
weight = 15
|
||||
max_occurrences = 3
|
||||
min_players = 10
|
||||
min_players = 20
|
||||
|
||||
/datum/round_event/spacevine
|
||||
fakeable = FALSE
|
||||
|
||||
@@ -435,7 +435,7 @@
|
||||
name = "alien drone cube"
|
||||
desc = "Just add water and run!"
|
||||
tastes = list("the jungle" = 1, "acid" = 1)
|
||||
dried_being = /mob/living/carbon/alien/humanoid/drone
|
||||
dried_being = /mob/living/simple_animal/hostile/alien/sentinel/cube
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cube/goat
|
||||
name = "goat cube"
|
||||
|
||||
@@ -259,7 +259,9 @@
|
||||
/obj/machinery/smartfridge/drying_rack/exchange_parts()
|
||||
/obj/machinery/smartfridge/drying_rack/spawn_frame()
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/crowbar/C, ignore_panel = 1)
|
||||
/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/C, ignore_panel = 1)
|
||||
if(!C.tool_behaviour == TOOL_CROWBAR)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/ui_data(mob/user)
|
||||
|
||||
@@ -72,16 +72,14 @@
|
||||
if((last_poof+3 MINUTES) < world.realtime)
|
||||
poof()
|
||||
|
||||
/mob/living/simple_animal/jacq/Destroy() //I.e invincible
|
||||
/mob/living/simple_animal/jacq/death() //What is alive may never die
|
||||
visible_message("<b>[src]</b> cackles, <span class='spooky'>\"You'll nae get rid a me that easily!\"</span>")
|
||||
playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25)
|
||||
var/mob/living/simple_animal/jacq/Jacq = new src.type(loc)
|
||||
Jacq.progression = progression
|
||||
if(ckey) //transfer over any ghost posessions
|
||||
Jacq.key = key
|
||||
..()
|
||||
fully_heal(FALSE)
|
||||
health = 25
|
||||
poof()
|
||||
|
||||
/mob/living/simple_animal/jacq/death() //What is alive may never die
|
||||
/mob/living/simple_animal/jacq/gib()
|
||||
visible_message("<b>[src]</b> cackles, <span class='spooky'>\"You'll nae get rid a me that easily!\"</span>")
|
||||
playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25)
|
||||
fully_heal(FALSE)
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
to_chat(user, "<span class='warning'>There's no room for any more frames in the apiary!</span>")
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/wrench))
|
||||
if(I.tool_behaviour == TOOL_WRENCH)
|
||||
if(default_unfasten_wrench(user, I, time = 20))
|
||||
return
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
/obj/machinery/seed_extractor/examine(mob/user)
|
||||
. = ..()
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += "<span class='notice'>The status display reads: Extracting <b>[seed_multiplier]</b> seed(s) per piece of produce.<br>Machine can store up to <b>[max_seeds]%</b> seeds.</span>"
|
||||
. += "<span class='notice'>The status display reads: Extracting <b>[seed_multiplier]</b> seed(s) per piece of produce.<br>Machine can store up to <b>[max_seeds]</b> seeds.</span>"
|
||||
|
||||
/obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params)
|
||||
|
||||
|
||||
@@ -452,7 +452,7 @@
|
||||
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/multitool) || istype(I, /obj/item/integrated_electronics/wirer) || istype(I, /obj/item/integrated_electronics/debugger))
|
||||
else if(I.tool_behaviour == TOOL_MULTITOOL || istype(I, /obj/item/integrated_electronics/wirer) || istype(I, /obj/item/integrated_electronics/debugger))
|
||||
if(opened)
|
||||
interact(user)
|
||||
return TRUE
|
||||
|
||||
@@ -252,7 +252,7 @@ a creative player the means to solve many problems. Circuits are held inside an
|
||||
var/update = TRUE
|
||||
var/update_to_assembly = FALSE
|
||||
|
||||
var/obj/held_item = usr.get_active_held_item()
|
||||
var/obj/item/held_item = usr.get_active_held_item()
|
||||
|
||||
if(href_list["rename"])
|
||||
rename_component(usr)
|
||||
@@ -267,7 +267,7 @@ a creative player the means to solve many problems. Circuits are held inside an
|
||||
if(href_list["link"])
|
||||
linked = locate(href_list["link"]) in pin.linked
|
||||
|
||||
if(istype(held_item, /obj/item/integrated_electronics) || istype(held_item, /obj/item/multitool))
|
||||
if(istype(held_item, /obj/item/integrated_electronics) || held_item.tool_behaviour == TOOL_MULTITOOL)
|
||||
pin.handle_wire(linked, held_item, href_list["act"], usr)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You can't do a whole lot without the proper tools.</span>")
|
||||
|
||||
@@ -105,15 +105,14 @@ D [1]/ ||
|
||||
push_data()
|
||||
|
||||
/datum/integrated_io/proc/handle_wire(datum/integrated_io/linked_pin, obj/item/tool, action, mob/living/user)
|
||||
if(istype(tool, /obj/item/multitool))
|
||||
var/obj/item/multitool/multitool = tool
|
||||
if(tool.tool_behaviour == TOOL_MULTITOOL)
|
||||
switch(action)
|
||||
if("wire")
|
||||
multitool.wire(src, user)
|
||||
tool.wire(src, user)
|
||||
return TRUE
|
||||
if("unwire")
|
||||
if(linked_pin)
|
||||
multitool.unwire(src, linked_pin, user)
|
||||
tool.unwire(src, linked_pin, user)
|
||||
return TRUE
|
||||
if("data")
|
||||
ask_for_pin_data(user)
|
||||
|
||||
@@ -12,13 +12,12 @@
|
||||
icon_state = "wirer-wire"
|
||||
flags_1 = CONDUCT_1
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/datum/integrated_io/selected_io = null
|
||||
var/mode = WIRE
|
||||
|
||||
/obj/item/integrated_electronics/wirer/update_icon_state()
|
||||
icon_state = "wirer-[mode]"
|
||||
|
||||
/obj/item/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user)
|
||||
/obj/item/integrated_electronics/wirer/wire(var/datum/integrated_io/io, mob/user)
|
||||
if(!io.holder.assembly)
|
||||
to_chat(user, "<span class='warning'>\The [io.holder] needs to be secured inside an assembly first.</span>")
|
||||
return
|
||||
|
||||
@@ -53,12 +53,12 @@
|
||||
/obj/structure/bookcase/attackby(obj/item/I, mob/user, params)
|
||||
switch(state)
|
||||
if(0)
|
||||
if(istype(I, /obj/item/wrench))
|
||||
if(I.tool_behaviour == TOOL_WRENCH)
|
||||
if(I.use_tool(src, user, 20, volume=50))
|
||||
to_chat(user, "<span class='notice'>You wrench the frame into place.</span>")
|
||||
anchored = TRUE
|
||||
state = 1
|
||||
if(istype(I, /obj/item/crowbar))
|
||||
if(I.tool_behaviour == TOOL_CROWBAR)
|
||||
if(I.use_tool(src, user, 20, volume=50))
|
||||
to_chat(user, "<span class='notice'>You pry the frame apart.</span>")
|
||||
deconstruct(TRUE)
|
||||
@@ -71,7 +71,7 @@
|
||||
to_chat(user, "<span class='notice'>You add a shelf.</span>")
|
||||
state = 2
|
||||
icon_state = "book-0"
|
||||
if(istype(I, /obj/item/wrench))
|
||||
if(I.tool_behaviour == TOOL_WRENCH)
|
||||
I.play_tool_sound(src, 100)
|
||||
to_chat(user, "<span class='notice'>You unwrench the frame.</span>")
|
||||
anchored = FALSE
|
||||
@@ -100,7 +100,7 @@
|
||||
return
|
||||
else
|
||||
name = "bookcase ([sanitize(newname)])"
|
||||
else if(istype(I, /obj/item/crowbar))
|
||||
else if(I.tool_behaviour == TOOL_CROWBAR)
|
||||
if(contents.len)
|
||||
to_chat(user, "<span class='warning'>You need to remove the books first!</span>")
|
||||
else
|
||||
@@ -302,7 +302,7 @@
|
||||
scanner.computer.inventory.Add(src)
|
||||
to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'")
|
||||
|
||||
else if(istype(I, /obj/item/kitchen/knife) || istype(I, /obj/item/wirecutters))
|
||||
else if(istype(I, /obj/item/kitchen/knife) || I.tool_behaviour == TOOL_WIRECUTTER)
|
||||
to_chat(user, "<span class='notice'>You begin to carve out [title]...</span>")
|
||||
if(do_after(user, 30, target = src))
|
||||
to_chat(user, "<span class='notice'>You carve out the pages from [title]! You didn't want to read it anyway.</span>")
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user)
|
||||
if(locked)
|
||||
if(istype(W, /obj/item/multitool))
|
||||
if(W.tool_behaviour == TOOL_MULTITOOL)
|
||||
to_chat(user, "<span class='notice'>DECA-CODE LOCK REPORT:</span>")
|
||||
if(attempts == 1)
|
||||
to_chat(user, "<span class='warning'>* Anti-Tamper Bomb will activate on next failed access attempt.</span>")
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
. += "<span class='notice'>It has \a [T] attached, which causes [T.effect_desc()].</span>"
|
||||
|
||||
/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user)
|
||||
if(istype(I, /obj/item/crowbar))
|
||||
if(I.tool_behaviour == TOOL_CROWBAR)
|
||||
if(LAZYLEN(trophies))
|
||||
to_chat(user, "<span class='notice'>You remove [src]'s trophies.</span>")
|
||||
I.play_tool_sound(src)
|
||||
|
||||
@@ -188,8 +188,10 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/multitool_act(mob/living/user, obj/item/multitool/I)
|
||||
if (panel_open)
|
||||
/obj/machinery/mineral/ore_redemption/multitool_act(mob/living/user, obj/item/I)
|
||||
if(!I.tool_behaviour == TOOL_MULTITOOL)
|
||||
return
|
||||
if(panel_open)
|
||||
input_dir = turn(input_dir, -90)
|
||||
output_dir = turn(output_dir, -90)
|
||||
to_chat(user, "<span class='notice'>You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].</span>")
|
||||
|
||||
@@ -170,8 +170,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
|
||||
updateUsrDialog()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/ore_silo/multitool_act(mob/living/user, obj/item/multitool/I)
|
||||
if (istype(I))
|
||||
/obj/machinery/ore_silo/multitool_act(mob/living/user, obj/item/I)
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL)
|
||||
to_chat(user, "<span class='notice'>You log [src] in the multitool's buffer.</span>")
|
||||
I.buffer = src
|
||||
return TRUE
|
||||
|
||||
@@ -38,9 +38,8 @@
|
||||
user << browse(dat, "window=console_stacking_machine")
|
||||
|
||||
/obj/machinery/mineral/stacking_unit_console/multitool_act(mob/living/user, obj/item/I)
|
||||
if(istype(I, /obj/item/multitool))
|
||||
var/obj/item/multitool/M = I
|
||||
M.buffer = src
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL)
|
||||
I.buffer = src
|
||||
to_chat(user, "<span class='notice'>You store linkage information in [I]'s buffer.</span>")
|
||||
return TRUE
|
||||
|
||||
@@ -97,8 +96,8 @@
|
||||
if(istype(AM, /obj/item/stack/sheet) && AM.loc == get_step(src, input_dir))
|
||||
process_sheet(AM)
|
||||
|
||||
/obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/multitool/M)
|
||||
if(istype(M))
|
||||
/obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/M)
|
||||
if(M.tool_behaviour == TOOL_MULTITOOL)
|
||||
if(istype(M.buffer, /obj/machinery/mineral/stacking_unit_console))
|
||||
CONSOLE = M.buffer
|
||||
CONSOLE.machine = src
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
to_chat(user, "<span class='info'>You instruct [src] to drop any collected ore.</span>")
|
||||
DropOre()
|
||||
return
|
||||
if(istype(I, /obj/item/crowbar) || istype(I, /obj/item/borg/upgrade/modkit))
|
||||
if(I.tool_behaviour == TOOL_CROWBAR || istype(I, /obj/item/borg/upgrade/modkit))
|
||||
I.melee_attack_chain(user, stored_gun, params)
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -251,7 +251,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
GibtoniteReaction(user)
|
||||
return
|
||||
if(primed)
|
||||
if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) || istype(I, /obj/item/multitool))
|
||||
if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) || I.tool_behaviour == TOOL_MULTITOOL)
|
||||
primed = FALSE
|
||||
if(det_timer)
|
||||
deltimer(det_timer)
|
||||
|
||||
@@ -142,10 +142,10 @@
|
||||
parry_efficiency_considered_successful = 0.01
|
||||
parry_efficiency_to_counterattack = 0.01
|
||||
parry_max_attacks = INFINITY
|
||||
parry_failed_cooldown_duration = 3 SECONDS
|
||||
parry_failed_stagger_duration = 2 SECONDS
|
||||
parry_cooldown = 3 SECONDS
|
||||
parry_failed_clickcd_duration = 0.8 SECONDS
|
||||
parry_failed_cooldown_duration = 1.5 SECONDS
|
||||
parry_failed_stagger_duration = 1 SECONDS
|
||||
parry_cooldown = 0
|
||||
parry_failed_clickcd_duration = 0.8
|
||||
|
||||
parry_data = list( // yeah it's snowflake
|
||||
"UNARMED_PARRY_STAGGER" = 3 SECONDS,
|
||||
|
||||
@@ -1454,9 +1454,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
|
||||
|
||||
var/armor_block = target.run_armor_check(affecting, "melee")
|
||||
if(HAS_TRAIT(user, TRAIT_MAULER)) // maulers get 15 armorpierce because if you're going to punch someone you might as well do a good job of it
|
||||
armor_block = target.run_armor_check(affecting, "melee", armour_penetration = 15) // lot of good that sec jumpsuit did you
|
||||
|
||||
playsound(target.loc, user.dna.species.attack_sound, 25, 1, -1)
|
||||
target.visible_message("<span class='danger'>[user] [atk_verb]ed [target]!</span>", \
|
||||
"<span class='userdanger'>[user] [atk_verb]ed you!</span>", null, COMBAT_MESSAGE_RANGE, null, \
|
||||
@@ -1473,9 +1470,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
target.apply_damage(damage*1.5, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus)
|
||||
target.apply_damage(damage*0.5, STAMINA, affecting, armor_block)
|
||||
log_combat(user, target, "kicked")
|
||||
else if(HAS_TRAIT(user, TRAIT_MAULER)) // mauler punches deal 1.1x raw damage + 1.3x stam damage, and have some armor pierce
|
||||
target.apply_damage(damage*1.1, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus)
|
||||
target.apply_damage(damage*1.3, STAMINA, affecting, armor_block)
|
||||
else if(HAS_TRAIT(user, TRAIT_MAULER)) // mauler punches deal 1.2x raw damage but nstam
|
||||
target.apply_damage(damage*1.2, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus)
|
||||
log_combat(user, target, "punched (mauler)")
|
||||
else //other attacks deal full raw damage + 2x in stamina damage
|
||||
target.apply_damage(damage, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus)
|
||||
@@ -1547,9 +1543,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
if(!user.UseStaminaBuffer(3, warn = TRUE))
|
||||
return FALSE
|
||||
user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP)
|
||||
target.adjust_arousal(20,maso = TRUE)
|
||||
target.adjust_arousal(20,"masochism", maso = TRUE)
|
||||
if (ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna() && prob(10))
|
||||
target.mob_climax(forced_climax=TRUE)
|
||||
target.mob_climax(forced_climax=TRUE, cause = "masochism")
|
||||
if (!HAS_TRAIT(target, TRAIT_PERMABONER))
|
||||
stop_wagging_tail(target)
|
||||
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
|
||||
@@ -1931,7 +1927,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
|
||||
H.update_damage_overlays()
|
||||
if(HAS_TRAIT(H, TRAIT_MASO) && prob(damage_amount))
|
||||
H.mob_climax(forced_climax=TRUE)
|
||||
H.mob_climax(forced_climax=TRUE, cause = "masochism")
|
||||
|
||||
else//no bodypart, we deal damage with a more general method.
|
||||
H.adjustBruteLoss(damage_amount)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
to_chat(C, "<span class='danger'>You ran out of blood!</span>")
|
||||
C.dust()
|
||||
var/area/A = get_area(C)
|
||||
if(istype(A, /area/chapel))
|
||||
if(istype(A, /area/chapel) && C.mind?.assigned_role != "Chaplain")
|
||||
to_chat(C, "<span class='danger'>You don't belong here!</span>")
|
||||
C.adjustFireLoss(5)
|
||||
C.adjust_fire_stacks(6)
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
if(!(combat_flags & COMBAT_FLAG_PARRY_CAPABLE))
|
||||
to_chat(src, "<span class='warning'>You are not something that can parry attacks.</span>")
|
||||
return
|
||||
if(!(mobility_flags & MOBILITY_STAND))
|
||||
to_chat(src, "<span class='warning'>You aren't able to parry without solid footing!</span>")
|
||||
return
|
||||
// Prioritize item, then martial art, then unarmed.
|
||||
// yanderedev else if time
|
||||
var/obj/item/using_item = get_active_held_item()
|
||||
|
||||
@@ -289,11 +289,13 @@
|
||||
return FALSE
|
||||
return ISINRANGE(T1.x, T0.x - interaction_range, T0.x + interaction_range) && ISINRANGE(T1.y, T0.y - interaction_range, T0.y + interaction_range)
|
||||
|
||||
/mob/living/silicon/robot/proc/attempt_welder_repair(obj/item/weldingtool/W, mob/user)
|
||||
if (!getBruteLoss())
|
||||
/mob/living/silicon/robot/proc/attempt_welder_repair(obj/item/W, mob/user)
|
||||
if(!W.tool_behaviour == TOOL_WELDER)
|
||||
return
|
||||
if(!getBruteLoss())
|
||||
to_chat(user, "<span class='warning'>[src] is already in good condition!</span>")
|
||||
return
|
||||
if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
|
||||
if(!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
|
||||
return
|
||||
user.DelayNextAction(CLICK_CD_MELEE)
|
||||
if(src == user)
|
||||
@@ -333,7 +335,7 @@
|
||||
to_chat(user, "The wires seem fine, there's no need to fix them.")
|
||||
|
||||
/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
|
||||
if(W.tool_behaviour == TOOL_WELDER && (user.a_intent != INTENT_HARM || user == src))
|
||||
INVOKE_ASYNC(src, .proc/attempt_welder_repair, W, user)
|
||||
return
|
||||
|
||||
@@ -341,7 +343,7 @@
|
||||
INVOKE_ASYNC(src, .proc/attempt_cable_repair, W, user)
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/crowbar)) // crowbar means open or close the cover
|
||||
else if(W.tool_behaviour == TOOL_CROWBAR) // crowbar means open or close the cover
|
||||
if(opened)
|
||||
to_chat(user, "<span class='notice'>You close the cover.</span>")
|
||||
opened = 0
|
||||
@@ -373,12 +375,12 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't reach the wiring!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/screwdriver) && opened && !cell) // haxing
|
||||
else if(W.tool_behaviour == TOOL_SCREWDRIVER && opened && !cell) // haxing
|
||||
wiresexposed = !wiresexposed
|
||||
to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]")
|
||||
update_icons()
|
||||
|
||||
else if(istype(W, /obj/item/screwdriver) && opened && cell) // radio
|
||||
else if((W.tool_behaviour == TOOL_SCREWDRIVER) && opened && cell) // radio
|
||||
if(shell)
|
||||
to_chat(user, "You cannot seem to open the radio compartment") //Prevent AI radio key theft
|
||||
else if(radio)
|
||||
@@ -387,7 +389,7 @@
|
||||
to_chat(user, "<span class='warning'>Unable to locate a radio!</span>")
|
||||
update_icons()
|
||||
|
||||
else if(istype(W, /obj/item/wrench) && opened && !cell) //Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module.
|
||||
else if(W.tool_behaviour == TOOL_WRENCH && opened && !cell) //Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module.
|
||||
if(!locked_down)
|
||||
to_chat(user, "<span class='boldannounce'>[src]'s bolts spark! Maybe you should lock them down first!</span>")
|
||||
spark_system.start()
|
||||
|
||||
@@ -306,7 +306,7 @@
|
||||
show_controls(user)
|
||||
|
||||
/mob/living/simple_animal/bot/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
if(!locked)
|
||||
open = !open
|
||||
to_chat(user, "<span class='notice'>The maintenance panel is now [open ? "opened" : "closed"].</span>")
|
||||
@@ -335,7 +335,7 @@
|
||||
user.visible_message("<span class='notice'>[user] uses [W] to pull [paicard] out of [bot_name]!</span>","<span class='notice'>You pull [paicard] out of [bot_name] with [W].</span>")
|
||||
ejectpai(user)
|
||||
else
|
||||
if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
|
||||
if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM)
|
||||
if(health >= maxHealth)
|
||||
to_chat(user, "<span class='warning'>[src] does not need a repair!</span>")
|
||||
return
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
build_step++
|
||||
|
||||
if(ASSEMBLY_FOURTH_STEP)
|
||||
if(istype(W, /obj/item/weldingtool))
|
||||
if(W.tool_behaviour == TOOL_WELDER)
|
||||
if(W.use_tool(src, user, 0, volume=40) && build_step == ASSEMBLY_FOURTH_STEP)
|
||||
name = "shielded frame assembly"
|
||||
to_chat(user, "<span class='notice'>You weld the vest to [src].</span>")
|
||||
@@ -180,7 +180,7 @@
|
||||
build_step++
|
||||
|
||||
if(8)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
to_chat(user, "<span class='notice'>You start attaching the gun to the frame...</span>")
|
||||
if(W.use_tool(src, user, 40, volume=100) && build_step == 8)
|
||||
name = "armed [name]"
|
||||
@@ -386,13 +386,13 @@
|
||||
var/atom/Tsec = drop_location()
|
||||
switch(build_step)
|
||||
if(ASSEMBLY_FIRST_STEP)
|
||||
if(istype(I, /obj/item/weldingtool))
|
||||
if(I.tool_behaviour == TOOL_WELDER)
|
||||
if(I.use_tool(src, user, 0, volume=40))
|
||||
add_overlay("hs_hole")
|
||||
to_chat(user, "<span class='notice'>You weld a hole in [src]!</span>")
|
||||
build_step++
|
||||
|
||||
else if(istype(I, /obj/item/screwdriver)) //deconstruct
|
||||
else if(I.tool_behaviour == TOOL_SCREWDRIVER) //deconstruct
|
||||
new /obj/item/assembly/signaler(Tsec)
|
||||
new /obj/item/clothing/head/helmet/sec(Tsec)
|
||||
to_chat(user, "<span class='notice'>You disconnect the signaler from the helmet.</span>")
|
||||
@@ -408,7 +408,7 @@
|
||||
qdel(I)
|
||||
build_step++
|
||||
|
||||
else if(istype(I, /obj/item/weldingtool)) //deconstruct
|
||||
else if(I.tool_behaviour == TOOL_WELDER) //deconstruct
|
||||
if(I.use_tool(src, user, 0, volume=40))
|
||||
cut_overlay("hs_hole")
|
||||
to_chat(user, "<span class='notice'>You weld the hole in [src] shut!</span>")
|
||||
@@ -425,7 +425,7 @@
|
||||
qdel(I)
|
||||
build_step++
|
||||
|
||||
else if(istype(I, /obj/item/screwdriver)) //deconstruct
|
||||
else if(I.tool_behaviour == TOOL_SCREWDRIVER) //deconstruct
|
||||
cut_overlay("hs_eye")
|
||||
new /obj/item/assembly/prox_sensor(Tsec)
|
||||
to_chat(user, "<span class='notice'>You detach the proximity sensor from [src].</span>")
|
||||
@@ -442,7 +442,7 @@
|
||||
S.robot_arm = robot_arm
|
||||
qdel(I)
|
||||
qdel(src)
|
||||
if(istype(I, /obj/item/wrench))
|
||||
if(I.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(user, "You adjust [src]'s arm slots to mount extra weapons")
|
||||
build_step ++
|
||||
return
|
||||
@@ -466,7 +466,7 @@
|
||||
qdel(I)
|
||||
qdel(src)
|
||||
|
||||
else if(istype(I, /obj/item/screwdriver)) //deconstruct
|
||||
else if(I.tool_behaviour == TOOL_SCREWDRIVER) //deconstruct
|
||||
cut_overlay("hs_arm")
|
||||
var/obj/item/bodypart/dropped_arm = new robot_arm(Tsec)
|
||||
robot_arm = null
|
||||
@@ -499,7 +499,7 @@
|
||||
S.robot_arm = robot_arm
|
||||
qdel(I)
|
||||
qdel(src)
|
||||
else if(istype(I, /obj/item/screwdriver)) //deconstruct
|
||||
else if(I.tool_behaviour == TOOL_SCREWDRIVER) //deconstruct
|
||||
build_step--
|
||||
icon_state = initial(icon_state)
|
||||
to_chat(user, "<span class='notice'>You unbolt [src]'s energy swords</span>")
|
||||
|
||||
@@ -184,9 +184,9 @@ Auto Patrol[]"},
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/attackby(obj/item/W, mob/user, params)
|
||||
..()
|
||||
if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
|
||||
if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
|
||||
return
|
||||
if(!istype(W, /obj/item/screwdriver) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
if(!W.tool_behaviour == TOOL_SCREWDRIVER && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
if(W.force && W.damtype != STAMINA)//If force is non-zero and damage type isn't stamina.
|
||||
retaliate(user)
|
||||
if(lasercolor)//To make up for the fact that lasertag bots don't hunt
|
||||
|
||||
@@ -340,7 +340,6 @@
|
||||
target = null
|
||||
playsound(src, 'sound/effects/whistlereset.ogg', 50, TRUE)
|
||||
return
|
||||
|
||||
if(isspaceturf(target_turf))
|
||||
//Must be a hull breach or in line mode to continue.
|
||||
if(!is_hull_breach(target_turf) && !targetdirection)
|
||||
@@ -356,9 +355,9 @@
|
||||
sleep(50)
|
||||
if(mode == BOT_REPAIRING && src.loc == target_turf)
|
||||
if(autotile) //Build the floor and include a tile.
|
||||
target_turf.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR)
|
||||
else //Build a hull plating without a floor tile.
|
||||
target_turf.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
|
||||
else //Build a hull plating without a floor tile.
|
||||
target_turf.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR)
|
||||
|
||||
else
|
||||
var/turf/open/floor/F = target_turf
|
||||
@@ -372,7 +371,7 @@
|
||||
if(mode == BOT_REPAIRING && F && src.loc == F)
|
||||
F.broken = 0
|
||||
F.burnt = 0
|
||||
F.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
|
||||
F.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR)
|
||||
|
||||
if(replacetiles && F.type != initial(tiletype.turf_type) && specialtiles && !isplatingturf(F))
|
||||
anchored = TRUE
|
||||
@@ -434,4 +433,4 @@
|
||||
if(robot.mode == BOT_REPAIRING)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
@@ -120,9 +120,9 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
|
||||
if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM)
|
||||
return
|
||||
if(!istype(W, /obj/item/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Check for welding tool to fix #2432.
|
||||
if(!W.tool_behaviour == TOOL_SCREWDRIVER && (W.force) && (!target) && (W.damtype != STAMINA) ) // Check for welding tool to fix #2432.
|
||||
retaliate(user)
|
||||
addtimer(CALLBACK(src, .proc/react_buzz), 5)
|
||||
..()
|
||||
|
||||
@@ -299,12 +299,12 @@ Auto Patrol: []"},
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/attackby(obj/item/W, mob/user, params)
|
||||
..()
|
||||
if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
|
||||
if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
|
||||
return
|
||||
if(istype(W, /obj/item/clothing/head))
|
||||
attempt_place_on_head(user, W)
|
||||
return
|
||||
if(!istype(W, /obj/item/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
if(!W.tool_behaviour == TOOL_SCREWDRIVER && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
retaliate(user)
|
||||
if(special_retaliate_after_attack(user))
|
||||
return
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/drone/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/screwdriver) && stat == DEAD)
|
||||
if(I.tool_behaviour == TOOL_SCREWDRIVER && stat == DEAD)
|
||||
try_reactivate(user)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/drone/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/screwdriver) && stat != DEAD)
|
||||
if(I.tool_behaviour == TOOL_SCREWDRIVER && stat != DEAD)
|
||||
if(health < maxHealth)
|
||||
to_chat(user, "<span class='notice'>You start to tighten loose screws on [src]...</span>")
|
||||
if(I.use_tool(src, user, 80))
|
||||
@@ -66,7 +66,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src]'s screws can't get any tighter!</span>")
|
||||
return //This used to not exist and drones who repaired themselves also stabbed the shit out of themselves.
|
||||
else if(istype(I, /obj/item/wrench) && user != src) //They aren't required to be hacked, because laws can change in other ways (i.e. admins)
|
||||
else if(I.tool_behaviour == TOOL_WRENCH && user != src) //They aren't required to be hacked, because laws can change in other ways (i.e. admins)
|
||||
user.visible_message("<span class='notice'>[user] starts resetting [src]...</span>", \
|
||||
"<span class='notice'>You press down on [src]'s factory reset control...</span>")
|
||||
if(I.use_tool(src, user, 50, volume=50))
|
||||
|
||||
@@ -78,6 +78,15 @@
|
||||
projectiletype = /obj/item/projectile/neurotox
|
||||
projectilesound = 'sound/weapons/pierce.ogg'
|
||||
|
||||
/mob/living/simple_animal/hostile/alien/sentinel/cube
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
health = 220
|
||||
maxHealth = 220
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
del_on_death = TRUE
|
||||
loot = list(/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/alien/queen
|
||||
name = "alien queen"
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/light_on = FALSE
|
||||
integrity_failure = 0.5
|
||||
max_integrity = 100
|
||||
rad_flags = RAD_PROTECT_CONTENTS
|
||||
armor = list("melee" = 0, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
|
||||
|
||||
var/enabled = 0 // Whether the computer is turned on.
|
||||
|
||||
@@ -552,7 +552,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/newscaster/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/wrench))
|
||||
if(I.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
I.play_tool_sound(src)
|
||||
if(I.use_tool(src, user, 60))
|
||||
@@ -566,7 +566,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
new /obj/item/wallframe/newscaster(loc)
|
||||
qdel(src)
|
||||
else if(istype(I, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
|
||||
else if(I.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM)
|
||||
if(stat & BROKEN)
|
||||
if(!I.tool_start_check(user, amount=0))
|
||||
return
|
||||
|
||||
@@ -22,10 +22,11 @@
|
||||
var/list/obj/item/ticket_machine_ticket/tickets = list()
|
||||
|
||||
/obj/machinery/ticket_machine/multitool_act(mob/living/user, obj/item/I)
|
||||
if(!I.tool_behaviour == TOOL_MULTITOOL)
|
||||
return
|
||||
if(!multitool_check_buffer(user, I)) //make sure it has a data buffer
|
||||
return
|
||||
var/obj/item/multitool/M = I
|
||||
M.buffer = src
|
||||
I.buffer = src
|
||||
to_chat(user, "<span class='notice'>You store linkage information in [I]'s buffer.</span>")
|
||||
return TRUE
|
||||
|
||||
@@ -77,11 +78,10 @@
|
||||
/obj/machinery/button/ticket_machine/multitool_act(mob/living/user, obj/item/I)
|
||||
. = ..()
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL)
|
||||
var/obj/item/multitool/M = I
|
||||
if(M.buffer && !istype(M.buffer, /obj/machinery/ticket_machine))
|
||||
if(I.buffer && !istype(I.buffer, /obj/machinery/ticket_machine))
|
||||
return
|
||||
var/obj/item/assembly/control/ticket_machine/controller = device
|
||||
controller.linked = M.buffer
|
||||
controller.linked = I.buffer
|
||||
id = null
|
||||
controller.id = null
|
||||
to_chat(user, "<span class='warning'>You've linked [src] to [controller.linked].</span>")
|
||||
|
||||
@@ -115,14 +115,14 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, params)
|
||||
if(can_decon && (istype(I, /obj/item/screwdriver) || istype(I, /obj/item/wrench)))
|
||||
if(can_decon && (I.tool_behaviour == TOOL_SCREWDRIVER || I.tool_behaviour == TOOL_WRENCH))
|
||||
to_chat(user, "<span class='notice'>You start unsecuring [name]...</span>")
|
||||
if(I.use_tool(src, user, 30, volume=50))
|
||||
playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You unsecure [name].</span>")
|
||||
deconstruct()
|
||||
|
||||
else if(istype(I, /obj/item/wirecutters) && framed)
|
||||
else if(I.tool_behaviour == TOOL_WIRECUTTER && framed)
|
||||
framed.forceMove(drop_location())
|
||||
framed = null
|
||||
user.visible_message("<span class='warning'>[user] cuts away [framed] from [src]!</span>")
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
//No other icons for it atm
|
||||
|
||||
/obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/wrench))
|
||||
if(W.tool_behaviour == TOOL_WRENCH)
|
||||
if(!anchored)
|
||||
W.play_tool_sound(src, 75)
|
||||
user.visible_message("[user.name] secures the [src.name] to the floor.", \
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
custom_materials = list(/datum/material/iron=100)
|
||||
|
||||
/obj/item/am_shielding_container/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/multitool) && istype(src.loc, /turf))
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL && istype(src.loc, /turf))
|
||||
new/obj/machinery/am_shielding(src.loc)
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -155,7 +155,7 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.intact)
|
||||
return
|
||||
if(istype(W, /obj/item/wirecutters))
|
||||
if(W.tool_behaviour == TOOL_WIRECUTTER)
|
||||
if (shock(user, 50))
|
||||
return
|
||||
user.visible_message("[user] cuts the cable.", "<span class='notice'>You cut the cable.</span>")
|
||||
@@ -177,7 +177,7 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
R.loaded.cable_join(src, user)
|
||||
R.is_empty(user)
|
||||
|
||||
else if(istype(W, /obj/item/multitool))
|
||||
else if(W.tool_behaviour == TOOL_MULTITOOL)
|
||||
if(powernet && (powernet.avail > 0)) // is it powered?
|
||||
to_chat(user, "<span class='danger'>[DisplayPower(powernet.avail)] in power network.</span>")
|
||||
else
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/state = FLOODLIGHT_NEEDS_WRENCHING
|
||||
|
||||
/obj/structure/floodlight_frame/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/wrench) && (state == FLOODLIGHT_NEEDS_WRENCHING))
|
||||
if(O.tool_behaviour == TOOL_WRENCH && (state == FLOODLIGHT_NEEDS_WRENCHING))
|
||||
to_chat(user, "<span class='notice'>You secure [src].</span>")
|
||||
anchored = TRUE
|
||||
state = FLOODLIGHT_NEEDS_WIRES
|
||||
@@ -26,7 +26,7 @@
|
||||
to_chat(user, "<span class='notice'>You put lights in [src].</span>")
|
||||
new /obj/machinery/power/floodlight(src.loc)
|
||||
qdel(src)
|
||||
else if(istype(O, /obj/item/screwdriver) && (state == FLOODLIGHT_NEEDS_SECURING))
|
||||
else if(O.tool_behaviour == TOOL_SCREWDRIVER && (state == FLOODLIGHT_NEEDS_SECURING))
|
||||
to_chat(user, "<span class='notice'>You fasten the wiring and electronics in [src].</span>")
|
||||
name = "secured [name]"
|
||||
desc = "A bare metal frame that looks like a floodlight. Requires light tubes."
|
||||
@@ -82,7 +82,7 @@
|
||||
to_chat(user, "You set [src] to [setting_text].")
|
||||
|
||||
/obj/machinery/power/floodlight/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/wrench))
|
||||
if(O.tool_behaviour == TOOL_WRENCH)
|
||||
default_unfasten_wrench(user, O, time = 20)
|
||||
change_setting(1)
|
||||
if(anchored)
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
return
|
||||
switch(stage)
|
||||
if(1)
|
||||
if(istype(W, /obj/item/wrench))
|
||||
if(W.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(usr, "<span class='notice'>You begin deconstructing [src]...</span>")
|
||||
if (W.use_tool(src, user, 30, volume=50))
|
||||
new /obj/item/stack/sheet/metal(drop_location(), sheets_refunded)
|
||||
@@ -127,11 +127,11 @@
|
||||
to_chat(user, "<span class='warning'>You need one length of cable to wire [src]!</span>")
|
||||
return
|
||||
if(2)
|
||||
if(istype(W, /obj/item/wrench))
|
||||
if(W.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(usr, "<span class='warning'>You have to remove the wires first!</span>")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/wirecutters))
|
||||
if(W.tool_behaviour == TOOL_WIRECUTTER)
|
||||
stage = 1
|
||||
icon_state = "[fixture_type]-construct-stage1"
|
||||
new /obj/item/stack/cable_coil(drop_location(), 1, "red")
|
||||
@@ -140,7 +140,7 @@
|
||||
W.play_tool_sound(src, 100)
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
user.visible_message("[user.name] closes [src]'s casing.", \
|
||||
"<span class='notice'>You close [src]'s casing.</span>", "<span class='italics'>You hear screwing.</span>")
|
||||
W.play_tool_sound(src, 75)
|
||||
@@ -462,7 +462,7 @@
|
||||
|
||||
// attempt to stick weapon into light socket
|
||||
else if(status == LIGHT_EMPTY)
|
||||
if(istype(W, /obj/item/screwdriver)) //If it's a screwdriver open it.
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER) //If it acts like a screwdriver, open it.
|
||||
W.play_tool_sound(src, 75)
|
||||
user.visible_message("[user.name] opens [src]'s casing.", \
|
||||
"<span class='notice'>You open [src]'s casing.</span>", "<span class='italics'>You hear a noise.</span>")
|
||||
@@ -621,7 +621,7 @@
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You can't receive charge from the [fitting]!</span>")
|
||||
return
|
||||
|
||||
|
||||
if(H.gloves)
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
if(G.max_heat_protection_temperature)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
var/creation_type = /obj/singularity
|
||||
|
||||
/obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/wrench))
|
||||
if(W.tool_behaviour == TOOL_WRENCH)
|
||||
default_unfasten_wrench(user, W, 0)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
switch(construction_state)
|
||||
if(PA_CONSTRUCTION_UNSECURED)
|
||||
if(istype(W, /obj/item/wrench) && !isinspace())
|
||||
if(W.tool_behaviour == TOOL_WRENCH && !isinspace())
|
||||
W.play_tool_sound(src, 75)
|
||||
anchored = TRUE
|
||||
user.visible_message("[user.name] secures the [name] to the floor.", \
|
||||
@@ -71,7 +71,7 @@
|
||||
construction_state = PA_CONSTRUCTION_UNWIRED
|
||||
did_something = TRUE
|
||||
if(PA_CONSTRUCTION_UNWIRED)
|
||||
if(istype(W, /obj/item/wrench))
|
||||
if(W.tool_behaviour == TOOL_WRENCH)
|
||||
W.play_tool_sound(src, 75)
|
||||
anchored = FALSE
|
||||
user.visible_message("[user.name] detaches the [name] from the floor.", \
|
||||
@@ -85,18 +85,18 @@
|
||||
construction_state = PA_CONSTRUCTION_PANEL_OPEN
|
||||
did_something = TRUE
|
||||
if(PA_CONSTRUCTION_PANEL_OPEN)
|
||||
if(istype(W, /obj/item/wirecutters))//TODO:Shock user if its on?
|
||||
if(W.tool_behaviour == TOOL_WIRECUTTER)//TODO:Shock user if its on?
|
||||
user.visible_message("[user.name] removes some wires from the [name].", \
|
||||
"You remove some wires.")
|
||||
construction_state = PA_CONSTRUCTION_UNWIRED
|
||||
did_something = TRUE
|
||||
else if(istype(W, /obj/item/screwdriver))
|
||||
else if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
user.visible_message("[user.name] closes the [name]'s access panel.", \
|
||||
"You close the access panel.")
|
||||
construction_state = PA_CONSTRUCTION_COMPLETE
|
||||
did_something = TRUE
|
||||
if(PA_CONSTRUCTION_COMPLETE)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
user.visible_message("[user.name] opens the [name]'s access panel.", \
|
||||
"You open the access panel.")
|
||||
construction_state = PA_CONSTRUCTION_PANEL_OPEN
|
||||
|
||||
@@ -162,8 +162,8 @@
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/machinery/power/smes/default_deconstruction_crowbar(obj/item/crowbar/C)
|
||||
if(istype(C) && terminal)
|
||||
/obj/machinery/power/smes/default_deconstruction_crowbar(obj/item/C)
|
||||
if(C.tool_behaviour == TOOL_CROWBAR && terminal)
|
||||
to_chat(usr, "<span class='warning'>You must first remove the power terminal!</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -227,7 +227,7 @@
|
||||
|
||||
|
||||
/obj/item/solar_assembly/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/wrench) && isturf(loc))
|
||||
if(W.tool_behaviour == TOOL_WRENCH && isturf(loc))
|
||||
if(isinspace())
|
||||
to_chat(user, "<span class='warning'>You can't secure [src] here.</span>")
|
||||
return
|
||||
@@ -269,7 +269,7 @@
|
||||
user.visible_message("[user] inserts the electronics into the solar assembly.", "<span class='notice'>You insert the electronics into the solar assembly.</span>")
|
||||
return 1
|
||||
else
|
||||
if(istype(W, /obj/item/crowbar))
|
||||
if(W.tool_behaviour == TOOL_CROWBAR)
|
||||
new /obj/item/electronics/tracker(src.loc)
|
||||
tracker = 0
|
||||
user.visible_message("[user] takes out the electronics from the solar assembly.", "<span class='notice'>You take out the electronics from the solar assembly.</span>")
|
||||
|
||||
@@ -131,8 +131,10 @@
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/power/tesla_coil/research/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20)
|
||||
/obj/machinery/power/tesla_coil/research/default_unfasten_wrench(mob/user, obj/item/W, time = 20)
|
||||
. = ..()
|
||||
if(!W.tool_behaviour == TOOL_WRENCH)
|
||||
return
|
||||
if(. == SUCCESSFUL_UNFASTEN)
|
||||
if(panel_open)
|
||||
icon_state = "rpcoil_open[anchored]"
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
|
||||
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
|
||||
if (istype(A, /obj/item/screwdriver) && !modified)
|
||||
if(A.tool_behaviour == TOOL_SCREWDRIVER && !modified)
|
||||
modified = TRUE
|
||||
FD.modified = TRUE
|
||||
FD.damage_type = BRUTE
|
||||
to_chat(user, "<span class='notice'>You pop the safety cap off [src].</span>")
|
||||
update_icon()
|
||||
else if (istype(A, /obj/item/pen))
|
||||
else if(istype(A, /obj/item/pen))
|
||||
if(modified)
|
||||
if(!FD.pen)
|
||||
harmful = TRUE
|
||||
|
||||
@@ -434,7 +434,7 @@
|
||||
to_chat(user, "<span class='notice'>You attach \the [K] to the front of \the [src].</span>")
|
||||
bayonet = K
|
||||
update_icon()
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
else if(I.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
if(gun_light)
|
||||
var/obj/item/flashlight/seclite/S = gun_light
|
||||
to_chat(user, "<span class='notice'>You unscrew the seclite from \the [src].</span>")
|
||||
|
||||
@@ -45,6 +45,13 @@
|
||||
trippy = FALSE
|
||||
pH = 8
|
||||
|
||||
//Nicotine is used as a pesticide IRL.
|
||||
/datum/reagent/drug/nicotine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(chems.has_reagent(type, 1))
|
||||
mytray.adjustToxic(round(chems.get_reagent_amount(type)))
|
||||
mytray.adjustPests(-rand(1,2))
|
||||
|
||||
/datum/reagent/drug/nicotine/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(1))
|
||||
var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.")
|
||||
@@ -563,3 +570,129 @@
|
||||
var/mob/living/carbon/C = M
|
||||
if(!C.undergoing_cardiac_arrest())
|
||||
C.set_heartattack(TRUE)
|
||||
|
||||
//aphrodisiac & anaphrodisiac
|
||||
|
||||
/datum/reagent/drug/aphrodisiac
|
||||
name = "Crocin"
|
||||
description = "Naturally found in the crocus and gardenia flowers, this drug acts as a natural and safe aphrodisiac."
|
||||
taste_description = "strawberries"
|
||||
color = "#FFADFF"//PINK, rgb(255, 173, 255)
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M)
|
||||
if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO))
|
||||
if((prob(min(current_cycle/2,5))))
|
||||
M.emote(pick("moan","blush"))
|
||||
if(prob(min(current_cycle/4,10)))
|
||||
var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.")
|
||||
to_chat(M, "<span class='userlove'>[aroused_message]</span>")
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/list/genits = H.adjust_arousal(current_cycle, "crocin", aphro = TRUE) // redundant but should still be here
|
||||
for(var/g in genits)
|
||||
var/obj/item/organ/genital/G = g
|
||||
to_chat(M, "<span class='userlove'>[G.arousal_verb]!</span>")
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/aphrodisiacplus
|
||||
name = "Hexacrocin"
|
||||
description = "Chemically condensed form of basic crocin. This aphrodisiac is extremely powerful and addictive in most animals.\
|
||||
Addiction withdrawals can cause brain damage and shortness of breath. Overdosage can lead to brain damage and a \
|
||||
permanent increase in libido (commonly referred to as 'bimbofication')."
|
||||
taste_description = "liquid desire"
|
||||
color = "#FF2BFF"//dark pink
|
||||
addiction_threshold = 20
|
||||
overdose_threshold = 20
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M)
|
||||
if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO))
|
||||
if(prob(5))
|
||||
if(prob(current_cycle))
|
||||
M.say(pick("Hnnnnngghh...", "Ohh...", "Mmnnn..."))
|
||||
else
|
||||
M.emote(pick("moan","blush"))
|
||||
if(prob(5))
|
||||
var/aroused_message
|
||||
if(current_cycle>25)
|
||||
aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!")
|
||||
else
|
||||
aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.")
|
||||
to_chat(M, "<span class='userlove'>[aroused_message]</span>")
|
||||
REMOVE_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/list/genits = H.adjust_arousal(100, "hexacrocin", aphro = TRUE) // redundant but should still be here
|
||||
for(var/g in genits)
|
||||
var/obj/item/organ/genital/G = g
|
||||
to_chat(M, "<span class='userlove'>[G.arousal_verb]!</span>")
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M)
|
||||
if(prob(30))
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2)
|
||||
..()
|
||||
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage3(mob/living/M)
|
||||
if(prob(30))
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3)
|
||||
|
||||
..()
|
||||
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage4(mob/living/M)
|
||||
if(prob(30))
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4)
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M)
|
||||
if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33))
|
||||
if(prob(5) && ishuman(M) && M.has_dna() && (M.client?.prefs.cit_toggles & BIMBOFICATION))
|
||||
if(!HAS_TRAIT(M,TRAIT_PERMABONER))
|
||||
to_chat(M, "<span class='userlove'>Your libido is going haywire!</span>")
|
||||
M.log_message("Made perma-horny by hexacrocin.",LOG_EMOTE)
|
||||
ADD_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT)
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/anaphrodisiac
|
||||
name = "Camphor"
|
||||
description = "Naturally found in some species of evergreen trees, camphor is a waxy substance. When injested by most animals, it acts as an anaphrodisiac\
|
||||
, reducing libido and calming them. Non-habit forming and not addictive."
|
||||
taste_description = "dull bitterness"
|
||||
taste_mult = 2
|
||||
color = "#D9D9D9"//rgb(217, 217, 217)
|
||||
reagent_state = SOLID
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/drug/anaphrodisiac/on_mob_life(mob/living/M)
|
||||
if(M && M.client?.prefs.arousable && prob(16))
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/list/genits = H.adjust_arousal(-100, "camphor", aphro = TRUE)
|
||||
if(genits.len)
|
||||
to_chat(M, "<span class='notice'>You no longer feel aroused.")
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/anaphrodisiacplus
|
||||
name = "Hexacamphor"
|
||||
description = "Chemically condensed camphor. Causes an extreme reduction in libido and a permanent one if overdosed. Non-addictive."
|
||||
taste_description = "tranquil celibacy"
|
||||
color = "#D9D9D9"//rgb(217, 217, 217)
|
||||
reagent_state = SOLID
|
||||
overdose_threshold = 20
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/drug/anaphrodisiacplus/on_mob_life(mob/living/M)
|
||||
if(M && M.client?.prefs.arousable)
|
||||
REMOVE_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/list/genits = H.adjust_arousal(-100, "hexacamphor", aphro = TRUE)
|
||||
if(genits.len)
|
||||
to_chat(M, "<span class='notice'>You no longer feel aroused.")
|
||||
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/anaphrodisiacplus/overdose_process(mob/living/M)
|
||||
if(M && M.client?.prefs.arousable && prob(5))
|
||||
to_chat(M, "<span class='userlove'>You feel like you'll never feel aroused again...</span>")
|
||||
ADD_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT)
|
||||
..()
|
||||
|
||||
@@ -49,6 +49,11 @@
|
||||
var/brute_heal = 1
|
||||
var/burn_heal = 0
|
||||
|
||||
/datum/reagent/consumable/nutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(chems.has_reagent(type, 1))
|
||||
mytray.adjustHealth(round(chems.get_reagent_amount(type) * 0.2))
|
||||
|
||||
/datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/M)
|
||||
if(!HAS_TRAIT(M, TRAIT_NO_PROCESS_FOOD))
|
||||
if(prob(50))
|
||||
|
||||
@@ -155,6 +155,12 @@
|
||||
pH = 11
|
||||
value = REAGENT_VALUE_COMMON
|
||||
|
||||
// Healing
|
||||
/datum/reagent/medicine/cryoxadone/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
mytray.adjustHealth(round(chems.get_reagent_amount(type) * 3))
|
||||
mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 3))
|
||||
|
||||
/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M)
|
||||
var/power = -0.00003 * (M.bodytemperature ** 2) + 3
|
||||
if(M.bodytemperature < T0C)
|
||||
@@ -935,6 +941,12 @@
|
||||
pH = 0
|
||||
value = REAGENT_VALUE_RARE
|
||||
|
||||
// FEED ME SEYMOUR
|
||||
/datum/reagent/medicine/strange_reagent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(chems.has_reagent(type, 1))
|
||||
mytray.spawnplant()
|
||||
|
||||
/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(M.stat == DEAD)
|
||||
if(M.suiciding || M.hellbound) //they are never coming back
|
||||
|
||||
@@ -2362,6 +2362,12 @@
|
||||
M.emote("nya")
|
||||
if(prob(20))
|
||||
to_chat(M, "<span class = 'notice'>[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Whats behind those doors?")]</span>")
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/list/adjusted = H.adjust_arousal(2,"catnip", aphro = TRUE)
|
||||
for(var/g in adjusted)
|
||||
var/obj/item/organ/genital/G = g
|
||||
to_chat(M, "<span class='userlove'>You feel like playing with your [G.name]!</span>")
|
||||
..()
|
||||
|
||||
/datum/reagent/preservahyde
|
||||
@@ -2539,7 +2545,7 @@
|
||||
M.drowsyness = max(M.drowsyness-5, 0)
|
||||
M.AdjustAllImmobility(-40, FALSE)
|
||||
M.adjustStaminaLoss(-15, FALSE)
|
||||
M.adjustToxLoss(-3, FALSE)
|
||||
M.adjustToxLoss(-3, FALSE, TRUE)
|
||||
M.adjustOxyLoss(-3, FALSE)
|
||||
M.adjustBruteLoss(-3, FALSE)
|
||||
M.adjustFireLoss(-3, FALSE)
|
||||
|
||||
@@ -32,6 +32,12 @@
|
||||
value = REAGENT_VALUE_VERY_COMMON
|
||||
taste_description = "metal"
|
||||
|
||||
//It has stable IN THE NAME. IT WAS MADE FOR THIS MOMENT.
|
||||
/datum/reagent/stabilizing_agent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(myseed && chems.has_reagent(type, 1))
|
||||
myseed.adjust_instability(-1)
|
||||
|
||||
/datum/reagent/clf3
|
||||
name = "Chlorine Trifluoride"
|
||||
description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space."
|
||||
@@ -167,6 +173,15 @@
|
||||
taste_description = "burning"
|
||||
value = REAGENT_VALUE_COMMON
|
||||
|
||||
// Smells like victory...
|
||||
/datum/reagent/napalm/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(chems.has_reagent(type, 1))
|
||||
if(!(myseed.resistance_flags & FIRE_PROOF))
|
||||
mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 6))
|
||||
mytray.adjustToxic(round(chems.get_reagent_amount(type) * 7))
|
||||
mytray.adjustWeeds(-rand(5,9)) //At least give them a small reward if they bother.
|
||||
|
||||
/datum/reagent/napalm/on_mob_life(mob/living/carbon/M)
|
||||
M.adjust_fire_stacks(1)
|
||||
..()
|
||||
|
||||
@@ -62,3 +62,35 @@
|
||||
results = list(/datum/reagent/moonsugar = 1, /datum/reagent/medicine/morphine = 2.5)
|
||||
required_temp = 315 //a little above normal body temperature
|
||||
required_reagents = list(/datum/reagent/drug/skooma = 1)
|
||||
|
||||
/datum/chemical_reaction/aphro
|
||||
name = "crocin"
|
||||
id = /datum/reagent/drug/aphrodisiac
|
||||
results = list(/datum/reagent/drug/aphrodisiac = 6)
|
||||
required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2, /datum/reagent/water = 1)
|
||||
required_temp = 400
|
||||
mix_message = "The mixture boils off a pink vapor..."//The water boils off, leaving the crocin
|
||||
|
||||
/datum/chemical_reaction/aphroplus
|
||||
name = "hexacrocin"
|
||||
id = /datum/reagent/drug/aphrodisiacplus
|
||||
results = list(/datum/reagent/drug/aphrodisiacplus = 1)
|
||||
required_reagents = list(/datum/reagent/drug/aphrodisiac = 6, /datum/reagent/phenol = 1)
|
||||
required_temp = 400
|
||||
mix_message = "The mixture rapidly condenses and darkens in color..."
|
||||
|
||||
/datum/chemical_reaction/anaphro
|
||||
name = "camphor"
|
||||
id = /datum/reagent/drug/anaphrodisiac
|
||||
results = list(/datum/reagent/drug/anaphrodisiac = 6)
|
||||
required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2, /datum/reagent/sulfur = 1)
|
||||
required_temp = 400
|
||||
mix_message = "The mixture boils off a yellow, smelly vapor..."//Sulfur burns off, leaving the camphor
|
||||
|
||||
/datum/chemical_reaction/anaphroplus
|
||||
name = "pentacamphor"
|
||||
id = /datum/reagent/drug/anaphrodisiacplus
|
||||
results = list(/datum/reagent/drug/anaphrodisiacplus = 1)
|
||||
required_reagents = list(/datum/reagent/drug/aphrodisiac = 5, /datum/reagent/acetone = 1)
|
||||
required_temp = 300
|
||||
mix_message = "The mixture thickens and heats up slighty..."
|
||||
|
||||
@@ -718,7 +718,7 @@
|
||||
name = "felinid mutation toxin"
|
||||
id = /datum/reagent/mutationtoxin/felinid
|
||||
results = list(/datum/reagent/mutationtoxin/felinid = 1)
|
||||
required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/ammonia = 1, /datum/reagent/water = 1, /datum/reagent/pax/catnip = 1, /datum/reagent/mutationtoxin = 1)
|
||||
required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/ammonia = 1, /datum/reagent/water = 1, /datum/reagent/drug/aphrodisiac = 10, /datum/reagent/mutationtoxin = 1)
|
||||
required_temp = 450
|
||||
|
||||
/datum/chemical_reaction/moff
|
||||
|
||||
@@ -417,6 +417,26 @@
|
||||
name = "bromine bottle"
|
||||
list_reagents = list(/datum/reagent/bromine = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/crocin
|
||||
name = "Crocin bottle"
|
||||
desc = "A bottle of mild aphrodisiac. Increases libido."
|
||||
list_reagents = list(/datum/reagent/drug/aphrodisiac = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/hexacrocin
|
||||
name = "Hexacrocin bottle"
|
||||
desc = "A bottle of strong aphrodisiac. Increases libido."
|
||||
list_reagents = list(/datum/reagent/drug/aphrodisiacplus = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/camphor
|
||||
name = "Camphor bottle"
|
||||
desc = "A bottle of mild anaphrodisiac. Reduces libido."
|
||||
list_reagents = list(/datum/reagent/drug/anaphrodisiac = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/hexacamphor
|
||||
name = "Hexacamphor bottle"
|
||||
desc = "A bottle of strong anaphrodisiac. Reduces libido."
|
||||
list_reagents = list(/datum/reagent/drug/anaphrodisiacplus = 30)
|
||||
|
||||
//Ichors
|
||||
/obj/item/reagent_containers/glass/bottle/ichor
|
||||
possible_transfer_amounts = list(1)
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
boom()
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/weldingtool))
|
||||
if(I.tool_behaviour == TOOL_WELDER)
|
||||
if(!reagents.has_reagent(/datum/reagent/fuel))
|
||||
to_chat(user, "<span class='warning'>[src] is out of fuel!</span>")
|
||||
return
|
||||
|
||||
@@ -145,7 +145,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
|
||||
// attack with item, place item on conveyor
|
||||
/obj/machinery/conveyor/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/crowbar))
|
||||
if(I.tool_behaviour == TOOL_CROWBAR)
|
||||
user.visible_message("<span class='notice'>[user] struggles to pry up \the [src] with \the [I].</span>", \
|
||||
"<span class='notice'>You struggle to pry up \the [src] with \the [I].</span>")
|
||||
if(I.use_tool(src, user, 40, volume=40))
|
||||
@@ -155,14 +155,14 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
to_chat(user, "<span class='notice'>You remove the conveyor belt.</span>")
|
||||
qdel(src)
|
||||
|
||||
else if(istype(I, /obj/item/wrench))
|
||||
else if(I.tool_behaviour == TOOL_WRENCH)
|
||||
if(!(stat & BROKEN))
|
||||
I.play_tool_sound(src)
|
||||
setDir(turn(dir,-45))
|
||||
update_move_direction()
|
||||
to_chat(user, "<span class='notice'>You rotate [src].</span>")
|
||||
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
else if(I.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
if(!(stat & BROKEN))
|
||||
verted = verted * -1
|
||||
update_move_direction()
|
||||
@@ -306,7 +306,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
CHECK_TICK
|
||||
|
||||
/obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/crowbar))
|
||||
if(I.tool_behaviour == TOOL_CROWBAR)
|
||||
var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc)
|
||||
C.id = id
|
||||
transfer_fingerprints_to(C)
|
||||
|
||||
@@ -194,7 +194,9 @@ Nothing else in the console has ID requirements.
|
||||
locked = FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/rdconsole/multitool_act(mob/user, obj/item/multitool/I)
|
||||
/obj/machinery/computer/rdconsole/multitool_act(mob/user, obj/item/I)
|
||||
if(!I.tool_behaviour == TOOL_MULTITOOL)
|
||||
return
|
||||
var/lathe = linked_lathe && linked_lathe.multitool_act(user, I)
|
||||
var/print = linked_imprinter && linked_imprinter.multitool_act(user, I)
|
||||
return lathe || print
|
||||
|
||||
@@ -39,7 +39,9 @@
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/multitool/I)
|
||||
/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/I)
|
||||
if(!I.tool_behaviour == TOOL_MULTITOOL)
|
||||
return
|
||||
if(panel_open)
|
||||
var/new_name = "Beacon_[input("Enter the custom name for this beacon", "It be Beacon ..your input..") as text]"
|
||||
if(new_name && Adjacent(user))
|
||||
|
||||
@@ -41,9 +41,8 @@
|
||||
icon_state = "power_box"
|
||||
|
||||
/obj/machinery/bsa/back/multitool_act(mob/living/user, obj/item/I)
|
||||
if(istype(I, /obj/item/multitool)) // Only this multitool type has a data buffer.
|
||||
var/obj/item/multitool/M = I
|
||||
M.buffer = src
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL) // Lies and deception
|
||||
I.buffer = src
|
||||
to_chat(user, "<span class='notice'>You store linkage information in [I]'s buffer.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[I] has no data buffer!</span>")
|
||||
@@ -55,9 +54,8 @@
|
||||
icon_state = "emitter_center"
|
||||
|
||||
/obj/machinery/bsa/front/multitool_act(mob/living/user, obj/item/I)
|
||||
if(istype(I, /obj/item/multitool)) // Only this multitool type has a data buffer.
|
||||
var/obj/item/multitool/M = I
|
||||
M.buffer = src
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL) // Lies and deception
|
||||
I.buffer = src
|
||||
to_chat(user, "<span class='notice'>You store linkage information in [I]'s buffer.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[I] has no data buffer!</span>")
|
||||
@@ -71,16 +69,15 @@
|
||||
var/obj/machinery/bsa/front/front
|
||||
|
||||
/obj/machinery/bsa/middle/multitool_act(mob/living/user, obj/item/I)
|
||||
if(istype(I, /obj/item/multitool)) // Only this multitool type has a data buffer.
|
||||
var/obj/item/multitool/M = I
|
||||
if(M.buffer)
|
||||
if(istype(M.buffer, /obj/machinery/bsa/back))
|
||||
back = M.buffer
|
||||
M.buffer = null
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL) // Lies and deception
|
||||
if(I.buffer)
|
||||
if(istype(I.buffer, /obj/machinery/bsa/back))
|
||||
back = I.buffer
|
||||
I.buffer = null
|
||||
to_chat(user, "<span class='notice'>You link [src] with [back].</span>")
|
||||
else if(istype(M.buffer, /obj/machinery/bsa/front))
|
||||
front = M.buffer
|
||||
M.buffer = null
|
||||
else if(istype(I.buffer, /obj/machinery/bsa/front))
|
||||
front = I.buffer
|
||||
I.buffer = null
|
||||
to_chat(user, "<span class='notice'>You link [src] with [front].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[I]'s data buffer is empty!</span>")
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
icon_state = active ? "sat_active" : "sat_inactive"
|
||||
|
||||
/obj/machinery/satellite/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/multitool))
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL)
|
||||
to_chat(user, "<span class='notice'>// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[(obj_flags & EMAGGED) ? "DEBUG_MODE //" : ""]</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -24,6 +24,13 @@
|
||||
/datum/surgery_step/toxichealing/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] starts rejuvenating some of [target]'s flesh back to life.", "<span class='notice'>You start knitting some of [target]'s flesh back to life.</span>")
|
||||
|
||||
/datum/surgery_step/toxichealing/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
|
||||
if(..())
|
||||
while((target.getToxLoss() >= 1) || (target.getOxyLoss() >= 1))
|
||||
. = ..()
|
||||
if(!.)
|
||||
break
|
||||
|
||||
/datum/surgery_step/toxichealing/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] fixes some of [target]'s wounds.", "<span class='notice'>You succeed in fixing some of [target]'s wounds.</span>")
|
||||
target.heal_bodypart_damage(0,0,30) //Heals stam
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user