Merge remote-tracking branch 'upstream/master' into I-guess-I-port-stuff-now-huh

This commit is contained in:
Qwertytoforty
2021-05-16 09:19:08 -04:00
908 changed files with 17189 additions and 18371 deletions
+26 -26
View File
@@ -22,7 +22,7 @@ AI MODULES
materials = list(MAT_GOLD=50)
var/datum/ai_laws/laws = null
/obj/item/aiModule/proc/install(var/obj/machinery/computer/C)
/obj/item/aiModule/proc/install(obj/machinery/computer/C)
if(istype(C, /obj/machinery/computer/aiupload))
var/obj/machinery/computer/aiupload/comp = C
if(comp.stat & NOPOWER)
@@ -72,7 +72,7 @@ AI MODULES
to_chat(usr, "<span class='notice'>Upload complete. The robot's laws have been modified.</span>")
/obj/item/aiModule/proc/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/proc/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
log_law_changes(target, sender)
if(laws)
@@ -82,12 +82,12 @@ AI MODULES
to_chat(target, "[sender] has uploaded a change to the laws you must follow, using \an [src]. From now on: ")
target.show_laws()
/obj/item/aiModule/proc/log_law_changes(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/proc/log_law_changes(mob/living/silicon/ai/target, mob/sender)
var/time = time2text(world.realtime,"hh:mm:ss")
GLOB.lawchanges.Add("[time] <B>:</B> [sender.name]([sender.key]) used [src.name] on [target.name]([target.key])")
log_and_message_admins("used [src.name] on [target.name]([target.key])")
/obj/item/aiModule/proc/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/proc/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
/******************** Safeguard ********************/
@@ -97,19 +97,19 @@ AI MODULES
desc = "A 'safeguard' AI module: 'Safeguard <name>. Individuals that threaten <name> are not crew and must be eliminated.'"
origin_tech = "programming=3;materials=3"
/obj/item/aiModule/safeguard/attack_self(var/mob/user as mob)
/obj/item/aiModule/safeguard/attack_self(mob/user as mob)
..()
var/targName = stripped_input(usr, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name)
targetName = targName
desc = text("A 'safeguard' AI module: 'Safeguard []. Individuals that threaten [] are not crew and must be eliminated.'", targetName, targetName)
/obj/item/aiModule/safeguard/install(var/obj/machinery/computer/C)
/obj/item/aiModule/safeguard/install(obj/machinery/computer/C)
if(!targetName)
to_chat(usr, "No name detected on module, please enter one.")
return 0
..()
/obj/item/aiModule/safeguard/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/safeguard/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = text("Safeguard []. Individuals that threaten [] are not crew and must be eliminated.'", targetName, targetName)
to_chat(target, law)
@@ -123,19 +123,19 @@ AI MODULES
desc = "A 'one human' AI module: 'Only <name> is crew.'"
origin_tech = "programming=4;materials=4"
/obj/item/aiModule/oneCrewMember/attack_self(var/mob/user as mob)
/obj/item/aiModule/oneCrewMember/attack_self(mob/user as mob)
..()
var/targName = stripped_input(usr, "Please enter the name of the person who is the only crew.", "Who?", user.real_name)
targetName = targName
desc = text("A 'one human' AI module: 'Only [] is crew.'", targetName)
/obj/item/aiModule/oneCrewMember/install(var/obj/machinery/computer/C)
/obj/item/aiModule/oneCrewMember/install(obj/machinery/computer/C)
if(!targetName)
to_chat(usr, "No name detected on module, please enter one.")
return 0
..()
/obj/item/aiModule/oneCrewMember/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/oneCrewMember/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "Only [targetName] is crew."
if(!is_special_character(target)) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite
@@ -153,10 +153,10 @@ AI MODULES
desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized.'"
origin_tech = "programming=4;materials=4" //made of gold
/obj/item/aiModule/protectStation/attack_self(var/mob/user as mob)
/obj/item/aiModule/protectStation/attack_self(mob/user as mob)
..()
/obj/item/aiModule/protectStation/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/protectStation/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized."
to_chat(target, law)
@@ -168,10 +168,10 @@ AI MODULES
desc = "A 'OxygenIsToxicToHumans' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'"
origin_tech = "programming=4;biotech=2;materials=4"
/obj/item/aiModule/oxygen/attack_self(var/mob/user as mob)
/obj/item/aiModule/oxygen/attack_self(mob/user as mob)
..()
/obj/item/aiModule/oxygen/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/oxygen/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member."
to_chat(target, law)
@@ -185,7 +185,7 @@ AI MODULES
desc = "A 'freeform' AI module: '<freeform>'"
origin_tech = "programming=4;materials=4"
/obj/item/aiModule/freeform/attack_self(var/mob/user as mob)
/obj/item/aiModule/freeform/attack_self(mob/user as mob)
..()
var/new_lawpos = input("Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) as num
if(new_lawpos < MIN_SUPPLIED_LAW_NUMBER) return
@@ -195,7 +195,7 @@ AI MODULES
newFreeFormLaw = targName
desc = "A 'freeform' AI module: ([lawpos]) '[newFreeFormLaw]'"
/obj/item/aiModule/freeform/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/freeform/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "[newFreeFormLaw]"
to_chat(target, law)
@@ -204,7 +204,7 @@ AI MODULES
target.add_supplied_law(lawpos, law)
GLOB.lawchanges.Add("The law was '[newFreeFormLaw]'")
/obj/item/aiModule/freeform/install(var/obj/machinery/computer/C)
/obj/item/aiModule/freeform/install(obj/machinery/computer/C)
if(!newFreeFormLaw)
to_chat(usr, "No law detected on module, please create one.")
return 0
@@ -217,7 +217,7 @@ AI MODULES
desc = "A 'reset' AI module: 'Clears all laws except for the core laws.'"
origin_tech = "programming=3;materials=2"
/obj/item/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/reset/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
log_law_changes(target, sender)
if(!is_special_character(target))
@@ -234,7 +234,7 @@ AI MODULES
desc = "A 'purge' AI Module: 'Purges all laws.'"
origin_tech = "programming=5;materials=4"
/obj/item/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/purge/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
..()
if(!is_special_character(target))
target.clear_zeroth_law()
@@ -320,20 +320,20 @@ AI MODULES
desc = "A 'freeform' Core AI module: '<freeform>'"
origin_tech = "programming=5;materials=4"
/obj/item/aiModule/freeformcore/attack_self(var/mob/user as mob)
/obj/item/aiModule/freeformcore/attack_self(mob/user as mob)
..()
var/newlaw = ""
var/targName = stripped_input(usr, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw)
newFreeFormLaw = targName
desc = "A 'freeform' Core AI module: '[newFreeFormLaw]'"
/obj/item/aiModule/freeformcore/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/freeformcore/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "[newFreeFormLaw]"
target.add_inherent_law(law)
GLOB.lawchanges.Add("The law is '[newFreeFormLaw]'")
/obj/item/aiModule/freeformcore/install(var/obj/machinery/computer/C)
/obj/item/aiModule/freeformcore/install(obj/machinery/computer/C)
if(!newFreeFormLaw)
to_chat(usr, "No law detected on module, please create one.")
return 0
@@ -346,14 +346,14 @@ AI MODULES
desc = "A hacked AI law module: '<freeform>'"
origin_tech = "programming=5;materials=5;syndicate=5"
/obj/item/aiModule/syndicate/attack_self(var/mob/user as mob)
/obj/item/aiModule/syndicate/attack_self(mob/user as mob)
..()
var/newlaw = ""
var/targName = stripped_input(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw,MAX_MESSAGE_LEN)
newFreeFormLaw = targName
desc = "A hacked AI law module: '[newFreeFormLaw]'"
/obj/item/aiModule/syndicate/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/syndicate/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
// ..() //We don't want this module reporting to the AI who dun it. --NEO
log_law_changes(target, sender)
@@ -363,7 +363,7 @@ AI MODULES
target.add_ion_law(law)
target.show_laws()
/obj/item/aiModule/syndicate/install(var/obj/machinery/computer/C)
/obj/item/aiModule/syndicate/install(obj/machinery/computer/C)
if(!newFreeFormLaw)
to_chat(usr, "No law detected on module, please create one.")
return 0
@@ -378,7 +378,7 @@ AI MODULES
origin_tech = "programming=6;materials=5;syndicate=6"
laws = list("")
/obj/item/aiModule/toyAI/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/toyAI/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
//..()
to_chat(target, "<span class='warning'>KRZZZT</span>")
target.add_ion_law(laws[1])
+11 -10
View File
@@ -157,7 +157,7 @@
/obj/item/card/id/proc/UpdateName()
name = "[src.registered_name]'s ID Card ([src.assignment])"
/obj/item/card/id/proc/SetOwnerInfo(var/mob/living/carbon/human/H)
/obj/item/card/id/proc/SetOwnerInfo(mob/living/carbon/human/H)
if(!H || !H.dna)
return
@@ -332,11 +332,12 @@
var/list/initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_EXTERNAL_AIRLOCKS)
origin_tech = "syndicate=1"
var/registered_user = null
untrackable = 1
var/anyone = FALSE //Can anyone forge the ID or just syndicate?
untrackable = TRUE
/obj/item/card/id/syndicate/anyone
anyone = TRUE
/obj/item/card/id/syndicate/researcher
initial_access = list(ACCESS_SYNDICATE)
assignment = "Syndicate Researcher"
icon_state = "syndie"
/obj/item/card/id/syndicate/New()
access = initial_access.Copy()
@@ -350,19 +351,19 @@
initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS)
icon_state = "commander"
/obj/item/card/id/syndicate/afterattack(var/obj/item/O as obj, mob/user as mob, proximity)
/obj/item/card/id/syndicate/afterattack(obj/item/O as obj, mob/user as mob, proximity)
if(!proximity)
return
if(istype(O, /obj/item/card/id))
var/obj/item/card/id/I = O
if(istype(user, /mob/living) && user.mind)
if(user.mind.special_role || anyone)
if(user.mind.special_role)
to_chat(usr, "<span class='notice'>The card's microscanners activate as you pass it over \the [I], copying its access.</span>")
src.access |= I.access //Don't copy access if user isn't an antag -- to prevent metagaming
/obj/item/card/id/syndicate/attack_self(mob/user as mob)
if(!src.registered_name)
var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name))
var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name), TRUE)
if(!t)
to_chat(user, "<span class='warning'>Invalid name.</span>")
return
@@ -601,7 +602,7 @@
registered_name = "Syndicate"
icon_state = "syndie"
assignment = "Syndicate Overlord"
untrackable = 1
untrackable = TRUE
access = list(ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS)
/obj/item/card/id/captains_spare
@@ -623,7 +624,7 @@
item_state = "gold_id"
registered_name = "Admin"
assignment = "Testing Shit"
untrackable = 1
untrackable = TRUE
/obj/item/card/id/admin/New()
access = get_absolutely_all_accesses()
@@ -13,7 +13,7 @@
var/obj/item/gun/energy/chrono_gun/PA = null
var/list/erased_minds = list() //a collection of minds from the dead
/obj/item/chrono_eraser/proc/pass_mind(var/datum/mind/M)
/obj/item/chrono_eraser/proc/pass_mind(datum/mind/M)
erased_minds += M
/obj/item/chrono_eraser/dropped()
@@ -113,7 +113,7 @@
field_disconnect(F)
return 0
/obj/item/gun/energy/chrono_gun/proc/pass_mind(var/datum/mind/M)
/obj/item/gun/energy/chrono_gun/proc/pass_mind(datum/mind/M)
if(TED)
TED.pass_mind(M)
+13 -10
View File
@@ -187,7 +187,7 @@
QDEL_NULL(cell)
return ..()
/obj/item/defibrillator/proc/deductcharge(var/chrgdeductamt)
/obj/item/defibrillator/proc/deductcharge(chrgdeductamt)
if(cell)
if(cell.charge < (paddles.revivecost+chrgdeductamt))
powered = FALSE
@@ -199,7 +199,7 @@
update_icon()
return FALSE
/obj/item/defibrillator/proc/cooldowncheck(var/mob/user)
/obj/item/defibrillator/proc/cooldowncheck(mob/user)
spawn(50)
if(cell)
if(cell.charge >= paddles.revivecost)
@@ -310,7 +310,7 @@
if(!t.Adjacent(user))
defib.remove_paddles(user)
/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O)
/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, mob/living/carbon/human/M, obj/O)
if(!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns
M.unEquip(O)
qdel(O)
@@ -363,7 +363,7 @@
if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("<span class='notice'>[user] places [src] on [M.name]'s chest.</span>", "<span class='warning'>You place [src] on [M.name]'s chest.</span>")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
var/mob/dead/observer/ghost = H.get_ghost(TRUE)
if(ghost && !ghost.client)
// In case the ghost's not getting deleted for some reason
H.key = ghost.key
@@ -420,7 +420,7 @@
for(var/obj/item/organ/external/O in H.bodyparts)
total_brute += O.brute_dam
total_burn += O.burn_dam
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK) && !HAS_TRAIT(H, TRAIT_BADDNA) && (H.mind && H.mind.is_revivable()) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime)))
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK) && !HAS_TRAIT(H, TRAIT_BADDNA) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime)))
tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
H.adjustOxyLoss(tobehealed)
@@ -446,10 +446,13 @@
else if(total_burn >= 180 || total_brute >= 180)
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Severe tissue damage detected.</span>")
else if(ghost)
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
if(!ghost.can_reenter_corpse) // DNR or AntagHUD
user.visible_message("<span class='notice'>[defib] buzzes: Resucitation failed: No electrical brain activity detected.</span>")
else
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed.</span>")
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
@@ -539,7 +542,7 @@
for(var/obj/item/organ/external/O in H.bodyparts)
total_brute += O.brute_dam
total_burn += O.burn_dam
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK) && (H.mind && H.mind.is_revivable()))
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK))
tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
H.adjustOxyLoss(tobehealed)
@@ -37,7 +37,7 @@
else
to_chat(user, "<span class='warning'>You failed to inject [M].</span>")
/obj/item/dnascrambler/proc/injected(var/mob/living/carbon/human/target, var/mob/living/carbon/user)
/obj/item/dnascrambler/proc/injected(mob/living/carbon/human/target, mob/living/carbon/user)
if(istype(target))
var/mob/living/carbon/human/H = target
scramble(1, H, 100)
@@ -109,8 +109,6 @@
message_say = "FOR THE REVOLOUTION!"
else if(role == "death commando" || role == ROLE_ERT)
message_say = "FOR NANOTRASEN!"
else if(role == ROLE_DEVIL)
message_say = "FOR INFERNO!"
user.say(message_say)
target = user
sleep(10)
@@ -57,7 +57,7 @@
to_chat(user, "The safety is [safety ? "on" : "off"].")
return
/obj/item/extinguisher/attack_obj(obj/O, mob/living/user)
/obj/item/extinguisher/attack_obj(obj/O, mob/living/user, params)
if(AttemptRefill(O, user))
refilling = TRUE
return FALSE
@@ -37,7 +37,7 @@
var/fillamt = 0
/obj/item/grenade/bananade/casing/attackby(var/obj/item/I, mob/user as mob, params)
/obj/item/grenade/bananade/casing/attackby(obj/item/I, mob/user as mob, params)
if(istype(I, /obj/item/grown/bananapeel))
if(fillamt < 9)
to_chat(usr, "<span class='notice'>You add another banana peel to the assembly.</span>")
@@ -304,7 +304,7 @@
qdel(src)
/obj/item/grenade/chem_grenade/proc/CreateDefaultTrigger(var/typekey)
/obj/item/grenade/chem_grenade/proc/CreateDefaultTrigger(typekey)
if(ispath(typekey,/obj/item/assembly))
nadeassembly = new(src)
if(nadeassembly.has_prox_sensors())
@@ -457,7 +457,7 @@
/obj/item/grenade/chem_grenade/firefighting
payload_name = "fire fighting grenade"
payload_name = "fire fighting"
desc = "Can help to put out dangerous fires from a distance."
stage = READY
@@ -37,7 +37,7 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "clusterbang_segment"
/obj/item/grenade/clusterbuster/segment/New(var/loc, var/payload_type = /obj/item/grenade/flashbang/cluster)
/obj/item/grenade/clusterbuster/segment/New(loc, payload_type = /obj/item/grenade/flashbang/cluster)
..()
icon_state = "clusterbang_segment_active"
payload = payload_type
@@ -58,7 +58,7 @@
//////////////////////////////////
//The payload spawner effect
/////////////////////////////////
/obj/effect/payload_spawner/New(var/turf/newloc,var/type, var/numspawned as num)
/obj/effect/payload_spawner/New(turf/newloc, type, numspawned as num)
. = ..()
for(var/loop = numspawned ,loop > 0, loop--)
var/obj/item/grenade/P = new type(loc)
@@ -21,7 +21,7 @@
if(!QDELETED(src))
qdel(src)
/obj/item/grenade/proc/clown_check(var/mob/living/user)
/obj/item/grenade/proc/clown_check(mob/living/user)
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, "<span class='warning'>Huh? How does this thing work?</span>")
active = 1
+6 -1
View File
@@ -145,7 +145,7 @@
desc = "Use this to keep prisoners in line. Or you know, your significant other."
icon_state = "pinkcuffs"
/obj/item/restraints/handcuffs/cable/attackby(var/obj/item/I, mob/user as mob, params)
/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user as mob, params)
..()
if(istype(I, /obj/item/stack/rods))
var/obj/item/stack/rods/R = I
@@ -192,5 +192,10 @@
desc = "A pair of broken zipties."
icon_state = "cuff_white_used"
/obj/item/restraints/handcuffs/cable/zipties/used/decompile_act(obj/item/matter_decompiler/C, mob/user)
C.stored_comms["glass"] += 1
qdel(src)
return TRUE
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
return
@@ -39,7 +39,7 @@
if(ishuman(M) && M.mind?.vampire)
if(!M.mind.vampire.get_ability(/datum/vampire_passive/full))
to_chat(M, "<span class='warning'>The nullrod's power interferes with your own!</span>")
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
M.mind.vampire.adjust_nullification(5, 2)
/obj/item/nullrod/pickup(mob/living/user)
. = ..()
@@ -471,12 +471,12 @@
if(target.mind)
if(iscultist(target))
SSticker.mode.remove_cultist(target.mind) // This proc will handle message generation.
SSticker.mode.remove_cultist(target.mind, TRUE, TRUE) // This proc will handle message generation.
praying = FALSE
return
if(target.mind.vampire && !target.mind.vampire.get_ability(/datum/vampire_passive/full)) // Getting a full prayer off on a vampire will interrupt their powers for a large duration.
target.mind.vampire.nullified = max(120, target.mind.vampire.nullified + 120)
target.mind.vampire.adjust_nullification(120, 50)
to_chat(target, "<span class='userdanger'>[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!</span>")
praying = FALSE
return
@@ -500,7 +500,7 @@
if(holder.l_hand == src || holder.r_hand == src) // Holding this in your hand will
for(var/mob/living/carbon/human/H in range(5, loc))
if(H.mind && H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full))
H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2)
H.mind.vampire.adjust_nullification(5, 2)
if(prob(10))
to_chat(H, "<span class='userdanger'>Being in the presence of [holder]'s [src] is interfering with your powers!</span>")
@@ -28,7 +28,7 @@
//return 1 if the implant injects
//return -1 if the implant fails to inject
//return 0 if there is no room for implant
/obj/item/implant/proc/implant(var/mob/source, var/mob/user)
/obj/item/implant/proc/implant(mob/source, mob/user)
var/obj/item/implant/imp_e = locate(src.type) in source
if(!allow_multiple && imp_e && imp_e != src)
if(imp_e.uses < initial(imp_e.uses)*2)
@@ -58,7 +58,7 @@
return 1
/obj/item/implant/proc/removed(var/mob/source)
/obj/item/implant/proc/removed(mob/source)
src.loc = null
imp_in = null
implanted = 0
@@ -38,7 +38,7 @@
home = console.pad
return 1
/obj/item/implant/abductor/proc/get_team_console(var/team)
/obj/item/implant/abductor/proc/get_team_console(team)
var/obj/machinery/abductor/console/console
for(var/obj/machinery/abductor/console/c in GLOB.abductor_equipment)
if(c.team == team)
@@ -31,7 +31,7 @@
else if(M.stat == DEAD)
activate("death")
/obj/item/implant/death_alarm/activate(var/cause)
/obj/item/implant/death_alarm/activate(cause)
var/mob/M = imp_in
var/area/t = get_area(M)
@@ -3,6 +3,7 @@
desc = "And boom goes the weasel."
icon_state = "explosive"
origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
actions_types = list(/datum/action/item_action/hands_free/activate/always)
var/weak = 2
var/medium = 0.8
var/heavy = 0.4
@@ -135,6 +136,7 @@
desc = "An alarm which monitors host vital signs, transmitting a radio message and dusting the corpse on death."
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
actions_types = list(/datum/action/item_action/hands_free/activate/always)
/obj/item/implant/dust/get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
@@ -33,7 +33,7 @@
return 1
return 0
/obj/item/implant/mindshield/removed(mob/target, var/silent = 0)
/obj/item/implant/mindshield/removed(mob/target, silent = 0)
if(..())
if(target.stat != DEAD && !silent)
to_chat(target, "<span class='boldnotice'>You feel a sense of liberation as Nanotrasen's grip on your mind fades away.</span>")
+1 -1
View File
@@ -838,7 +838,7 @@
/obj/item/book/manual/chef_recipes
name = "Chef Recipes"
icon_state = "cooked_book"
icon_state = "cook_book"
author = "NanoTrasen"
title = "Chef Recipes"
dat = {"
@@ -133,7 +133,7 @@
/obj/item/melee/energy/sword/cyborg
var/hitcost = 50
/obj/item/melee/energy/sword/cyborg/attack(mob/M, var/mob/living/silicon/robot/R)
/obj/item/melee/energy/sword/cyborg/attack(mob/M, mob/living/silicon/robot/R)
if(R.cell)
var/obj/item/stock_parts/cell/C = R.cell
if(active && !(C.use(hitcost)))
@@ -88,7 +88,7 @@
Fire(user, target)
/obj/item/pneumatic_cannon/proc/Fire(var/mob/living/carbon/human/user, var/atom/target)
/obj/item/pneumatic_cannon/proc/Fire(mob/living/carbon/human/user, atom/target)
if(!istype(user) && !target)
return
var/discharge = 0
@@ -137,7 +137,7 @@
/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
name = "Pneumatic Cannon"
result = /obj/item/pneumatic_cannon/ghetto
result = list(/obj/item/pneumatic_cannon/ghetto)
tools = list(TOOL_WELDER, TOOL_WRENCH)
reqs = list(/obj/item/stack/sheet/metal = 4,
/obj/item/stack/packageWrap = 8,
+1 -1
View File
@@ -86,7 +86,7 @@
if(delay)
lastused = world.time
/obj/item/rpd/proc/can_dispense_pipe(var/pipe_id, var/pipe_type) //Returns TRUE if this is a legit pipe we can dispense, otherwise returns FALSE
/obj/item/rpd/proc/can_dispense_pipe(pipe_id, pipe_type) //Returns TRUE if this is a legit pipe we can dispense, otherwise returns FALSE
for(var/list/L in GLOB.rpd_pipe_list)
if(pipe_type != L["pipe_type"]) //Sometimes pipes in different categories have the same pipe_id, so we need to skip anything not in the category we want
continue
+1 -1
View File
@@ -43,7 +43,7 @@
attack_self(H)
return
/obj/item/teleportation_scroll/proc/teleportscroll(var/mob/user)
/obj/item/teleportation_scroll/proc/teleportscroll(mob/user)
var/A
+1 -1
View File
@@ -38,7 +38,7 @@
/datum/crafting_recipe/picket_sign
name = "Picket Sign"
result = /obj/item/picket_sign
result = list(/obj/item/picket_sign)
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/cardboard = 2)
time = 80
+6 -1
View File
@@ -43,7 +43,7 @@
if(wielded)
to_chat(user, "<span class='notice'>You hold \the [src] between your legs.</span>")
/obj/item/twohanded/staff/broom/attackby(var/obj/O, mob/user)
/obj/item/twohanded/staff/broom/attackby(obj/O, mob/user)
if(istype(O, /obj/item/clothing/mask/horsehead))
new/obj/item/twohanded/staff/broom/horsebroom(get_turf(src))
user.unEquip(O)
@@ -52,6 +52,11 @@
return
..()
/obj/item/twohanded/staff/broom/dropped(mob/user)
if((user.mind in SSticker.mode.wizards) && user.flying)
user.flying = FALSE
..()
/obj/item/twohanded/staff/broom/horsebroom
name = "broomstick horse"
desc = "Saddle up!"
@@ -54,7 +54,7 @@
//Sorts stock parts inside an RPED by their rating.
//Only use /obj/item/stock_parts/ with this sort proc!
/proc/cmp_rped_sort(var/obj/item/stock_parts/A, var/obj/item/stock_parts/B)
/proc/cmp_rped_sort(obj/item/stock_parts/A, obj/item/stock_parts/B)
return B.rating - A.rating
/obj/item/stock_parts
@@ -366,6 +366,22 @@
item_state = "assault"
storage_slots = 6
/obj/item/storage/belt/military/assault/marines/full/populate_contents()
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m45(src)
new /obj/item/ammo_box/magazine/m45(src)
update_icon()
/obj/item/storage/belt/military/assault/marines/elite/full/populate_contents()
new /obj/item/ammo_box/magazine/m556/arg(src)
new /obj/item/ammo_box/magazine/m556/arg(src)
new /obj/item/ammo_box/magazine/m556/arg(src)
new /obj/item/ammo_box/magazine/m45(src)
new /obj/item/ammo_box/magazine/m45(src)
update_icon()
/obj/item/storage/belt/janitor
name = "janibelt"
desc = "A belt used to hold most janitorial supplies."
@@ -121,19 +121,21 @@
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonbox"
w_class = WEIGHT_CLASS_SMALL
storage_slots = 6
storage_slots = 8
icon_type = "crayon"
can_hold = list(
/obj/item/toy/crayon
)
/obj/item/storage/fancy/crayons/populate_contents()
new /obj/item/toy/crayon/white(src)
new /obj/item/toy/crayon/red(src)
new /obj/item/toy/crayon/orange(src)
new /obj/item/toy/crayon/yellow(src)
new /obj/item/toy/crayon/green(src)
new /obj/item/toy/crayon/blue(src)
new /obj/item/toy/crayon/purple(src)
new /obj/item/toy/crayon/black(src)
update_icon()
/obj/item/storage/fancy/crayons/update_icon()
@@ -76,6 +76,10 @@
if(!cell)
return
cell.use(amount)
if(cell.rigged)
cell = null
turned_on = FALSE
update_icon()
if(cell.charge < (hitcost)) // If after the deduction the baton doesn't have enough charge for a stun hit it turns off.
turned_on = FALSE
update_icon()
@@ -141,7 +141,7 @@
/obj/item/reagent_containers/spray/mister/attack_self()
return
/proc/check_tank_exists(parent_tank, var/mob/living/carbon/human/M, var/obj/O)
/proc/check_tank_exists(parent_tank, mob/living/carbon/human/M, obj/O)
if(!parent_tank || !istype(parent_tank, /obj/item/watertank)) //To avoid weird issues from admin spawns
M.unEquip(O)
qdel(0)
@@ -182,7 +182,7 @@
/obj/item/watertank/janitor/make_noz()
return new /obj/item/reagent_containers/spray/mister/janitor(src)
/obj/item/reagent_containers/spray/mister/janitor/attack_self(var/mob/user)
/obj/item/reagent_containers/spray/mister/janitor/attack_self(mob/user)
amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10)
to_chat(user, "<span class='notice'>You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.</span>")
+1 -1
View File
@@ -8,7 +8,7 @@
amount = 25
max_amount = 25
/obj/item/stack/tape_roll/New(var/loc, var/amount=null)
/obj/item/stack/tape_roll/New(loc, amount=null)
..()
update_icon()
+2 -75
View File
@@ -638,7 +638,7 @@
/obj/item/twohanded/singularityhammer
name = "singularity hammer"
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
icon_state = "mjollnir0"
icon_state = "singulohammer0"
flags = CONDUCT
slot_flags = SLOT_BACK
force = 5
@@ -665,7 +665,7 @@
charged++
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
icon_state = "singulohammer[wielded]"
..()
/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
@@ -806,76 +806,3 @@
Z.ex_act(2)
charged = 3
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
/obj/item/twohanded/pitchfork
icon_state = "pitchfork0"
name = "pitchfork"
desc = "A simple tool used for moving hay."
force = 7
throwforce = 15
w_class = WEIGHT_CLASS_BULKY
force_unwielded = 7
force_wielded = 15
attack_verb = list("attacked", "impaled", "pierced")
hitsound = 'sound/weapons/bladeslice.ogg'
max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
/obj/item/twohanded/pitchfork/demonic
name = "demonic pitchfork"
desc = "A red pitchfork, it looks like the work of the devil."
force = 19
throwforce = 24
force_unwielded = 19
force_wielded = 25
/obj/item/twohanded/pitchfork/demonic/greater
force = 24
throwforce = 50
force_unwielded = 24
force_wielded = 34
/obj/item/twohanded/pitchfork/demonic/ascended
force = 100
throwforce = 100
force_unwielded = 100
force_wielded = 500000 // Kills you DEAD.
/obj/item/twohanded/pitchfork/update_icon()
icon_state = "pitchfork[wielded]"
/obj/item/twohanded/pitchfork/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] impales \himself in \his abdomen with [src]! It looks like \he's trying to commit suicide...</span>")
return BRUTELOSS
/obj/item/twohanded/pitchfork/demonic/pickup(mob/user)
. = ..()
if(istype(user, /mob/living))
var/mob/living/U = user
if(U.mind && !U.mind.devilinfo && (U.mind.soulOwner == U.mind)) //Burn hands unless they are a devil or have sold their soul
U.visible_message("<span class='warning'>As [U] picks [src] up, [U]'s arms briefly catch fire.</span>", \
"<span class='warning'>\"As you pick up the [src] your arms ignite, reminding you of all your past sins.\"</span>")
if(ishuman(U))
var/mob/living/carbon/human/H = U
H.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
else
U.adjustFireLoss(rand(force/2,force))
/obj/item/twohanded/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user)
if(user.mind && !user.mind.devilinfo && (user.mind.soulOwner != user.mind))
to_chat(user, "<span class ='warning'>The [src] burns in your hands.</span>")
user.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
..()
// It's no fun being the lord of all hell if you can't get out of a simple room
/obj/item/twohanded/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity)
if(!proximity || !wielded)
return
if(istype(target, /turf/simulated/wall))
var/turf/simulated/wall/W = target
user.visible_message("<span class='danger'>[user] blasts \the [target] with \the [src]!</span>")
playsound(target, 'sound/magic/Disintegrate.ogg', 100, 1)
W.devastate_wall(TRUE)
return 1
..()