Merge remote-tracking branch 'upstream/master' into fix-cqc

# Conflicts:
#	code/game/objects/items.dm
This commit is contained in:
Fox McCloud
2019-04-07 19:54:14 -04:00
1409 changed files with 1712308 additions and 63928 deletions
+10 -6
View File
@@ -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 \
+1
View File
@@ -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
+81 -46
View File
@@ -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"
+4 -3
View File
@@ -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()
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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"
+25 -12
View File
@@ -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)
+1
View File
@@ -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()
..()
+126 -122
View File
@@ -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
..()
..()
+14 -5
View File
@@ -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)
+1 -1
View File
@@ -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)
+23 -29
View File
@@ -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."
+53 -18
View File
@@ -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)
+37 -1
View File
@@ -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")
+1 -1
View File
@@ -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)
..()
+5 -4
View File
@@ -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"
+23 -3
View File
@@ -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
+2 -2
View File
@@ -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.
+1 -1
View File
@@ -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)
+7 -3
View File
@@ -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."
+27 -113
View File
@@ -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
+20 -20
View File
@@ -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)
+84 -6
View File
@@ -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
..()
+7 -7
View File
@@ -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
+1 -1
View File
@@ -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