mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-21 20:13:45 +01:00
Merge remote-tracking branch 'upstream/master' into fix-cqc
# Conflicts: # code/game/objects/items.dm
This commit is contained in:
@@ -46,7 +46,7 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
materials = list(MAT_METAL = 30000)
|
||||
origin_tech = "engineering=4;materials=2"
|
||||
toolspeed = 1
|
||||
usesound = 'sound/items/Deconstruct.ogg'
|
||||
usesound = 'sound/items/deconstruct.ogg'
|
||||
flags_2 = NO_MAT_REDEMPTION_2
|
||||
req_access = list(access_engine)
|
||||
|
||||
@@ -456,20 +456,24 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
/obj/item/rcd/proc/checkResource(amount, mob/user)
|
||||
return matter >= amount
|
||||
|
||||
/obj/item/rcd/borg
|
||||
canRwall = 1
|
||||
var/use_multiplier = 160
|
||||
|
||||
/obj/item/rcd/borg/syndicate
|
||||
use_multiplier = 80
|
||||
|
||||
/obj/item/rcd/borg/useResource(amount, mob/user)
|
||||
if(!isrobot(user))
|
||||
return 0
|
||||
var/mob/living/silicon/robot/R = user
|
||||
return R.cell.use(amount * 160)
|
||||
return R.cell.use(amount * use_multiplier)
|
||||
|
||||
/obj/item/rcd/borg/checkResource(amount, mob/user)
|
||||
if(!isrobot(user))
|
||||
return 0
|
||||
var/mob/living/silicon/robot/R = user
|
||||
return R.cell.charge >= (amount * 160)
|
||||
|
||||
/obj/item/rcd/borg
|
||||
canRwall = 1
|
||||
return R.cell.charge >= (amount * use_multiplier)
|
||||
|
||||
/obj/item/rcd/proc/detonate_pulse()
|
||||
audible_message("<span class='danger'><b>[src] begins to vibrate and \
|
||||
|
||||
@@ -85,6 +85,7 @@
|
||||
else
|
||||
icon_state = "rcl-0"
|
||||
item_state = "rcl-0"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/rcl/proc/is_empty(mob/user, loud = 1)
|
||||
update_icon()
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
|
||||
|
||||
/obj/item/bee_briefcase/attack_self(mob/user as mob)
|
||||
var/bees_released
|
||||
if(!bees_left)
|
||||
to_chat(user, "<span class='danger'>The lack of all and any bees at this event has been somewhat of a let-down...</span>")
|
||||
return
|
||||
@@ -69,4 +70,5 @@
|
||||
var/mob/living/simple_animal/hostile/poison/bees/syndi/B = new /mob/living/simple_animal/hostile/poison/bees/syndi(null)
|
||||
B.master_and_friends = blood_list.Copy() //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
|
||||
B.forceMove(get_turf(user)) //RELEASE THE BEES!
|
||||
bees_left -= 5
|
||||
bees_released++
|
||||
bees_left -= bees_released
|
||||
|
||||
@@ -319,6 +319,10 @@
|
||||
name = "agent card"
|
||||
initial_access = list(access_maint_tunnels, access_vox, access_external_airlocks)
|
||||
|
||||
/obj/item/card/id/syndicate/command
|
||||
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)
|
||||
if(!proximity)
|
||||
return
|
||||
@@ -329,25 +333,6 @@
|
||||
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/proc/fake_id_photo(var/mob/living/carbon/human/H)//get_id_photo wouldn't work correctly
|
||||
if(!istype(H))
|
||||
return
|
||||
var/storedDir = H.dir //don't want to lose track of this
|
||||
|
||||
var/icon/faked = new()
|
||||
if(!H.equip_to_slot_if_possible(src, slot_l_store, 0, 1))
|
||||
to_chat(H, "<span class='warning'>You need to empty your pockets before taking the ID picture.</span>")
|
||||
return
|
||||
|
||||
H.dir = WEST //ensure the icon is actually the proper direction before copying it
|
||||
faked.Insert(getFlatIcon(H), dir = WEST)
|
||||
H.dir = SOUTH
|
||||
faked.Insert(getFlatIcon(H), dir = SOUTH)
|
||||
H.dir = storedDir
|
||||
H.equip_to_slot_if_possible(src, slot_l_hand, 0, 1)
|
||||
|
||||
return faked
|
||||
|
||||
/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))
|
||||
@@ -373,7 +358,7 @@
|
||||
if("Show")
|
||||
return ..()
|
||||
if("Edit")
|
||||
switch(input(user,"What would you like to edit on \the [src]?") in list("Name","Photo","Appearance","Sex","Age","Occupation","Money Account","Blood Type","DNA Hash","Fingerprint Hash","Reset Card"))
|
||||
switch(input(user,"What would you like to edit on \the [src]?") in list("Name", "Photo", "Appearance", "Sex", "Age", "Occupation", "Money Account", "Blood Type", "DNA Hash", "Fingerprint Hash", "Reset Access", "Delete Card Information"))
|
||||
if("Name")
|
||||
var/new_name = reject_bad_name(input(user,"What name would you like to put on this card?","Agent Card Name", ishuman(user) ? user.real_name : user.name))
|
||||
if(!Adjacent(user))
|
||||
@@ -386,11 +371,14 @@
|
||||
if("Photo")
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
var/icon/newphoto = fake_id_photo(user)
|
||||
var/job_clothes = null
|
||||
if(assignment)
|
||||
job_clothes = assignment
|
||||
var/icon/newphoto = get_id_photo(user, job_clothes)
|
||||
if(!newphoto)
|
||||
return
|
||||
photo = newphoto
|
||||
to_chat(user, "<span class='notice'>Photo changed.</span>")
|
||||
to_chat(user, "<span class='notice'>Photo changed. Select another occupation and take a new photo if you wish to appear with different clothes.</span>")
|
||||
RebuildHTML()
|
||||
|
||||
if("Appearance")
|
||||
@@ -428,22 +416,41 @@
|
||||
return
|
||||
if(!choice)
|
||||
return
|
||||
src.icon_state = choice
|
||||
icon_state = choice
|
||||
switch(choice)
|
||||
if("silver")
|
||||
desc = "A silver card which shows honour and dedication."
|
||||
if("gold")
|
||||
desc = "A golden card which shows power and might."
|
||||
if("clown")
|
||||
desc = "Even looking at the card strikes you with deep fear."
|
||||
if("mime")
|
||||
desc = "..."
|
||||
if("prisoner")
|
||||
desc = "You are a number, you are not a free man."
|
||||
if("centcom")
|
||||
desc = "An ID straight from Central Command."
|
||||
else
|
||||
desc = "A card used to provide ID and determine access across the station."
|
||||
to_chat(usr, "<span class='notice'>Appearance changed to [choice].</span>")
|
||||
|
||||
if("Sex")
|
||||
var/new_sex = sanitize(stripped_input(user,"What sex would you like to put on this card?","Agent Card Sex", ishuman(user) ? capitalize(user.gender) : "Male", MAX_MESSAGE_LEN))
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
src.sex = new_sex
|
||||
sex = new_sex
|
||||
to_chat(user, "<span class='notice'>Sex changed to [new_sex].</span>")
|
||||
RebuildHTML()
|
||||
|
||||
if("Age")
|
||||
var/new_age = sanitize(stripped_input(user,"What age would you like to put on this card?","Agent Card Age","21", MAX_MESSAGE_LEN))
|
||||
var/default = "21"
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
default = H.age
|
||||
var/new_age = sanitize(input(user,"What age would you like to be written on this card?","Agent Card Age", default) as text)
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
src.age = new_age
|
||||
age = new_age
|
||||
to_chat(user, "<span class='notice'>Age changed to [new_age].</span>")
|
||||
RebuildHTML()
|
||||
|
||||
@@ -481,7 +488,7 @@
|
||||
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
src.assignment = new_job
|
||||
assignment = new_job
|
||||
to_chat(user, "<span class='notice'>Occupation changed to [new_job].</span>")
|
||||
UpdateName()
|
||||
RebuildHTML()
|
||||
@@ -503,7 +510,7 @@
|
||||
var/new_blood_type = sanitize(input(user,"What blood type would you like to be written on this card?","Agent Card Blood Type",default) as text)
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
src.blood_type = new_blood_type
|
||||
blood_type = new_blood_type
|
||||
to_chat(user, "<span class='notice'>Blood type changed to [new_blood_type].</span>")
|
||||
RebuildHTML()
|
||||
|
||||
@@ -517,7 +524,7 @@
|
||||
var/new_dna_hash = sanitize(input(user,"What DNA hash would you like to be written on this card?","Agent Card DNA Hash",default) as text)
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
src.dna_hash = new_dna_hash
|
||||
dna_hash = new_dna_hash
|
||||
to_chat(user, "<span class='notice'>DNA hash changed to [new_dna_hash].</span>")
|
||||
RebuildHTML()
|
||||
|
||||
@@ -531,26 +538,33 @@
|
||||
var/new_fingerprint_hash = sanitize(input(user,"What fingerprint hash would you like to be written on this card?","Agent Card Fingerprint Hash",default) as text)
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
src.fingerprint_hash = new_fingerprint_hash
|
||||
fingerprint_hash = new_fingerprint_hash
|
||||
to_chat(user, "<span class='notice'>Fingerprint hash changed to [new_fingerprint_hash].</span>")
|
||||
RebuildHTML()
|
||||
|
||||
if("Reset Card")
|
||||
name = initial(name)
|
||||
registered_name = initial(registered_name)
|
||||
icon_state = initial(icon_state)
|
||||
sex = initial(sex)
|
||||
age = initial(age)
|
||||
assignment = initial(assignment)
|
||||
associated_account_number = initial(associated_account_number)
|
||||
blood_type = initial(blood_type)
|
||||
dna_hash = initial(dna_hash)
|
||||
fingerprint_hash = initial(fingerprint_hash)
|
||||
access = initial_access.Copy() // Initial() doesn't work on lists
|
||||
registered_user = null
|
||||
if("Reset Access")
|
||||
var/response = alert(user, "Are you sure you want to reset access saved on the card?","Reset Access", "No", "Yes")
|
||||
if(response == "Yes")
|
||||
access = initial_access.Copy() // Initial() doesn't work on lists
|
||||
to_chat(user, "<span class='notice'>Card access reset.</span>")
|
||||
|
||||
to_chat(user, "<span class='notice'>All information has been deleted from \the [src].</span>")
|
||||
RebuildHTML()
|
||||
if("Delete Card Information")
|
||||
var/response = alert(user, "Are you sure you want to delete all information saved on the card?","Delete Card Information", "No", "Yes")
|
||||
if(response == "Yes")
|
||||
name = initial(name)
|
||||
registered_name = initial(registered_name)
|
||||
icon_state = initial(icon_state)
|
||||
sex = initial(sex)
|
||||
age = initial(age)
|
||||
assignment = initial(assignment)
|
||||
associated_account_number = initial(associated_account_number)
|
||||
blood_type = initial(blood_type)
|
||||
dna_hash = initial(dna_hash)
|
||||
fingerprint_hash = initial(fingerprint_hash)
|
||||
photo = null
|
||||
registered_user = null
|
||||
to_chat(user, "<span class='notice'>All information has been deleted from \the [src].</span>")
|
||||
RebuildHTML()
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -561,7 +575,7 @@
|
||||
icon_state = "syndie"
|
||||
assignment = "Syndicate Overlord"
|
||||
untrackable = 1
|
||||
access = list(access_syndicate, access_external_airlocks)
|
||||
access = list(access_syndicate, access_syndicate_leader, access_syndicate_command, access_external_airlocks)
|
||||
|
||||
/obj/item/card/id/captains_spare
|
||||
name = "captain's spare ID"
|
||||
@@ -771,6 +785,27 @@
|
||||
icon_state = "ERT_engineering"
|
||||
/obj/item/card/id/ert/medic
|
||||
icon_state = "ERT_medical"
|
||||
|
||||
/obj/item/card/id/golem
|
||||
name = "Free Golem ID"
|
||||
desc = "A card used to claim mining points and buy gear. Use it to mark it as yours."
|
||||
icon_state = "research"
|
||||
access = list(access_free_golems, access_robotics, access_clown, access_mime) //access to robots/mechs
|
||||
var/registered = FALSE
|
||||
|
||||
/obj/item/card/id/golem/attack_self(mob/user as mob)
|
||||
if(!registered && ishuman(user))
|
||||
registered_name = user.real_name
|
||||
SetOwnerInfo(user)
|
||||
assignment = "Free Golem"
|
||||
RebuildHTML()
|
||||
UpdateName()
|
||||
desc = "A card used to claim mining points and buy gear."
|
||||
registered = TRUE
|
||||
to_chat(user, "<span class='notice'>The ID is now registered as yours.</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
// Decals
|
||||
/obj/item/id_decal
|
||||
name = "identification card decal"
|
||||
|
||||
@@ -61,7 +61,8 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/clothing/mask/cigarette/fire_act()
|
||||
/obj/item/clothing/mask/cigarette/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
|
||||
..()
|
||||
light()
|
||||
|
||||
/obj/item/clothing/mask/cigarette/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
@@ -196,7 +197,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
if(is_being_smoked) // if it's being smoked, transfer reagents to the mob
|
||||
var/mob/living/carbon/C = loc
|
||||
for (var/datum/reagent/R in reagents.reagent_list)
|
||||
reagents.trans_to(C, REAGENTS_METABOLISM)
|
||||
reagents.trans_id_to(C, R.id, max(REAGENTS_METABOLISM / reagents.reagent_list.len, 0.1)) //transfer at least .1 of each chem
|
||||
if(!reagents.total_volume) // There were reagents, but now they're gone
|
||||
to_chat(C, "<span class='notice'>Your [name] loses its flavor.</span>")
|
||||
else // else just remove some of the reagents
|
||||
@@ -232,7 +233,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
type_butt = /obj/item/cigbutt/roach
|
||||
throw_speed = 0.5
|
||||
item_state = "spliffoff"
|
||||
smoketime = 180
|
||||
smoketime = 250
|
||||
chem_volume = 100
|
||||
|
||||
/obj/item/clothing/mask/cigarette/rollie/New()
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
icon_state = "razor"
|
||||
flags = CONDUCT
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
usesound = 'sound/items/Welder2.ogg'
|
||||
usesound = 'sound/items/welder2.ogg'
|
||||
toolspeed = 1
|
||||
|
||||
/obj/item/razor/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/obj/item/gavelhammer/suicide_act(mob/user)
|
||||
user.visible_message("<span class='warning'>[user] has sentenced [user.p_them()]self to death with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/gavelblock
|
||||
name = "gavel block"
|
||||
|
||||
@@ -41,6 +41,10 @@
|
||||
update_overlays()
|
||||
update_charge()
|
||||
|
||||
/obj/item/defibrillator/examine(mob/user)
|
||||
..(user)
|
||||
to_chat(user,"<span class='notice'>Ctrl-click to remove the paddles from the defibrillator.")
|
||||
|
||||
/obj/item/defibrillator/proc/update_power()
|
||||
if(bcell)
|
||||
if(bcell.charge < paddles.revivecost)
|
||||
@@ -118,11 +122,11 @@
|
||||
if(safety)
|
||||
safety = 0
|
||||
src.visible_message("<span class='notice'>[src] beeps: Safety protocols disabled!</span>")
|
||||
playsound(get_turf(src), 'sound/machines/defib_saftyOff.ogg', 50, 0)
|
||||
playsound(get_turf(src), 'sound/machines/defib_saftyoff.ogg', 50, 0)
|
||||
else
|
||||
safety = 1
|
||||
src.visible_message("<span class='notice'>[src] beeps: Safety protocols enabled!</span>")
|
||||
playsound(get_turf(src), 'sound/machines/defib_saftyOn.ogg', 50, 0)
|
||||
playsound(get_turf(src), 'sound/machines/defib_saftyon.ogg', 50, 0)
|
||||
update_icon()
|
||||
..()
|
||||
|
||||
@@ -279,7 +283,7 @@
|
||||
user.visible_message("<span class='danger'>[user] is putting the live paddles on [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
defib.deductcharge(revivecost)
|
||||
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
return (OXYLOSS)
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/twohanded/shockpaddles/dropped(mob/user as mob)
|
||||
if(user)
|
||||
@@ -294,8 +298,10 @@
|
||||
return unwield(user)
|
||||
|
||||
/obj/item/twohanded/shockpaddles/on_mob_move(dir, mob/user)
|
||||
if(defib && !(defib.Adjacent(user)))
|
||||
defib.remove_paddles(user)
|
||||
if(defib)
|
||||
var/turf/t = get_turf(defib)
|
||||
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)
|
||||
if(!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns
|
||||
@@ -307,7 +313,7 @@
|
||||
|
||||
/obj/item/twohanded/shockpaddles/attack(mob/M, mob/user)
|
||||
var/tobehealed
|
||||
var/threshold = -config.health_threshold_dead
|
||||
var/threshold = -HEALTH_THRESHOLD_DEAD
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(busy)
|
||||
@@ -336,6 +342,7 @@
|
||||
H.emote("gasp")
|
||||
if(!H.undergoing_cardiac_arrest() && (prob(10) || defib.combat)) // Your heart explodes.
|
||||
H.set_heartattack(TRUE)
|
||||
H.shock_internal_organs(100)
|
||||
add_attack_logs(user, M, "Stunned with [src]")
|
||||
defib.deductcharge(revivecost)
|
||||
cooldown = 1
|
||||
@@ -357,8 +364,8 @@
|
||||
|
||||
QDEL_NULL(ghost)
|
||||
var/tplus = world.time - H.timeofdeath
|
||||
var/tlimit = 3000 //past this much time the patient is unrecoverable (in deciseconds)
|
||||
var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting
|
||||
var/tlimit = DEFIB_TIME_LIMIT * 10 //past this much time the patient is unrecoverable (in deciseconds)
|
||||
var/tloss = DEFIB_TIME_LOSS * 10 //brain damage starts setting in on the patient after some time left rotting
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
|
||||
@@ -386,6 +393,7 @@
|
||||
update_icon()
|
||||
return
|
||||
H.set_heartattack(FALSE)
|
||||
H.shock_internal_organs(100)
|
||||
user.visible_message("<span class='boldnotice'>[defib] pings: Cardiac arrhythmia corrected.</span>")
|
||||
M.visible_message("<span class='warning'>[M]'s body convulses a bit.")
|
||||
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
@@ -405,7 +413,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 && !(NOCLONE in H.mutations) && (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 && !(NOCLONE in H.mutations) && (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)))
|
||||
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)
|
||||
@@ -420,6 +428,9 @@
|
||||
H.emote("gasp")
|
||||
if(tplus > tloss)
|
||||
H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))))
|
||||
H.shock_internal_organs(100)
|
||||
H.med_hud_set_health()
|
||||
H.med_hud_set_status()
|
||||
defib.deductcharge(revivecost)
|
||||
add_attack_logs(user, M, "Revived with [src]")
|
||||
else
|
||||
@@ -461,7 +472,7 @@
|
||||
|
||||
/obj/item/borg_defib/attack(mob/M, mob/user)
|
||||
var/tobehealed
|
||||
var/threshold = -config.health_threshold_dead
|
||||
var/threshold = -HEALTH_THRESHOLD_DEAD
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(busy)
|
||||
@@ -480,6 +491,7 @@
|
||||
H.Weaken(5)
|
||||
if(!H.undergoing_cardiac_arrest() && prob(10)) // Your heart explodes.
|
||||
H.set_heartattack(TRUE)
|
||||
H.shock_internal_organs(100)
|
||||
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
H.emote("gasp")
|
||||
add_attack_logs(user, M, "Stunned with [src]")
|
||||
@@ -512,7 +524,7 @@
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
|
||||
if(H.stat == 2)
|
||||
if(H.stat == DEAD)
|
||||
var/health = H.health
|
||||
M.visible_message("<span class='warning'>[M]'s body convulses a bit.")
|
||||
playsound(get_turf(src), "bodyfall", 50, 1)
|
||||
@@ -520,7 +532,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 && !(NOCLONE in H.mutations))
|
||||
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations) && (H.mind && H.mind.is_revivable()))
|
||||
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)
|
||||
@@ -535,6 +547,7 @@
|
||||
H.emote("gasp")
|
||||
if(tplus > tloss)
|
||||
H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))))
|
||||
H.shock_internal_organs(100)
|
||||
if(isrobot(user))
|
||||
var/mob/living/silicon/robot/R = user
|
||||
R.cell.use(revivecost)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "Contains all the luck you'll ever need."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "dicebag"
|
||||
can_hold = list(/obj/item/dice)
|
||||
|
||||
/obj/item/storage/pill_bottle/dice/New()
|
||||
..()
|
||||
|
||||
@@ -12,16 +12,18 @@
|
||||
origin_tech = "biotech=1"
|
||||
|
||||
var/damage_coeff = 1
|
||||
var/used = 0
|
||||
var/used = FALSE
|
||||
|
||||
// USE ONLY IN PREMADE SYRINGES. WILL NOT WORK OTHERWISE.
|
||||
var/datatype = 0
|
||||
var/value = 0
|
||||
var/forcedmutation = FALSE //Will it give the mutation, guaranteed?
|
||||
|
||||
/obj/item/dnainjector/New()
|
||||
/obj/item/dnainjector/Initialize()
|
||||
. = ..()
|
||||
if(datatype && block)
|
||||
buf=new
|
||||
buf.dna=new
|
||||
buf = new
|
||||
buf.dna = new
|
||||
buf.types = datatype
|
||||
buf.dna.ResetSE()
|
||||
SetValue(value)
|
||||
@@ -30,53 +32,56 @@
|
||||
QDEL_NULL(buf)
|
||||
return ..()
|
||||
|
||||
/obj/item/dnainjector/proc/GetRealBlock(var/selblock)
|
||||
if(selblock==0)
|
||||
/obj/item/dnainjector/proc/GetRealBlock(selblock)
|
||||
if(selblock == 0)
|
||||
return block
|
||||
else
|
||||
return selblock
|
||||
|
||||
/obj/item/dnainjector/proc/GetState(var/selblock=0)
|
||||
var/real_block=GetRealBlock(selblock)
|
||||
if(buf.types&DNA2_BUF_SE)
|
||||
/obj/item/dnainjector/proc/GetState(selblock = 0)
|
||||
var/real_block = GetRealBlock(selblock)
|
||||
if(buf.types & DNA2_BUF_SE)
|
||||
return buf.dna.GetSEState(real_block)
|
||||
else
|
||||
return buf.dna.GetUIState(real_block)
|
||||
|
||||
/obj/item/dnainjector/proc/SetState(var/on, var/selblock=0)
|
||||
var/real_block=GetRealBlock(selblock)
|
||||
if(buf.types&DNA2_BUF_SE)
|
||||
/obj/item/dnainjector/proc/SetState(on, selblock = 0)
|
||||
var/real_block = GetRealBlock(selblock)
|
||||
if(buf.types & DNA2_BUF_SE)
|
||||
return buf.dna.SetSEState(real_block,on)
|
||||
else
|
||||
return buf.dna.SetUIState(real_block,on)
|
||||
|
||||
/obj/item/dnainjector/proc/GetValue(var/selblock=0)
|
||||
var/real_block=GetRealBlock(selblock)
|
||||
if(buf.types&DNA2_BUF_SE)
|
||||
/obj/item/dnainjector/proc/GetValue(selblock = 0)
|
||||
var/real_block = GetRealBlock(selblock)
|
||||
if(buf.types & DNA2_BUF_SE)
|
||||
return buf.dna.GetSEValue(real_block)
|
||||
else
|
||||
return buf.dna.GetUIValue(real_block)
|
||||
|
||||
/obj/item/dnainjector/proc/SetValue(var/val,var/selblock=0)
|
||||
var/real_block=GetRealBlock(selblock)
|
||||
if(buf.types&DNA2_BUF_SE)
|
||||
/obj/item/dnainjector/proc/SetValue(val, selblock = 0)
|
||||
var/real_block = GetRealBlock(selblock)
|
||||
if(buf.types & DNA2_BUF_SE)
|
||||
return buf.dna.SetSEValue(real_block,val)
|
||||
else
|
||||
return buf.dna.SetUIValue(real_block,val)
|
||||
|
||||
/obj/item/dnainjector/proc/inject(mob/living/M as mob, mob/user as mob)
|
||||
/obj/item/dnainjector/proc/inject(mob/living/M, mob/user)
|
||||
if(used)
|
||||
return
|
||||
if(istype(M,/mob/living))
|
||||
M.apply_effect(rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)),IRRADIATE,0,1)
|
||||
M.apply_effect(rand(20 / (damage_coeff ** 2), 50 / (damage_coeff ** 2)), IRRADIATE, 0, 1)
|
||||
var/mob/living/carbon/human/H
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
H = M
|
||||
|
||||
if(!buf)
|
||||
log_runtime(EXCEPTION("[src] used by [user] on [M] failed to initialize properly."), src)
|
||||
return
|
||||
|
||||
spawn(0) //Some mutations have sleeps in them, like monkey
|
||||
if(!(NOCLONE in M.mutations) && !(H && (NO_DNA in H.dna.species.species_traits))) // prevents drained people from having their DNA changed
|
||||
var/prev_ue = M.dna.unique_enzymes
|
||||
var/mutflags = 0
|
||||
// UI in syringe.
|
||||
if(buf.types & DNA2_BUF_UI)
|
||||
if(!block) //isolated block?
|
||||
@@ -93,35 +98,34 @@
|
||||
M.dna.SetUIValue(block,src.GetValue())
|
||||
M.UpdateAppearance()
|
||||
if(buf.types & DNA2_BUF_SE)
|
||||
mutflags = MUTCHK_FORCED
|
||||
if(!block) //isolated block?
|
||||
M.dna.SE = buf.dna.SE.Copy()
|
||||
M.dna.UpdateSE()
|
||||
else
|
||||
M.dna.SetSEValue(block,src.GetValue())
|
||||
domutcheck(M, null, mutflags)
|
||||
domutcheck(M, null, forcedmutation ? MUTCHK_FORCED : 0)
|
||||
M.update_mutations()
|
||||
if(H)
|
||||
H.sync_organ_dna(assimilate = 0, old_ue = prev_ue)
|
||||
|
||||
/obj/item/dnainjector/attack(mob/M as mob, mob/user as mob)
|
||||
/obj/item/dnainjector/attack(mob/M, mob/user)
|
||||
if(used)
|
||||
to_chat(user, "<span class='warning'>This injector is used up!</span>")
|
||||
return
|
||||
if(!M.dna) //You know what would be nice? If the mob you're injecting has DNA, and so doesn't cause runtimes.
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(NO_DNA in H.dna.species.species_traits)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(!user.IsAdvancedToolUser())
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/attack_log = "injected with the Isolated [name]"
|
||||
|
||||
if(buf.types & DNA2_BUF_SE)
|
||||
if(buf && buf.types & DNA2_BUF_SE)
|
||||
if(block)
|
||||
if(GetState() && block == MONKEYBLOCK && ishuman(M))
|
||||
attack_log = "injected with the Isolated [name] (MONKEY)"
|
||||
@@ -149,7 +153,7 @@
|
||||
M.LAssailant = user
|
||||
|
||||
inject(M, user)
|
||||
used = 1
|
||||
used = TRUE
|
||||
icon_state = "dnainjector0"
|
||||
desc += " This one is used up."
|
||||
|
||||
@@ -158,9 +162,9 @@
|
||||
desc = "This will make you big and strong, but give you a bad skin condition."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/hulkmut/New()
|
||||
/obj/item/dnainjector/hulkmut/Initialize()
|
||||
block = HULKBLOCK
|
||||
..()
|
||||
|
||||
@@ -169,9 +173,9 @@
|
||||
desc = "Cures green skin."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antihulk/New()
|
||||
/obj/item/dnainjector/antihulk/Initialize()
|
||||
block = HULKBLOCK
|
||||
..()
|
||||
|
||||
@@ -180,9 +184,9 @@
|
||||
desc = "Finally you can see what the Captain does."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 8
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/xraymut/New()
|
||||
/obj/item/dnainjector/xraymut/Initialize()
|
||||
block = XRAYBLOCK
|
||||
..()
|
||||
|
||||
@@ -191,9 +195,9 @@
|
||||
desc = "It will make you see harder."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 8
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antixray/New()
|
||||
/obj/item/dnainjector/antixray/Initialize()
|
||||
block = XRAYBLOCK
|
||||
..()
|
||||
|
||||
@@ -202,9 +206,9 @@
|
||||
desc = "Gives you fire."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 10
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/firemut/New()
|
||||
/obj/item/dnainjector/firemut/Initialize()
|
||||
block = FIREBLOCK
|
||||
..()
|
||||
|
||||
@@ -213,9 +217,9 @@
|
||||
desc = "Cures fire."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 10
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antifire/New()
|
||||
/obj/item/dnainjector/antifire/Initialize()
|
||||
block = FIREBLOCK
|
||||
..()
|
||||
|
||||
@@ -224,9 +228,9 @@
|
||||
desc = "Super brain man!"
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 12
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/telemut/New()
|
||||
/obj/item/dnainjector/telemut/Initialize()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
@@ -240,9 +244,9 @@
|
||||
desc = "Will make you not able to control your mind."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 12
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antitele/New()
|
||||
/obj/item/dnainjector/antitele/Initialize()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
@@ -251,9 +255,9 @@
|
||||
desc = "Hold your breath and count to infinity."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/nobreath/New()
|
||||
/obj/item/dnainjector/nobreath/Initialize()
|
||||
block = BREATHLESSBLOCK
|
||||
..()
|
||||
|
||||
@@ -262,9 +266,9 @@
|
||||
desc = "Hold your breath and count to 100."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antinobreath/New()
|
||||
/obj/item/dnainjector/antinobreath/Initialize()
|
||||
block = BREATHLESSBLOCK
|
||||
..()
|
||||
|
||||
@@ -273,9 +277,9 @@
|
||||
desc = "Stare into the distance for a reason."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/remoteview/New()
|
||||
/obj/item/dnainjector/remoteview/Initialize()
|
||||
block = REMOTEVIEWBLOCK
|
||||
..()
|
||||
|
||||
@@ -284,9 +288,9 @@
|
||||
desc = "Cures green skin."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antiremoteview/New()
|
||||
/obj/item/dnainjector/antiremoteview/Initialize()
|
||||
block = REMOTEVIEWBLOCK
|
||||
..()
|
||||
|
||||
@@ -295,9 +299,9 @@
|
||||
desc = "Healthy but hungry."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/regenerate/New()
|
||||
/obj/item/dnainjector/regenerate/Initialize()
|
||||
block = REGENERATEBLOCK
|
||||
..()
|
||||
|
||||
@@ -306,9 +310,9 @@
|
||||
desc = "Sickly but sated."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antiregenerate/New()
|
||||
/obj/item/dnainjector/antiregenerate/Initialize()
|
||||
block = REGENERATEBLOCK
|
||||
..()
|
||||
|
||||
@@ -317,9 +321,9 @@
|
||||
desc = "Running Man."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/runfast/New()
|
||||
/obj/item/dnainjector/runfast/Initialize()
|
||||
block = INCREASERUNBLOCK
|
||||
..()
|
||||
|
||||
@@ -328,9 +332,9 @@
|
||||
desc = "Walking Man."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antirunfast/New()
|
||||
/obj/item/dnainjector/antirunfast/Initialize()
|
||||
block = INCREASERUNBLOCK
|
||||
..()
|
||||
|
||||
@@ -339,9 +343,9 @@
|
||||
desc = "A total makeover."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/morph/New()
|
||||
/obj/item/dnainjector/morph/Initialize()
|
||||
block = MORPHBLOCK
|
||||
..()
|
||||
|
||||
@@ -350,9 +354,9 @@
|
||||
desc = "Cures identity crisis."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antimorph/New()
|
||||
/obj/item/dnainjector/antimorph/Initialize()
|
||||
block = MORPHBLOCK
|
||||
..()
|
||||
|
||||
@@ -361,9 +365,9 @@
|
||||
desc = "Better than a pair of budget insulated gloves."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/noprints/New()
|
||||
/obj/item/dnainjector/noprints/Initialize()
|
||||
block = NOPRINTSBLOCK
|
||||
..()
|
||||
|
||||
@@ -372,9 +376,9 @@
|
||||
desc = "Not quite as good as a pair of budget insulated gloves."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antinoprints/New()
|
||||
/obj/item/dnainjector/antinoprints/Initialize()
|
||||
block = NOPRINTSBLOCK
|
||||
..()
|
||||
|
||||
@@ -383,9 +387,9 @@
|
||||
desc = "Better than a pair of real insulated gloves."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/insulation/New()
|
||||
/obj/item/dnainjector/insulation/Initialize()
|
||||
block = SHOCKIMMUNITYBLOCK
|
||||
..()
|
||||
|
||||
@@ -394,9 +398,9 @@
|
||||
desc = "Not quite as good as a pair of real insulated gloves."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antiinsulation/New()
|
||||
/obj/item/dnainjector/antiinsulation/Initialize()
|
||||
block = SHOCKIMMUNITYBLOCK
|
||||
..()
|
||||
|
||||
@@ -405,9 +409,9 @@
|
||||
desc = "Makes you shrink."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/midgit/New()
|
||||
/obj/item/dnainjector/midgit/Initialize()
|
||||
block = SMALLSIZEBLOCK
|
||||
..()
|
||||
|
||||
@@ -416,9 +420,9 @@
|
||||
desc = "Makes you grow. But not too much."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antimidgit/New()
|
||||
/obj/item/dnainjector/antimidgit/Initialize()
|
||||
block = SMALLSIZEBLOCK
|
||||
..()
|
||||
|
||||
@@ -428,9 +432,9 @@
|
||||
desc = "Toss away those glasses!"
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 1
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antiglasses/New()
|
||||
/obj/item/dnainjector/antiglasses/Initialize()
|
||||
block = GLASSESBLOCK
|
||||
..()
|
||||
|
||||
@@ -439,9 +443,9 @@
|
||||
desc = "Will make you need dorkish glasses."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 1
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/glassesmut/New()
|
||||
/obj/item/dnainjector/glassesmut/Initialize()
|
||||
block = GLASSESBLOCK
|
||||
..()
|
||||
|
||||
@@ -450,9 +454,9 @@
|
||||
desc = "Shake shake shake the room!"
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 3
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/epimut/New()
|
||||
/obj/item/dnainjector/epimut/Initialize()
|
||||
block = EPILEPSYBLOCK
|
||||
..()
|
||||
|
||||
@@ -461,9 +465,9 @@
|
||||
desc = "Will fix you up from shaking the room."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 3
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antiepi/New()
|
||||
/obj/item/dnainjector/antiepi/Initialize()
|
||||
block = EPILEPSYBLOCK
|
||||
..()
|
||||
|
||||
@@ -472,9 +476,9 @@
|
||||
desc = "Will stop that awful noise."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 5
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/anticough/New()
|
||||
/obj/item/dnainjector/anticough/Initialize()
|
||||
block = COUGHBLOCK
|
||||
..()
|
||||
|
||||
@@ -483,9 +487,9 @@
|
||||
desc = "Will bring forth a sound of horror from your throat."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 5
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/coughmut/New()
|
||||
/obj/item/dnainjector/coughmut/Initialize()
|
||||
block = COUGHBLOCK
|
||||
..()
|
||||
|
||||
@@ -494,9 +498,9 @@
|
||||
desc = "Makes clumsy minions."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 6
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/clumsymut/New()
|
||||
/obj/item/dnainjector/clumsymut/Initialize()
|
||||
block = CLUMSYBLOCK
|
||||
..()
|
||||
|
||||
@@ -505,9 +509,9 @@
|
||||
desc = "Cleans up confusion."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 6
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/anticlumsy/New()
|
||||
/obj/item/dnainjector/anticlumsy/Initialize()
|
||||
block = CLUMSYBLOCK
|
||||
..()
|
||||
|
||||
@@ -516,9 +520,9 @@
|
||||
desc = "Will cure tourrets."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 7
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antitour/New()
|
||||
/obj/item/dnainjector/antitour/Initialize()
|
||||
block = TWITCHBLOCK
|
||||
..()
|
||||
|
||||
@@ -527,9 +531,9 @@
|
||||
desc = "Gives you a nasty case off tourrets."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 7
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/tourmut/New()
|
||||
/obj/item/dnainjector/tourmut/Initialize()
|
||||
block = TWITCHBLOCK
|
||||
..()
|
||||
|
||||
@@ -538,9 +542,9 @@
|
||||
desc = "Makes you s-s-stuttterrr"
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 9
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/stuttmut/New()
|
||||
/obj/item/dnainjector/stuttmut/Initialize()
|
||||
block = NERVOUSBLOCK
|
||||
..()
|
||||
|
||||
@@ -550,9 +554,9 @@
|
||||
desc = "Fixes that speaking impairment."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 9
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antistutt/New()
|
||||
/obj/item/dnainjector/antistutt/Initialize()
|
||||
block = NERVOUSBLOCK
|
||||
..()
|
||||
|
||||
@@ -561,9 +565,9 @@
|
||||
desc = "Makes you not see anything."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 11
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/blindmut/New()
|
||||
/obj/item/dnainjector/blindmut/Initialize()
|
||||
block = BLINDBLOCK
|
||||
..()
|
||||
|
||||
@@ -572,9 +576,9 @@
|
||||
desc = "ITS A MIRACLE!!!"
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 11
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antiblind/New()
|
||||
/obj/item/dnainjector/antiblind/Initialize()
|
||||
block = BLINDBLOCK
|
||||
..()
|
||||
|
||||
@@ -583,9 +587,9 @@
|
||||
desc = "Super brain man!"
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 12
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/telemut/New()
|
||||
/obj/item/dnainjector/telemut/Initialize()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
@@ -594,9 +598,9 @@
|
||||
desc = "Will make you not able to control your mind."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 12
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antitele/New()
|
||||
/obj/item/dnainjector/antitele/Initialize()
|
||||
block = TELEBLOCK
|
||||
..()
|
||||
|
||||
@@ -605,9 +609,9 @@
|
||||
desc = "Sorry, what did you say?"
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 13
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/deafmut/New()
|
||||
/obj/item/dnainjector/deafmut/Initialize()
|
||||
block = DEAFBLOCK
|
||||
..()
|
||||
|
||||
@@ -616,9 +620,9 @@
|
||||
desc = "Will make you hear once more."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 13
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antideaf/New()
|
||||
/obj/item/dnainjector/antideaf/Initialize()
|
||||
block = DEAFBLOCK
|
||||
..()
|
||||
|
||||
@@ -627,9 +631,9 @@
|
||||
desc = "What you see isn't always what you get."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/hallucination/New()
|
||||
/obj/item/dnainjector/hallucination/Initialize()
|
||||
block = HALLUCINATIONBLOCK
|
||||
..()
|
||||
|
||||
@@ -638,9 +642,9 @@
|
||||
desc = "What you see is what you get."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 2
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/antihallucination/New()
|
||||
/obj/item/dnainjector/antihallucination/Initialize()
|
||||
block = HALLUCINATIONBLOCK
|
||||
..()
|
||||
|
||||
@@ -649,9 +653,9 @@
|
||||
desc = "Will make you a flea bag."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0xFFF
|
||||
//block = 14
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/h2m/New()
|
||||
/obj/item/dnainjector/h2m/Initialize()
|
||||
block = MONKEYBLOCK
|
||||
..()
|
||||
|
||||
@@ -660,8 +664,8 @@
|
||||
desc = "Will make you...less hairy."
|
||||
datatype = DNA2_BUF_SE
|
||||
value = 0x001
|
||||
//block = 14
|
||||
forcedmutation = TRUE
|
||||
|
||||
/obj/item/dnainjector/m2h/New()
|
||||
/obj/item/dnainjector/m2h/Initialize()
|
||||
block = MONKEYBLOCK
|
||||
..()
|
||||
..()
|
||||
@@ -109,11 +109,14 @@
|
||||
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)
|
||||
prime()
|
||||
user.gib()
|
||||
return OBLITERATION
|
||||
|
||||
/obj/item/grenade/plastic/update_icon()
|
||||
if(nadeassembly)
|
||||
@@ -133,13 +136,16 @@
|
||||
var/turf/location
|
||||
if(target)
|
||||
if(!QDELETED(target))
|
||||
location = get_turf(target)
|
||||
if(istype(target, /turf/))
|
||||
location = get_turf(target) // Set the explosion location to turf if planted directly on a wall or floor
|
||||
else
|
||||
location = get_atom_on_turf(target) // Otherwise, make sure we're blowing up what's on top of the turf
|
||||
target.overlays -= image_overlay
|
||||
else
|
||||
location = get_turf(src)
|
||||
location = get_atom_on_turf(src)
|
||||
if(location)
|
||||
location.ex_act(2, target)
|
||||
explosion(location,0,0,3)
|
||||
location.ex_act(2, target)
|
||||
if(istype(target, /mob))
|
||||
var/mob/M = target
|
||||
M.gib()
|
||||
@@ -160,10 +166,13 @@
|
||||
var/turf/location
|
||||
if(target)
|
||||
if(!QDELETED(target))
|
||||
location = get_turf(target)
|
||||
if(istype(target, /turf/))
|
||||
location = get_turf(target)
|
||||
else
|
||||
location = get_atom_on_turf(target)
|
||||
target.overlays -= image_overlay
|
||||
else
|
||||
location = get_turf(src)
|
||||
location = get_atom_on_turf(src)
|
||||
if(location)
|
||||
if(target && target.density)
|
||||
var/turf/T = get_step(location, aim_dir)
|
||||
|
||||
@@ -168,4 +168,4 @@
|
||||
/obj/item/twohanded/garrote/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is wrapping the [src] around [user.p_their()] neck and pulling the handles! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1)
|
||||
return (OXYLOSS)
|
||||
return OXYLOSS
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
|
||||
|
||||
|
||||
/obj/item/grenade/gas
|
||||
name = "Plasma Fire Grenade"
|
||||
name = "plasma fire grenade"
|
||||
desc = "A compressed plasma grenade, used to start horrific plasma fires."
|
||||
origin_tech = "materials=3;magnets=4;syndicate=3"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
@@ -18,7 +15,40 @@
|
||||
target_turf.air_update_turf()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/gas/plasma
|
||||
icon_state = "plasma"
|
||||
|
||||
/obj/item/grenade/gas/knockout
|
||||
name = "Knockout Grenade"
|
||||
desc = "A grenade that completely removes all air and heat from its detonation area."
|
||||
spawn_contents = SPAWN_20C | SPAWN_N2O
|
||||
name = "knockout grenade"
|
||||
desc = "A grenade that releases pure N2O gas."
|
||||
spawn_contents = SPAWN_20C | SPAWN_N2O
|
||||
|
||||
/obj/item/grenade/gas/oxygen
|
||||
name = "oxygen grenade"
|
||||
desc = "A grenade that releases pure O2 gas."
|
||||
icon_state = "oxygen"
|
||||
spawn_contents = SPAWN_20C | SPAWN_OXYGEN
|
||||
spawn_amount = 500
|
||||
|
||||
/obj/item/grenade/gluon
|
||||
desc = "An advanced grenade that releases a harmful stream of gluons inducing radiation in those nearby. These gluon streams will also make victims feel exhausted, and induce shivering. This extreme coldness will also wet any nearby floors."
|
||||
name = "gluon grenade"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "gluon"
|
||||
item_state = "flashbang"
|
||||
var/range = 4
|
||||
var/rad_damage = 60
|
||||
var/stamina_damage = 30
|
||||
|
||||
/obj/item/grenade/gluon/prime()
|
||||
update_mob()
|
||||
playsound(loc, 'sound/effects/empulse.ogg', 50, 1)
|
||||
for(var/turf/T in view(range, loc))
|
||||
if(isfloorturf(T))
|
||||
var/turf/simulated/F = T
|
||||
F.MakeSlippery(TURF_WET_PERMAFROST)
|
||||
for(var/mob/living/carbon/L in T)
|
||||
L.adjustStaminaLoss(stamina_damage)
|
||||
L.apply_effect(rad_damage, IRRADIATE)
|
||||
L.adjust_bodytemperature(-230)
|
||||
qdel(src)
|
||||
@@ -11,7 +11,7 @@
|
||||
var/payload_name = null // used for spawned grenades
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 2
|
||||
var/prime_sound = 'sound/items/Screwdriver2.ogg'
|
||||
var/prime_sound = 'sound/items/screwdriver2.ogg'
|
||||
var/stage = EMPTY
|
||||
var/list/beakers = list()
|
||||
var/list/allowed_containers = list(/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle)
|
||||
@@ -235,7 +235,7 @@
|
||||
nadeassembly.process_movement()
|
||||
|
||||
/obj/item/grenade/chem_grenade/pickup()
|
||||
..()
|
||||
. = ..()
|
||||
if(nadeassembly)
|
||||
nadeassembly.process_movement()
|
||||
|
||||
@@ -247,9 +247,9 @@
|
||||
if(nadeassembly)
|
||||
nadeassembly.on_found(finder)
|
||||
|
||||
/obj/item/grenade/chem_grenade/hear_talk(mob/living/M, msg)
|
||||
/obj/item/grenade/chem_grenade/hear_talk(mob/living/M, list/message_pieces)
|
||||
if(nadeassembly)
|
||||
nadeassembly.hear_talk(M, msg)
|
||||
nadeassembly.hear_talk(M, message_pieces)
|
||||
|
||||
/obj/item/grenade/chem_grenade/hear_message(mob/living/M, msg)
|
||||
if(nadeassembly)
|
||||
@@ -275,7 +275,7 @@
|
||||
reactants += G.reagents
|
||||
|
||||
if(!chem_splash(get_turf(src), affected_area, reactants, ignition_temp, threatscale) && !no_splash)
|
||||
playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1)
|
||||
playsound(loc, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
if(beakers.len)
|
||||
for(var/obj/O in beakers)
|
||||
O.forceMove(get_turf(src))
|
||||
@@ -526,20 +526,20 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/grenade/chem_grenade/facid
|
||||
name = "acid grenade"
|
||||
desc = "Used for melting armoured opponents."
|
||||
payload_name = "acid smoke"
|
||||
desc = "Use to chew up opponents from the inside out."
|
||||
stage = READY
|
||||
|
||||
/obj/item/grenade/chem_grenade/facid/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("facid", 280)
|
||||
B1.reagents.add_reagent("facid", 80)
|
||||
B1.reagents.add_reagent("potassium", 20)
|
||||
B2.reagents.add_reagent("phosphorus", 20)
|
||||
B2.reagents.add_reagent("sugar", 20)
|
||||
B2.reagents.add_reagent("facid", 260)
|
||||
B2.reagents.add_reagent("facid", 60)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
payload = /obj/item/grenade/chem_grenade/cleaner
|
||||
|
||||
/obj/item/grenade/clusterbuster/teargas
|
||||
name = "Oignon Grenade"
|
||||
name = "Oignon Teargas Grenade"
|
||||
payload = /obj/item/grenade/chem_grenade/teargas
|
||||
|
||||
/obj/item/grenade/clusterbuster/facid
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
light_power = 10
|
||||
light_color = LIGHT_COLOR_WHITE
|
||||
var/light_time = 2
|
||||
var/range = 7
|
||||
|
||||
/obj/item/grenade/flashbang/prime()
|
||||
update_mob()
|
||||
@@ -15,60 +16,65 @@
|
||||
|
||||
set_light(7)
|
||||
|
||||
for(var/mob/living/M in hearers(7, flashbang_turf))
|
||||
bang(get_turf(M), M)
|
||||
do_sparks(rand(5, 9), FALSE, src)
|
||||
playsound(flashbang_turf, 'sound/effects/bang.ogg', 25, 1)
|
||||
bang(flashbang_turf, range, src)
|
||||
|
||||
for(var/obj/structure/blob/B in hear(8,flashbang_turf)) //Blob damage here
|
||||
var/damage = round(30/(get_dist(B,get_turf(src))+1))
|
||||
for(var/obj/structure/blob/B in hear(8, flashbang_turf)) //Blob damage here
|
||||
var/damage = round(30 / (get_dist(B, get_turf(src)) + 1))
|
||||
B.health -= damage
|
||||
B.update_icon()
|
||||
|
||||
spawn(light_time)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M)
|
||||
M.show_message("<span class='warning'>BANG</span>", 2)
|
||||
playsound(loc, 'sound/effects/bang.ogg', 25, 1)
|
||||
/proc/bang(turf/T, atom/A, range = 7, flash = TRUE, bang = TRUE)
|
||||
for(var/mob/living/M in hearers(range, T))
|
||||
if(M.stat == DEAD)
|
||||
continue
|
||||
M.show_message("<span class='warning'>BANG</span>", 2)
|
||||
|
||||
//Checking for protections
|
||||
var/ear_safety = M.check_ear_prot()
|
||||
var/distance = max(1,get_dist(src,T))
|
||||
//Checking for protections
|
||||
var/ear_safety = M.check_ear_prot()
|
||||
var/distance = max(1, get_dist(get_turf(A), get_turf(M)))
|
||||
|
||||
//Flash
|
||||
if(M.weakeyes)
|
||||
M.visible_message("<span class='disarm'><b>[M]</b> screams and collapses!</span>")
|
||||
to_chat(M, "<span class='userdanger'><font size=3>AAAAGH!</font></span>")
|
||||
M.Weaken(15) //hella stunned
|
||||
M.Stun(15)
|
||||
if(ishuman(M))
|
||||
M.emote("scream")
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
|
||||
if(E)
|
||||
E.receive_damage(8, 1)
|
||||
//Flash
|
||||
if(flash)
|
||||
if(M.weakeyes)
|
||||
M.visible_message("<span class='disarm'><b>[M]</b> screams and collapses!</span>")
|
||||
to_chat(M, "<span class='userdanger'><font size=3>AAAAGH!</font></span>")
|
||||
M.Weaken(15) //hella stunned
|
||||
M.Stun(15)
|
||||
if(ishuman(M))
|
||||
M.emote("scream")
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
|
||||
if(E)
|
||||
E.receive_damage(8, 1)
|
||||
|
||||
if(M.flash_eyes(affect_silicon = 1))
|
||||
M.Stun(max(10/distance, 3))
|
||||
M.Weaken(max(10/distance, 3))
|
||||
if(M.flash_eyes(affect_silicon = TRUE))
|
||||
M.Stun(max(10 / distance, 3))
|
||||
M.Weaken(max(10 / distance, 3))
|
||||
|
||||
|
||||
//Bang
|
||||
if((loc == M) || loc == M.loc)//Holding on person or being exactly where lies is significantly more dangerous and voids protection
|
||||
M.Stun(10)
|
||||
M.Weaken(10)
|
||||
if(!ear_safety)
|
||||
M.Stun(max(10/distance, 3))
|
||||
M.Weaken(max(10/distance, 3))
|
||||
M.AdjustEarDamage(rand(0, 5), 15)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears)
|
||||
if(istype(ears))
|
||||
if(ears.ear_damage >= 15)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(ears.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.BecomeDeaf()
|
||||
else
|
||||
if(ears.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
//Bang
|
||||
if(bang)
|
||||
if(!distance || A.loc == M || A.loc == M.loc) //Holding on person or being exactly where lies is significantly more dangerous and voids protection
|
||||
M.Stun(10)
|
||||
M.Weaken(10)
|
||||
if(!ear_safety)
|
||||
M.Stun(max(10 / distance, 3))
|
||||
M.Weaken(max(10 / distance, 3))
|
||||
M.AdjustEarDamage(rand(0, 5), 15)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears)
|
||||
if(istype(ears))
|
||||
if(ears.ear_damage >= 15)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(ears.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.BecomeDeaf()
|
||||
else
|
||||
if(ears.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
@@ -0,0 +1,50 @@
|
||||
/obj/item/grenade/frag
|
||||
name = "frag grenade"
|
||||
desc = "Fire in the hole."
|
||||
icon_state = "frag"
|
||||
item_state = "flashbang"
|
||||
origin_tech = "materials=3;magnets=4"
|
||||
var/range = 5
|
||||
var/max_shrapnel = 4
|
||||
var/embed_prob = 100 //reduced by armor
|
||||
var/embedded_type = /obj/item/embedded/shrapnel
|
||||
|
||||
/obj/item/grenade/frag/prime()
|
||||
update_mob()
|
||||
var/turf/epicenter = get_turf(src)
|
||||
for(var/mob/living/carbon/human/H in epicenter)
|
||||
if(H.resting) //grenade is jumped on but get real fucked up
|
||||
embed_shrapnel(H, max_shrapnel)
|
||||
range = 1
|
||||
explosion(loc, 0, 1, range, breach = FALSE)
|
||||
for(var/turf/T in view(range, loc))
|
||||
for(var/mob/living/carbon/human/H in T)
|
||||
var/shrapnel_amount = max_shrapnel - T.Distance(epicenter)
|
||||
if(shrapnel_amount > 0)
|
||||
embed_shrapnel(H, shrapnel_amount)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/frag/proc/embed_shrapnel(mob/living/carbon/human/H, amount)
|
||||
for(var/i = 0, i < amount, i++)
|
||||
if(prob(embed_prob - H.getarmor(null, "bomb")))
|
||||
var/obj/item/embedded/S = new embedded_type(src)
|
||||
H.hitby(S, skipcatch = 1)
|
||||
S.throwforce = 1
|
||||
S.throw_speed = 1
|
||||
S.sharp = FALSE
|
||||
else
|
||||
to_chat(H, "<span class='warning'>Shrapnel bounces off your armor!</span>")
|
||||
|
||||
/obj/item/embedded/shrapnel
|
||||
name = "shrapnel"
|
||||
icon = 'icons/obj/shards.dmi'
|
||||
throwforce = 10
|
||||
throw_speed = EMBED_THROWSPEED_THRESHOLD
|
||||
embed_chance = 100
|
||||
embedded_fall_chance = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
sharp = TRUE
|
||||
hitsound = 'sound/weapons/pierce.ogg'
|
||||
|
||||
/obj/item/embedded/shrapnel/New()
|
||||
icon_state = pick("shrapnel1", "shrapnel2", "shrapnel3")
|
||||
@@ -8,5 +8,5 @@
|
||||
|
||||
/obj/item/grenade/syndieminibomb/prime()
|
||||
update_mob()
|
||||
explosion(src.loc,1,2,4,flame_range = 2)
|
||||
qdel(src)
|
||||
explosion(loc, 1, 2, 4, flame_range = 2)
|
||||
qdel(src)
|
||||
@@ -15,6 +15,7 @@
|
||||
breakouttime = 600 //Deciseconds = 60s = 1 minutes
|
||||
var/cuffsound = 'sound/weapons/handcuffs.ogg'
|
||||
var/trashtype = null //For disposable cuffs
|
||||
var/ignoresClumsy = FALSE
|
||||
|
||||
/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/user)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
@@ -23,13 +24,17 @@
|
||||
if(!istype(C))
|
||||
return
|
||||
|
||||
if(CLUMSY in user.mutations && prob(50))
|
||||
if((CLUMSY in user.mutations) && prob(50) && (!ignoresClumsy))
|
||||
to_chat(user, "<span class='warning'>Uh... how do those things work?!</span>")
|
||||
apply_cuffs(user,user)
|
||||
|
||||
apply_cuffs(user, user)
|
||||
return
|
||||
|
||||
cuff(C, user)
|
||||
|
||||
/obj/item/restraints/handcuffs/proc/cuff(mob/living/carbon/C, mob/user, remove_src = TRUE)
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(!H.has_left_hand() || !H.has_right_hand())
|
||||
if(!(H.has_left_hand() || H.has_right_hand()))
|
||||
to_chat(user, "<span class='warning'>How do you suggest handcuffing someone with no hands?</span>")
|
||||
return
|
||||
|
||||
@@ -39,26 +44,31 @@
|
||||
|
||||
playsound(loc, cuffsound, 30, 1, -2)
|
||||
if(do_mob(user, C, 30))
|
||||
apply_cuffs(C,user)
|
||||
apply_cuffs(C, user, remove_src)
|
||||
to_chat(user, "<span class='notice'>You handcuff [C].</span>")
|
||||
if(istype(src, /obj/item/restraints/handcuffs/cable))
|
||||
feedback_add_details("handcuffs","C")
|
||||
feedback_add_details("handcuffs", "C")
|
||||
else
|
||||
feedback_add_details("handcuffs","H")
|
||||
feedback_add_details("handcuffs", "H")
|
||||
|
||||
add_attack_logs(user, C, "Handcuffed ([src])")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to handcuff [C].</span>")
|
||||
|
||||
/obj/item/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user)
|
||||
/obj/item/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user, remove_src = TRUE)
|
||||
if(!target.handcuffed)
|
||||
user.drop_item()
|
||||
if(remove_src)
|
||||
user.drop_item()
|
||||
if(trashtype)
|
||||
target.handcuffed = new trashtype(target)
|
||||
qdel(src)
|
||||
if(remove_src)
|
||||
qdel(src)
|
||||
else
|
||||
loc = target
|
||||
target.handcuffed = src
|
||||
if(remove_src)
|
||||
loc = target
|
||||
target.handcuffed = src
|
||||
else
|
||||
target.handcuffed = new type(loc)
|
||||
target.update_handcuffed()
|
||||
return
|
||||
|
||||
@@ -169,23 +179,7 @@
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user)
|
||||
if(isrobot(user))
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(!(H.get_organ("l_hand") || H.get_organ("r_hand")))
|
||||
to_chat(user, "<span class='warning'>How do you suggest handcuffing someone with no hands?</span>")
|
||||
return
|
||||
if(!C.handcuffed)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
C.visible_message("<span class='danger'>[user] is trying to put zipties on [C]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to put zipties on [C]!</span>")
|
||||
if(do_mob(user, C, 30))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
|
||||
C.update_handcuffed()
|
||||
to_chat(user, "<span class='notice'>You handcuff [C].</span>")
|
||||
add_attack_logs(user, C, "Handcuffed (ziptie-cuffed)")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to handcuff [C].</span>")
|
||||
cuff(C, user, FALSE)
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/used
|
||||
desc = "A pair of broken zipties."
|
||||
|
||||
@@ -11,10 +11,11 @@
|
||||
var/reskinned = FALSE
|
||||
var/reskin_selectable = TRUE //set to FALSE if a subtype is meant to not normally be available as a reskin option (fluff ones will get re-added through their list)
|
||||
var/list/fluff_transformations = list() //does it have any special transformations only accessible to it? Should only be subtypes of /obj/item/nullrod
|
||||
var/sanctify_force = 0
|
||||
|
||||
/obj/item/nullrod/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is killing [user.p_them()]self with \the [src.name]! It looks like [user.p_theyre()] trying to get closer to god!</span>")
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
return BRUTELOSS|FIRELOSS
|
||||
|
||||
/obj/item/nullrod/attack(mob/M, mob/living/carbon/user)
|
||||
..()
|
||||
@@ -25,12 +26,29 @@
|
||||
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)
|
||||
|
||||
/obj/item/nullrod/pickup(mob/living/user)
|
||||
. = ..()
|
||||
if(sanctify_force)
|
||||
if(!user.mind || !user.mind.isholy)
|
||||
user.adjustBruteLoss(force)
|
||||
user.adjustFireLoss(sanctify_force)
|
||||
user.Weaken(5)
|
||||
user.unEquip(src, 1)
|
||||
user.visible_message("<span class='warning'>[src] slips out of the grip of [user] as they try to pick it up, bouncing upwards and smacking [user.p_them()] in the face!</span>", \
|
||||
"<span class='warning'>[src] slips out of your grip as you pick it up, bouncing upwards and smacking you in the face!</span>")
|
||||
playsound(get_turf(user), 'sound/effects/hit_punch.ogg', 50, 1, -1)
|
||||
throw_at(get_edge_target_turf(user, pick(alldirs)), rand(1, 3), 5)
|
||||
|
||||
|
||||
/obj/item/nullrod/attack_self(mob/user)
|
||||
if(reskinned)
|
||||
return
|
||||
if(user.mind && (user.mind.assigned_role == "Chaplain" || user.mind.special_role == SPECIAL_ROLE_ERT))
|
||||
if(user.mind && (user.mind.isholy) && !reskinned)
|
||||
reskin_holy_weapon(user)
|
||||
|
||||
/obj/item/nullrod/examine(mob/living/user)
|
||||
. = ..()
|
||||
if(sanctify_force)
|
||||
to_chat(user, "<span class='notice'>It bears the inscription: 'Sanctified weapon of the inquisitors. Only the worthy may wield. Nobody shall expect us.'</span>")
|
||||
|
||||
/obj/item/nullrod/proc/reskin_holy_weapon(mob/M)
|
||||
var/list/holy_weapons_list = typesof(/obj/item/nullrod)
|
||||
for(var/entry in holy_weapons_list)
|
||||
@@ -60,11 +78,27 @@
|
||||
holy_weapon.reskinned = TRUE
|
||||
M.unEquip(src)
|
||||
M.put_in_active_hand(holy_weapon)
|
||||
if(sanctify_force)
|
||||
holy_weapon.sanctify_force = sanctify_force
|
||||
holy_weapon.name = "sanctified " + holy_weapon.name
|
||||
qdel(src)
|
||||
|
||||
/obj/item/nullrod/fluff //fluff subtype to be used for all donator nullrods
|
||||
/obj/item/nullrod/afterattack(atom/movable/AM, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!sanctify_force)
|
||||
return
|
||||
if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
L.adjustFireLoss(sanctify_force) // Bonus fire damage for sanctified (ERT) versions of nullrod
|
||||
|
||||
/obj/item/nullrod/fluff // fluff subtype to be used for all donator nullrods
|
||||
reskin_selectable = FALSE
|
||||
|
||||
/obj/item/nullrod/ert // ERT subtype, applies sanctified property to any derived rod
|
||||
name = "inquisitor null rod"
|
||||
reskin_selectable = FALSE
|
||||
sanctify_force = 10
|
||||
|
||||
/obj/item/nullrod/godhand
|
||||
name = "god hand"
|
||||
icon_state = "disintegrate"
|
||||
@@ -126,7 +160,7 @@
|
||||
hitsound = 'sound/weapons/chainsaw.ogg'
|
||||
|
||||
/obj/item/nullrod/claymore/glowing
|
||||
name = "force weapon"
|
||||
name = "force blade"
|
||||
icon_state = "swordon"
|
||||
item_state = "swordon"
|
||||
desc = "The blade glows with the power of faith. Or possibly a battery."
|
||||
@@ -147,7 +181,7 @@
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
/obj/item/nullrod/claymore/saber
|
||||
name = "light energy sword"
|
||||
name = "light energy blade"
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
icon_state = "swordblue"
|
||||
item_state = "swordblue"
|
||||
@@ -155,13 +189,13 @@
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
/obj/item/nullrod/claymore/saber/red
|
||||
name = "dark energy sword"
|
||||
name = "dark energy blade"
|
||||
icon_state = "swordred"
|
||||
item_state = "swordred"
|
||||
desc = "Woefully ineffective when used on steep terrain."
|
||||
|
||||
/obj/item/nullrod/claymore/saber/pirate
|
||||
name = "nautical energy sword"
|
||||
name = "nautical energy cutlass"
|
||||
icon_state = "cutlass1"
|
||||
item_state = "cutlass1"
|
||||
desc = "Convincing HR that your religion involved piracy was no mean feat."
|
||||
@@ -279,7 +313,7 @@
|
||||
|
||||
/obj/item/nullrod/whip
|
||||
name = "holy whip"
|
||||
desc = "What a terrible night to be in spess"
|
||||
desc = "A whip, blessed with the power to banish evil shadowy creatures. What a terrible night to be in spess."
|
||||
icon_state = "chain"
|
||||
item_state = "chain"
|
||||
slot_flags = SLOT_BELT
|
||||
@@ -298,11 +332,11 @@
|
||||
if(is_shadow(H))
|
||||
var/phrase = pick("Die monster! You don't belong in this world!!!", "You steal men's souls and make them your slaves!!!", "Your words are as empty as your soul!!!", "Mankind ill needs a savior such as you!!!")
|
||||
user.say("[phrase]")
|
||||
H.adjustBruteLoss(8) //Bonus damage
|
||||
H.adjustBruteLoss(12) //Bonus damage
|
||||
|
||||
/obj/item/nullrod/fedora
|
||||
name = "athiest's fedora"
|
||||
desc = "The brim of the hat is as sharp as your wit. Throwing it at someone would hurt almost as much as disproving the existence of God."
|
||||
name = "binary fedora"
|
||||
desc = "The brim of the hat is as sharp as the division between 0 and 1. It makes a mighty throwing weapon."
|
||||
icon_state = "fedora"
|
||||
item_state = "fedora"
|
||||
slot_flags = SLOT_HEAD
|
||||
@@ -310,7 +344,7 @@
|
||||
force = 0
|
||||
throw_speed = 4
|
||||
throw_range = 7
|
||||
throwforce = 20
|
||||
throwforce = 25 // Yes, this is high, since you can typically only use it once in a fight.
|
||||
|
||||
/obj/item/nullrod/armblade
|
||||
name = "dark blessing"
|
||||
@@ -335,7 +369,7 @@
|
||||
/obj/item/nullrod/carp/attack_self(mob/living/user)
|
||||
if(used_blessing)
|
||||
return
|
||||
if(user.mind && (user.mind.assigned_role != "Chaplain" && user.mind.special_role != SPECIAL_ROLE_ERT))
|
||||
if(user.mind && !user.mind.isholy)
|
||||
return
|
||||
to_chat(user, "You are blessed by Carp-Sie. Wild space carp will no longer attack you.")
|
||||
user.faction |= "carp"
|
||||
@@ -408,19 +442,20 @@
|
||||
if(!iscarbon(M))
|
||||
return ..()
|
||||
|
||||
if(!user.mind || (user.mind.assigned_role != "Chaplain" && user.mind.special_role != SPECIAL_ROLE_ERT))
|
||||
if(!user.mind || !user.mind.isholy)
|
||||
to_chat(user, "<span class='notice'>You are not close enough with [ticker.Bible_deity_name] to use [src].</span>")
|
||||
return
|
||||
|
||||
if(praying)
|
||||
to_chat(user, "<span class='notice'>You are already using [src].</span>")
|
||||
return
|
||||
|
||||
user.visible_message("<span class='info'>[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [ticker.Bible_deity_name].</span>", \
|
||||
"<span class='info'>You kneel[M == user ? null : " next to [M]"] and begin a prayer to [ticker.Bible_deity_name].</span>")
|
||||
|
||||
praying = 1
|
||||
if(do_after(user, 150, target = M))
|
||||
if(ishuman(M)) // This probably should not work on vulps. They're unholy abominations.
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/target = M
|
||||
|
||||
if(target.mind)
|
||||
@@ -470,7 +505,7 @@
|
||||
|
||||
/obj/item/nullrod/salt/attack_self(mob/user)
|
||||
|
||||
if(!user.mind || (user.mind.assigned_role != "Chaplain" && user.mind.special_role != SPECIAL_ROLE_ERT ))
|
||||
if(!user.mind || !user.mind.isholy)
|
||||
to_chat(user, "<span class='notice'>You are not close enough with [ticker.Bible_deity_name] to use [src].</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -10,6 +10,16 @@
|
||||
hidden_uplink.uses = 10
|
||||
..()
|
||||
|
||||
/obj/item/implant/uplink/sit/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "sit"
|
||||
|
||||
/obj/item/implant/uplink/admin/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "admin"
|
||||
|
||||
/obj/item/implant/uplink/implant(mob/source)
|
||||
var/obj/item/implant/imp_e = locate(src.type) in source
|
||||
if(imp_e && imp_e != src)
|
||||
|
||||
@@ -8,12 +8,17 @@
|
||||
* Butcher's cleaver
|
||||
* Rolling Pins
|
||||
* Candy Moulds
|
||||
* Sushi Mat
|
||||
* Circular cutter
|
||||
*/
|
||||
|
||||
/obj/item/kitchen
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
origin_tech = "materials=1"
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Utensils
|
||||
*/
|
||||
@@ -116,7 +121,7 @@
|
||||
user.visible_message(pick("<span class='suicide'>[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
|
||||
"<span class='suicide'>[user] is slitting [user.p_their()] throat with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
|
||||
"<span class='suicide'>[user] is slitting [user.p_their()] stomach open with the [name]! It looks like [user.p_theyre()] trying to commit seppuku.</span>"))
|
||||
return (BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/kitchen/knife/plastic
|
||||
name = "plastic knife"
|
||||
@@ -178,6 +183,7 @@
|
||||
origin_tech = "biotech=3;combat=2"
|
||||
attack_verb = list("shanked", "shivved")
|
||||
|
||||
|
||||
/*
|
||||
* Rolling Pins
|
||||
*/
|
||||
@@ -249,3 +255,33 @@
|
||||
name = "sucker mould"
|
||||
desc = "It has the shape of a sucker imprinted into it."
|
||||
icon_state = "mould_loli"
|
||||
|
||||
/*
|
||||
* Sushi Mat
|
||||
*/
|
||||
/obj/item/kitchen/sushimat
|
||||
name = "Sushi Mat"
|
||||
desc = "A wooden mat used for efficient sushi crafting."
|
||||
icon_state = "sushi_mat"
|
||||
force = 5
|
||||
throwforce = 5
|
||||
throw_speed = 3
|
||||
throw_range = 3
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("rolled", "cracked", "battered", "thrashed")
|
||||
|
||||
|
||||
|
||||
/// circular cutter by Ume
|
||||
|
||||
/obj/item/kitchen/cutter
|
||||
name = "generic circular cutter"
|
||||
desc = "A generic circular cutter for cookies and other things."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "circular_cutter"
|
||||
force = 5
|
||||
throwforce = 5
|
||||
throw_speed = 3
|
||||
throw_range = 3
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("bashed", "slashed", "pricked", "thrashed")
|
||||
@@ -35,7 +35,7 @@
|
||||
/obj/item/restraints/legcuffs/beartrap/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is sticking [user.p_their()] head in the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/attack_self(mob/user)
|
||||
..()
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
item_state = "lighter-g"
|
||||
var/icon_on = "lighter-g-on"
|
||||
var/icon_off = "lighter-g"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throwforce = 4
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
@@ -43,7 +43,7 @@
|
||||
attack_verb = list("burnt", "singed")
|
||||
if(istype(src, /obj/item/lighter/zippo) )
|
||||
user.visible_message("<span class='rose'>Without even breaking stride, [user] flips open and lights [src] in one smooth movement.</span>")
|
||||
playsound(src.loc, 'sound/items/ZippoLight.ogg', 25, 1)
|
||||
playsound(src.loc, 'sound/items/zippolight.ogg', 25, 1)
|
||||
else
|
||||
if(prob(75))
|
||||
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src].</span>")
|
||||
@@ -69,7 +69,7 @@
|
||||
attack_verb = null //human_defense.dm takes care of it
|
||||
if(istype(src, /obj/item/lighter/zippo) )
|
||||
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow.")
|
||||
playsound(src.loc, 'sound/items/ZippoClose.ogg', 25, 1)
|
||||
playsound(src.loc, 'sound/items/zippoclose.ogg', 25, 1)
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] quietly shuts off the [src].")
|
||||
|
||||
@@ -166,7 +166,8 @@
|
||||
location.hotspot_expose(700, 5)
|
||||
return
|
||||
|
||||
/obj/item/match/fire_act()
|
||||
/obj/item/match/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
|
||||
..()
|
||||
matchignite()
|
||||
|
||||
/obj/item/match/proc/matchignite()
|
||||
|
||||
@@ -796,6 +796,7 @@
|
||||
name = "Space Law"
|
||||
desc = "A set of Nanotrasen guidelines for keeping law and order on their space stations."
|
||||
icon_state = "bookSpaceLaw"
|
||||
force = 4 //advanced magistrate tactics
|
||||
author = "Nanotrasen"
|
||||
title = "Space Law"
|
||||
dat = {"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/obj/item/melee/energy/suicide_act(mob/user)
|
||||
user.visible_message(pick("<span class='suicide'>[user] is slitting [user.p_their()] stomach open with the [name]! It looks like [user.p_theyre()] trying to commit seppuku.</span>", \
|
||||
"<span class='suicide'>[user] is falling on the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>"))
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
return BRUTELOSS|FIRELOSS
|
||||
|
||||
/obj/item/melee/energy/attack_self(mob/living/carbon/user)
|
||||
if(user.disabilities & CLUMSY && prob(50))
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
/obj/item/melee/energy/axe/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] swings the [name] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
return BRUTELOSS|FIRELOSS
|
||||
|
||||
/obj/item/melee/energy/sword
|
||||
name = "energy sword"
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
|
||||
|
||||
/obj/item/melee/chainofcommand/suicide_act(mob/user)
|
||||
to_chat(viewers(user), "<span class='suicide'>[user] is strangling [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
return (OXYLOSS)
|
||||
to_chat(viewers(user), "<span class='suicide'>[user] is strangling [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/melee/rapier
|
||||
name = "captain's rapier"
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
var/whatdpipe = PIPE_DISPOSALS_STRAIGHT //What kind of disposals pipe is it?
|
||||
var/spawndelay = RPD_COOLDOWN_TIME
|
||||
var/walldelay = RPD_WALLBUILD_TIME
|
||||
var/ranged = FALSE
|
||||
var/primary_sound = 'sound/machines/click.ogg'
|
||||
var/alt_sound = null
|
||||
|
||||
/obj/item/rpd/New()
|
||||
..()
|
||||
@@ -41,11 +44,24 @@
|
||||
QDEL_NULL(spark_system)
|
||||
return ..()
|
||||
|
||||
/obj/item/rpd/bluespace
|
||||
name = "bluespace rapid pipe dispenser"
|
||||
desc = "This device can rapidly dispense atmospherics and disposals piping, manipulate loose piping, and recycle any detached pipes it is applied to, at any range."
|
||||
icon_state = "brpd"
|
||||
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500, MAT_SILVER = 3000)
|
||||
origin_tech = "engineering=4;materials=2;bluespace=3"
|
||||
ranged = TRUE
|
||||
primary_sound = 'sound/items/PSHOOM.ogg'
|
||||
alt_sound = 'sound/items/PSHOOM_2.ogg'
|
||||
|
||||
//Procs
|
||||
|
||||
/obj/item/rpd/proc/activate_rpd(delay) //Maybe makes sparks and activates cooldown if there is a delay
|
||||
playsound(loc, "sound/machines/click.ogg", 50, 1)
|
||||
if(prob(15))
|
||||
if(alt_sound && prob(3))
|
||||
playsound(src, alt_sound, 50, 1)
|
||||
else
|
||||
playsound(src, primary_sound, 50, 1)
|
||||
if(prob(15) && !ranged)
|
||||
spark_system.start()
|
||||
if(delay)
|
||||
lastused = world.time
|
||||
@@ -188,7 +204,7 @@ var/list/pipemenu = list(
|
||||
..()
|
||||
if(loc != user)
|
||||
return
|
||||
if(!proximity)
|
||||
if(!proximity && !ranged)
|
||||
return
|
||||
if(world.time < lastused + spawndelay)
|
||||
return
|
||||
@@ -201,6 +217,8 @@ var/list/pipemenu = list(
|
||||
if(target.rpd_act(user, src) == TRUE)
|
||||
// If the object we are clicking on has a valid RPD interaction for just that specific object, do that and nothing else.
|
||||
// Example: clicking on a pipe with a RPD in rotate mode should rotate that pipe and ignore everything else on the tile.
|
||||
if(ranged)
|
||||
user.Beam(T, icon_state="rped_upgrade", icon='icons/effects/effects.dmi', time=5)
|
||||
return
|
||||
|
||||
// If we get this far, we have to check every object in the tile, to make sure that none of them block RPD usage on this tile.
|
||||
@@ -212,6 +230,8 @@ var/list/pipemenu = list(
|
||||
return
|
||||
|
||||
// If we get here, then we're effectively acting on the turf, probably placing a pipe.
|
||||
if(ranged) //woosh beam if bluespaced at a distance
|
||||
user.Beam(T,icon_state="rped_upgrade", icon='icons/effects/effects.dmi', time=5)
|
||||
T.rpd_act(user, src)
|
||||
|
||||
#undef RPD_COOLDOWN_TIME
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
species_hair = GLOB.hair_styles_public_list
|
||||
var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair
|
||||
user.visible_message("<span class='notice'>[user] starts cutting [M]'s hair!</span>", "<span class='notice'>You start cutting [M]'s hair!</span>") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo)
|
||||
playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1)
|
||||
playsound(loc, 'sound/goonstation/misc/scissor.ogg', 100, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = H)) //this is the part that adds a delay. delay is in deciseconds. --Made it 5 seconds, because hair isn't cut in one second in real life, and I want at least a little bit longer time, (TGameCo)
|
||||
if(!(M in view(1))) //Adjacency test
|
||||
user.visible_message("<span class='notice'>[user] stops cutting [M]'s hair.</span>", "<span class='notice'>You stop cutting [M]'s hair.</span>")
|
||||
@@ -111,7 +111,7 @@
|
||||
if(!is_cutting)
|
||||
is_cutting = 1
|
||||
user.visible_message("<span class='notice'>[user] starts cutting [M]'s hair!</span>", "<span class='notice'>You start cutting [M]'s hair!</span>")
|
||||
playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1)
|
||||
playsound(loc, 'sound/goonstation/misc/scissor.ogg', 100, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = H))
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
user.visible_message("<span class='danger'>[user] abruptly stops cutting [M]'s hair and slices [M.p_their()] throat!</span>", "<span class='danger'>You stop cutting [M]'s hair and slice [M.p_their()] throat!</span>") //Just a little off the top.
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
/obj/item/shard/suicide_act(mob/user)
|
||||
to_chat(viewers(user), pick("<span class='danger'>[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>",
|
||||
"<span class='danger'>[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>"))
|
||||
return (BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/shard/New()
|
||||
..()
|
||||
|
||||
@@ -40,9 +40,9 @@
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
max_combined_w_class = 800
|
||||
works_from_distance = 1
|
||||
primary_sound = 'sound/items/PSHOOM.ogg'
|
||||
alt_sound = 'sound/items/PSHOOM_2.ogg'
|
||||
usesound = 'sound/items/PSHOOM.ogg'
|
||||
primary_sound = 'sound/items/pshoom.ogg'
|
||||
alt_sound = 'sound/items/pshoom_2.ogg'
|
||||
usesound = 'sound/items/pshoom.ogg'
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/storage/part_replacer/proc/play_rped_sound()
|
||||
@@ -65,7 +65,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/rating = 1
|
||||
toolspeed = 1
|
||||
usesound = 'sound/items/Deconstruct.ogg'
|
||||
usesound = 'sound/items/deconstruct.ogg'
|
||||
|
||||
/obj/item/stock_parts/New()
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
|
||||
@@ -13,57 +13,74 @@
|
||||
force = 5
|
||||
throwforce = 10
|
||||
origin_tech = "combat=4;engineering=4;syndicate=2"
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
var/list/servantlinks = list()
|
||||
var/hunger = 0
|
||||
var/hunger_message_level = 0
|
||||
var/original_owner = null
|
||||
var/activated = 0
|
||||
var/mindless_override = 0
|
||||
var/mob/living/carbon/human/original_owner = null
|
||||
var/activated = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/green/memetic/ui_action_click(mob/user)
|
||||
if(user.HasDisease(new /datum/disease/memetic_madness(0)))
|
||||
var/obj/item/storage/toolbox/green/memetic/M = user.get_active_hand()
|
||||
if(istype(M))
|
||||
to_chat(user, "<span class='warning'>His Grace [flags & NODROP ? "releases from" : "binds to"] your hand!</span>")
|
||||
flags ^= NODROP
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't seem to understand what this does.</span>")
|
||||
|
||||
|
||||
/obj/item/storage/toolbox/green/memetic/attack_hand(mob/living/carbon/user)
|
||||
if(!activated)
|
||||
if(ishuman(user) && !user.HasDisease(new /datum/disease/memetic_madness(0)))
|
||||
activated = 1
|
||||
user.ForceContractDisease(new /datum/disease/memetic_madness(0))
|
||||
for(var/datum/disease/memetic_madness/DD in user.viruses)
|
||||
DD.progenitor = src
|
||||
servantlinks.Add(DD)
|
||||
break
|
||||
force += 4
|
||||
throwforce += 4
|
||||
user << 'sound/goonstation/effects/screech.ogg'
|
||||
shake_camera(user, 20, 1)
|
||||
to_chat(user, "<i><b><font face = Tempus Sans ITC>His Grace accepts thee, spread His will! All who look close to the Enlightened may share His gifts.</font></b></i>")
|
||||
original_owner = user
|
||||
return
|
||||
if(loc == user)
|
||||
if(!activated)
|
||||
if(ishuman(user) && !user.HasDisease(new /datum/disease/memetic_madness(0)))
|
||||
activated = TRUE
|
||||
user.ForceContractDisease(new /datum/disease/memetic_madness(0))
|
||||
for(var/datum/disease/memetic_madness/DD in user.viruses)
|
||||
DD.progenitor = src
|
||||
servantlinks.Add(DD)
|
||||
break
|
||||
force += 4
|
||||
throwforce += 4
|
||||
SEND_SOUND(user, 'sound/goonstation/effects/screech.ogg')
|
||||
shake_camera(user, 20, 1)
|
||||
var/acount = 0
|
||||
var/amax = rand(10, 15)
|
||||
var/up_and_down
|
||||
var/asize = 1
|
||||
while(acount <= amax)
|
||||
up_and_down += "<font size=[asize]>a</font>"
|
||||
if(acount > (amax * 0.5))
|
||||
asize--
|
||||
else
|
||||
asize++
|
||||
acount++
|
||||
to_chat(user, "<span class='warning'>[up_and_down]</span>")
|
||||
to_chat(user, "<i><b><font face = Tempus Sans ITC>His Grace accepts thee, spread His will! All who look close to the Enlightened may share His gifts.</font></b></i>")
|
||||
original_owner = user
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/storage/toolbox/green/memetic/attackby(obj/item/I, mob/user)
|
||||
if(activated)
|
||||
if(istype(I, /obj/item/grab/))
|
||||
if(istype(I, /obj/item/grab))
|
||||
var/obj/item/grab/G = I
|
||||
if(!G.affecting)
|
||||
return
|
||||
var/mob/living/victim = G.affecting
|
||||
if(!user.HasDisease(new /datum/disease/memetic_madness(0)))
|
||||
to_chat(user, "<span class='warning'>You can't seem to find the latch to open this.</span>")
|
||||
return
|
||||
if(!ishuman(G.affecting) || issmall(G.affecting))
|
||||
to_chat(user, "<span class='warning'>His Grace will not accept such a meager offering!</span>")
|
||||
if(!victim)
|
||||
return
|
||||
if(!mindless_override)
|
||||
if(G.affecting.mind == null && G.affecting.ckey == null)
|
||||
to_chat(user, "<span class='warning'>His Grace will not accept a soulless shell for an offering!</span>")
|
||||
return
|
||||
if(!G.affecting.stat && !G.affecting.restrained() && !G.affecting.weakened)
|
||||
if(!victim.stat && !victim.restrained() && !victim.weakened)
|
||||
to_chat(user, "<span class='warning'>They're moving too much to feed to His Grace!</span>")
|
||||
return
|
||||
user.visible_message("<span class='userdanger'>[user] is trying to feed [G.affecting] to [src]!</span>")
|
||||
if(!do_mob(user, G.affecting, 30))
|
||||
user.visible_message("<span class='userdanger'>[user] is trying to feed [victim] to [src]!</span>")
|
||||
if(!do_mob(user, victim, 30))
|
||||
return
|
||||
G.affecting.forceMove(src)
|
||||
user.visible_message("<span class='userdanger'>[user] has fed [G.affecting] to [src]!</span>")
|
||||
|
||||
consume(G.affecting)
|
||||
user.visible_message("<span class='userdanger'>[user] has fed [victim] to [src]!</span>")
|
||||
|
||||
consume(victim)
|
||||
qdel(G)
|
||||
|
||||
to_chat(user, "<i><b><font face = Tempus Sans ITC>You have done well...</font></b></i>")
|
||||
@@ -71,40 +88,52 @@
|
||||
throwforce += 5
|
||||
return
|
||||
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/toolbox/green/memetic/proc/consume(mob/M)
|
||||
if(!M)
|
||||
/obj/item/storage/toolbox/green/memetic/proc/consume(mob/living/L)
|
||||
if(!L)
|
||||
return
|
||||
hunger = 0
|
||||
hunger_message_level = 0
|
||||
playsound(src.loc, 'sound/goonstation/misc/burp_alien.ogg', 50, 0)
|
||||
M.emote("scream")
|
||||
M.death()
|
||||
M.ghostize()
|
||||
if(M == original_owner)
|
||||
qdel(M)
|
||||
playsound(loc, 'sound/goonstation/misc/burp_alien.ogg', 50, 0)
|
||||
|
||||
if(L != original_owner)
|
||||
var/list/equipped_items = L.get_equipped_items(TRUE)
|
||||
if(L.l_hand)
|
||||
equipped_items += L.l_hand
|
||||
if(L.r_hand)
|
||||
equipped_items += L.r_hand
|
||||
if(equipped_items.len)
|
||||
var/obj/item/storage/box/B = new(src)
|
||||
B.name = "Box-'[L.real_name]'"
|
||||
for(var/obj/item/SI in equipped_items)
|
||||
L.unEquip(SI, TRUE)
|
||||
SI.forceMove(B)
|
||||
equipped_items.Cut()
|
||||
|
||||
L.forceMove(src)
|
||||
|
||||
L.emote("scream")
|
||||
L.death()
|
||||
L.ghostize()
|
||||
if(L == original_owner)
|
||||
L.unEquip(src, TRUE)
|
||||
qdel(L)
|
||||
var/obj/item/storage/toolbox/green/fake_toolbox = new(get_turf(src))
|
||||
fake_toolbox.desc = "It looks a lot duller than it used to."
|
||||
qdel(src)
|
||||
else
|
||||
qdel(L)
|
||||
|
||||
/obj/item/storage/toolbox/green/memetic/Destroy()
|
||||
for(var/mob/living/carbon/human/H in src)
|
||||
H.forceMove(get_turf(src))
|
||||
visible_message("<span class='warning'>[H] bursts out of [src]!</span>")
|
||||
for(var/datum/disease/memetic_madness/D in servantlinks)
|
||||
D.cure()
|
||||
|
||||
for(var/A in servantlinks)
|
||||
var/datum/disease/memetic_madness/D = A
|
||||
if(D)
|
||||
D.cure()
|
||||
break
|
||||
|
||||
if(servantlinks)
|
||||
servantlinks.Cut()
|
||||
servantlinks.Cut()
|
||||
servantlinks = null
|
||||
original_owner = null
|
||||
visible_message("<span class='userdanger'>[src] screams!</span>")
|
||||
playsound(src.loc, 'sound/goonstation/effects/screech.ogg', 100, 1)
|
||||
playsound(loc, 'sound/goonstation/effects/screech.ogg', 100, 1)
|
||||
return ..()
|
||||
|
||||
/datum/disease/memetic_madness
|
||||
@@ -116,11 +145,14 @@
|
||||
cure_text = "Unknown"
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
severity = BIOHAZARD
|
||||
disease_flags = CURABLE
|
||||
disease_flags = CAN_CARRY
|
||||
spread_flags = NON_CONTAGIOUS
|
||||
virus_heal_resistant = TRUE
|
||||
var/obj/item/storage/toolbox/green/memetic/progenitor = null
|
||||
|
||||
/datum/disease/memetic_madness/Destroy()
|
||||
if(progenitor)
|
||||
progenitor.servantlinks.Remove(src)
|
||||
progenitor = null
|
||||
if(affected_mob)
|
||||
affected_mob.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE
|
||||
@@ -142,6 +174,8 @@
|
||||
affected_mob.AdjustDizzy(-10)
|
||||
affected_mob.AdjustDrowsy(-10)
|
||||
affected_mob.SetSleeping(0)
|
||||
affected_mob.SetSlowed(0)
|
||||
affected_mob.SetConfused(0)
|
||||
stage = 1
|
||||
switch(progenitor.hunger)
|
||||
if(10 to 60)
|
||||
@@ -182,4 +216,4 @@
|
||||
affected_mob.adjustBruteLoss(5)
|
||||
|
||||
if(ismob(progenitor.loc))
|
||||
progenitor.hunger++
|
||||
progenitor.hunger++
|
||||
@@ -26,6 +26,23 @@
|
||||
playsound(src.loc, "rustle", 50, 1, -5)
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/backpack/examine(mob/user)
|
||||
var/space_used = 0
|
||||
if(!..(user, 1))
|
||||
return
|
||||
for(var/obj/item/I in contents)
|
||||
space_used += I.w_class
|
||||
if(!space_used)
|
||||
to_chat(user, "<span class='notice'> [src] is empty.</span>")
|
||||
else if(space_used <= max_combined_w_class*0.6)
|
||||
to_chat(user, "<span class='notice'> [src] still has plenty of remaining space.</span>")
|
||||
else if(space_used <= max_combined_w_class*0.8)
|
||||
to_chat(user, "<span class='notice'> [src] is beginning to run out of space.</span>")
|
||||
else if(space_used < max_combined_w_class)
|
||||
to_chat(user, "<span class='notice'> [src] doesn't have much space left.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'> [src] is full.</span>")
|
||||
|
||||
/*
|
||||
* Backpack Types
|
||||
*/
|
||||
@@ -47,7 +64,7 @@
|
||||
|
||||
/obj/item/storage/backpack/holding/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/storage/backpack/holding))
|
||||
var/response = alert(user, "Are you sure you want to put the bag of holding inside another bag of holding?","Are you sure you want to die?","Yes","No")
|
||||
var/response = alert(user, "This creates a singularity, destroying you and much of the station. Are you SURE?","IMMINENT DEATH!", "No", "Yes")
|
||||
if(response == "Yes")
|
||||
user.visible_message("<span class='warning'>[user] grins as [user.p_they()] begin[user.p_s()] to put a Bag of Holding into a Bag of Holding!</span>", "<span class='warning'>You begin to put the Bag of Holding into the Bag of Holding!</span>")
|
||||
if(do_after(user, 30, target=src))
|
||||
@@ -98,6 +115,7 @@
|
||||
new /obj/item/clothing/mask/gas/voice/clown(src)
|
||||
new /obj/item/radio/headset/headset_service(src)
|
||||
new /obj/item/pda/clown(src)
|
||||
new /obj/item/storage/box/survival(src)
|
||||
new /obj/item/reagent_containers/food/snacks/grown/banana(src)
|
||||
new /obj/item/stamp/clown(src)
|
||||
new /obj/item/toy/crayon/rainbow(src)
|
||||
@@ -179,6 +197,22 @@
|
||||
desc = "It's a very fancy satchel made with fine leather."
|
||||
icon_state = "satchel"
|
||||
burn_state = FIRE_PROOF
|
||||
var/strap_side_straight = FALSE
|
||||
|
||||
/obj/item/storage/backpack/satchel/verb/switch_strap()
|
||||
set name = "Switch Strap Side"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
strap_side_straight = !strap_side_straight
|
||||
icon_state = strap_side_straight ? "satchel-flipped" : "satchel"
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.update_inv_back()
|
||||
|
||||
|
||||
|
||||
/obj/item/storage/backpack/satcheldeluxe
|
||||
name = "leather satchel"
|
||||
@@ -333,7 +367,6 @@
|
||||
new /obj/item/FixOVein(src)
|
||||
new /obj/item/clothing/suit/straight_jacket(src)
|
||||
new /obj/item/clothing/mask/muzzle(src)
|
||||
new /obj/item/mmi/syndie(src)
|
||||
|
||||
/obj/item/storage/backpack/duffel/syndie/surgery_fake //for maint spawns
|
||||
name = "surgery duffelbag"
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
/obj/item/storage/bag/trash/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] puts the [name] over [user.p_their()] head and starts chomping at the insides! Disgusting!</span>")
|
||||
playsound(loc, 'sound/items/eatfood.ogg', 50, 1, -1)
|
||||
return (TOXLOSS)
|
||||
return TOXLOSS
|
||||
|
||||
/obj/item/storage/bag/trash/update_icon()
|
||||
if(contents.len == 0)
|
||||
@@ -460,6 +460,19 @@
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/storage/bag/tray/cookies_tray
|
||||
var/cookie = /obj/item/reagent_containers/food/snacks/cookie
|
||||
|
||||
/obj/item/storage/bag/tray/cookies_tray/New() /// By Azule Utama, thank you a lot!
|
||||
..()
|
||||
for(var/i in 1 to 6)
|
||||
var/obj/item/C = new cookie(src)
|
||||
handle_item_insertion(C) // Done this way so the tray actually has the cookies visible when spawned
|
||||
rebuild_overlays()
|
||||
|
||||
/obj/item/storage/bag/tray/cookies_tray/sugarcookie
|
||||
cookie = /obj/item/reagent_containers/food/snacks/sugarcookie
|
||||
|
||||
/*
|
||||
* Chemistry bag
|
||||
*/
|
||||
@@ -486,5 +499,5 @@
|
||||
storage_slots = 25
|
||||
max_combined_w_class = 200
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
can_hold = list(/obj/item/slime_extract,/obj/item/reagent_containers/food/snacks/monkeycube,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/blood,/obj/item/reagent_containers/hypospray/autoinjector)
|
||||
can_hold = list(/obj/item/slime_extract,/obj/item/reagent_containers/food/snacks/monkeycube,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/iv_bag,/obj/item/reagent_containers/hypospray/autoinjector)
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/belt/utility/chief
|
||||
name = "Chief Engineer's toolbelt"
|
||||
name = "advanced toolbelt"
|
||||
desc = "Holds tools, looks snazzy"
|
||||
icon_state = "utilitybelt_ce"
|
||||
item_state = "utility_ce"
|
||||
@@ -112,6 +112,7 @@
|
||||
icon_state = "medicalbelt"
|
||||
item_state = "medical"
|
||||
use_item_overlays = 1
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
can_hold = list(
|
||||
/obj/item/healthanalyzer,
|
||||
/obj/item/dnainjector,
|
||||
@@ -133,13 +134,14 @@
|
||||
/obj/item/rad_laser,
|
||||
/obj/item/sensor_device,
|
||||
/obj/item/wrench/medical,
|
||||
/obj/item/handheld_defibrillator
|
||||
)
|
||||
|
||||
/obj/item/storage/belt/medical/surgery
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
max_combined_w_class = 17
|
||||
use_to_pickup = 1
|
||||
name = "Surgical Belt"
|
||||
name = "surgical belt"
|
||||
desc = "Can hold various surgical tools."
|
||||
storage_slots = 9
|
||||
use_item_overlays = 1
|
||||
@@ -295,6 +297,10 @@
|
||||
item_state = "military"
|
||||
max_w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/storage/belt/military/sst
|
||||
icon_state = "assaultbelt"
|
||||
item_state = "assault"
|
||||
|
||||
/obj/item/storage/belt/military/traitor
|
||||
name = "tool-belt"
|
||||
desc = "Can hold various tools. This model seems to have additional compartments."
|
||||
@@ -302,6 +308,48 @@
|
||||
item_state = "utility"
|
||||
use_item_overlays = 1 // So it will still show tools in it in case sec get lazy and just glance at it.
|
||||
|
||||
/obj/item/storage/belt/grenade
|
||||
name = "grenadier belt"
|
||||
desc = "A belt for holding grenades."
|
||||
icon_state = "assaultbelt"
|
||||
item_state = "assault"
|
||||
storage_slots = 30
|
||||
max_combined_w_class = 60
|
||||
display_contents_with_number = 1
|
||||
can_hold = list(
|
||||
/obj/item/grenade,
|
||||
/obj/item/lighter,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/molotov
|
||||
)
|
||||
|
||||
/obj/item/storage/belt/grenade/full/New()
|
||||
..()
|
||||
new /obj/item/grenade/smokebomb(src) //4
|
||||
new /obj/item/grenade/smokebomb(src)
|
||||
new /obj/item/grenade/smokebomb(src)
|
||||
new /obj/item/grenade/smokebomb(src)
|
||||
new /obj/item/grenade/empgrenade(src) //2
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/gluon(src) //4
|
||||
new /obj/item/grenade/gluon(src)
|
||||
new /obj/item/grenade/gluon(src)
|
||||
new /obj/item/grenade/gluon(src)
|
||||
new /obj/item/grenade/chem_grenade/facid(src) //1
|
||||
new /obj/item/grenade/gas/plasma(src) //2
|
||||
new /obj/item/grenade/gas/plasma(src)
|
||||
new /obj/item/grenade/frag(src) //10
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/syndieminibomb(src) //2
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
|
||||
/obj/item/storage/belt/military/abductor
|
||||
name = "agent belt"
|
||||
desc = "A belt used by abductor agents."
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
var/mob/affecting = null
|
||||
var/deity_name = "Christ"
|
||||
|
||||
suicide_act(mob/user)
|
||||
to_chat(viewers(user), "<span class='warning'><b>[user] stares into [src.name] and attempts to trascend understanding of the universe!</b></span>")
|
||||
return (user.dust())
|
||||
/obj/item/storage/bible/suicide_act(mob/user)
|
||||
to_chat(viewers(user), "<span class='warning'><b>[user] stares into [src.name] and attempts to transcend understanding of the universe!</b></span>")
|
||||
user.dust()
|
||||
return OBLITERATION
|
||||
|
||||
|
||||
/obj/item/storage/bible/booze
|
||||
@@ -38,10 +39,6 @@
|
||||
return
|
||||
|
||||
/obj/item/storage/bible/attack(mob/living/M as mob, mob/living/user as mob)
|
||||
var/chaplain = 0
|
||||
if(user.mind && (user.mind.assigned_role == "Chaplain"))
|
||||
chaplain = 1
|
||||
|
||||
add_attack_logs(user, M, "Hit with [src]")
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
@@ -51,7 +48,7 @@
|
||||
if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
if(!chaplain)
|
||||
if(!user.mind || !user.mind.isholy)
|
||||
to_chat(user, "<span class='warning'>The book sizzles in your hands.</span>")
|
||||
user.take_organ_damage(0,10)
|
||||
return
|
||||
@@ -62,14 +59,7 @@
|
||||
user.Paralyse(20)
|
||||
return
|
||||
|
||||
// if(..() == BLOCKED)
|
||||
// return
|
||||
|
||||
if(M.stat !=2)
|
||||
/*if((M.mind in ticker.mode.cult) && (prob(20)))
|
||||
to_chat(M, "<span class='warning'>The power of [src.deity_name] clears your mind of heresy!</span>")
|
||||
to_chat(user, "<span class='warning'>You see how [M]'s eyes become clear, the cult no longer holds control over [M.p_them()]!</span>")
|
||||
ticker.mode.remove_cultist(M.mind)*/
|
||||
if((istype(M, /mob/living/carbon/human) && prob(60)))
|
||||
bless(M)
|
||||
for(var/mob/O in viewers(M, null))
|
||||
@@ -94,11 +84,11 @@
|
||||
return
|
||||
if(istype(A, /turf/simulated/floor))
|
||||
to_chat(user, "<span class='notice'>You hit the floor with the bible.</span>")
|
||||
if(user.mind && (user.mind.assigned_role == "Chaplain"))
|
||||
if(user.mind && (user.mind.isholy))
|
||||
for(var/obj/effect/rune/R in A)
|
||||
if(R.invisibility)
|
||||
R.talismanreveal()
|
||||
if(user.mind && (user.mind.assigned_role == "Chaplain"))
|
||||
if(user.mind && (user.mind.isholy))
|
||||
if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder
|
||||
to_chat(user, "<span class='notice'>You bless [A].</span>")
|
||||
var/water2holy = A.reagents.get_reagent_amount("water")
|
||||
|
||||
@@ -72,8 +72,31 @@
|
||||
new /obj/item/clothing/mask/breath( src )
|
||||
new /obj/item/tank/emergency_oxygen( src )
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector( src )
|
||||
new /obj/item/flashlight/flare/glowstick/emergency( src )
|
||||
return
|
||||
|
||||
/obj/item/storage/box/survival_vox
|
||||
icon_state = "box_vox"
|
||||
|
||||
/obj/item/storage/box/survival_vox/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/clothing/mask/breath/vox(src)
|
||||
new /obj/item/tank/emergency_oxygen/nitrogen(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
new /obj/item/flashlight/flare/glowstick/emergency(src)
|
||||
|
||||
/obj/item/storage/box/survival_plasmaman
|
||||
icon_state = "box_plasma"
|
||||
|
||||
/obj/item/storage/box/survival_plasmaman/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/clothing/mask/breath(src)
|
||||
new /obj/item/tank/emergency_oxygen/plasma(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
new /obj/item/flashlight/flare/glowstick/emergency(src)
|
||||
|
||||
/obj/item/storage/box/engineer
|
||||
icon_state = "box_eng"
|
||||
New()
|
||||
@@ -82,6 +105,7 @@
|
||||
new /obj/item/clothing/mask/breath( src )
|
||||
new /obj/item/tank/emergency_oxygen/engi( src )
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector( src )
|
||||
new /obj/item/flashlight/flare/glowstick/emergency( src )
|
||||
return
|
||||
|
||||
/obj/item/storage/box/survival_mining
|
||||
@@ -93,6 +117,18 @@
|
||||
new /obj/item/tank/emergency_oxygen/engi(src)
|
||||
new /obj/item/crowbar/red(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
new /obj/item/flashlight/flare/glowstick/emergency(src)
|
||||
|
||||
/obj/item/storage/box/survival_syndi
|
||||
icon_state = "box_syndi"
|
||||
New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/clothing/mask/gas/syndicate(src)
|
||||
new /obj/item/tank/emergency_oxygen/syndi(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
new /obj/item/reagent_containers/food/pill/initropidril(src)
|
||||
new /obj/item/flashlight/flare/glowstick/red(src)
|
||||
|
||||
/obj/item/storage/box/gloves
|
||||
name = "box of latex gloves"
|
||||
@@ -155,6 +191,21 @@
|
||||
new /obj/item/reagent_containers/glass/beaker( src )
|
||||
new /obj/item/reagent_containers/glass/beaker( src )
|
||||
|
||||
/obj/item/storage/box/iv_bags
|
||||
name = "IV Bags"
|
||||
desc = "A box full of empty IV bags."
|
||||
icon_state = "beaker"
|
||||
|
||||
/obj/item/storage/box/iv_bags/New()
|
||||
..()
|
||||
new /obj/item/reagent_containers/iv_bag( src )
|
||||
new /obj/item/reagent_containers/iv_bag( src )
|
||||
new /obj/item/reagent_containers/iv_bag( src )
|
||||
new /obj/item/reagent_containers/iv_bag( src )
|
||||
new /obj/item/reagent_containers/iv_bag( src )
|
||||
new /obj/item/reagent_containers/iv_bag( src )
|
||||
new /obj/item/reagent_containers/iv_bag( src )
|
||||
|
||||
/obj/item/storage/box/injectors
|
||||
name = "\improper DNA injectors"
|
||||
desc = "This box contains injectors it seems."
|
||||
@@ -644,6 +695,56 @@
|
||||
new /obj/item/clothing/head/syndicatefake(src)
|
||||
new /obj/item/clothing/suit/syndicatefake(src)
|
||||
|
||||
/obj/item/storage/box/enforcer_rubber
|
||||
name = "enforcer pistol kit (rubber)"
|
||||
desc = "A box marked with pictures of an enforcer pistol, two ammo clips, and the word 'NON-LETHAL'."
|
||||
icon_state = "box_ert"
|
||||
|
||||
/obj/item/storage/box/enforcer_rubber/New()
|
||||
..()
|
||||
new /obj/item/gun/projectile/automatic/pistol/enforcer(src) // loaded with rubber by default
|
||||
new /obj/item/ammo_box/magazine/enforcer(src)
|
||||
new /obj/item/ammo_box/magazine/enforcer(src)
|
||||
|
||||
/obj/item/storage/box/enforcer_lethal
|
||||
name = "enforcer pistol kit (lethal)"
|
||||
desc = "A box marked with pictures of an enforcer pistol, two ammo clips, and the word 'LETHAL'."
|
||||
icon_state = "box_ert"
|
||||
|
||||
/obj/item/storage/box/enforcer_lethal/New()
|
||||
..()
|
||||
new /obj/item/gun/projectile/automatic/pistol/enforcer/lethal(src)
|
||||
new /obj/item/ammo_box/magazine/enforcer/lethal(src)
|
||||
new /obj/item/ammo_box/magazine/enforcer/lethal(src)
|
||||
|
||||
/obj/item/storage/box/bartender_rare_ingredients_kit
|
||||
name = "bartender rare reagents kit"
|
||||
desc = "A box intended for experienced bartenders."
|
||||
|
||||
/obj/item/storage/box/bartender_rare_ingredients_kit/New()
|
||||
..()
|
||||
var/list/reagent_list = list("sacid", "radium", "ether", "methamphetamine", "plasma", "gold", "silver", "capsaicin", "psilocybin")
|
||||
for(var/reag in reagent_list)
|
||||
var/obj/item/reagent_containers/glass/bottle/B = new(src)
|
||||
B.reagents.add_reagent(reag, 30)
|
||||
B.name = "[reag] bottle"
|
||||
|
||||
/obj/item/storage/box/chef_rare_ingredients_kit
|
||||
name = "chef rare reagents kit"
|
||||
desc = "A box intended for experienced chefs."
|
||||
|
||||
/obj/item/storage/box/chef_rare_ingredients_kit/New()
|
||||
..()
|
||||
new /obj/item/reagent_containers/food/condiment/soysauce(src)
|
||||
new /obj/item/reagent_containers/food/condiment/enzyme(src)
|
||||
new /obj/item/reagent_containers/food/condiment/pack/hotsauce(src)
|
||||
new /obj/item/kitchen/knife/butcher(src)
|
||||
var/list/reagent_list = list("msg", "triple_citrus", "salglu_solution", "nutriment", "gravy", "honey", "vitfro")
|
||||
for(var/reag in reagent_list)
|
||||
var/obj/item/reagent_containers/glass/bottle/B = new(src)
|
||||
B.reagents.add_reagent(reag, 30)
|
||||
B.name = "[reag] bottle"
|
||||
|
||||
/obj/item/storage/box/mousetraps
|
||||
name = "box of Pest-B-Gon mousetraps"
|
||||
desc = "<B><FONT color='red'>WARNING:</FONT></B> <I>Keep out of reach of children</I>."
|
||||
@@ -672,6 +773,20 @@
|
||||
new /obj/item/storage/pill_bottle( src )
|
||||
new /obj/item/storage/pill_bottle( src )
|
||||
|
||||
/obj/item/storage/box/patch_packs
|
||||
name = "box of patch packs"
|
||||
desc = "It has pictures of patch packs on its front."
|
||||
|
||||
/obj/item/storage/box/patch_packs/New()
|
||||
..()
|
||||
new /obj/item/storage/pill_bottle/patch_pack(src)
|
||||
new /obj/item/storage/pill_bottle/patch_pack(src)
|
||||
new /obj/item/storage/pill_bottle/patch_pack(src)
|
||||
new /obj/item/storage/pill_bottle/patch_pack(src)
|
||||
new /obj/item/storage/pill_bottle/patch_pack(src)
|
||||
new /obj/item/storage/pill_bottle/patch_pack(src)
|
||||
new /obj/item/storage/pill_bottle/patch_pack(src)
|
||||
|
||||
/obj/item/storage/box/bodybags
|
||||
name = "body bags"
|
||||
desc = "This box contains body bags."
|
||||
@@ -912,6 +1027,23 @@
|
||||
new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
|
||||
/obj/item/storage/box/clown
|
||||
name = "clown box"
|
||||
desc = "A colorful cardboard box for the clown"
|
||||
icon_state = "box_clown"
|
||||
|
||||
/obj/item/storage/box/rndboards
|
||||
name = "the Liberator's legacy"
|
||||
desc = "A box containing a gift for worthy golems."
|
||||
|
||||
/obj/item/storage/box/rndboards/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/circuitboard/protolathe(src)
|
||||
new /obj/item/circuitboard/destructive_analyzer(src)
|
||||
new /obj/item/circuitboard/circuit_imprinter(src)
|
||||
new /obj/item/circuitboard/rdconsole/public(src)
|
||||
|
||||
#undef NODESIGN
|
||||
#undef NANOTRASEN
|
||||
#undef SYNDI
|
||||
|
||||
@@ -234,6 +234,7 @@
|
||||
/*
|
||||
* Pill Bottles
|
||||
*/
|
||||
|
||||
/obj/item/storage/pill_bottle
|
||||
name = "pill bottle"
|
||||
desc = "It's an airtight container for storing medication."
|
||||
@@ -241,18 +242,38 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
item_state = "contsolid"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
can_hold = list(/obj/item/reagent_containers/food/pill, /obj/item/dice, /obj/item/paper)
|
||||
allow_quick_gather = 1
|
||||
use_to_pickup = 1
|
||||
storage_slots = 14
|
||||
display_contents_with_number = 1
|
||||
can_hold = list(/obj/item/reagent_containers/food/pill)
|
||||
cant_hold = list(/obj/item/reagent_containers/food/pill/patch)
|
||||
allow_quick_gather = TRUE
|
||||
use_to_pickup = TRUE
|
||||
storage_slots = 50
|
||||
max_combined_w_class = 50
|
||||
display_contents_with_number = TRUE
|
||||
var/base_name = ""
|
||||
var/label_text = ""
|
||||
var/applying_meds = FALSE //To Prevent spam clicking and generating runtimes from apply a deleting pill multiple times.
|
||||
var/rapid_intake_message = "unscrews the cap on the pill bottle and begins dumping the entire contents down their throat!"
|
||||
var/rapid_post_instake_message = "downs the entire bottle of pills in one go!"
|
||||
|
||||
/obj/item/storage/pill_bottle/New()
|
||||
..()
|
||||
base_name = name
|
||||
|
||||
/obj/item/storage/pill_bottle/attack(mob/M, mob/user)
|
||||
if(iscarbon(M) && contents.len)
|
||||
if(applying_meds)
|
||||
to_chat(user, "<span class='warning'>You are already applying meds.</span>")
|
||||
return
|
||||
applying_meds = TRUE
|
||||
for(var/obj/item/reagent_containers/food/pill/P in contents)
|
||||
if(P.attack(M, user))
|
||||
applying_meds = FALSE
|
||||
else
|
||||
applying_meds = FALSE
|
||||
break
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/pill_bottle/ert/New()
|
||||
..()
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
@@ -262,29 +283,23 @@
|
||||
new /obj/item/reagent_containers/food/pill/charcoal(src)
|
||||
new /obj/item/reagent_containers/food/pill/charcoal(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri
|
||||
if(ishuman(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~
|
||||
var/mob/M = usr
|
||||
if(!( istype(over_object, /obj/screen) ))
|
||||
return ..()
|
||||
if((!( M.restrained() ) && !( M.stat ) /*&& M.pocket == src*/))
|
||||
switch(over_object.name)
|
||||
if("r_hand")
|
||||
M.unEquip(src)
|
||||
M.put_in_r_hand(src)
|
||||
if("l_hand")
|
||||
M.unEquip(src)
|
||||
M.put_in_l_hand(src)
|
||||
src.add_fingerprint(usr)
|
||||
/obj/item/storage/pill_bottle/MouseDrop(obj/over_object as obj) // Best utilized if you're a cantankerous doctor with a Vicodin habit.
|
||||
if(iscarbon(over_object))
|
||||
var/mob/living/carbon/C = over_object
|
||||
if(loc == C && src == C.get_active_hand())
|
||||
if(!contents.len)
|
||||
to_chat(C, "<span class='notice'>There is nothing in [src]!</span>")
|
||||
return
|
||||
C.visible_message("<span class='danger'>[C] [rapid_intake_message]</span>")
|
||||
if(do_mob(C, C, 100)) // 10 seconds
|
||||
for(var/obj/item/reagent_containers/food/pill/P in contents)
|
||||
P.attack(C, C)
|
||||
C.visible_message("<span class='danger'>[C] [rapid_post_instake_message]</span>")
|
||||
return
|
||||
if(over_object == usr && in_range(src, usr) || usr.contents.Find(src))
|
||||
if(usr.s_active)
|
||||
usr.s_active.close(usr)
|
||||
src.show_to(usr)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/storage/pill_bottle/attackby(var/obj/item/I, mob/user as mob, params)
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/pill_bottle/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/pen) || istype(I, /obj/item/flashlight/pen))
|
||||
var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text))
|
||||
if(length(tmp_label) > MAX_NAME_LEN)
|
||||
@@ -294,7 +309,7 @@
|
||||
label_text = tmp_label
|
||||
update_name_label()
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/pill_bottle/proc/update_name_label()
|
||||
if(label_text == "")
|
||||
@@ -302,6 +317,14 @@
|
||||
else
|
||||
name = "[base_name] ([label_text])"
|
||||
|
||||
/obj/item/storage/pill_bottle/patch_pack
|
||||
name = "Patch Pack"
|
||||
icon_state = "patch_pack"
|
||||
can_hold = list(/obj/item/reagent_containers/food/pill/patch)
|
||||
cant_hold = list()
|
||||
rapid_intake_message = "flips the lid of the Patch Pack open and begins rapidly stamping patches on themselves!"
|
||||
rapid_post_instake_message = "stamps the entire contents of the Patch Pack all over their entire body!"
|
||||
|
||||
/obj/item/storage/pill_bottle/charcoal
|
||||
name = "Pill bottle (Charcoal)"
|
||||
desc = "Contains pills used to counter toxins."
|
||||
@@ -330,3 +353,9 @@
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/fakedeath/New()
|
||||
..()
|
||||
new /obj/item/reagent_containers/food/pill/fakedeath(src)
|
||||
new /obj/item/reagent_containers/food/pill/fakedeath(src)
|
||||
new /obj/item/reagent_containers/food/pill/fakedeath(src)
|
||||
@@ -24,6 +24,8 @@
|
||||
if(locked)
|
||||
icon_state = icon_locked
|
||||
to_chat(user, "<span class='warning'>You lock \the [src]!</span>")
|
||||
if(user.s_active)
|
||||
user.s_active.close(user)
|
||||
return
|
||||
else
|
||||
icon_state = icon_closed
|
||||
@@ -67,7 +69,7 @@
|
||||
origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
|
||||
return
|
||||
|
||||
/obj/item/storage/lockbox/hear_talk(mob/living/M as mob, msg)
|
||||
/obj/item/storage/lockbox/hear_talk(mob/living/M as mob, list/message_pieces)
|
||||
|
||||
/obj/item/storage/lockbox/hear_message(mob/living/M as mob, msg)
|
||||
|
||||
@@ -131,5 +133,5 @@
|
||||
|
||||
/obj/item/storage/lockbox/t4/New()
|
||||
..()
|
||||
for(var/i = 0, i < 3, i++)
|
||||
for(var/i in 0 to 2)
|
||||
new /obj/item/grenade/plastic/x4/thermite(src)
|
||||
@@ -158,7 +158,7 @@
|
||||
to_chat(usr, "<span class='notice'>[src] is locked!</span>")
|
||||
return 0
|
||||
|
||||
/obj/item/storage/secure/hear_talk(mob/living/M as mob, msg)
|
||||
/obj/item/storage/secure/hear_talk(mob/living/M as mob, list/message_pieces)
|
||||
return
|
||||
|
||||
/obj/item/storage/secure/hear_message(mob/living/M as mob, msg)
|
||||
|
||||
@@ -433,6 +433,7 @@
|
||||
CHECK_TICK
|
||||
|
||||
/obj/item/storage/New()
|
||||
..()
|
||||
can_hold = typecacheof(can_hold)
|
||||
cant_hold = typecacheof(cant_hold)
|
||||
|
||||
@@ -473,10 +474,10 @@
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
|
||||
/obj/item/storage/hear_talk(mob/living/M as mob, msg)
|
||||
/obj/item/storage/hear_talk(mob/living/M as mob, list/message_pieces)
|
||||
..()
|
||||
for(var/obj/O in contents)
|
||||
O.hear_talk(M, msg)
|
||||
O.hear_talk(M, message_pieces)
|
||||
|
||||
/obj/item/storage/hear_message(mob/living/M as mob, msg)
|
||||
..()
|
||||
|
||||
@@ -94,15 +94,11 @@
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/clothing/gloves/combat(src)
|
||||
|
||||
|
||||
/obj/item/storage/toolbox/syndicate/trapped
|
||||
name = "suspicious looking toolbox"
|
||||
desc = "Danger. Very robust. Has a small red marker by the handle."
|
||||
|
||||
/obj/item/storage/toolbox/syndicate/trapped/New()
|
||||
..()
|
||||
new /obj/item/grenade/chem_grenade/explosion/mine_armed(src)
|
||||
|
||||
/obj/item/storage/toolbox/fakesyndi
|
||||
name = "suspicous looking toolbox"
|
||||
icon_state = "syndicate"
|
||||
item_state = "toolbox_syndi"
|
||||
desc = "Danger. Very Robust. The paint is still wet."
|
||||
|
||||
/obj/item/storage/toolbox/drone
|
||||
name = "mechanical toolbox"
|
||||
|
||||
@@ -1,85 +1,113 @@
|
||||
/obj/item/storage/box/syndicate/
|
||||
New()
|
||||
..()
|
||||
switch(pickweight(list("bloodyspai" = 1, "thief" = 1, "bond" = 1, "sabotage" = 1, "payday" = 1, "implant" = 1, "hacker" = 1, "darklord" = 1, "gadgets" = 1)))
|
||||
if("bloodyspai")
|
||||
switch(pickweight(list("bloodyspai" = 1, "thief" = 1, "bond" = 1, "sabotage" = 1, "payday" = 1, "implant" = 1, "hacker" = 1, "darklord" = 1, "gadgets" = 1, "professional" = 1)))
|
||||
if("bloodyspai") // 28TC
|
||||
new /obj/item/twohanded/garrote(src)
|
||||
new /obj/item/pinpointer/advpinpointer(src)
|
||||
new /obj/item/clothing/mask/gas/voice(src)
|
||||
new /obj/item/clothing/under/chameleon(src)
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/storage/box/syndie_kit/emp(src)
|
||||
new /obj/item/flashlight/emp(src)
|
||||
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src)
|
||||
new /obj/item/clothing/glasses/hud/security/chameleon(src)
|
||||
new /obj/item/camera_bug(src)
|
||||
return
|
||||
|
||||
if("thief")
|
||||
if("thief") // 30TC
|
||||
new /obj/item/gun/energy/kinetic_accelerator/crossbow(src)
|
||||
new /obj/item/chameleon(src)
|
||||
new /obj/item/clothing/gloves/color/black/thief(src)
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/clothing/shoes/syndigaloshes(src)
|
||||
new /obj/item/storage/box/syndie_kit/safecracking(src)
|
||||
return
|
||||
|
||||
if("bond")
|
||||
if("bond") // 29TC + Healing Cocktail + armored suit jacket
|
||||
new /obj/item/gun/projectile/automatic/pistol(src)
|
||||
new /obj/item/suppressor(src)
|
||||
new /obj/item/ammo_box/magazine/m10mm/hp(src)
|
||||
new /obj/item/ammo_box/magazine/m10mm/ap(src)
|
||||
new /obj/item/encryptionkey/syndicate(src)
|
||||
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src)
|
||||
new /obj/item/implanter/krav_maga(src)
|
||||
new /obj/item/reagent_containers/food/drinks/drinkingglass/alliescocktail(src)
|
||||
new /obj/item/reagent_containers/food/drinks/drinkingglass/alliescocktail(src) // This drink heals now
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/dnascrambler(src)
|
||||
new /obj/item/storage/box/syndie_kit/emp(src)
|
||||
new /obj/item/CQC_manual(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src)
|
||||
return
|
||||
|
||||
if("sabotage")
|
||||
if("sabotage") // 31TC + RCD + Insuls
|
||||
new /obj/item/powersink(src)
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/grenade/clusterbuster/n2o(src)
|
||||
new /obj/item/storage/box/syndie_kit/space(src)
|
||||
new /obj/item/clothing/gloves/color/yellow(src)
|
||||
new /obj/item/rcd/preloaded(src)
|
||||
new /obj/item/storage/box/syndie_kit/space(src)
|
||||
return
|
||||
|
||||
if("payday")
|
||||
if("payday") // 31TC + armored suit jacket
|
||||
new /obj/item/gun/projectile/revolver(src)
|
||||
new /obj/item/ammo_box/a357(src)
|
||||
new /obj/item/ammo_box/a357(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/grenade/plastic/x4(src)
|
||||
new /obj/item/grenade/plastic/c4(src)
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src)
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/gas/clown_hat(src)
|
||||
new /obj/item/thermal_drill(src)
|
||||
return
|
||||
|
||||
if("implant")
|
||||
if("implant") // 35TC
|
||||
new /obj/item/implanter/uplink(src)
|
||||
new /obj/item/implanter/adrenalin(src)
|
||||
new /obj/item/implanter/storage(src)
|
||||
new /obj/item/implanter/freedom(src)
|
||||
return
|
||||
|
||||
if("hacker")
|
||||
if("hacker") // 22TC + Ion law uploader
|
||||
new /obj/item/aiModule/syndicate(src)
|
||||
new /obj/item/encryptionkey/binary(src)
|
||||
new /obj/item/encryptionkey/syndicate(src)
|
||||
new /obj/item/aiModule/toyAI(src)
|
||||
new /obj/item/card/emag(src)
|
||||
return
|
||||
|
||||
if("darklord")
|
||||
if("darklord") // 23TC + TK implant
|
||||
new /obj/item/melee/energy/sword/saber/red(src)
|
||||
new /obj/item/melee/energy/sword/saber/red(src)
|
||||
new /obj/item/dnainjector/telemut/darkbundle(src)
|
||||
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/clothing/shoes/syndigaloshes(src)
|
||||
new /obj/item/clothing/mask/gas/voice(src)
|
||||
return
|
||||
|
||||
if("gadgets")
|
||||
if("gadgets") // 30TC
|
||||
new /obj/item/clothing/gloves/color/yellow/power(src)
|
||||
new /obj/item/pen/sleepy(src)
|
||||
new /obj/item/clothing/shoes/syndigaloshes(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
new /obj/item/flashlight/emp(src)
|
||||
new /obj/item/clothing/shoes/syndigaloshes(src)
|
||||
new /obj/item/stamp/chameleon(src)
|
||||
new /obj/item/multitool/ai_detect(src)
|
||||
return
|
||||
|
||||
if("professional") // 29TC + armored suit jacket + insulated combat gloves
|
||||
new /obj/item/gun/projectile/automatic/sniper_rifle/soporific(src) // Unique version that starts with soporific rounds loaded and cannot be suppressed
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
|
||||
new /obj/item/pen/edagger(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi/sunglasses(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src)
|
||||
new /obj/item/clothing/gloves/combat(src)
|
||||
return
|
||||
|
||||
/obj/item/storage/box/syndie_kit
|
||||
name = "Box"
|
||||
desc = "A sleek, sturdy box"
|
||||
@@ -161,6 +189,17 @@
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/implanter/emp/(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/c4
|
||||
name = "Pack of C-4 Explosives"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/c4/New()
|
||||
..()
|
||||
new /obj/item/grenade/plastic/c4(src)
|
||||
new /obj/item/grenade/plastic/c4(src)
|
||||
new /obj/item/grenade/plastic/c4(src)
|
||||
new /obj/item/grenade/plastic/c4(src)
|
||||
new /obj/item/grenade/plastic/c4(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/throwing_weapons
|
||||
name = "boxed throwing kit"
|
||||
can_hold = list(/obj/item/throwing_star, /obj/item/restraints/legcuffs/bola/tactical)
|
||||
@@ -207,22 +246,47 @@
|
||||
|
||||
/obj/item/storage/box/syndie_kit/caneshotgun/New()
|
||||
..()
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/gun/projectile/revolver/doublebarrel/improvised/cane(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/fake_revolver
|
||||
name = "trick revolver kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/atmosgasgrenades
|
||||
name = "Atmos Grenades"
|
||||
/obj/item/storage/box/syndie_kit/fake_revolver/New()
|
||||
..()
|
||||
new /obj/item/toy/russian_revolver/trick_revolver(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/atmosgasgrenades/New()
|
||||
/obj/item/storage/box/syndie_kit/mimery
|
||||
name = "advanced mimery kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/mimery/New()
|
||||
..()
|
||||
new /obj/item/spellbook/oneuse/mime/greaterwall(src)
|
||||
new /obj/item/spellbook/oneuse/mime/fingergun(src)
|
||||
|
||||
|
||||
/obj/item/storage/box/syndie_kit/atmosn2ogrenades
|
||||
name = "Atmos N2O Grenades"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/atmosn2ogrenades/New()
|
||||
..()
|
||||
new /obj/item/grenade/clusterbuster/n2o(src)
|
||||
new /obj/item/grenade/clusterbuster/n2o(src)
|
||||
|
||||
|
||||
/obj/item/storage/box/syndie_kit/atmosfiregrenades
|
||||
name = "Plasma Fire Grenades"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/atmosfiregrenades/New()
|
||||
..()
|
||||
new /obj/item/grenade/clusterbuster/plasma(src)
|
||||
new /obj/item/grenade/clusterbuster/n2o(src)
|
||||
new /obj/item/grenade/clusterbuster/plasma(src)
|
||||
|
||||
|
||||
/obj/item/storage/box/syndie_kit/missionary_set
|
||||
name = "Missionary Starter Kit"
|
||||
@@ -276,4 +340,4 @@ To apply, hold the injector a short distance away from the outer thigh before ap
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/balaclava(src)
|
||||
new /obj/item/clothing/accessory/stethoscope(src)
|
||||
new /obj/item/book/manual/engineering_hacking(src)
|
||||
new /obj/item/book/manual/engineering_hacking(src)
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
/obj/item/melee/baton/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
return (FIRELOSS)
|
||||
return FIRELOSS
|
||||
|
||||
/obj/item/melee/baton/New()
|
||||
..()
|
||||
@@ -173,9 +173,13 @@
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that
|
||||
playsound(L, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return
|
||||
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.shock_internal_organs(33)
|
||||
|
||||
L.Stun(stunforce)
|
||||
L.Weaken(stunforce)
|
||||
L.apply_effect(STUTTER, stunforce)
|
||||
@@ -186,7 +190,7 @@
|
||||
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
|
||||
add_attack_logs(user, L, "stunned")
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
|
||||
deductcharge(hitcost)
|
||||
|
||||
|
||||
@@ -27,6 +27,9 @@
|
||||
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
|
||||
//playsound(usr, 'sound/effects/alert.ogg', 50, 1)
|
||||
|
||||
obj/item/tank/oxygen/empty/New()
|
||||
..()
|
||||
air_contents.oxygen = null
|
||||
|
||||
/obj/item/tank/oxygen/yellow
|
||||
desc = "A tank of oxygen, this one is yellow."
|
||||
@@ -142,11 +145,19 @@
|
||||
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
|
||||
user << sound('sound/effects/alert.ogg')
|
||||
|
||||
obj/item/tank/emergency_oxygen/empty/New()
|
||||
..()
|
||||
air_contents.oxygen = null
|
||||
|
||||
/obj/item/tank/emergency_oxygen/engi
|
||||
name = "extended-capacity emergency oxygen tank"
|
||||
icon_state = "emergency_engi"
|
||||
volume = 6
|
||||
|
||||
obj/item/tank/emergency_oxygen/engi/empty/New()
|
||||
..()
|
||||
air_contents.oxygen = null
|
||||
|
||||
/obj/item/tank/emergency_oxygen/syndi
|
||||
name = "suspicious emergency oxygen tank"
|
||||
icon_state = "emergency_syndi"
|
||||
@@ -158,6 +169,10 @@
|
||||
icon_state = "emergency_double"
|
||||
volume = 10
|
||||
|
||||
obj/item/tank/emergency_oxygen/double/empty/New()
|
||||
..()
|
||||
air_contents.oxygen = null
|
||||
|
||||
/obj/item/tank/emergency_oxygen/double/full
|
||||
name = "pressurized double emergency oxygen tank"
|
||||
desc = "Used for \"emergencies,\" it actually contains a fair amount of oxygen."
|
||||
|
||||
@@ -5,59 +5,42 @@
|
||||
icon_state = "taperoll"
|
||||
singular_name = "tape roll"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
amount = 10
|
||||
max_amount = 10
|
||||
amount = 25
|
||||
max_amount = 25
|
||||
|
||||
/obj/item/stack/tape_roll/New(var/loc, var/amount=null)
|
||||
..()
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/item/stack/tape_roll/attack(mob/living/carbon/human/M as mob, mob/living/user as mob)
|
||||
/obj/item/stack/tape_roll/attack(mob/living/carbon/human/M, mob/living/user)
|
||||
if(!istype(M)) //What good is a duct tape mask if you are unable to speak?
|
||||
return
|
||||
if(M.wear_mask)
|
||||
to_chat(user, "Remove [M.p_their()] mask first!")
|
||||
else if(amount < 2)
|
||||
to_chat(user, "You'll need more tape for this!")
|
||||
else if(!M.check_has_mouth())
|
||||
to_chat(user, "[M.p_they(TRUE)] [M.p_have()] no mouth to tape over!")
|
||||
else
|
||||
if(M == user)
|
||||
to_chat(user, "You try to tape your own mouth shut.")
|
||||
else
|
||||
to_chat(user, "You try to tape [M]'s mouth shut.")
|
||||
M.visible_message("<span class='warning'>[user] tries to tape [M]'s mouth closed!</span>")
|
||||
if(do_after(user, 50, target = M))
|
||||
if(M == user)
|
||||
to_chat(user, "You cover your own mouth with a piece of duct tape.")
|
||||
else
|
||||
to_chat(user, "You cover [M]'s mouth with a piece of duct tape. That will shut [M.p_them()] up!")
|
||||
M.visible_message("<span class='warning'>[user] tapes [M]'s mouth shut!</span>")
|
||||
var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag
|
||||
M.equip_to_slot(G, slot_wear_mask)
|
||||
G.add_fingerprint(user)
|
||||
amount = amount - 2
|
||||
if(amount <= 0)
|
||||
user.unEquip(src, 1)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
/* -- Disabled for now until it has a use --
|
||||
/obj/item/stack/tape_roll/attack_self(mob/user as mob)
|
||||
to_chat(user, "You remove a length of tape from [src].")
|
||||
|
||||
var/obj/item/ducttape/tape = new()
|
||||
user.put_in_hands(tape)
|
||||
*/
|
||||
|
||||
/obj/item/stack/tape_roll/proc/stick(var/obj/item/W, mob/user)
|
||||
if(!istype(W, /obj/item/paper))
|
||||
return
|
||||
|
||||
user.unEquip(W)
|
||||
var/obj/item/ducttape/tape = new(get_turf(src))
|
||||
tape.attach(W)
|
||||
user.put_in_hands(tape)
|
||||
if(amount < 2)
|
||||
to_chat(user, "You'll need more tape for this!")
|
||||
return
|
||||
if(!M.check_has_mouth())
|
||||
to_chat(user, "[M.p_they(TRUE)] [M.p_have()] no mouth to tape over!")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] is taping [M]'s mouth closed!</span>",
|
||||
"<span class='notice'>You try to tape [M == user ? "your own" : "[M]'s"] mouth shut!</span>",
|
||||
"<span class='warning'>You hear tape ripping.</span>")
|
||||
if(!do_after(user, 50, target = M))
|
||||
return
|
||||
if(!use(2))
|
||||
to_chat(user, "<span class='notice'>You don't have enough tape!</span>")
|
||||
return
|
||||
if(M.wear_mask)
|
||||
to_chat(user, "<span class='notice'>[M == user ? user : M]'s mouth is already covered!</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] tapes [M]'s mouth shut!</span>",
|
||||
"<span class='notice'>You cover [M == user ? "your own" : "[M]'s"] mouth with a piece of duct tape.[M == user ? null : " That will shut them up."]</span>")
|
||||
var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag
|
||||
M.equip_to_slot(G, slot_wear_mask)
|
||||
G.add_fingerprint(user)
|
||||
|
||||
/obj/item/stack/tape_roll/update_icon()
|
||||
var/amount = get_amount()
|
||||
@@ -71,73 +54,4 @@
|
||||
icon_state = "taperoll-4"
|
||||
else
|
||||
icon_state = "taperoll-4"
|
||||
|
||||
/obj/item/ducttape
|
||||
name = "tape"
|
||||
desc = "A piece of sticky tape."
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "tape"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
layer = 4
|
||||
anchored = 1 //it's sticky, no you cant move it
|
||||
|
||||
var/obj/item/stuck = null
|
||||
|
||||
/obj/item/ducttape/New()
|
||||
..()
|
||||
flags |= NOBLUDGEON
|
||||
|
||||
/obj/item/ducttape/examine(mob/user)
|
||||
return stuck.examine(user)
|
||||
|
||||
/obj/item/ducttape/proc/attach(var/obj/item/W)
|
||||
stuck = W
|
||||
W.forceMove(src)
|
||||
icon_state = W.icon_state + "_taped"
|
||||
name = W.name + " (taped)"
|
||||
overlays = W.overlays
|
||||
|
||||
/obj/item/ducttape/attack_self(mob/user)
|
||||
if(!stuck)
|
||||
return
|
||||
|
||||
to_chat(user, "You remove \the [initial(name)] from [stuck].")
|
||||
|
||||
user.unEquip(src)
|
||||
stuck.forceMove(get_turf(src))
|
||||
user.put_in_hands(stuck)
|
||||
stuck = null
|
||||
overlays = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/ducttape/afterattack(var/A, mob/user, flag, params)
|
||||
if(!in_range(user, A) || istype(A, /obj/machinery/door) || !stuck)
|
||||
return
|
||||
|
||||
var/turf/target_turf = get_turf(A)
|
||||
var/turf/source_turf = get_turf(user)
|
||||
|
||||
var/dir_offset = 0
|
||||
if(target_turf != source_turf)
|
||||
dir_offset = get_dir(source_turf, target_turf)
|
||||
if(!(dir_offset in cardinal))
|
||||
to_chat(user, "You cannot reach that from here.")// can only place stuck papers in cardinal directions, to
|
||||
return // reduce papers around corners issue.
|
||||
|
||||
user.unEquip(src)
|
||||
forceMove(source_turf)
|
||||
|
||||
if(params)
|
||||
var/list/mouse_control = params2list(params)
|
||||
if(mouse_control["icon-x"])
|
||||
pixel_x = text2num(mouse_control["icon-x"]) - 16
|
||||
if(dir_offset & EAST)
|
||||
pixel_x += 32
|
||||
else if(dir_offset & WEST)
|
||||
pixel_x -= 32
|
||||
if(mouse_control["icon-y"])
|
||||
pixel_y = text2num(mouse_control["icon-y"]) - 16
|
||||
if(dir_offset & NORTH)
|
||||
pixel_y += 32
|
||||
else if(dir_offset & SOUTH)
|
||||
pixel_y -= 32
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
slot_flags = SLOT_BELT
|
||||
force = 5
|
||||
throwforce = 7
|
||||
usesound = 'sound/items/Ratchet.ogg'
|
||||
usesound = 'sound/items/ratchet.ogg'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
materials = list(MAT_METAL=150)
|
||||
origin_tech = "materials=1;engineering=1"
|
||||
@@ -32,7 +32,7 @@
|
||||
/obj/item/wrench/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/wrench/cyborg
|
||||
name = "automatic wrench"
|
||||
@@ -50,7 +50,7 @@
|
||||
desc = "A polarized wrench. It causes anything placed between the jaws to turn."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "wrench"
|
||||
usesound = 'sound/effects/EMPulse.ogg'
|
||||
usesound = 'sound/effects/empulse.ogg'
|
||||
toolspeed = 0.1
|
||||
origin_tech = "materials=5;engineering=5;abductor=3"
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
/obj/item/wrench/power/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!")
|
||||
return (BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/wrench/medical
|
||||
name = "medical wrench"
|
||||
@@ -113,7 +113,7 @@
|
||||
return
|
||||
|
||||
user.dust()
|
||||
return OXYLOSS
|
||||
return OBLITERATION
|
||||
|
||||
//Screwdriver
|
||||
/obj/item/screwdriver
|
||||
@@ -131,7 +131,7 @@
|
||||
materials = list(MAT_METAL=75)
|
||||
attack_verb = list("stabbed")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
usesound = 'sound/items/Screwdriver.ogg'
|
||||
usesound = 'sound/items/screwdriver.ogg'
|
||||
toolspeed = 1
|
||||
var/random_color = TRUE //if the screwdriver uses random coloring
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
|
||||
/obj/item/screwdriver/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return(BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/screwdriver/New(loc, var/param_color = null)
|
||||
..()
|
||||
@@ -176,7 +176,7 @@
|
||||
desc = "An ultrasonic screwdriver."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "screwdriver"
|
||||
usesound = 'sound/items/PSHOOM.ogg'
|
||||
usesound = 'sound/items/pshoom.ogg'
|
||||
toolspeed = 0.1
|
||||
random_color = FALSE
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
|
||||
/obj/item/screwdriver/power/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return(BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/screwdriver/power/attack_self(mob/user)
|
||||
playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1)
|
||||
@@ -229,8 +229,8 @@
|
||||
materials = list(MAT_METAL=80)
|
||||
origin_tech = "materials=1;engineering=1"
|
||||
attack_verb = list("pinched", "nipped")
|
||||
hitsound = 'sound/items/Wirecutter.ogg'
|
||||
usesound = 'sound/items/Wirecutter.ogg'
|
||||
hitsound = 'sound/items/wirecutter.ogg'
|
||||
usesound = 'sound/items/wirecutter.ogg'
|
||||
sharp = 1
|
||||
toolspeed = 1
|
||||
var/random_color = TRUE
|
||||
@@ -256,7 +256,7 @@
|
||||
/obj/item/wirecutters/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is cutting at [user.p_their()] arteries with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(loc, usesound, 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/wirecutters/brass
|
||||
name = "brass wirecutters"
|
||||
@@ -299,7 +299,7 @@
|
||||
if(head)
|
||||
head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE)
|
||||
playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/wirecutters/power/attack_self(mob/user)
|
||||
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
|
||||
@@ -322,9 +322,9 @@
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
hitsound = "swing_hit"
|
||||
usesound = 'sound/items/Welder.ogg'
|
||||
var/acti_sound = 'sound/items/WelderActivate.ogg'
|
||||
var/deac_sound = 'sound/items/WelderDeactivate.ogg'
|
||||
usesound = 'sound/items/welder.ogg'
|
||||
var/acti_sound = 'sound/items/welderactivate.ogg'
|
||||
var/deac_sound = 'sound/items/welderdeactivate.ogg'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=30)
|
||||
origin_tech = "engineering=1;plasmatech=1"
|
||||
@@ -349,7 +349,7 @@
|
||||
|
||||
/obj/item/weldingtool/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (FIRELOSS)
|
||||
return FIRELOSS
|
||||
|
||||
/obj/item/weldingtool/proc/update_torch()
|
||||
overlays.Cut()
|
||||
@@ -368,6 +368,7 @@
|
||||
else
|
||||
icon_state = "[initial(icon_state)][ratio]"
|
||||
update_torch()
|
||||
..()
|
||||
|
||||
/obj/item/weldingtool/process()
|
||||
switch(welding)
|
||||
@@ -468,7 +469,6 @@
|
||||
/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
if(welding)
|
||||
remove_fuel(1)
|
||||
var/turf/location = get_turf(user)
|
||||
@@ -671,7 +671,7 @@ obj/item/weldingtool/experimental/process()
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "crowbar"
|
||||
item_state = "crowbar"
|
||||
usesound = 'sound/items/Crowbar.ogg'
|
||||
usesound = 'sound/items/crowbar.ogg'
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
force = 5
|
||||
@@ -738,7 +738,7 @@ obj/item/weldingtool/experimental/process()
|
||||
/obj/item/crowbar/power/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is putting [user.p_their()] head in [src]. It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/crowbar/power/attack_self(mob/user)
|
||||
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
|
||||
|
||||
@@ -91,9 +91,6 @@
|
||||
O.unwield(user)
|
||||
return unwield(user)
|
||||
|
||||
/obj/item/twohanded/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/twohanded/attack_self(mob/user)
|
||||
..()
|
||||
if(wielded) //Trying to unwield it
|
||||
@@ -178,10 +175,11 @@
|
||||
force_wielded = 24
|
||||
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
usesound = 'sound/items/Crowbar.ogg'
|
||||
usesound = 'sound/items/crowbar.ogg'
|
||||
|
||||
/obj/item/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "fireaxe[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/fireaxe/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
@@ -208,6 +206,7 @@
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/w_class_on = WEIGHT_CLASS_BULKY
|
||||
force_unwielded = 3
|
||||
force_wielded = 34
|
||||
wieldsound = 'sound/weapons/saberon.ogg'
|
||||
@@ -232,6 +231,7 @@
|
||||
else
|
||||
icon_state = "dualsaber0"
|
||||
set_light(0)
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/user)
|
||||
if(HULK in user.mutations)
|
||||
@@ -278,6 +278,7 @@
|
||||
/obj/item/twohanded/dualsaber/unwield()
|
||||
..()
|
||||
hitsound = "swing_hit"
|
||||
w_class = initial(w_class)
|
||||
|
||||
/obj/item/twohanded/dualsaber/IsReflect()
|
||||
if(wielded)
|
||||
@@ -289,6 +290,7 @@
|
||||
return
|
||||
..()
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
w_class = w_class_on
|
||||
|
||||
/obj/item/twohanded/dualsaber/attackby(obj/item/W, mob/user, params)
|
||||
if(ismultitool(W))
|
||||
@@ -327,6 +329,7 @@
|
||||
icon_state = "spearbomb[wielded]"
|
||||
else
|
||||
icon_state = "spearglass[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity)
|
||||
if(!proximity)
|
||||
@@ -405,7 +408,7 @@
|
||||
|
||||
/obj/structure/headspear/attack_hand(mob/living/user)
|
||||
user.visible_message("<span class='warning'>[user] kicks over [src]!</span>", "<span class='danger'>You kick down [src]!</span>")
|
||||
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
var/turf/T = get_turf(src)
|
||||
if(contained_spear)
|
||||
contained_spear.forceMove(T)
|
||||
@@ -509,6 +512,7 @@
|
||||
icon_state = "chainsaw[wielded]"
|
||||
else
|
||||
icon_state = "chainsaw0"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/chainsaw/attack(mob/target, mob/living/user)
|
||||
if(wielded)
|
||||
@@ -565,6 +569,7 @@
|
||||
|
||||
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "mjollnir[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
|
||||
for(var/atom/movable/X in orange(5, pull))
|
||||
@@ -640,6 +645,7 @@
|
||||
|
||||
/obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "mjollnir[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/knighthammer
|
||||
name = "singuloth knight's hammer"
|
||||
@@ -670,6 +676,7 @@
|
||||
|
||||
/obj/item/twohanded/knighthammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "knighthammer[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/knighthammer/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
@@ -725,6 +732,7 @@
|
||||
icon_state = "fireaxe2"
|
||||
else
|
||||
icon_state = "fireaxe0"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/energizedfireaxe/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
@@ -750,4 +758,74 @@
|
||||
qdel(A)
|
||||
if(prob(4))
|
||||
charged++
|
||||
user.visible_message("<span class='notice'>The axe starts to emit an electric buzz!</span>")
|
||||
user.visible_message("<span class='notice'>The axe starts to emit an electric buzz!</span>")
|
||||
|
||||
/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'
|
||||
|
||||
/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
|
||||
..()
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
|
||||
|
||||
/obj/item/banhammer/suicide_act(mob/user)
|
||||
to_chat(viewers(user), "<span class='suicide'>[user] is hitting [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.</span>")
|
||||
return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS)
|
||||
to_chat(viewers(user), "<span class='suicide'>[user] is hitting [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.</span>")
|
||||
return BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS
|
||||
|
||||
/obj/item/sord
|
||||
name = "\improper SORD"
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
/obj/item/claymore/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is falling on the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
return(BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/claymore/ceremonial
|
||||
name = "ceremonial claymore"
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
/obj/item/katana/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku.</span>")
|
||||
return(BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/harpoon
|
||||
name = "harpoon"
|
||||
@@ -89,7 +89,7 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("jabbed","stabbed","ripped")
|
||||
|
||||
obj/item/wirerod
|
||||
/obj/item/wirerod
|
||||
name = "Wired rod"
|
||||
desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit."
|
||||
icon_state = "wiredrod"
|
||||
@@ -101,7 +101,7 @@ obj/item/wirerod
|
||||
materials = list(MAT_METAL=1150, MAT_GLASS=75)
|
||||
attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
|
||||
|
||||
obj/item/wirerod/attackby(obj/item/I, mob/user, params)
|
||||
/obj/item/wirerod/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/shard))
|
||||
var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear
|
||||
@@ -191,7 +191,7 @@ obj/item/wirerod/attackby(obj/item/I, mob/user, params)
|
||||
user.visible_message("<span class='userdanger'>It's a home run!</span>")
|
||||
target.throw_at(throw_target, rand(8,10), 14, user)
|
||||
target.ex_act(2)
|
||||
playsound(get_turf(src), 'sound/weapons/HOMERUN.ogg', 100, 1)
|
||||
playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, 1)
|
||||
homerun_ready = 0
|
||||
return
|
||||
else
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "whetstone"
|
||||
desc = "A block of stone used to sharpen things."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
usesound = 'sound/items/Screwdriver.ogg'
|
||||
usesound = 'sound/items/screwdriver.ogg'
|
||||
var/used = 0
|
||||
var/increment = 4
|
||||
var/max = 30
|
||||
|
||||
Reference in New Issue
Block a user