radio-emp

This commit is contained in:
Alexshreds
2017-05-31 23:51:15 -05:00
committed by Chakirski
1986 changed files with 79586 additions and 52439 deletions
+4 -4
View File
@@ -35,11 +35,11 @@
return FALSE
//procs that handle the actual buckling and unbuckling
/atom/movable/proc/buckle_mob(mob/living/M)
if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || M.buckled_mob || buckled_mob || (buckle_requires_restraints && !M.restrained()) || M == src)
/atom/movable/proc/buckle_mob(mob/living/M, force = 0)
if((!can_buckle && !force)|| !istype(M) || (M.loc != loc) || M.buckled || M.buckled_mob || buckled_mob || (buckle_requires_restraints && !M.restrained()) || M == src)
return 0
if(isslime(M) || isAI(M))
if((isslime(M) || isAI(M)) && !force)
if(M == usr)
to_chat(M, "<span class='warning'>You are unable to buckle yourself to the [src]!</span>")
else
@@ -54,7 +54,7 @@
M.throw_alert("buckled", /obj/screen/alert/restrained/buckled, new_master = src)
return 1
/obj/buckle_mob(mob/living/M)
/obj/buckle_mob(mob/living/M, force = 0)
. = ..()
if(.)
if(burn_state == ON_FIRE) //Sets the mob on fire if you buckle them to a burning atom/movableect
+6 -5
View File
@@ -104,9 +104,9 @@
/obj/structure/alien/resin/hitby(atom/movable/AM)
..()
var/tforce = 0
if(!isobj(AM))
if(ismob(AM))
tforce = 10
else
else if(isobj(AM))
var/obj/O = AM
tforce = O.throwforce
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
@@ -222,7 +222,7 @@
var/obj/item/weapon/weldingtool/WT = I
if(WT.remove_fuel(0, user))
damage = 15
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
playsound(loc, WT.usesound, 100, 1)
health -= damage
healthcheck()
@@ -363,7 +363,8 @@
break
/obj/structure/alien/egg/bullet_act(obj/item/projectile/Proj)
health -= Proj.damage
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
health -= Proj.damage
..()
healthcheck()
@@ -380,7 +381,7 @@
if(WT.remove_fuel(0, user))
damage = 15
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
playsound(loc, WT.usesound, 100, 1)
health -= damage
user.changeNext_move(CLICK_CD_MELEE)
+6
View File
@@ -18,6 +18,12 @@
var/new_frequency = sanitize_frequency(rand(PUBLIC_LOW_FREQ, PUBLIC_HIGH_FREQ))
aSignal.set_frequency(new_frequency)
poi_list |= src
/obj/effect/anomaly/Destroy()
QDEL_NULL(aSignal)
poi_list.Remove(src)
return ..()
/obj/effect/anomaly/proc/anomalyEffect()
if(prob(50))
@@ -1,228 +0,0 @@
//This item is not completely unused- the central datacore datum uses it.
/*
* This item is completely unused, but removing it will break something in R&D and Radio code causing PDA and Ninja code to fail on compile
*/
/obj/effect/datacore
name = "datacore"
var/medical[] = list()
var/general[] = list()
var/security[] = list()
//This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
var/locked[] = list()
/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
var/list/heads = new()
var/list/sec = new()
var/list/eng = new()
var/list/med = new()
var/list/sci = new()
var/list/ser = new()
var/list/sup = new()
var/list/bot = new()
var/list/misc = new()
var/list/isactive = new()
var/dat = {"
<head><style>
.manifest {border-collapse:collapse;}
.manifest td, th {border:1px solid [monochrome?"black":"#DEF; background-color:white; color:black"]; padding:.25em}
.manifest th {height: 2em; [monochrome?"border-top-width: 3px":"background-color: #48C; color:white"]}
.manifest tr.head th { [monochrome?"border-top-width: 1px":"background-color: #488;"] }
.manifest td:first-child {text-align:right}
.manifest tr.alt td {[monochrome?"border-top-width: 2px":"background-color: #DEF"]}
</style></head>
<table class="manifest" width='350px'>
<tr class='head'><th>Name</th><th>Rank</th><th>Activity</th></tr>
"}
var/even = 0
// sort mobs
for(var/datum/data/record/t in data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/real_rank = t.fields["real_rank"]
if(OOC)
var/active = 0
for(var/mob/M in player_list)
if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
active = 1
break
isactive[name] = active ? "Active" : "Inactive"
else
isactive[name] = t.fields["p_stat"]
// to_chat(world, "[name]: [rank]")
//cael - to prevent multiple appearances of a player/job combination, add a continue after each line
var/department = 0
if(real_rank in command_positions)
heads[name] = rank
department = 1
if(real_rank in security_positions)
sec[name] = rank
department = 1
if(real_rank in engineering_positions)
eng[name] = rank
department = 1
if(real_rank in medical_positions)
med[name] = rank
department = 1
if(real_rank in science_positions)
sci[name] = rank
department = 1
if(real_rank in service_positions)
ser[name] = rank
department = 1
if(real_rank in supply_positions)
sup[name] = rank
department = 1
if(real_rank in nonhuman_positions)
bot[name] = rank
department = 1
if(!department && !(name in heads))
misc[name] = rank
if(heads.len > 0)
dat += "<tr><th colspan=3>Heads</th></tr>"
for(name in heads)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[heads[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sec.len > 0)
dat += "<tr><th colspan=3>Security</th></tr>"
for(name in sec)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sec[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(eng.len > 0)
dat += "<tr><th colspan=3>Engineering</th></tr>"
for(name in eng)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[eng[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(med.len > 0)
dat += "<tr><th colspan=3>Medical</th></tr>"
for(name in med)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[med[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sci.len > 0)
dat += "<tr><th colspan=3>Science</th></tr>"
for(name in sci)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sci[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(ser.len > 0)
dat += "<tr><th colspan=3>Service</th></tr>"
for(name in ser)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[ser[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sup.len > 0)
dat += "<tr><th colspan=3>Supply</th></tr>"
for(name in sup)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sup[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// in case somebody is insane and added them to the manifest, why not
if(bot.len > 0)
dat += "<tr><th colspan=3>Silicon</th></tr>"
for(name in bot)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[bot[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
// misc guys
if(misc.len > 0)
dat += "<tr><th colspan=3>Miscellaneous</th></tr>"
for(name in misc)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[misc[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
dat += "</table>"
dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
dat = replacetext(dat, "\t", "")
return dat
/*
We can't just insert in HTML into the nanoUI so we need the raw data to play with.
Instead of creating this list over and over when someone leaves their PDA open to the page
we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change
using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( )
*/
var/global/list/PDA_Manifest = list()
/obj/effect/datacore/proc/get_manifest_json()
if(PDA_Manifest.len)
return
var/heads[0]
var/sec[0]
var/eng[0]
var/med[0]
var/sci[0]
var/ser[0]
var/sup[0]
var/bot[0]
var/misc[0]
for(var/datum/data/record/t in data_core.general)
var/name = sanitize(t.fields["name"])
var/rank = sanitize(t.fields["rank"])
var/real_rank = t.fields["real_rank"]
var/isactive = t.fields["p_stat"]
var/department = 0
var/depthead = 0 // Department Heads will be placed at the top of their lists.
if(real_rank in command_positions)
heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
depthead = 1
if(rank == "Captain" && heads.len != 1)
heads.Swap(1, heads.len)
if(real_rank in security_positions)
sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && sec.len != 1)
sec.Swap(1, sec.len)
if(real_rank in engineering_positions)
eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && eng.len != 1)
eng.Swap(1, eng.len)
if(real_rank in medical_positions)
med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && med.len != 1)
med.Swap(1, med.len)
if(real_rank in science_positions)
sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && sci.len != 1)
sci.Swap(1, sci.len)
if(real_rank in service_positions)
ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && ser.len != 1)
ser.Swap(1, ser.len)
if(real_rank in supply_positions)
sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && sup.len != 1)
sup.Swap(1, sup.len)
if(real_rank in nonhuman_positions)
bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(!department && !(name in heads))
misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
PDA_Manifest = list(\
"heads" = heads,\
"sec" = sec,\
"eng" = eng,\
"med" = med,\
"sci" = sci,\
"ser" = ser,\
"sup" = sup,\
"bot" = bot,\
"misc" = misc\
)
return
@@ -1,4 +1,4 @@
obj/effect/decal/cleanable/liquid_fuel
/obj/effect/decal/cleanable/liquid_fuel
//Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
icon = 'icons/effects/effects.dmi'
icon_state = "fuel"
@@ -6,52 +6,53 @@ obj/effect/decal/cleanable/liquid_fuel
anchored = 1
var/amount = 1 //Basically moles.
New(newLoc,amt=1)
src.amount = amt
/obj/effect/decal/cleanable/liquid_fuel/New(newLoc,amt=1)
amount = amt
//Be absorbed by any other liquid fuel in the tile.
for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
if(other != src)
other.amount += src.amount
spawn other.Spread()
qdel(src)
//Be absorbed by any other liquid fuel in the tile.
for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
if(other != src)
other.amount += amount
spawn other.Spread()
qdel(src)
Spread()
. = ..()
Spread()
. = ..()
proc/Spread()
//Allows liquid fuels to sometimes flow into other tiles.
if(amount < 0.5) return
var/turf/simulated/S = loc
if(!istype(S)) return
for(var/d in cardinal)
if(rand(25))
var/turf/simulated/target = get_step(src,d)
var/turf/simulated/origin = get_turf(src)
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target)
new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25)
amount *= 0.75
/obj/effect/decal/cleanable/liquid_fuel/proc/Spread()
//Allows liquid fuels to sometimes flow into other tiles.
if(amount < 0.5) return
var/turf/simulated/S = loc
if(!istype(S)) return
for(var/d in cardinal)
if(rand(25))
var/turf/simulated/target = get_step(src, d)
var/turf/simulated/origin = get_turf(src)
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target)
new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25)
amount *= 0.75
flamethrower_fuel
icon_state = "mustard"
anchored = 0
New(newLoc, amt = 1, d = 0)
dir = d //Setting this direction means you won't get torched by your own flamethrower.
. = ..()
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel
icon_state = "mustard"
anchored = 0
Spread()
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
if(amount < 0.1) return
var/turf/simulated/S = loc
if(!istype(S)) return
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/New(newLoc, amt = 1, d = 0)
dir = d //Setting this direction means you won't get torched by your own flamethrower.
. = ..()
for(var/d in list(turn(dir,90),turn(dir,-90), dir))
var/turf/simulated/O = get_step(S,d)
if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
continue
if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Spread()
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
if(amount < 0.1) return
var/turf/simulated/S = loc
if(!istype(S)) return
amount *= 0.25
for(var/d in list(turn(dir,90),turn(dir,-90), dir))
var/turf/simulated/O = get_step(S,d)
if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
continue
if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
amount *= 0.25
@@ -20,6 +20,7 @@ var/global/list/image/splatter_cache=list()
var/basecolor="#A10808" // Color when wet.
var/amount = 5
appearance_flags = NO_CLIENT_COLOR
var/dry_timer = 0
/obj/effect/decal/cleanable/blood/New()
..()
@@ -41,8 +42,7 @@ var/global/list/image/splatter_cache=list()
if(B.blood_DNA)
blood_DNA |= B.blood_DNA.Copy()
qdel(B)
spawn(DRYING_TIME * (amount+1))
dry()
dry_timer = addtimer(src, "dry", DRYING_TIME * (amount+1))
/obj/effect/decal/cleanable/blood/Destroy()
if(GAMEMODE_IS_CULT)
@@ -51,7 +51,9 @@ var/global/list/image/splatter_cache=list()
if(T && (is_station_level(T.z)))
mode_ticker.bloody_floors -= T
mode_ticker.blood_check()
.=..()
if(dry_timer)
deltimer(dry_timer)
return ..()
/obj/effect/decal/cleanable/blood/update_icon()
if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
@@ -118,9 +120,12 @@ var/global/list/image/splatter_cache=list()
user.update_inv_gloves(1)
user.verbs += /mob/living/carbon/human/proc/bloody_doodle
/obj/effect/decal/cleanable/blood/can_bloodcrawl_in()
return TRUE
/obj/effect/decal/cleanable/blood/splatter
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
amount = 2
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
amount = 2
/obj/effect/decal/cleanable/blood/drip
name = "drips of blood"
@@ -134,8 +139,7 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/drip/New()
..()
spawn(1)
drips |= icon_state
drips |= icon_state
/obj/effect/decal/cleanable/blood/writing
icon_state = "tracks"
@@ -89,15 +89,20 @@
/obj/effect/decal/cleanable/cobweb/fire_act()
qdel(src)
/obj/effect/decal/cleanable/molten_item
/obj/effect/decal/cleanable/molten_object
name = "gooey grey mass"
desc = "It looks like a melted... something."
density = 0
anchored = 1
layer = 3
icon = 'icons/obj/chemical.dmi'
gender = NEUTER
icon = 'icons/effects/effects.dmi'
icon_state = "molten"
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
icon_state = "big_molten"
/obj/effect/decal/cleanable/cobweb2
name = "cobweb"
desc = "Somebody should remove that."
@@ -145,6 +150,15 @@
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
/obj/effect/decal/cleanable/plant_smudge
name = "plant smudge"
density = 0
anchored = 1
layer = 2
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_plant")
/obj/effect/decal/cleanable/egg_smudge
name = "smashed egg"
desc = "Seems like this one won't hatch."
@@ -163,16 +177,6 @@
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_pie")
/obj/effect/decal/cleanable/fruit_smudge
name = "smudge"
desc = "Some kind of fruit smear."
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
/obj/effect/decal/cleanable/fungus
name = "space fungus"
desc = "A fungal growth. Looks pretty nasty."
@@ -11,6 +11,9 @@
/obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like
return
/obj/effect/decal/cleanable/blood/gibs/robot/can_bloodcrawl_in()
return FALSE
/obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions)
spawn (0)
@@ -42,6 +45,9 @@
desc = "It's black and greasy. Looks like Beepsky made another mess."
basecolor="#030303"
/obj/effect/decal/cleanable/blood/oil/can_bloodcrawl_in()
return FALSE
/obj/effect/decal/cleanable/blood/oil/dry()
return
@@ -1,9 +1,11 @@
/obj/effect/decal/cleanable
var/list/random_icon_states = list()
var/targeted_by = null // Used so cleanbots can't claim a mess.
var/noscoop = 0 //if it has this, don't let it be scooped up
var/noclear = 0 //if it has this, don't delete it when its' scooped up
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
return FALSE
/obj/effect/decal/cleanable/New()
if(random_icon_states && length(src.random_icon_states) > 0)
src.icon_state = pick(src.random_icon_states)
+45 -24
View File
@@ -2,7 +2,7 @@
#define NUM_OF_POSTER_DESIGNS 33 //subtype 0-contraband posters
#define NUM_OF_POSTER_DESIGNS_LEGIT 33 //subtype 1-corporate approved posters
#define NUM_OF_POSTER_DESIGNS_LEGIT 40 //subtype 1-corporate approved posters
/obj/item/weapon/contraband
name = "contraband item"
@@ -167,20 +167,20 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
name += " - Rebels Unite!"
desc += " A poster telling the viewer to rebel against Nanotrasen."
if(24)
name += " - C-20r Advertisment"
name += " - C-20r Advertisement"
desc += " A poster advertising the Scarborough Arms C-20r."
if(25)
name += " - Have A Puff"
desc += " Who cares about lung cancer when you're high as a kite?"
if(26)
name += " - Revolver Advertisment"
name += " - Revolver Advertisement"
desc += " Because seven shots are all you need."
if(27)
name += " - D-Day Promotional Poster"
desc += " A promotional poster for some rapper."
if(28)
name += " - Syndicate Pistol Advertisment"
desc += " A poster advertising syndicate pistols as being 'Classy as fuck'."
name += " - Syndicate Pistol Advertisement"
desc += " A poster advertising Syndicate pistols as being 'Classy as fuck'."
if(29)
name += " - E-sword Rainbow"
desc += " All the colors of bloody murder rainbow."
@@ -188,7 +188,7 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
name += " - Red Rum"
desc += " Looking at this poster makes you want to kill."
if(31)
name += " - CC 64K Advertisment"
name += " - CC 64K Advertisement"
desc += " The latest portable computer from Comrade Computing, with a whole 64kB of ram!"
if(32)
name += " - Punch Shit"
@@ -198,13 +198,13 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
desc += " The Griffin commands you to be the worst you can be. Will you?"
else
name += " - Error (subtype 0 serial_number)"
desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/tgstation/-tg-station/issues."
desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues."
if(subtype == 1)
icon_state = "poster[serial_number]_legit"
switch(serial_number)
if(1)
name += " - Here for Your Saftey"
name += " - Here for Your Safety"
desc += " A poster glorifying the station's security force."
if(2)
name += " - Nanotrasen Logo"
@@ -247,7 +247,7 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
desc += " This thing is all in Japanese."
if(15)
name += " - Get Your LEGS"
desc += " LEGS: Leadership, Experiance, Genius, S(Opportunity)."
desc += " LEGS: Leadership, Experience, Genius, S(Opportunity)."
if(16)
name += " - Do Not Question"
desc += " A poster instructing the viewer not to ask about things they aren't meant to know."
@@ -258,58 +258,79 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
name += " - Soft Cap Pop Art"
desc += " A poster reprint of some cheap pop art."
if(19)
name += " - Saftey: Internals"
name += " - Safety: Internals"
desc += " A poster instructing the viewer to wear internals in environments where there is no oxygen or the air has been rendered toxic."
if(20)
name += " - Saftey: Eye Protection"
name += " - Safety: Eye Protection"
desc += " A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights."
if(21)
name += " - Saftey: Report"
name += " - Safety: Report"
desc += " A poster instructing the viewer to report suspicious activity to the security force."
if(22)
name += " - Report Crimes"
desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malconetents."
desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malcontents."
if(23)
name += " - Ion Rifle"
desc += " A poster displaying an Ion Rifle."
if(24)
name += " - Foam Force Advertisment"
name += " - Foam Force Advertisement"
desc += " Foam Force, it's Foam or be Foamed!"
if(25)
name += " - Cohiba Robusto Advertisment"
name += " - Cohiba Robusto Advertisement"
desc += " Cohiba Robusto, the classy cigar."
if(26)
name += " - 50th Aniversery Vintage Reprint"
desc += " A reprint of a poster from 2504, commemorating the 50th Aniversery of Nanoposters Manufacturing, a subsidary of Nanotrasen."
name += " - 50th Anniversary Vintage Reprint"
desc += " A reprint of a poster from 2504, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen."
if(27)
name += " - Fruit Bowl"
desc += " Simple, yet awe inspiring."
if(28)
name += " - NanoPDA 1000 Advertisment"
name += " - NanoPDA 1000 Advertisement"
desc += " A poster advertising the latest PDA from Nanotrasen."
if(29)
name += " - Enlist"
desc += " Enlist in the Nanotrasen ERT reserves today!"
if(30)
name += " - Nanomichi Advertisment"
name += " - Nanomichi Advertisement"
desc += " A poster advertising Nanomichi brand audio cassettes."
if(31)
name += " - 12 Gauge"
desc += " A poster boasting about the superiority of 12 gauge shotgun shells."
desc += " A poster boasting about the superiority of 12-gauge shotgun shells."
if(32)
name += " - High-Class Martini"
desc += " I told you to shake it, no stirring"
desc += " I told you to shake it, no stirring."
if(33)
name += " - The Owl"
desc += " The Owl would do his best to protect the station. Will you?"
if(34)
name += " - Spider Risk"
desc += " A poster detailing what to do when giant spiders are seen."
if(35)
name += " - Kill Syndicate"
desc += " A poster demanding that all crew should be ready to fight the Syndicate."
if(36)
name += " - Information on Air"
desc += " A poster providing visual aid to remind crew of air canisters."
if(37)
name += " - Information on Air"
desc += " A poster providing visual aid to remind crew of air canisters."
if(38)
name += " - Dig for Glory!"
desc += " A poster providing trying to convince crew to mine for ore."
if(39)
name += " - Religious Poster"
desc += " A generic religious poser telling you to believe."
if(40)
name += " - Stay Healthy!"
desc += " A healthy crew is a happy crew!"
else
name += " - Error (subtype 1 serial_number)"
desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/NTStation/NTstation13/issues."
desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues."
..()
obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/wirecutters))
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
playsound(loc, I.usesound, 100, 1)
if(ruined)
to_chat(user, "<span class='notice'>You remove the remnants of the poster.</span>")
qdel(src)
@@ -405,6 +426,6 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
//Putting non-contraband posters here because everything else here is related to posters anyway. -JS
/obj/item/weapon/contraband/poster/legit
desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidlines."
desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidelines."
icon_state = "rolled_poster_legit"
subtype = 1
+23 -45
View File
@@ -337,8 +337,8 @@ steam.start() -- spawns the effect
return
/obj/effect/effect/bad_smoke/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group || (height==0)) return 1
/obj/effect/effect/bad_smoke/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0) return 1
if(istype(mover, /obj/item/projectile/beam))
var/obj/item/projectile/beam/B = mover
B.damage = (B.damage/2)
@@ -425,21 +425,6 @@ steam.start() -- spawns the effect
/obj/effect/effect/chem_smoke/Move()
..()
return
// Spores
/datum/effect/system/chem_smoke_spread/spores
var/datum/seed/seed
/datum/effect/system/chem_smoke_spread/spores/New(seed_name)
if(seed_name && plant_controller)
seed = plant_controller.seeds[seed_name]
if(!seed)
qdel(src)
..()
/datum/effect/system/chem_smoke_spread/New()
..()
chemholder = new/obj()
@@ -517,13 +502,6 @@ steam.start() -- spawns the effect
var/mob/living/carbon/C = A
if(C.can_breathe_gas())
chemholder.reagents.copy_to(C, chemholder.reagents.total_volume)
if(istype(A, /obj/machinery/portable_atmospherics/hydroponics))
var/obj/machinery/portable_atmospherics/hydroponics/tray = A
chemholder.reagents.copy_to(tray, chemholder.reagents.total_volume)
if(istype(A, /obj/effect/plant))
var/obj/effect/plant/plant = A
if(chemholder.reagents.has_reagent("atrazine"))
plant.die_off()
qdel(smokeholder)
for(i=0, i<src.number, i++)
if(src.total_smoke > 20)
@@ -772,7 +750,7 @@ steam.start() -- spawns the effect
var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
I.dir = src.holder.dir
flick("ion_fade", I)
I.icon_state = "blank"
I.icon_state = ""
spawn( 20 )
if(I)
I.delete()
@@ -834,8 +812,8 @@ steam.start() -- spawns the effect
II.dir = src.holder.dir
flick("ion_fade", I)
flick("ion_fade", II)
I.icon_state = "blank"
II.icon_state = "blank"
I.icon_state = ""
II.icon_state = ""
spawn( 20 )
if(I) I.delete()
if(II) II.delete()
@@ -899,21 +877,22 @@ steam.start() -- spawns the effect
// Similar to smoke, but spreads out more
// metal foams leave behind a foamed metal wall
/obj/effect/effect/foam
/obj/structure/foam
name = "foam"
icon = 'icons/effects/effects.dmi'
icon_state = "foam"
opacity = 0
anchored = 1
density = 0
layer = OBJ_LAYER + 0.9
mouse_opacity = 0
animate_movement = 0
var/amount = 3
var/expand = 1
animate_movement = 0
var/metal = 0
/obj/effect/effect/foam/New(loc, var/ismetal=0)
/obj/structure/foam/New(loc, var/ismetal=0)
..(loc)
icon_state = "[ismetal ? "m":""]foam"
if(!ismetal && reagents)
@@ -940,11 +919,11 @@ steam.start() -- spawns the effect
flick("[icon_state]-disolve", src)
sleep(5)
delete()
qdel(src)
return
// on delete, transfer any reagents to the floor
/obj/effect/effect/foam/Destroy()
/obj/structure/foam/Destroy()
if(!metal && reagents)
reagents.handle_reactions()
for(var/atom/A in oview(1, src))
@@ -955,7 +934,7 @@ steam.start() -- spawns the effect
reagents.reaction(A, TOUCH, fraction)
return ..()
/obj/effect/effect/foam/process()
/obj/structure/foam/process()
if(--amount < 0)
return
@@ -970,11 +949,11 @@ steam.start() -- spawns the effect
if(!T.Enter(src))
continue
var/obj/effect/effect/foam/F = locate() in T
var/obj/structure/foam/F = locate() in T
if(F)
continue
F = new /obj/effect/effect/foam(T, metal)
F = new /obj/structure/foam(T, metal)
F.amount = amount
if(!metal)
F.create_reagents(15)
@@ -985,15 +964,15 @@ steam.start() -- spawns the effect
// foam disolves when heated
// except metal foams
/obj/effect/effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/structure/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(!metal && prob(max(0, exposed_temperature - 475)))
flick("[icon_state]-disolve", src)
spawn(5)
delete()
qdel(src)
/obj/effect/effect/foam/Crossed(var/atom/movable/AM)
/obj/structure/foam/Crossed(var/atom/movable/AM)
if(metal)
return
@@ -1038,13 +1017,13 @@ steam.start() -- spawns the effect
/datum/effect/system/foam_spread/start()
spawn(0)
var/obj/effect/effect/foam/F = locate() in location
var/obj/structure/foam/F = locate() in location
if(F)
F.amount += amount
F.amount = min(F.amount, 27)
return
F = new /obj/effect/effect/foam(location, metal)
F = new /obj/structure/foam(location, metal)
F.amount = amount
if(!metal) // don't carry other chemicals if a metal foam
@@ -1146,8 +1125,7 @@ steam.start() -- spawns the effect
M.visible_message("<span class='danger'>[M] tears apart \the [src]!</span>");
qdel(src)
/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
if(air_group) return 0
/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5)
return !density
/obj/structure/foamedmetal/CanAtmosPass()
@@ -1177,10 +1155,10 @@ steam.start() -- spawns the effect
s.start()
for(var/mob/M in viewers(5, location))
to_chat(M, "\red The solution violently explodes.")
to_chat(M, "<span class='warning'>The solution violently explodes.</span>")
for(var/mob/M in viewers(1, location))
if(prob (50 * amount))
to_chat(M, "\red The explosion knocks you down.")
to_chat(M, "<span class='warning'>The explosion knocks you down.</span>")
M.Weaken(rand(1,5))
return
else
@@ -1203,7 +1181,7 @@ steam.start() -- spawns the effect
flash += (round(amount/4) * flashing_factor)
for(var/mob/M in viewers(8, location))
to_chat(M, "\red The solution violently explodes.")
to_chat(M, "<span class='warning'>The solution violently explodes.</span>")
explosion(location, devastation, heavy, light, flash)
@@ -48,7 +48,6 @@
..()
spawn (10)
qdel(src)
return
/datum/effect/system/explosion/set_up(turf/loc)
..(loc=loc)
@@ -58,6 +57,11 @@
var/datum/effect/system/expl_particles/P = new/datum/effect/system/expl_particles()
P.set_up(10,location)
P.start()
/datum/effect/system/explosion/smoke
/datum/effect/system/explosion/smoke/start()
..()
spawn(5)
var/datum/effect/system/harmless_smoke_spread/S = new/datum/effect/system/harmless_smoke_spread()
S.set_up(5,0,location,null)
+1 -1
View File
@@ -25,7 +25,7 @@
proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null)
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
to_chat(world, "\red Gib list length mismatch!")
to_chat(world, "<span class='warning'>Gib list length mismatch!</span>")
return
var/obj/effect/decal/cleanable/blood/gibs/gib = null
+109 -88
View File
@@ -1,33 +1,63 @@
//separate dm since hydro is getting bloated already
/obj/effect/glowshroom
/obj/structure/glowshroom
name = "glowshroom"
desc = "Mycena Bregprox, a species of mushroom that glows in the dark."
anchored = 1
opacity = 0
density = 0
icon = 'icons/obj/lighting.dmi'
icon_state = "glowshroomf"
icon_state = "glowshroom" //replaced in New
layer = 2.1
var/endurance = 30
var/potency = 30
var/delay = 1200
var/floor = 0
var/yield = 3
var/spreadChance = 40
var/generation = 1
var/spreadIntoAdjacentChance = 60
var/evolveChance = 2
var/lastTick = 0
var/spreaded = 1
var/obj/item/seeds/myseed = /obj/item/seeds/glowshroom
/obj/effect/glowshroom/single
spreadChance = 0
/obj/structure/glowshroom/glowcap
name = "glowcap"
desc = "Mycena Ruthenia, a species of mushroom that, while it does glow in the dark, is not actually bioluminescent."
icon_state = "glowcap"
myseed = /obj/item/seeds/glowshroom/glowcap
/obj/effect/glowshroom/New()
/obj/structure/glowshroom/shadowshroom
name = "shadowshroom"
desc = "Mycena Umbra, a species of mushroom that emits shadow instead of light."
icon_state = "shadowshroom"
myseed = /obj/item/seeds/glowshroom/shadowshroom
/obj/structure/glowshroom/single/Spread()
return
/obj/structure/glowshroom/examine(mob/user)
. = ..()
to_chat(user, "This is a [generation]\th generation [name]!")
/obj/structure/glowshroom/Destroy()
QDEL_NULL(myseed)
return ..()
/obj/structure/glowshroom/New(loc, obj/item/seeds/newseed, mutate_stats)
..()
dir = CalcDir()
if(newseed)
myseed = newseed.Copy()
myseed.forceMove(src)
else
myseed = new myseed(src)
if(mutate_stats) //baby mushrooms have different stats :3
myseed.adjust_potency(rand(-3,6))
myseed.adjust_yield(rand(-1,2))
myseed.adjust_production(rand(-3,6))
myseed.adjust_endurance(rand(-3,6))
delay = delay - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
endurance = myseed.endurance
if(myseed.get_gene(/datum/plant_gene/trait/glow))
var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow)
set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color)
setDir(CalcDir())
var/base_icon_state = initial(icon_state)
if(!floor)
switch(dir) //offset to make it be on the wall rather than on the floor
if(NORTH)
@@ -38,70 +68,58 @@
pixel_x = 32
if(WEST)
pixel_x = -32
icon_state = "glowshroom[rand(1,3)]"
icon_state = "[base_icon_state][rand(1,3)]"
else //if on the floor, glowshroom on-floor sprite
icon_state = "glowshroomf"
icon_state = "[base_icon_state]f"
processing_objects += src
addtimer(src, "Spread", delay, FALSE)
/obj/structure/glowshroom/proc/Spread()
var/turf/ownturf = get_turf(src)
var/shrooms_planted = 0
for(var/i in 1 to myseed.yield)
if(prob(1/(generation * generation) * 100))//This formula gives you diminishing returns based on generation. 100% with 1st gen, decreasing to 25%, 11%, 6, 4, 2...
var/list/possibleLocs = list()
var/spreadsIntoAdjacent = FALSE
set_light(round(potency/10))
lastTick = world.timeofday
if(prob(spreadIntoAdjacentChance))
spreadsIntoAdjacent = TRUE
/obj/effect/glowshroom/Destroy()
processing_objects -= src
return ..()
/obj/effect/glowshroom/process()
if(!spreaded)
return
if(((world.timeofday - lastTick) > delay) || ((world.timeofday - lastTick) < 0))
lastTick = world.timeofday
spreaded = 0
for(var/i=1,i<=yield,i++)
if(prob(spreadChance))
var/list/possibleLocs = list()
var/spreadsIntoAdjacent = 0
if(prob(spreadIntoAdjacentChance))
spreadsIntoAdjacent = 1
for(var/turf/simulated/floor/plating/airless/asteroid/earth in view(3,src))
if(spreadsIntoAdjacent || !locate(/obj/effect/glowshroom) in view(1,earth))
possibleLocs += earth
if(!possibleLocs.len)
break
var/turf/newLoc = pick(possibleLocs)
var/shroomCount = 0 //hacky
var/placeCount = 1
for(var/obj/effect/glowshroom/shroom in newLoc)
shroomCount++
for(var/wallDir in cardinal)
var/turf/isWall = get_step(newLoc,wallDir)
if(isWall.density)
placeCount++
if(shroomCount >= placeCount)
for(var/turf/simulated/floor/earth in view(3,src))
if(!ownturf.CanAtmosPass(earth))
continue
if(spreadsIntoAdjacent || !locate(/obj/structure/glowshroom) in view(1,earth))
possibleLocs += earth
CHECK_TICK
var/obj/effect/glowshroom/child = new /obj/effect/glowshroom(newLoc)
child.potency = potency
child.yield = yield
child.delay = delay
child.endurance = endurance
if(!possibleLocs.len)
break
spreaded++
var/turf/newLoc = pick(possibleLocs)
if(prob(evolveChance)) //very low chance to evolve on its own
potency += rand(4,6)
var/shroomCount = 0 //hacky
var/placeCount = 1
for(var/obj/structure/glowshroom/shroom in newLoc)
shroomCount++
for(var/wallDir in cardinal)
var/turf/isWall = get_step(newLoc,wallDir)
if(isWall.density)
placeCount++
if(shroomCount >= placeCount)
continue
/obj/effect/glowshroom/proc/CalcDir(turf/location = loc)
//set background = 1
var/obj/structure/glowshroom/child = new type(newLoc, myseed, TRUE)
child.generation = generation + 1
shrooms_planted++
CHECK_TICK
else
shrooms_planted++ //if we failed due to generation, don't try to plant one later
if(shrooms_planted < myseed.yield) //if we didn't get all possible shrooms planted, try again later
myseed.yield -= shrooms_planted
addtimer(src, "Spread", delay, FALSE)
/obj/structure/glowshroom/proc/CalcDir(turf/location = loc)
var/direction = 16
for(var/wallDir in cardinal)
@@ -109,7 +127,7 @@
if(newTurf.density)
direction |= wallDir
for(var/obj/effect/glowshroom/shroom in location)
for(var/obj/structure/glowshroom/shroom in location)
if(shroom == src)
continue
if(shroom.floor) //special
@@ -133,34 +151,37 @@
floor = 1
return 1
/obj/effect/glowshroom/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
/obj/structure/glowshroom/attackby(obj/item/I, mob/user)
..()
endurance -= W.force
CheckEndurance()
/obj/effect/glowshroom/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
var/damage_to_do = I.force
if(istype(I, /obj/item/weapon/scythe))
var/obj/item/weapon/scythe/S = I
if(S.extend) //so folded telescythes won't get damage boosts / insta-clears (they instead will instead be treated like non-scythes)
damage_to_do *= 4
for(var/obj/structure/glowshroom/G in range(1,src))
G.endurance -= damage_to_do
G.CheckEndurance()
return
if(2.0)
if(I.damtype != STAMINA)
endurance -= damage_to_do
CheckEndurance()
/obj/structure/glowshroom/ex_act(severity)
switch(severity)
if(1)
qdel(src)
if(2)
if(prob(50))
qdel(src)
return
if(3.0)
if(3)
if(prob(5))
qdel(src)
return
else
return
/obj/effect/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/structure/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
endurance -= 5
CheckEndurance()
/obj/effect/glowshroom/proc/CheckEndurance()
/obj/structure/glowshroom/proc/CheckEndurance()
if(endurance <= 0)
qdel(src)
qdel(src)
+263 -245
View File
@@ -1,252 +1,270 @@
/obj/effect/landmark
name = "landmark"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
anchored = 1.0
unacidable = 1
/obj/effect/landmark/New()
..()
set_tag()
invisibility = 101
switch(name) //some of these are probably obsolete
if("start")
newplayer_start += loc
qdel(src)
if("wizard")
wizardstart += loc
qdel(src)
if("JoinLate")
latejoin += loc
qdel(src)
if("JoinLateGateway")
latejoin_gateway += loc
qdel(src)
if("JoinLateCryo")
latejoin_cryo += loc
qdel(src)
if("JoinLateCyborg")
latejoin_cyborg += loc
qdel(src)
if("prisonwarp")
prisonwarp += loc
qdel(src)
/obj/effect/landmark
name = "landmark"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
anchored = 1.0
unacidable = 1
if("prisonsecuritywarp")
prisonsecuritywarp += loc
qdel(src)
/obj/effect/landmark/New()
if("tdome1")
tdome1 += loc
..()
set_tag()
invisibility = 101
if("tdome2")
tdome2 += loc
switch(name) //some of these are probably obsolete
if("start")
newplayer_start += loc
qdel(src)
if("tdomeadmin")
tdomeadmin += loc
if("wizard")
wizardstart += loc
qdel(src)
if("tdomeobserve")
tdomeobserve += loc
if("avatarspawn")
avatarspawn += loc
if("aroomwarp")
aroomwarp += loc
if("blobstart")
blobstart += loc
qdel(src)
if("xeno_spawn")
xeno_spawn += loc
qdel(src)
if("ninjastart")
ninjastart += loc
qdel(src)
if("carpspawn")
carplist += loc
if("voxstart")
raider_spawn += loc
if("ERT Director")
ertdirector += loc
qdel(src)
if("JoinLate")
latejoin += loc
qdel(src)
if("Response Team")
emergencyresponseteamspawn += loc
qdel(src)
landmarks_list += src
return 1
/obj/effect/landmark/Destroy()
landmarks_list -= src
..()
return QDEL_HINT_HARDDEL_NOW
/obj/effect/landmark/proc/set_tag()
tag = text("landmark*[]", name)
/obj/effect/landmark/start
name = "start"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x"
anchored = 1.0
/obj/effect/landmark/start/set_tag()
tag = "start*[name]"
//Costume spawner landmarks
/obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears
var/list/options = typesof(/obj/effect/landmark/costume)
var/PICK= options[rand(1,options.len)]
new PICK(src.loc)
qdel(src)
//SUBCLASSES. Spawn a bunch of items and disappear likewise
/obj/effect/landmark/costume/chicken/New()
new /obj/item/clothing/suit/chickensuit(src.loc)
new /obj/item/clothing/head/chicken(src.loc)
new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc)
qdel(src)
/obj/effect/landmark/costume/gladiator/New()
new /obj/item/clothing/under/gladiator(src.loc)
new /obj/item/clothing/head/helmet/gladiator(src.loc)
qdel(src)
/obj/effect/landmark/costume/madscientist/New()
new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
new /obj/item/clothing/head/flatcap(src.loc)
new /obj/item/clothing/suit/storage/labcoat/mad(src.loc)
new /obj/item/clothing/glasses/gglasses(src.loc)
qdel(src)
/obj/effect/landmark/costume/elpresidente/New()
new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
new /obj/item/clothing/head/flatcap(src.loc)
new /obj/item/clothing/mask/cigarette/cigar/havana(src.loc)
new /obj/item/clothing/shoes/jackboots(src.loc)
qdel(src)
/obj/effect/landmark/costume/nyangirl/New()
new /obj/item/clothing/under/schoolgirl(src.loc)
new /obj/item/clothing/head/kitty(src.loc)
qdel(src)
/obj/effect/landmark/costume/maid/New()
new /obj/item/clothing/under/blackskirt(src.loc)
var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
new CHOICE(src.loc)
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
qdel(src)
/obj/effect/landmark/costume/butler/New()
new /obj/item/clothing/suit/wcoat(src.loc)
new /obj/item/clothing/under/suit_jacket(src.loc)
new /obj/item/clothing/head/that(src.loc)
qdel(src)
/obj/effect/landmark/costume/scratch/New()
new /obj/item/clothing/gloves/color/white(src.loc)
new /obj/item/clothing/shoes/white(src.loc)
new /obj/item/clothing/under/scratch(src.loc)
if(prob(30))
new /obj/item/clothing/head/cueball(src.loc)
qdel(src)
/obj/effect/landmark/costume/highlander/New()
new /obj/item/clothing/under/kilt(src.loc)
new /obj/item/clothing/head/beret(src.loc)
qdel(src)
/obj/effect/landmark/costume/prig/New()
new /obj/item/clothing/suit/wcoat(src.loc)
new /obj/item/clothing/glasses/monocle(src.loc)
var/CHOICE= pick( /obj/item/clothing/head/bowlerhat, /obj/item/clothing/head/that)
new CHOICE(src.loc)
new /obj/item/clothing/shoes/black(src.loc)
new /obj/item/weapon/cane(src.loc)
new /obj/item/clothing/under/sl_suit(src.loc)
new /obj/item/clothing/mask/fakemoustache(src.loc)
qdel(src)
/obj/effect/landmark/costume/plaguedoctor/New()
new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc)
new /obj/item/clothing/head/plaguedoctorhat(src.loc)
qdel(src)
/obj/effect/landmark/costume/nightowl/New()
new /obj/item/clothing/under/owl(src.loc)
new /obj/item/clothing/mask/gas/owl_mask(src.loc)
qdel(src)
/obj/effect/landmark/costume/waiter/New()
new /obj/item/clothing/under/waiter(src.loc)
var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears)
new CHOICE(src.loc)
new /obj/item/clothing/suit/apron(src.loc)
qdel(src)
/obj/effect/landmark/costume/pirate/New()
new /obj/item/clothing/under/pirate(src.loc)
new /obj/item/clothing/suit/pirate_black(src.loc)
var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/head/bandana )
new CHOICE(src.loc)
new /obj/item/clothing/glasses/eyepatch(src.loc)
qdel(src)
/obj/effect/landmark/costume/commie/New()
new /obj/item/clothing/under/soviet(src.loc)
new /obj/item/clothing/head/ushanka(src.loc)
qdel(src)
/obj/effect/landmark/costume/imperium_monk/New()
new /obj/item/clothing/suit/imperium_monk(src.loc)
if(prob(25))
new /obj/item/clothing/mask/gas/cyborg(src.loc)
qdel(src)
/obj/effect/landmark/costume/holiday_priest/New()
new /obj/item/clothing/suit/holidaypriest(src.loc)
qdel(src)
/obj/effect/landmark/costume/marisawizard/fake/New()
new /obj/item/clothing/head/wizard/marisa/fake(src.loc)
new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc)
qdel(src)
/obj/effect/landmark/costume/cutewitch/New()
new /obj/item/clothing/under/sundress(src.loc)
new /obj/item/clothing/head/witchwig(src.loc)
new /obj/item/weapon/twohanded/staff/broom(src.loc)
qdel(src)
/obj/effect/landmark/costume/fakewizard/New()
new /obj/item/clothing/suit/wizrobe/fake(src.loc)
new /obj/item/clothing/head/wizard/fake(src.loc)
new /obj/item/weapon/twohanded/staff/(src.loc)
qdel(src)
/obj/effect/landmark/costume/sexyclown/New()
new /obj/item/clothing/mask/gas/sexyclown(src.loc)
new /obj/item/clothing/under/sexyclown(src.loc)
qdel(src)
/obj/effect/landmark/costume/sexymime/New()
new /obj/item/clothing/mask/gas/sexymime(src.loc)
new /obj/item/clothing/under/sexymime(src.loc)
qdel(src)
if("JoinLateGateway")
latejoin_gateway += loc
qdel(src)
if("JoinLateCryo")
latejoin_cryo += loc
qdel(src)
if("JoinLateCyborg")
latejoin_cyborg += loc
qdel(src)
if("prisonwarp")
prisonwarp += loc
qdel(src)
if("prisonsecuritywarp")
prisonsecuritywarp += loc
qdel(src)
if("tdome1")
tdome1 += loc
if("tdome2")
tdome2 += loc
if("tdomeadmin")
tdomeadmin += loc
if("tdomeobserve")
tdomeobserve += loc
if("aroomwarp")
aroomwarp += loc
if("blobstart")
blobstart += loc
qdel(src)
if("xeno_spawn")
xeno_spawn += loc
qdel(src)
if("ninjastart")
ninjastart += loc
qdel(src)
if("carpspawn")
carplist += loc
if("voxstart")
raider_spawn += loc
if("ERT Director")
ertdirector += loc
qdel(src)
if("Response Team")
emergencyresponseteamspawn += loc
qdel(src)
landmarks_list += src
return 1
/obj/effect/landmark/Destroy()
landmarks_list -= src
..()
return QDEL_HINT_HARDDEL_NOW
/obj/effect/landmark/proc/set_tag()
tag = text("landmark*[]", name)
/obj/effect/landmark/start
name = "start"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x"
anchored = 1.0
/obj/effect/landmark/start/set_tag()
tag = "start*[name]"
//Costume spawner landmarks
/obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears
var/list/options = typesof(/obj/effect/landmark/costume)
var/PICK= options[rand(1,options.len)]
new PICK(src.loc)
qdel(src)
//SUBCLASSES. Spawn a bunch of items and disappear likewise
/obj/effect/landmark/costume/chicken/New()
new /obj/item/clothing/suit/chickensuit(src.loc)
new /obj/item/clothing/head/chicken(src.loc)
new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc)
qdel(src)
/obj/effect/landmark/costume/gladiator/New()
new /obj/item/clothing/under/gladiator(src.loc)
new /obj/item/clothing/head/helmet/gladiator(src.loc)
qdel(src)
/obj/effect/landmark/costume/madscientist/New()
new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
new /obj/item/clothing/head/flatcap(src.loc)
new /obj/item/clothing/suit/storage/labcoat/mad(src.loc)
new /obj/item/clothing/glasses/gglasses(src.loc)
qdel(src)
/obj/effect/landmark/costume/elpresidente/New()
new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
new /obj/item/clothing/head/flatcap(src.loc)
new /obj/item/clothing/mask/cigarette/cigar/havana(src.loc)
new /obj/item/clothing/shoes/jackboots(src.loc)
qdel(src)
/obj/effect/landmark/costume/nyangirl/New()
new /obj/item/clothing/under/schoolgirl(src.loc)
new /obj/item/clothing/head/kitty(src.loc)
qdel(src)
/obj/effect/landmark/costume/maid/New()
new /obj/item/clothing/under/blackskirt(src.loc)
var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
new CHOICE(src.loc)
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
qdel(src)
/obj/effect/landmark/costume/butler/New()
new /obj/item/clothing/suit/wcoat(src.loc)
new /obj/item/clothing/under/suit_jacket(src.loc)
new /obj/item/clothing/head/that(src.loc)
qdel(src)
/obj/effect/landmark/costume/scratch/New()
new /obj/item/clothing/gloves/color/white(src.loc)
new /obj/item/clothing/shoes/white(src.loc)
new /obj/item/clothing/under/scratch(src.loc)
if(prob(30))
new /obj/item/clothing/head/cueball(src.loc)
qdel(src)
/obj/effect/landmark/costume/highlander/New()
new /obj/item/clothing/under/kilt(src.loc)
new /obj/item/clothing/head/beret(src.loc)
qdel(src)
/obj/effect/landmark/costume/prig/New()
new /obj/item/clothing/suit/wcoat(src.loc)
new /obj/item/clothing/glasses/monocle(src.loc)
var/CHOICE= pick( /obj/item/clothing/head/bowlerhat, /obj/item/clothing/head/that)
new CHOICE(src.loc)
new /obj/item/clothing/shoes/black(src.loc)
new /obj/item/weapon/cane(src.loc)
new /obj/item/clothing/under/sl_suit(src.loc)
new /obj/item/clothing/mask/fakemoustache(src.loc)
qdel(src)
/obj/effect/landmark/costume/plaguedoctor/New()
new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc)
new /obj/item/clothing/head/plaguedoctorhat(src.loc)
qdel(src)
/obj/effect/landmark/costume/nightowl/New()
new /obj/item/clothing/under/owl(src.loc)
new /obj/item/clothing/mask/gas/owl_mask(src.loc)
qdel(src)
/obj/effect/landmark/costume/waiter/New()
new /obj/item/clothing/under/waiter(src.loc)
var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears)
new CHOICE(src.loc)
new /obj/item/clothing/suit/apron(src.loc)
qdel(src)
/obj/effect/landmark/costume/pirate/New()
new /obj/item/clothing/under/pirate(src.loc)
new /obj/item/clothing/suit/pirate_black(src.loc)
var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/head/bandana )
new CHOICE(src.loc)
new /obj/item/clothing/glasses/eyepatch(src.loc)
qdel(src)
/obj/effect/landmark/costume/commie/New()
new /obj/item/clothing/under/soviet(src.loc)
new /obj/item/clothing/head/ushanka(src.loc)
qdel(src)
/obj/effect/landmark/costume/imperium_monk/New()
new /obj/item/clothing/suit/imperium_monk(src.loc)
if(prob(25))
new /obj/item/clothing/mask/gas/cyborg(src.loc)
qdel(src)
/obj/effect/landmark/costume/holiday_priest/New()
new /obj/item/clothing/suit/holidaypriest(src.loc)
qdel(src)
/obj/effect/landmark/costume/marisawizard/fake/New()
new /obj/item/clothing/head/wizard/marisa/fake(src.loc)
new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc)
qdel(src)
/obj/effect/landmark/costume/cutewitch/New()
new /obj/item/clothing/under/sundress(src.loc)
new /obj/item/clothing/head/witchwig(src.loc)
new /obj/item/weapon/twohanded/staff/broom(src.loc)
qdel(src)
/obj/effect/landmark/costume/fakewizard/New()
new /obj/item/clothing/suit/wizrobe/fake(src.loc)
new /obj/item/clothing/head/wizard/fake(src.loc)
new /obj/item/weapon/twohanded/staff/(src.loc)
qdel(src)
/obj/effect/landmark/costume/sexyclown/New()
new /obj/item/clothing/mask/gas/sexyclown(src.loc)
new /obj/item/clothing/under/sexyclown(src.loc)
qdel(src)
/obj/effect/landmark/costume/sexymime/New()
new /obj/item/clothing/mask/gas/sexymime(src.loc)
new /obj/item/clothing/under/sexymime(src.loc)
qdel(src)
/obj/effect/landmark/ruin
var/datum/map_template/ruin/ruin_template
/obj/effect/landmark/ruin/New(loc, my_ruin_template)
name = "ruin_[ruin_landmarks.len + 1]"
..(loc)
ruin_template = my_ruin_template
ruin_landmarks |= src
/obj/effect/landmark/ruin/Destroy()
ruin_landmarks -= src
ruin_template = null
. = ..()
+149 -72
View File
@@ -1,94 +1,171 @@
/obj/effect/mine
name = "Mine"
name = "dummy mine"
desc = "I Better stay away from that thing."
density = 1
density = 0
anchored = 1
layer = 3
icon = 'icons/obj/weapons.dmi'
icon_state = "uglymine"
var/triggerproc = "explode" //name of the proc thats called when the mine is triggered
var/triggered = 0
/obj/effect/mine/New()
icon_state = "uglyminearmed"
var/triggered = 0
var/faction = "syndicate"
/obj/effect/mine/proc/mineEffect(mob/living/victim)
to_chat(victim, "<span class='danger'>*click*</span>")
/obj/effect/mine/Crossed(AM as mob|obj)
Bumped(AM)
if(!isliving(AM))
return
if(isanimal(AM))
var/mob/living/simple_animal/SA = AM
if(faction && (faction in SA.faction))
return
if(!SA.flying)
triggermine(SA)
else
triggermine(AM)
/obj/effect/mine/Bumped(mob/M as mob|obj)
if(triggered) return
if(istype(M, /mob/living/carbon/human))
for(var/mob/O in viewers(world.view, src.loc))
to_chat(O, "<font color='red'>[M] triggered the [bicon(src)] [src]</font>")
triggered = 1
call(src,triggerproc)(M)
/obj/effect/mine/proc/triggerrad(obj)
/obj/effect/mine/proc/triggermine(mob/living/victim)
if(triggered)
return
visible_message("<span class='danger'>[victim] sets off \icon[src] [src]!</span>")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
obj:radiation += 50
randmutb(obj)
domutcheck(obj,null)
spawn(0)
qdel(src)
mineEffect(victim)
triggered = 1
qdel(src)
/obj/effect/mine/proc/triggerstun(obj)
if(ismob(obj))
var/mob/M = obj
M.Stun(30)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
spawn(0)
qdel(src)
/obj/effect/mine/explosive
name = "explosive mine"
var/range_devastation = 0
var/range_heavy = 1
var/range_light = 2
var/range_flash = 3
/obj/effect/mine/proc/triggern2o(obj)
atmos_spawn_air(SPAWN_N2O, 360)
spawn(0)
qdel(src)
/obj/effect/mine/explosive/mineEffect(mob/living/victim)
explosion(loc, range_devastation, range_heavy, range_light, range_flash)
/obj/effect/mine/proc/triggerplasma(obj)
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 360)
spawn(0)
qdel(src)
/obj/effect/mine/stun
name = "stun mine"
var/stun_time = 8
/obj/effect/mine/proc/triggerkick(obj)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
qdel(obj:client)
spawn(0)
qdel(src)
/obj/effect/mine/proc/explode(obj)
explosion(loc, 0, 1, 2, 3)
spawn(0)
qdel(src)
/obj/effect/mine/stun/mineEffect(mob/living/victim)
if(isliving(victim))
victim.Weaken(stun_time)
/obj/effect/mine/dnascramble
name = "Radiation Mine"
icon_state = "uglymine"
triggerproc = "triggerrad"
var/radiation_amount
/obj/effect/mine/plasma
name = "Plasma Mine"
icon_state = "uglymine"
triggerproc = "triggerplasma"
/obj/effect/mine/dnascramble/mineEffect(mob/living/victim)
victim.apply_effect(radiation_amount, IRRADIATE, 0)
randmutb(victim)
domutcheck(victim ,null)
/obj/effect/mine/kick
name = "Kick Mine"
icon_state = "uglymine"
triggerproc = "triggerkick"
/obj/effect/mine/gas
name = "oxygen mine"
var/gas_amount = 360
var/gas_type = SPAWN_OXYGEN
/obj/effect/mine/n2o
name = "N2O Mine"
icon_state = "uglymine"
triggerproc = "triggern2o"
/obj/effect/mine/gas/mineEffect(mob/living/victim)
atmos_spawn_air(gas_type, gas_amount)
/obj/effect/mine/stun
name = "Stun Mine"
icon_state = "uglymine"
triggerproc = "triggerstun"
/obj/effect/mine/gas/plasma
name = "plasma mine"
gas_type = SPAWN_HEAT | SPAWN_TOXINS
/obj/effect/mine/gas/n2o
name = "\improper N2O mine"
gas_type = SPAWN_N2O
/obj/effect/mine/sound
name = "honkblaster 1000"
var/sound = 'sound/items/bikehorn.ogg'
/obj/effect/mine/sound/mineEffect(mob/living/victim)
playsound(loc, sound, 100, 1)
/obj/effect/mine/sound/bwoink
name = "bwoink mine"
sound = 'sound/effects/adminhelp.ogg'
/obj/effect/mine/pickup
name = "pickup"
desc = "pick me up"
icon = 'icons/effects/effects.dmi'
icon_state = "electricity2"
density = 0
var/duration = 0
/obj/effect/mine/pickup/New()
..()
animate(src, pixel_y = 4, time = 20, loop = -1)
/obj/effect/mine/pickup/triggermine(mob/living/victim)
if(triggered)
return
triggered = 1
invisibility = 101
mineEffect(victim)
qdel(src)
/obj/effect/mine/pickup/bloodbath
name = "Red Orb"
desc = "You feel angry just looking at it."
duration = 1200 //2min
color = "red"
/obj/effect/mine/pickup/bloodbath/mineEffect(mob/living/carbon/victim)
if(!istype(victim) || !victim.client)
return
to_chat(victim, "<span class='reallybig redtext'>RIP AND TEAR</span>")
victim << 'sound/misc/e1m1.ogg'
var/old_color = victim.client.color
var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0)
var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
spawn(0)
new /obj/effect/hallucination/delusion(victim.loc, victim, force_kind = "demon", duration = duration, skip_nearby = 0)
var/obj/item/weapon/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
chainsaw.flags |= NODROP
victim.drop_l_hand()
victim.drop_r_hand()
victim.put_in_hands(chainsaw)
chainsaw.attack_self(victim)
chainsaw.wield(victim)
victim.reagents.add_reagent("adminordrazine", 25)
victim.client.color = pure_red
animate(victim.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT)
spawn(10)
animate(victim.client,color = old_color, time = duration)//, easing = SINE_EASING|EASE_OUT)
spawn(duration)
to_chat(victim, "<span class='notice'>Your bloodlust seeps back into the bog of your subconscious and you regain self control.<span>")
qdel(chainsaw)
qdel(src)
/obj/effect/mine/pickup/healing
name = "Blue Orb"
desc = "You feel better just looking at it."
color = "blue"
/obj/effect/mine/pickup/healing/mineEffect(mob/living/carbon/victim)
if(!victim.client || !istype(victim))
return
to_chat(victim, "<span class='notice'>You feel great!</span>")
victim.revive()
/obj/effect/mine/pickup/speed
name = "Yellow Orb"
desc = "You feel faster just looking at it."
color = "yellow"
duration = 300
/obj/effect/mine/pickup/speed/mineEffect(mob/living/carbon/victim)
if(!victim.client || !istype(victim))
return
to_chat(victim, "<span class='notice'>You feel fast!</span>")
victim.status_flags |= GOTTAGOREALLYFAST
spawn(duration)
victim.status_flags &= ~GOTTAGOREALLYFAST
to_chat(victim, "<span class='notice'>You slow down.</span>")
+161 -55
View File
@@ -1,4 +1,3 @@
/obj/effect/overlay
name = "overlay"
unacidable = 1
@@ -17,60 +16,9 @@
var/tmp/atom/BeamSource
New()
..()
spawn(10) qdel(src)
/obj/effect/overlay/temp
anchored = 1
layer = 4.1
mouse_opacity = 0
var/duration = 10
var/randomdir = 1
/obj/effect/overlay/temp/New()
if(randomdir)
dir = pick(cardinal)
spawn(duration)
qdel(src)
/obj/effect/overlay/temp/revenant
name = "spooky lights"
icon = 'icons/effects/effects.dmi'
icon_state = "purplesparkles"
/obj/effect/overlay/temp/revenant/cracks
name = "glowing cracks"
icon_state = "purplecrack"
duration = 6
/obj/effect/overlay/temp/guardian
randomdir = 0
/obj/effect/overlay/temp/guardian/phase
duration = 5
icon_state = "phasein"
/obj/effect/overlay/temp/guardian/phase/out
icon_state = "phaseout"
/obj/effect/overlay/temp/emp
name = "emp sparks"
icon = 'icons/effects/effects.dmi'
icon_state = "empdisable"
/obj/effect/overlay/temp/emp/pulse
name = "emp pulse"
icon_state = "emp pulse"
duration = 8
randomdir = 0
/obj/effect/overlay/temp/kinetic_blast
name = "kinetic explosion"
icon = 'icons/obj/projectiles.dmi'
icon_state = "kinetic_blast"
layer = 4.1
duration = 4
spawn(10)
qdel(src)
/obj/effect/overlay/palmtree_r
name = "Palm tree"
icon = 'icons/misc/beach2.dmi'
@@ -98,6 +46,164 @@
icon_state = "admin"
layer = 4.1
/obj/effect/overlay/temp
anchored = 1
layer = 4.1
mouse_opacity = 0
var/duration = 10
var/randomdir = 1
/obj/effect/overlay/temp/New()
if(randomdir)
dir = pick(cardinal)
flick("[icon_state]", src) //Because we might be pulling it from a pool, flick whatever icon it uses so it starts at the start of the icon's animation.
spawn(duration)
qdel(src)
/obj/effect/overlay/temp/revenant
name = "spooky lights"
icon = 'icons/effects/effects.dmi'
icon_state = "purplesparkles"
/obj/effect/overlay/temp/revenant/cracks
name = "glowing cracks"
icon_state = "purplecrack"
duration = 6
/obj/effect/overlay/temp/guardian
randomdir = 0
/obj/effect/overlay/temp/guardian/phase
duration = 5
icon_state = "phasein"
/obj/effect/overlay/temp/guardian/phase/out
icon_state = "phaseout"
/obj/effect/overlay/temp/emp
name = "emp sparks"
icon = 'icons/effects/effects.dmi'
icon_state = "empdisable"
/obj/effect/overlay/temp/emp/pulse
name = "emp pulse"
icon_state = "emppulse"
duration = 8
randomdir = 0
/obj/effect/overlay/temp/heal //color is white by default, set to whatever is needed
name = "healing glow"
icon = 'icons/effects/effects.dmi'
icon_state = "heal"
duration = 15
/obj/effect/overlay/temp/heal/New(loc, colour)
..()
pixel_x = rand(-12, 12)
pixel_y = rand(-9, 0)
if(colour)
color = colour
/obj/effect/overlay/temp/kinetic_blast
name = "kinetic explosion"
icon = 'icons/obj/projectiles.dmi'
icon_state = "kinetic_blast"
layer = 4.1
duration = 4
/obj/effect/overlay/temp/explosion
name = "explosion"
icon = 'icons/effects/96x96.dmi'
icon_state = "explosion"
pixel_x = -32
pixel_y = -32
duration = 8
/obj/effect/overlay/temp/explosion/fast
icon_state = "explosionfast"
duration = 4
/obj/effect/overlay/temp/decoy
desc = "It's a decoy!"
duration = 15
/obj/effect/overlay/temp/decoy/New(loc, atom/mimiced_atom)
..()
alpha = initial(alpha)
if(mimiced_atom)
name = mimiced_atom.name
appearance = mimiced_atom.appearance
dir = mimiced_atom.dir
mouse_opacity = 0
/obj/effect/overlay/temp/decoy/fading/New(loc, atom/mimiced_atom)
..()
animate(src, alpha = 0, time = duration)
/obj/effect/overlay/temp/cult
icon = 'icons/effects/effects.dmi'
randomdir = 0
duration = 10
/obj/effect/overlay/temp/cult/sparks
randomdir = 1
name = "blood sparks"
icon_state = "bloodsparkles"
/obj/effect/overlay/temp/dir_setting
randomdir = FALSE
/obj/effect/overlay/temp/dir_setting/New(loc, set_dir)
if(set_dir)
dir = set_dir
..()
/obj/effect/overlay/temp/dir_setting/bloodsplatter
icon = 'icons/effects/blood.dmi'
duration = 5
randomdir = FALSE
layer = MOB_LAYER - 0.1
var/splatter_type = "splatter"
/obj/effect/overlay/temp/dir_setting/bloodsplatter/New(loc, set_dir)
if(set_dir in diagonals)
icon_state = "[splatter_type][pick(1, 2, 6)]"
else
icon_state = "[splatter_type][pick(3, 4, 5)]"
..()
var/target_pixel_x = 0
var/target_pixel_y = 0
switch(set_dir)
if(NORTH)
target_pixel_y = 16
if(SOUTH)
target_pixel_y = -16
layer = MOB_LAYER + 0.1
if(EAST)
target_pixel_x = 16
if(WEST)
target_pixel_x = -16
if(NORTHEAST)
target_pixel_x = 16
target_pixel_y = 16
if(NORTHWEST)
target_pixel_x = -16
target_pixel_y = 16
if(SOUTHEAST)
target_pixel_x = 16
target_pixel_y = -16
layer = MOB_LAYER + 0.1
if(SOUTHWEST)
target_pixel_x = -16
target_pixel_y = -16
layer = MOB_LAYER + 0.1
animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
/obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter
splatter_type = "xsplatter"
/obj/effect/overlay/wall_rot
name = "Wallrot"
desc = "Ick..."
+10 -9
View File
@@ -67,7 +67,7 @@
/obj/item/clothing/gloves/color/black = 20,
/obj/item/clothing/head/hardhat = 10,
/obj/item/clothing/head/hardhat/red = 10,
/obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 10,
/obj/item/clothing/head/that = 10,
/obj/item/clothing/head/ushanka = 10,
/obj/item/clothing/head/welding = 10,
/obj/item/clothing/mask/gas = 10,
@@ -103,8 +103,8 @@
/obj/item/weapon/hand_labeler = 10,
/obj/item/weapon/paper/crumpled = 10,
/obj/item/weapon/pen = 10,
/obj/item/weapon/minihoe = 10,
/obj/item/weapon/plantspray/pests = 10,
/obj/item/weapon/cultivator = 10,
/obj/item/weapon/reagent_containers/spray/pestspray = 10,
/obj/item/weapon/stock_parts/cell = 30,
/obj/item/weapon/storage/belt/utility = 20,
/obj/item/weapon/storage/box = 20,
@@ -121,14 +121,15 @@
/obj/item/weapon/wirecutters = 10,
/obj/item/weapon/wrench = 40,
/obj/item/weapon/relic = 35,
/obj/item/weaponcrafting/receiver = 20,
/obj/item/clothing/shoes/brown = 30,
/obj/item/seeds/ambrosiadeusseed = 10,
/obj/item/seeds/ambrosiavulgarisseed = 20,
/obj/item/seeds/ambrosia/deus = 10,
/obj/item/seeds/ambrosia = 20,
/obj/item/clothing/under/color/black = 30,
/obj/item/stack/tape_roll = 10,
////////////////CONTRABAND STUFF//////////////////
/obj/item/weapon/grenade/clown_grenade = 3,
/obj/item/seeds/ambrosiavulgarisseed/cruciatus = 3,
/obj/item/seeds/ambrosia/cruciatus = 3,
/obj/item/weapon/gun/projectile/automatic/pistol/empty = 1,
/obj/item/ammo_box/magazine/m10mm = 4,
/obj/item/weapon/soap/syndie = 7,
@@ -148,7 +149,7 @@
/obj/item/weapon/implanter/storage = 1,
/obj/item/toy/cards/deck/syndicate = 2,
/obj/item/weapon/storage/secure/briefcase/syndie = 2,
"" = 90
"" = 70
)
/obj/effect/spawner/lootdrop/crate_spawner // for ruins
@@ -192,8 +193,8 @@
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/weapon/spacecash/c200 = 1,
/obj/item/stack/spacecash/c200 = 1,
/obj/item/weapon/airlock_electronics = 1,
/obj/item/weapon/gun/energy/kinetic_accelerator/super = 1,
/obj/item/weapon/gun/energy/kinetic_accelerator = 1,
/obj/item/pizzabox = 3,
)
@@ -0,0 +1,65 @@
/obj/effect/spawner/random_barrier
name = "random tile"
var/list/result = list(
/turf/simulated/floor/plasteel = 1,
/turf/simulated/wall = 1,
/obj/structure/falsewall = 1,
/obj/effect/spawner/window/reinforced = 1,
/obj/machinery/door/airlock = 1,
/obj/machinery/door/airlock/welded = 1,
/obj/structure/barricade/wooden = 1)
// This needs to come before the initialization wave because
// the thing it creates might need to be initialized too
/obj/effect/spawner/random_barrier/New()
. = ..()
var/turf/T = get_turf(src)
if(!T)
log_runtime(EXCEPTION("Barrier spawner placed in nullspace!"), src)
return
var/thing_to_place = pickweight(result)
if(ispath(thing_to_place, /turf))
T.ChangeTurf(thing_to_place)
else
new thing_to_place(T)
qdel(src)
/obj/effect/spawner/random_barrier/wall_probably
name = "probably a wall"
result = list(
/turf/simulated/wall = 9,
/obj/structure/falsewall = 1)
/obj/effect/spawner/random_barrier/floor_probably
name = "probably a floor"
result = list(
/turf/simulated/floor/plasteel = 3,
/turf/simulated/wall = 1)
/obj/effect/spawner/random_barrier/obstruction
name = "obstruction"
result = list(
/turf/simulated/wall = 1,
/obj/structure/falsewall = 1,
/obj/structure/barricade/wooden = 1,
/obj/machinery/door/airlock/welded = 1)
/obj/effect/spawner/random_barrier/possibly_welded_airlock // these have no access restrictions, so for internal maintenance only
name = "possibly welded airlock"
result = list(
/obj/machinery/door/airlock = 3,
/obj/machinery/door/airlock/welded = 1)
/obj/effect/spawner/random_spawners/grille_often
name = "grille often"
result = list(
/obj/structure/grille = 8,
/obj/structure/grille/broken = 4,
/turf/simulated/floor/plating = 2)
/obj/effect/spawner/random_spawners/grille_maybe
name = "grille maybe"
result = list(
/obj/structure/grille = 2,
/obj/structure/grille/broken = 2,
/turf/simulated/floor/plating = 5)
@@ -0,0 +1,110 @@
/obj/effect/spawner/random_spawners
name = "random spawners"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
color = "#00FF00"
var/list/result = list(
/turf/simulated/floor/plasteel = 1,
/turf/simulated/floor/plating = 1,
/obj/effect/decal/cleanable/blood/splatter = 1,
/obj/effect/decal/cleanable/blood/oil = 1,
/obj/effect/decal/cleanable/fungus = 1)
// This needs to come before the initialization wave because
// the thing it creates might need to be initialized too
/obj/effect/spawner/random_spawners/New()
. = ..()
var/turf/T = get_turf(src)
if(!T)
log_runtime(EXCEPTION("Spawner placed in nullspace!"), src)
return
var/thing_to_place = pickweight(result)
if(ispath(thing_to_place, /turf))
T.ChangeTurf(thing_to_place)
else
new thing_to_place(T)
qdel(src)
/obj/effect/spawner/random_spawners/blood_maybe
name = "blood maybe"
result = list(
/turf/simulated/floor/plating = 20,
/obj/effect/decal/cleanable/blood/splatter = 1)
/obj/effect/spawner/random_spawners/blood_often
name = "blood often"
result = list(
/turf/simulated/floor/plating = 5,
/obj/effect/decal/cleanable/blood/splatter = 1)
/obj/effect/spawner/random_spawners/oil_maybe
name = "oil maybe"
result = list(
/turf/simulated/floor/plating = 20,
/obj/effect/decal/cleanable/blood/oil = 1)
/obj/effect/spawner/random_spawners/oil_maybe
name = "oil often"
result = list(
/turf/simulated/floor/plating = 5,
/obj/effect/decal/cleanable/blood/oil = 1)
/obj/effect/spawner/random_spawners/wall_rusted_probably
name = "rusted wall probably"
result = list(
/turf/simulated/wall = 2,
/turf/simulated/wall/rust = 7)
/obj/effect/spawner/random_spawners/wall_rusted_maybe
name = "rusted wall maybe"
result = list(
/turf/simulated/wall = 7,
/turf/simulated/wall/rust = 1)
/obj/effect/spawner/random_spawners/cobweb_left_frequent
name = "cobweb left frequent"
result = list(
/turf/simulated/floor/plating = 1,
/obj/effect/decal/cleanable/cobweb = 1)
/obj/effect/spawner/random_spawners/cobweb_right_frequent
name = "cobweb right frequent"
result = list(
/turf/simulated/floor/plating = 1,
/obj/effect/decal/cleanable/cobweb2 = 1)
/obj/effect/spawner/random_spawners/cobweb_left_rare
name = "cobweb left rare"
result = list(
/turf/simulated/floor/plating = 10,
/obj/effect/decal/cleanable/cobweb = 1)
/obj/effect/spawner/random_spawners/cobweb_right_rare
name = "cobweb right rare"
result = list(
/turf/simulated/floor/plating = 10,
/obj/effect/decal/cleanable/cobweb2 = 1)
/obj/effect/spawner/random_spawners/dirt_frequent
name = "dirt frequent"
result = list(
/turf/simulated/floor/plating = 1,
/obj/effect/decal/cleanable/dirt = 1)
/obj/effect/spawner/random_spawners/dirt_rare
name = "dirt rare"
result = list(
/turf/simulated/floor/plating = 10,
/obj/effect/decal/cleanable/dirt = 1)
/obj/effect/spawner/random_spawners/fungus_maybe
name = "rusted wall maybe"
result = list(
/turf/simulated/wall = 7,
/obj/effect/decal/cleanable/fungus = 1)
/obj/effect/spawner/random_spawners/fungus_probably
name = "rusted wall maybe"
result = list(
/turf/simulated/wall = 1,
/obj/effect/decal/cleanable/fungus = 7)
+36 -28
View File
@@ -1,14 +1,19 @@
//generic procs copied from obj/effect/alien
/obj/effect/spider
/obj/structure/spider
name = "web"
desc = "it's stringy and sticky"
icon = 'icons/effects/effects.dmi'
anchored = 1
density = 0
var/health = 15
var/master_commander = null
/obj/structure/spider/Destroy()
master_commander = null
return ..()
//similar to weeds, but only barfed out by nurses manually
/obj/effect/spider/ex_act(severity)
/obj/structure/spider/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
@@ -20,7 +25,7 @@
qdel(src)
return
/obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user, params)
/obj/structure/spider/attackby(var/obj/item/weapon/W, var/mob/user, params)
if(W.attack_verb.len)
visible_message("<span class='danger'>[user] has [pick(W.attack_verb)] \the [src] with \the [W]!</span>")
else
@@ -33,34 +38,34 @@
if(WT.remove_fuel(0, user))
damage = 15
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
playsound(loc, WT.usesound, 100, 1)
health -= damage
healthcheck()
/obj/effect/spider/bullet_act(var/obj/item/projectile/Proj)
/obj/structure/spider/bullet_act(var/obj/item/projectile/Proj)
..()
health -= Proj.damage
healthcheck()
/obj/effect/spider/proc/healthcheck()
/obj/structure/spider/proc/healthcheck()
if(health <= 0)
qdel(src)
/obj/effect/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/structure/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
health -= 5
healthcheck()
/obj/effect/spider/stickyweb
/obj/structure/spider/stickyweb
icon_state = "stickyweb1"
/obj/effect/spider/stickyweb/New()
/obj/structure/spider/stickyweb/New()
if(prob(50))
icon_state = "stickyweb2"
/obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group || (height==0)) return 1
/obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0) return 1
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider))
return 1
else if(istype(mover, /mob/living))
@@ -71,33 +76,32 @@
return prob(30)
return 1
/obj/effect/spider/eggcluster
/obj/structure/spider/eggcluster
name = "egg cluster"
desc = "They seem to pulse slightly with an inner life"
icon_state = "eggs"
var/amount_grown = 0
var/player_spiders = 0
var/faction = list()
var/master_commander = null
/obj/effect/spider/eggcluster/New()
/obj/structure/spider/eggcluster/New()
pixel_x = rand(3,-3)
pixel_y = rand(3,-3)
processing_objects.Add(src)
/obj/effect/spider/eggcluster/process()
/obj/structure/spider/eggcluster/process()
amount_grown += rand(0,2)
if(amount_grown >= 100)
var/num = rand(3,12)
for(var/i=0, i<num, i++)
var/obj/effect/spider/spiderling/S = new /obj/effect/spider/spiderling(src.loc)
var/obj/structure/spider/spiderling/S = new /obj/structure/spider/spiderling(src.loc)
S.faction = faction
S.master_commander = master_commander
if(player_spiders)
S.player_spiders = 1
qdel(src)
/obj/effect/spider/spiderling
/obj/structure/spider/spiderling
name = "spiderling"
desc = "It never stays still for long."
icon_state = "spiderling"
@@ -110,30 +114,34 @@
var/travelling_in_vent = 0
var/player_spiders = 0
var/faction = list()
var/master_commander = null
var/selecting_player = 0
/obj/effect/spider/spiderling/New()
/obj/structure/spider/spiderling/New()
pixel_x = rand(6,-6)
pixel_y = rand(6,-6)
processing_objects.Add(src)
/obj/effect/spider/spiderling/Bump(atom/user)
/obj/structure/spider/spiderling/Destroy()
processing_objects.Remove(src)
entry_vent = null
return ..()
/obj/structure/spider/spiderling/Bump(atom/user)
if(istype(user, /obj/structure/table))
src.loc = user.loc
else
..()
/obj/effect/spider/spiderling/proc/die()
/obj/structure/spider/spiderling/proc/die()
visible_message("<span class='alert'>[src] dies!</span>")
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/obj/effect/spider/spiderling/healthcheck()
/obj/structure/spider/spiderling/healthcheck()
if(health <= 0)
die()
/obj/effect/spider/spiderling/process()
/obj/structure/spider/spiderling/process()
if(travelling_in_vent)
if(istype(src.loc, /turf))
travelling_in_vent = 0
@@ -217,17 +225,17 @@
icon_state = "greenshatter"
anchored = 1
/obj/effect/spider/cocoon
/obj/structure/spider/cocoon
name = "cocoon"
desc = "Something wrapped in silky spider web"
icon_state = "cocoon1"
health = 60
/obj/effect/spider/cocoon/New()
/obj/structure/spider/cocoon/New()
icon_state = pick("cocoon1","cocoon2","cocoon3")
/obj/effect/spider/cocoon/Destroy()
src.visible_message("<span class='danger'>\The [src] splits open.</span>")
/obj/structure/spider/cocoon/Destroy()
visible_message("<span class='danger'>[src] splits open.</span>")
for(var/atom/movable/A in contents)
A.loc = src.loc
A.forceMove(loc)
return ..()
+9 -4
View File
@@ -1,6 +1,6 @@
//TODO: Flash range does nothing currently
/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0)
/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1)
src = null //so we don't abort once src is deleted
epicenter = get_turf(epicenter)
@@ -64,9 +64,14 @@
M << 'sound/effects/explosionfar.ogg'
if(heavy_impact_range > 1)
var/datum/effect/system/explosion/E = new/datum/effect/system/explosion()
E.set_up(epicenter)
E.start()
if(smoke)
var/datum/effect/system/explosion/smoke/E = new/datum/effect/system/explosion/smoke()
E.set_up(epicenter)
E.start()
else
var/datum/effect/system/explosion/E = new/datum/effect/system/explosion()
E.set_up(epicenter)
E.start()
var/x0 = epicenter.x
var/y0 = epicenter.y
+48 -55
View File
@@ -19,7 +19,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/r_speed = 1.0
var/health = null
var/hitsound = null
var/w_class = 3
var/usesound = null
var/w_class = WEIGHT_CLASS_NORMAL
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
pass_flags = PASSTABLE
pressure_resistance = 3
@@ -54,12 +55,16 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/strip_delay = DEFAULT_ITEM_STRIP_DELAY
var/put_on_delay = DEFAULT_ITEM_PUTON_DELAY
var/breakouttime = 0
var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES
var/flags_size = 0 //flag, primarily used for clothing to determine if a fatty can wear something or not.
var/block_chance = 0
var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom
var/mob/thrownby = null
var/toolspeed = 1 // If this item is a tool, the speed multiplier
/* Species-specific sprites, concept stolen from Paradise//vg/.
ex:
sprite_sheets = list(
@@ -78,11 +83,12 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
new path(src)
/obj/item/Destroy()
QDEL_NULL(hidden_uplink)
if(ismob(loc))
var/mob/m = loc
m.unEquip(src, 1)
for(var/X in actions)
qdel(X)
QDEL_LIST(actions)
master = null
return ..()
/obj/item/proc/check_allowed_items(atom/target, not_inside, target_self)
@@ -140,16 +146,18 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/examine(mob/user, var/distance = -1)
var/size
switch(src.w_class)
if(1.0)
if(WEIGHT_CLASS_TINY)
size = "tiny"
if(2.0)
if(WEIGHT_CLASS_SMALL)
size = "small"
if(3.0)
if(WEIGHT_CLASS_NORMAL)
size = "normal-sized"
if(4.0)
if(WEIGHT_CLASS_BULKY)
size = "bulky"
if(5.0)
if(WEIGHT_CLASS_HUGE)
size = "huge"
if(WEIGHT_CLASS_GIGANTIC)
size = "gigantic"
. = ..(user, distance, "", "It is a [size] item.")
@@ -182,9 +190,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(!user) return 0
if(hasorgans(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
var/obj/item/organ/external/temp = H.bodyparts_by_name["r_hand"]
if(user.hand)
temp = H.organs_by_name["l_hand"]
temp = H.bodyparts_by_name["l_hand"]
if(!temp)
to_chat(user, "<span class='warning'>You try to use your hand, but it's missing!</span>")
return 0
@@ -213,7 +221,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/obj/item/weapon/storage/S = src.loc
S.remove_from_storage(src)
src.throwing = 0
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
if(!user.unEquip(src))
return 0
@@ -227,36 +236,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
user.put_in_active_hand(src)
return 1
/obj/item/attack_alien(mob/user as mob)
if(isalien(user)) // -- TLE
var/mob/living/carbon/alien/A = user
if(!A.has_fine_manipulation)
if(src in A.contents) // To stop Aliens having items stuck in their pockets
A.unEquip(src)
to_chat(user, "Your claws aren't capable of such fine manipulation.")
return
if(istype(src.loc, /obj/item/weapon/storage))
for(var/mob/M in range(1, src.loc))
if(M.s_active == src.loc)
if(M.client)
M.client.screen -= src
src.throwing = 0
if(src.loc == user)
if(!user.unEquip(src))
return
else
if(istype(src.loc, /mob/living))
return
src.pickup(user)
user.put_in_active_hand(src)
return
/obj/item/attack_alien(mob/user as mob)
var/mob/living/carbon/alien/A = user
@@ -319,9 +298,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/proc/talk_into(mob/M, var/text, var/channel=null)
return
/obj/item/proc/moved(mob/user, old_loc)
return
/obj/item/proc/dropped(mob/user)
for(var/X in actions)
var/datum/action/A = X
@@ -388,22 +364,22 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr))
return
if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain
to_chat(usr, "\red You can't pick things up!")
to_chat(usr, "<span class='warning'>You can't pick things up!</span>")
return
if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained
to_chat(usr, "\red You can't pick things up!")
to_chat(usr, "<span class='warning'>You can't pick things up!</span>")
return
if(src.anchored) //Object isn't anchored
to_chat(usr, "\red You can't pick that up!")
to_chat(usr, "<span class='warning'>You can't pick that up!</span>")
return
if(!usr.hand && usr.r_hand) //Right hand is not full
to_chat(usr, "\red Your right hand is full.")
to_chat(usr, "<span class='warning'>Your right hand is full.</span>")
return
if(usr.hand && usr.l_hand) //Left hand is not full
to_chat(usr, "\red Your left hand is full.")
to_chat(usr, "<span class='warning'>Your left hand is full.</span>")
return
if(!istype(src.loc, /turf)) //Object is on a turf
to_chat(usr, "\red You can't pick that up!")
to_chat(usr, "<span class='warning'>You can't pick that up!</span>")
return
//All checks are done, time to pick it up!
usr.UnarmedAttack(src)
@@ -429,9 +405,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/mob/living/carbon/human/H = M
if(istype(H) && ( \
(H.head && H.head.flags & HEADCOVERSEYES) || \
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
(H.head && H.head.flags_cover & HEADCOVERSEYES) || \
(H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) || \
(H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES) \
))
// you can't stab someone in the eyes wearing a mask!
to_chat(user, "<span class='danger'>You're going to need to remove that mask/helmet/glasses first!</span>")
@@ -465,7 +441,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(istype(H))
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
if(!eyes) // should still get stabbed in the head
var/obj/item/organ/external/head/head = H.organs_by_name["head"]
var/obj/item/organ/external/head/head = H.bodyparts_by_name["head"]
head.take_damage(rand(10,14), 1)
return
eyes.take_damage(rand(3,4), 1)
@@ -542,6 +518,23 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
throw_at(S,14,3)
else ..()
/obj/item/throw_impact(atom/A)
if(A && !qdeleted(A))
var/itempush = 1
if(w_class < WEIGHT_CLASS_BULKY)
itempush = 0 // too light to push anything
return A.hitby(src, 0, itempush)
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
thrownby = thrower
callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own
. = ..(target, range, speed, thrower, spin, diagonals_first, callback)
/obj/item/proc/after_throw(datum/callback/callback)
if(callback) //call the original callback
. = callback.Invoke()
throw_speed = initial(throw_speed) //explosions change this.
/obj/item/proc/pwr_drain()
return 0 // Process Kill
+2 -2
View File
@@ -59,14 +59,14 @@
die()
return
if(contents.len)
src.visible_message("\red [src] slams into [hit_atom] spilling its contents!")
src.visible_message("<span class='warning'>[src] slams into [hit_atom] spilling its contents!</span>")
for(var/obj/item/clothing/mask/cigarette/O in contents)
O.loc = src.loc
icon_state = icon_empty
return ..()
/obj/item/ashtray/proc/die()
src.visible_message("\red [src] shatters spilling its contents!")
src.visible_message("<span class='warning'>[src] shatters spilling its contents!</span>")
for(var/obj/item/clothing/mask/cigarette/O in contents)
O.loc = src.loc
icon_state = icon_broken
+12 -5
View File
@@ -51,9 +51,9 @@
desc = "This is a one-use permit that allows the user to officially declare a built room as new addition to the station."
fluffnotice = "Nanotrasen Engineering requires all on-station construction projects to be approved by a head of staff, as detailed in Nanotrasen Company Regulation 512-C (Mid-Shift Modifications to Company Property). \
By submitting this form, you accept any fines, fees, or personal injury/death that may occur during construction."
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/areaeditor/permit/attack_self(mob/user as mob)
/obj/item/areaeditor/permit/attack_self(mob/user)
. = ..()
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
@@ -76,7 +76,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "blueprints"
fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage."
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
var/list/showing = list()
var/client/viewing
@@ -85,7 +85,7 @@
return ..()
/obj/item/areaeditor/blueprints/attack_self(mob/user as mob)
/obj/item/areaeditor/blueprints/attack_self(mob/user)
. = ..()
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
@@ -153,7 +153,7 @@
/obj/item/areaeditor/proc/get_area_type(var/area/A = get_area())
if(istype(A,/area/space))
if(A.outdoors)
return AREA_SPACE
var/list/SPECIALS = list(
/area/shuttle,
@@ -305,3 +305,10 @@
return ROOM_ERR_SPACE
found+=T
return found
//Blueprint Subtypes
/obj/item/areaeditor/blueprints/cyborg
name = "station schematics"
desc = "A digital copy of the station blueprints stored in your memory."
fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station."
+4 -4
View File
@@ -5,7 +5,7 @@
desc = "A folded bag designed for the storage and transportation of cadavers."
icon = 'icons/obj/bodybag.dmi'
icon_state = "bodybag_folded"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_self(mob/user)
var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc)
@@ -126,7 +126,7 @@
MouseDrop(over_object, src_location, over_location)
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
if(!ishuman(usr)) return
to_chat(usr, "\red You can't fold that up anymore..")
to_chat(usr, "<span class='warning'>You can't fold that up anymore..</span>")
..()
attackby(W as obj, mob/user as mob, params)
@@ -135,5 +135,5 @@
src.locked = !src.locked
to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]")
else
to_chat(user, "\red Access denied.")
return
to_chat(user, "<span class='warning'>Access denied.</span>")
return
+6 -2
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/candle.dmi'
icon_state = "candle1"
item_state = "candle1"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/wax = 200
var/lit = 0
var/infinite = 0
@@ -17,6 +17,10 @@
// No visible message
light(show_message = 0)
/obj/item/candle/Destroy()
processing_objects.Remove(src)
return ..()
/obj/item/candle/update_icon()
var/i
if(wax>150)
@@ -87,4 +91,4 @@
/obj/item/candle/eternal
desc = "A candle. This one seems to have an odd quality about the wax."
infinite = 1
infinite = 1
+2 -4
View File
@@ -8,7 +8,7 @@
icon = 'icons/obj/device.dmi'
name = "control wand"
desc = "Remotely controls airlocks."
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/mode = WAND_OPEN
var/region_access = 1 //See access.dm
var/obj/item/weapon/card/id/ID
@@ -19,9 +19,7 @@
ID.access = get_region_accesses(region_access)
/obj/item/weapon/door_remote/Destroy()
if(ID)
qdel(ID)
ID = null
QDEL_NULL(ID)
return ..()
/obj/item/weapon/door_remote/attack_self(mob/user)
+13 -7
View File
@@ -7,9 +7,10 @@
desc = "A colourful crayon. Looks tasty. Mmmm..."
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonred"
w_class = 1
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT | SLOT_EARS
attack_verb = list("attacked", "coloured")
toolspeed = 1
var/colour = "#FF0000" //RGB
var/drawtype = "rune"
var/list/graffiti = list("body","amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","up","down","left","right","heart","borgsrogue","voxpox","shitcurity","catbeast","hieroglyphs1","hieroglyphs2","hieroglyphs3","security","syndicate1","syndicate2","nanotrasen","lie","valid","arrowleft","arrowright","arrowup","arrowdown","chicken","hailcrab","brokenheart","peace","scribble","scribble2","scribble3","skrek","squish","tunnelsnake","yip","youaredead")
@@ -77,7 +78,7 @@
drawtype = temp
update_window(usr)
/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity)
/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity)
if(!proximity) return
if(is_type_in_list(target,validSurfaces))
var/temp = "rune"
@@ -86,7 +87,7 @@
else if(graffiti.Find(drawtype))
temp = "graffiti"
to_chat(user, "You start drawing a [temp] on the [target.name].")
if(instant || do_after(user, 50, target = target))
if(instant || do_after(user, 50 * toolspeed, target = target))
var/obj/effect/decal/cleanable/crayon/C = new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp)
C.add_hiddenprint(user)
to_chat(user, "You finish drawing [temp].")
@@ -95,17 +96,22 @@
if(!uses)
to_chat(user, "<span class='danger'>You used up your [name]!</span>")
qdel(src)
return
/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob)
/obj/item/toy/crayon/attack(mob/M, mob/user)
var/huffable = istype(src,/obj/item/toy/crayon/spraycan)
if(M == user)
to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!")
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(!H.check_has_mouth())
to_chat(user, "<span class='warning'>You do not have a mouth!</span>")
return
playsound(loc, 'sound/items/eatfood.ogg', 50, 0)
to_chat(user, "<span class='notice'>You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!</span>")
user.nutrition += 5
if(uses)
uses -= 5
if(uses <= 0)
to_chat(user, "<span class='danger'>There is no more of [name] left!</span>")
to_chat(user, "<span class='warning'>There is no more of [name] left!</span>")
qdel(src)
else
..()
+5
View File
@@ -8,6 +8,11 @@
var/mob/owner = null // Carp doesn't attack owner, set when using in hand
var/owned = 1 // Boolean, no owner to begin with
/obj/item/toy/carpplushie/dehy_carp/Destroy()
owner = null
return ..()
// Attack self
/obj/item/toy/carpplushie/dehy_carp/attack_self(mob/user as mob)
src.add_fingerprint(user) // Anyone can add their fingerprints to it with this
+1 -1
View File
@@ -3,7 +3,7 @@
icon = 'icons/obj/aicards.dmi'
icon_state = "aicard" // aicard-full
item_state = "electronic"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
flags = NOBLUDGEON
var/flush = null
+43 -66
View File
@@ -1,26 +1,30 @@
//moved these here from code/defines/obj/weapon.dm
//please preference put stuff where it's easy to find - C
/obj/item/weapon/autopsy_scanner
name = "autopsy scanner"
desc = "Extracts information on wounds."
icon = 'icons/obj/autopsy_scanner.dmi'
icon_state = ""
flags = CONDUCT
w_class = 1
w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=1;biotech=1"
var/list/datum/autopsy_data_scanner/wdata = list()
var/list/datum/autopsy_data_scanner/chemtraces = list()
var/list/chemtraces = list()
var/target_name = null
var/timeofdeath = null
/obj/item/weapon/autopsy_scanner/Destroy()
QDEL_LIST_ASSOC_VAL(wdata)
return ..()
/datum/autopsy_data_scanner
var/weapon = null // this is the DEFINITE weapon type that was used
var/list/organs_scanned = list() // this maps a number of scanned organs to
// the wounds to those organs with this data's weapon type
var/organ_names = ""
/datum/autopsy_data_scanner/Destroy()
QDEL_LIST_ASSOC_VAL(organs_scanned)
return ..()
/datum/autopsy_data
var/weapon = null
var/pretend_weapon = null
@@ -28,28 +32,23 @@
var/hits = 0
var/time_inflicted = 0
proc/copy()
var/datum/autopsy_data/W = new()
W.weapon = weapon
W.pretend_weapon = pretend_weapon
W.damage = damage
W.hits = hits
W.time_inflicted = time_inflicted
return W
/datum/autopsy_data/proc/copy()
var/datum/autopsy_data/W = new()
W.weapon = weapon
W.pretend_weapon = pretend_weapon
W.damage = damage
W.hits = hits
W.time_inflicted = time_inflicted
return W
/obj/item/weapon/autopsy_scanner/proc/add_data(var/obj/item/organ/external/O)
if(!O.autopsy_data.len && !O.trace_chemicals.len) return
/obj/item/weapon/autopsy_scanner/proc/add_data(obj/item/organ/external/O)
if(!O.autopsy_data.len && !O.trace_chemicals.len)
return
for(var/V in O.autopsy_data)
var/datum/autopsy_data/W = O.autopsy_data[V]
if(!W.pretend_weapon)
/*
// the more hits, the more likely it is that we get the right weapon type
if(prob(50 + W.hits * 10 + W.damage))
*/
// Buffing this stuff up for now!
if(1)
W.pretend_weapon = W.weapon
else
@@ -75,11 +74,8 @@
if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V))
chemtraces += V
/obj/item/weapon/autopsy_scanner/verb/print_data()
set src in view(usr, 1)
set name = "Print Data"
if(usr.stat || !(istype(usr,/mob/living/carbon/human)))
to_chat(usr, "No.")
/obj/item/weapon/autopsy_scanner/attack_self(mob/user)
if(!wdata.len && !chemtraces.len)
return
var/scan_data = ""
@@ -101,8 +97,10 @@
var/wname = W.pretend_weapon
if(wname in weapon_chances) weapon_chances[wname] += W.damage
else weapon_chances[wname] = max(W.damage, 1)
if(wname in weapon_chances)
weapon_chances[wname] += W.damage
else
weapon_chances[wname] = max(W.damage, 1)
total_score+=W.damage
@@ -126,7 +124,8 @@
if(30 to 1000)
damage_desc = "<font color='red'>severe</font>"
if(!total_score) total_score = D.organs_scanned.len
if(!total_score)
total_score = D.organs_scanned.len
scan_data += "<b>Weapon #[n]</b><br>"
if(damaging_weapon)
@@ -147,36 +146,19 @@
for(var/chemID in chemtraces)
scan_data += chemID
scan_data += "<br>"
user.visible_message("<span class='warning'>[src] rattles and prints out a sheet of paper.</span>")
for(var/mob/O in viewers(usr))
O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1)
playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(10)
var/obj/item/weapon/paper/P = new(usr.loc)
var/obj/item/weapon/paper/P = new(user.loc)
P.name = "Autopsy Data ([target_name])"
P.info = "<tt>[scan_data]</tt>"
P.overlays += "paper_words"
if(istype(usr,/mob/living/carbon))
// place the item in the usr's hand if possible
if(!usr.r_hand)
P.loc = usr
usr.r_hand = P
P.layer = 20
P.plane = HUD_PLANE
else if(!usr.l_hand)
P.loc = usr
usr.l_hand = P
P.layer = 20
P.plane = HUD_PLANE
user.put_in_hands(P)
if(istype(usr,/mob/living/carbon/human))
usr:update_inv_l_hand()
usr:update_inv_r_hand()
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M, mob/living/carbon/user)
if(!istype(M))
return
@@ -185,23 +167,18 @@
if(target_name != M.name)
target_name = M.name
src.wdata = list()
src.chemtraces = list()
src.timeofdeath = null
to_chat(user, "\red A new patient has been registered.. Purging data for previous patient.")
wdata.Cut()
chemtraces.Cut()
timeofdeath = null
to_chat(user, "<span class='warning'>A new patient has been registered. Purging data for previous patient.</span>")
src.timeofdeath = M.timeofdeath
timeofdeath = M.timeofdeath
var/obj/item/organ/external/S = M.get_organ(user.zone_sel.selecting)
if(!S)
to_chat(usr, "<b>You can't scan this body part.</b>")
to_chat(user, "<span class='warning'>You can't scan this body part.</span>")
return
if(!S.open)
to_chat(usr, "<b>You have to cut the limb open first!</b>")
return
for(var/mob/O in viewers(M))
O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.name] with \the [src.name]", 1)
M.visible_message("<span class='warning'>[user] scans the wounds on [M]'s [S] with [src]</span>")
src.add_data(S)
return 1
add_data(S)
return 1
@@ -9,7 +9,7 @@
desc = "For illicit snooping through the camera network."
icon = 'icons/obj/device.dmi'
icon_state = "camera_bug"
w_class = 1.0
w_class = WEIGHT_CLASS_TINY
item_state = "camera_bug"
throw_speed = 4
throw_range = 20
@@ -7,7 +7,7 @@
throwforce = 5.0
throw_speed = 3
throw_range = 5
w_class = 2
w_class = WEIGHT_CLASS_SMALL
origin_tech = "syndicate=4;magnets=4"
var/can_use = 1
var/obj/effect/dummy/chameleon/active_dummy = null
@@ -150,4 +150,4 @@
/obj/effect/dummy/chameleon/Destroy()
master.disrupt(0)
return ..()
return ..()
@@ -1,44 +0,0 @@
/**
* Multitool -- A multitool is used for hacking electronic devices.
* TO-DO -- Using it as a power measurement tool for cables etc. Nannek.
*
*/
/obj/item/device/debugger
icon = 'icons/obj/hacktool.dmi'
name = "debugger"
desc = "Used to debug electronic equipment."
icon_state = "hacktool-g"
flags = CONDUCT
force = 5.0
w_class = 2
throwforce = 5.0
throw_range = 15
throw_speed = 3
desc = "You can use this on airlocks or APCs to try to hack them without cutting wires."
materials = list(MAT_METAL=50, MAT_GLASS=20)
origin_tech = "magnets=1;engineering=1"
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
/obj/item/device/debugger/is_used_on(obj/O, mob/user)
if(istype(O, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = O
if(A.emagged || A.malfhack)
to_chat(user, "\red There is a software error with the device.")
else
to_chat(user, "\blue The device's software appears to be fine.")
return 1
if(istype(O, /obj/machinery/door))
var/obj/machinery/door/D = O
if(D.operating == -1)
to_chat(user, "\red There is a software error with the device.")
else
to_chat(user, "\blue The device's software appears to be fine.")
return 1
else if(istype(O, /obj/machinery))
var/obj/machinery/A = O
if(A.emagged)
to_chat(user, "\red There is a software error with the device.")
else
to_chat(user, "\blue The device's software appears to be fine.")
return 1
+2 -2
View File
@@ -4,7 +4,7 @@
icon_state = "flash"
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
throwforce = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
flags = CONDUCT
@@ -152,7 +152,7 @@
if(M.stat == CONSCIOUS)
M.mind_initialize() //give them a mind datum if they don't have one.
var/resisted
if(!isloyal(M))
if(!ismindshielded(M))
if(user.mind in ticker.mode.head_revolutionaries)
if(ticker.mode.add_revolutionary(M.mind))
times_used -- //Flashes less likely to burn out for headrevs when used for conversion
+17 -15
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "flashlight"
item_state = "flashlight"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=50, MAT_GLASS=20)
@@ -35,6 +35,7 @@
return 0
on = !on
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
update_brightness(user)
for(var/X in actions)
var/datum/action/A = X
@@ -54,8 +55,8 @@
return
var/mob/living/carbon/human/H = M //mob has protective eyewear
if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
to_chat(user, "<span class='notice'>You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first.</span>")
if(istype(H) && ((H.head && H.head.flags_cover & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) || (H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES)))
to_chat(user, "<span class='notice'>You're going to need to remove that [(H.head && H.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask" : "glasses"] first.</span>")
return
if(M == user) //they're using it on themselves
@@ -70,12 +71,13 @@
user.visible_message("<span class='notice'>[user] directs [src] to [M]'s eyes.</span>", \
"<span class='notice'>You direct [src] to [M]'s eyes.</span>")
if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected
if(M.stat == DEAD || M.disabilities & BLIND) //mob is dead or fully blind
to_chat(user, "<span class='notice'>[M] pupils does not react to the light!</span>")
else if(XRAY in M.mutations) //mob has X-RAY vision
to_chat(user, "<span class='notice'>[M] pupils give an eerie glow!</span>")
else //they're okay!
if(istype(H)) //robots and aliens are unaffected
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
if(M.stat == DEAD || !eyes || M.disabilities & BLIND) //mob is dead or fully blind
to_chat(user, "<span class='notice'>[M]'s pupils are unresponsive to the light!</span>")
else if((XRAY in M.mutations) || (eyes.colourblind_darkview && eyes.colourblind_darkview == eyes.get_dark_view())) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms).
to_chat(user, "<span class='notice'>[M]'s pupils glow eerily!</span>")
else //they're okay!
if(M.flash_eyes(visual = 1))
to_chat(user, "<span class='notice'>[M]'s pupils narrow.</span>")
else
@@ -86,7 +88,7 @@
desc = "A pen-sized light, used by medical staff."
icon_state = "penlight"
item_state = ""
w_class = 1
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT | SLOT_EARS
flags = CONDUCT
brightness_on = 2
@@ -107,7 +109,7 @@
item_state = ""
flags = CONDUCT
brightness_on = 2
w_class = 1
w_class = WEIGHT_CLASS_TINY
// the desk lamps are a bit special
/obj/item/device/flashlight/lamp
@@ -116,7 +118,7 @@
icon_state = "lamp"
item_state = "lamp"
brightness_on = 5
w_class = 4
w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
materials = list()
on = 1
@@ -151,7 +153,7 @@ obj/item/device/flashlight/lamp/bananalamp
/obj/item/device/flashlight/flare
name = "flare"
desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'."
w_class = 2
w_class = WEIGHT_CLASS_SMALL
brightness_on = 8 // Made it brighter (from 7 to 8).
light_color = "#ff0000" // changed colour to a more brighter red.
icon_state = "flare"
@@ -212,7 +214,7 @@ obj/item/device/flashlight/lamp/bananalamp
/obj/item/device/flashlight/flare/torch
name = "torch"
desc = "A torch fashioned from some leaves and a log."
w_class = 4
w_class = WEIGHT_CLASS_BULKY
brightness_on = 7
icon_state = "torch"
item_state = "torch"
@@ -225,7 +227,7 @@ obj/item/device/flashlight/lamp/bananalamp
icon = 'icons/obj/lighting.dmi'
icon_state = "floor1" //not a slime extract sprite but... something close enough!
item_state = "slime"
w_class = 1
w_class = WEIGHT_CLASS_TINY
brightness_on = 6
light_color = "#FFBF00"
materials = list()
@@ -3,37 +3,37 @@
/obj/item/device/floor_painter
name = "floor painter"
icon_state = "floor_painter"
var/floor_icon
var/floor_state = "floor"
var/floor_dir = SOUTH
w_class = 1
w_class = WEIGHT_CLASS_TINY
item_state = "electronic"
flags = CONDUCT
slot_flags = SLOT_BELT
var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "blackcorner", "blue", "bluecorner",
var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "blackcorner", "blue", "bluecorner",
"bluefull", "bluered", "blueyellow", "blueyellowfull", "bot", "brown", "browncorner", "browncornerold", "brownold",
"cafeteria", "caution", "cautioncorner", "chapel", "cmo", "dark", "delivery", "escape", "escapecorner", "floor",
"freezerfloor", "green", "greenblue", "greenbluefull", "greencorner", "greenfull", "greenyellow",
"greenyellowfull", "grimy", "loadingarea", "neutral", "neutralcorner", "neutralfull", "orange", "orangecorner",
"orangefull", "purple", "purplecorner", "purplefull", "rampbottom", "ramptop", "red", "redblue", "redbluefull",
"redcorner", "redfull", "redgreen", "redgreenfull", "redyellow", "redyellowfull", "warning", "warningcorner", "warnwhite",
"warnwhitecorner", "white", "whiteblue", "whitebluecorner", "whitebluefull", "whitebot", "whitecorner", "whitedelivery",
"whitegreen", "whitegreencorner", "whitegreenfull", "whitehall", "whitepurple", "whitepurplecorner", "whitepurplefull",
"whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
"redcorner", "redfull", "redgreen", "redgreenfull", "redyellow", "redyellowfull", "warning", "warningcorner", "warnwhite",
"warnwhitecorner", "white", "whiteblue", "whitebluecorner", "whitebluefull", "whitebot", "whitecorner", "whitedelivery",
"whitegreen", "whitegreencorner", "whitegreenfull", "whitehall", "whitepurple", "whitepurplecorner", "whitepurplefull",
"whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
"yellowcorner", "yellowcornersiding", "yellowsiding")
/obj/item/device/floor_painter/afterattack(var/atom/A, var/mob/user, proximity, params)
if(!proximity)
return
var/turf/simulated/floor/plasteel/F = A
if(!istype(F))
to_chat(user, "<span class='warning'>\The [src] can only be used on station flooring.</span>")
return
F.icon_state = floor_state
F.icon_regular_floor = floor_state
F.dir = floor_dir
@@ -60,7 +60,7 @@
<a href="?src=[UID()];choose_dir=1">Choose Direction</a>
<div class='statusDisplay'>Direction: [dir2text(floor_dir)]</div>
"}
var/datum/browser/popup = new(user, "floor_painter", name, 225, 300)
popup.set_content(dat)
popup.open()
@@ -68,7 +68,7 @@
/obj/item/device/floor_painter/Topic(href, href_list)
if(..())
return
if(href_list["choose_state"])
var/state = input("Please select a style", "[src]") as null|anything in allowed_states
if(state)
@@ -92,7 +92,7 @@
index = 1
floor_state = allowed_states[index]
floor_dir = SOUTH
floor_icon = icon('icons/turf/floors.dmi', floor_state, floor_dir)
if(usr)
attack_self(usr)
+2 -6
View File
@@ -17,18 +17,14 @@
song.instrumentExt = "ogg"
/obj/item/device/guitar/Destroy()
qdel(song)
song = null
QDEL_NULL(song)
return ..()
/obj/item/device/guitar/attack_self(mob/user as mob)
ui_interact(user)
/obj/item/device/guitar/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
if(!isliving(user) || user.stat || user.restrained() || user.lying)
if(!isliving(user) || user.incapacitated())
return
song.ui_interact(user, ui_key, ui, force_open)
@@ -8,7 +8,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=500, MAT_GLASS=500)
w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter.
w_class = WEIGHT_CLASS_SMALL //Increased to 2, because diodes are w_class 2. Conservation of matter.
origin_tech = "combat=1"
origin_tech = "magnets=2"
var/energy = 5
@@ -35,9 +35,7 @@
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/Destroy()
if(diode)
qdel(diode)
diode = null
QDEL_NULL(diode)
return ..()
/obj/item/device/laser_pointer/upgraded/New()
@@ -128,8 +126,8 @@
to_chat(S, "<span class='warning'>Your sensors were overloaded by a laser!</span>")
outmsg = "<span class='notice'>You overload [S] by shining [src] at their sensors.</span>"
S.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has had a laser pointer shone in their eyes by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='orange'>Shone a laser pointer in the eyes of [S.name] ([S.ckey])</font>")
S.create_attack_log("<font color='orange'>Has had a laser pointer shone in their eyes by [user.name] ([user.ckey])</font>")
user.create_attack_log("<font color='orange'>Shone a laser pointer in the eyes of [S.name] ([S.ckey])</font>")
log_attack("<font color='orange'>[user.name] ([user.ckey]) Shone a laser pointer in the eyes of [S.name] ([S.ckey])</font>")
else
outmsg = "<span class='notice'>You fail to overload [S] by shining [src] at their sensors.</span>"
@@ -142,7 +140,7 @@
outmsg = "<span class='notice'>You hit the lens of [C] with [src], temporarily disabling the camera!</span>"
log_admin("\[[time_stamp()]\] [user.name] ([user.ckey]) EMPd a camera with a laser pointer")
user.attack_log += text("\[[time_stamp()]\] [user.name] ([user.ckey]) EMPd a camera with a laser pointer")
user.create_attack_log("[user.name] ([user.ckey]) EMPd a camera with a laser pointer")
else
outmsg = "<span class='info'>You missed the lens of [C] with [src].</span>"
+16 -19
View File
@@ -3,7 +3,7 @@
desc = "A device used to project your voice. Loudly."
icon_state = "megaphone"
item_state = "radio"
w_class = 1
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
var/spamcheck = 0
@@ -12,24 +12,22 @@
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TATER!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!")
/obj/item/device/megaphone/attack_self(mob/living/user as mob)
if(user.client)
if(user.client.prefs.muted & MUTE_IC)
to_chat(src, "\red You cannot speak in IC (muted).")
return
if(!ishuman(user))
to_chat(user, "\red You don't know how to use this!")
if(user.client && (user.client.prefs.muted & MUTE_IC))
to_chat(src, "<span class='warning'>You cannot speak in IC (muted).</span>")
return
if(user.silent)
if(!ishuman(user))
to_chat(user, "<span class='warning'>You don't know how to use this!</span>")
return
if(!user.can_speak())
to_chat(user, "<span class='warning'>You find yourself unable to speak at all.</span>")
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H && H.mind)
if(H.mind.miming)
to_chat(user, "<span class='warning'>Your vow of silence prevents you from speaking.</span>")
return
if(H && H.mind && H.mind.miming)
to_chat(user, "<span class='warning'>Your vow of silence prevents you from speaking.</span>")
return
if(spamcheck)
to_chat(user, "\red \The [src] needs to recharge!")
to_chat(user, "<span class='warning'>\The [src] needs to recharge!</span>")
return
var/message = input(user, "Shout a message:", "Megaphone") as text|null
@@ -39,28 +37,27 @@
if(!message)
return
message = capitalize(message)
if((src.loc == user && usr.stat == 0))
if((loc == user && !user.incapacitated()))
if(emagged)
if(insults)
saymsg(user, pick(insultmsg))
insults--
else
to_chat(user, "\red *BZZZZzzzzzt*")
to_chat(user, "<span class='warning'>*BZZZZzzzzzt*</span>")
else
saymsg(user, message)
spamcheck = 1
spawn(20)
spamcheck = 0
return
/obj/item/device/megaphone/proc/saymsg(mob/living/user as mob, message)
audible_message("<span class='game say'><span class='name'>[user]</span> broadcasts, <FONT size=3>\"[message]\"</FONT></span>", hearing_distance = 14)
audible_message("<span class='game say'><span class='name'>[user]</span> broadcasts, <span class='reallybig'>\"[message]\"</span></span>", hearing_distance = 14)
for(var/obj/O in oview(14, get_turf(src)))
O.hear_talk(user, "<FONT size=3>[message]</FONT>")
O.hear_talk(user, "<span class='reallybig'>[message]</span>")
/obj/item/device/megaphone/emag_act(user as mob)
if(!emagged)
to_chat(user, "\red You overload \the [src]'s voice synthesizer.")
to_chat(user, "<span class='warning'>You overload \the [src]'s voice synthesizer.</span>")
emagged = 1
insults = rand(1, 3)//to prevent dickflooding
-87
View File
@@ -1,87 +0,0 @@
#define MODKIT_HELMET 1
#define MODKIT_SUIT 2
#define MODKIT_FULL 3
/obj/item/device/modkit
name = "hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user."
icon_state = "modkit"
var/parts = MODKIT_FULL
var/target_species = "Human"
var/list/permitted_types = list(
/obj/item/clothing/head/helmet/space/rig,
/obj/item/clothing/suit/space/rig
)
/obj/item/device/modkit/afterattack(obj/O, mob/user as mob, proximity)
if(!proximity)
return
if(!target_species)
return //it shouldn't be null, okay?
if(!parts)
to_chat(user, "<span class='warning'>This kit has no parts for this modification left.</span>")
user.unEquip(src)
qdel(src)
return
var/allowed = 0
for(var/permitted_type in permitted_types)
if(istype(O, permitted_type))
allowed = 1
var/obj/item/clothing/I = O
if(!istype(I) || !allowed)
to_chat(user, "<span class='notice'>[src] is unable to modify that.</span>")
return
var/excluding = ("exclude" in I.species_restricted)
var/in_list = (target_species in I.species_restricted)
if(excluding ^ in_list)
to_chat(user, "<span class='notice'>[I] is already modified.</span>")
return
if(!isturf(O.loc))
to_chat(user, "<span class='warning'>[O] must be safely placed on the ground for modification.</span>")
return
playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("\red [user] opens \the [src] and modifies \the [O].","\red You open \the [src] and modify \the [O].")
I.refit_for_species(target_species)
if(istype(I, /obj/item/clothing/head/helmet))
parts &= ~MODKIT_HELMET
if(istype(I, /obj/item/clothing/suit))
parts &= ~MODKIT_SUIT
if(!parts)
user.unEquip(src)
qdel(src)
/obj/item/device/modkit/examine(mob/user)
..(user)
to_chat(user, "It looks as though it modifies hardsuits to fit [target_species] users.")
/obj/item/device/modkit/tajaran
name = "Tajaran hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran."
target_species = "Tajaran"
/obj/item/device/modkit/unathi
name = "Unathi hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Unathi."
target_species = "Unathi"
/obj/item/device/modkit/skrell
name = "Skrell hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Skrell."
target_species = "Skrell"
/obj/item/device/modkit/vox
name = "Vox hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Vox."
target_species = "Vox"
+69 -24
View File
@@ -1,3 +1,7 @@
#define PROXIMITY_NONE ""
#define PROXIMITY_ON_SCREEN "_red"
#define PROXIMITY_NEAR "_yellow"
/**
* Multitool -- A multitool is used for hacking electronic devices.
* TO-DO -- Using it as a power measurement tool for cables etc. Nannek.
@@ -10,13 +14,15 @@
icon_state = "multitool"
flags = CONDUCT
force = 5.0
w_class = 2
throwforce = 5.0
throw_range = 15
w_class = WEIGHT_CLASS_SMALL
throwforce = 0
throw_range = 7
throw_speed = 3
desc = "You can use this on airlocks or APCs to try to hack them without cutting wires."
materials = list(MAT_METAL=50, MAT_GLASS=20)
origin_tech = "magnets=1;engineering=1"
origin_tech = "magnets=1;engineering=2"
toolspeed = 1
hitsound = 'sound/weapons/tap.ogg'
var/shows_wire_information = FALSE // shows what a wire does if set to TRUE
var/obj/machinery/buffer // simple machine buffer for device linkage
/obj/item/device/multitool/proc/IsBufferA(var/typepath)
@@ -26,40 +32,79 @@
// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
/obj/item/device/multitool/Destroy()
buffer = null
return ..()
/obj/item/device/multitool/ai_detect
var/track_delay = 0
var/track_cooldown = 0
var/track_delay = 10 //How often it checks for proximity
var/detect_state = PROXIMITY_NONE
var/rangealert = 8 //Glows red when inside
var/rangewarning = 20 //Glows yellow when inside
origin_tech = "magnets=1;engineering=2;syndicate=1"
/obj/item/device/multitool/ai_detect/New()
..()
processing_objects += src
/obj/item/device/multitool/ai_detect/Destroy()
processing_objects -= src
return ..()
/obj/item/device/multitool/ai_detect/process()
if(track_delay > world.time)
if(track_cooldown > world.time)
return
detect_state = PROXIMITY_NONE
multitool_detect()
icon_state = "[initial(icon_state)][detect_state]"
track_cooldown = world.time + track_delay
var/found_eye = 0
for(var/mob/camera/aiEye/A in living_mob_list)
var/turf/our_turf = get_turf(src)
var/turf/eye_turf = get_turf(A)
if(get_dist(our_turf, eye_turf) < 9)
found_eye = 1
/obj/item/device/multitool/ai_detect/proc/multitool_detect()
var/turf/our_turf = get_turf(src)
for(var/mob/living/silicon/ai/AI in ai_list)
if(AI.cameraFollow == src)
detect_state = PROXIMITY_ON_SCREEN
break
if(found_eye)
icon_state = "[initial(icon_state)]_red"
else
icon_state = initial(icon_state)
if(!detect_state && cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
var/datum/camerachunk/chunk = cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
if(chunk)
if(chunk.seenby.len)
for(var/mob/camera/aiEye/A in chunk.seenby)
var/turf/detect_turf = get_turf(A)
if(get_dist(our_turf, detect_turf) < rangealert)
detect_state = PROXIMITY_ON_SCREEN
break
if(get_dist(our_turf, detect_turf) < rangewarning)
detect_state = PROXIMITY_NEAR
break
track_delay = world.time + 10 // 1 second
return
/obj/item/device/multitool/ai_detect/admin
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item?
track_delay = 5
shows_wire_information = TRUE
/obj/item/device/multitool/ai_detect/admin/multitool_detect()
var/turf/our_turf = get_turf(src)
for(var/mob/J in urange(rangewarning,our_turf))
if(check_rights(R_ADMIN, 0, J))
detect_state = PROXIMITY_NEAR
var/turf/detect_turf = get_turf(J)
if(get_dist(our_turf, detect_turf) < rangealert)
detect_state = PROXIMITY_ON_SCREEN
break
/obj/item/device/multitool/cyborg
name = "multitool"
desc = "Optimised and stripped-down version of a regular multitool."
toolspeed = 0.5
/obj/item/device/multitool/abductor
name = "alien multitool"
desc = "An omni-technological interface."
icon = 'icons/obj/abductor.dmi'
icon_state = "multitool"
toolspeed = 0.1
origin_tech = "magnets=5;engineering=5;abductor=3"
shows_wire_information = TRUE
+28 -26
View File
@@ -3,7 +3,7 @@
icon = 'icons/obj/aicards.dmi'
icon_state = "pai"
item_state = "electronic"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "programming=2"
var/request_cooldown = 5 // five seconds
@@ -11,11 +11,16 @@
var/obj/item/device/radio/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
var/list/faction = list("neutral") // The factions the pAI will inherit from the card
/obj/item/device/paicard/syndicate
name = "syndicate personal AI device"
faction = list("syndicate")
/obj/item/device/paicard/relaymove(var/mob/user, var/direction)
if(user.stat || user.stunned)
return
var/obj/item/weapon/rig/rig = src.get_rig()
var/obj/item/weapon/rig/rig = get_rig()
if(istype(rig))
rig.forced_move(direction, user)
@@ -26,11 +31,8 @@
/obj/item/device/paicard/Destroy()
if(pai)
pai.ghostize()
qdel(pai)
pai = null
if(radio)
qdel(radio)
radio = null
QDEL_NULL(pai)
QDEL_NULL(radio)
return ..()
/obj/item/device/paicard/attack_self(mob/user)
@@ -257,10 +259,10 @@
var/delta = (world.time / 10) - last_request
if(request_cooldown > delta)
var/cooldown_time = round(request_cooldown - ((world.time / 10) - last_request), 1)
to_chat(usr, "\red The request system is currently offline. Please wait another [cooldown_time] seconds.")
to_chat(usr, "<span class='warning'>The request system is currently offline. Please wait another [cooldown_time] seconds.</span>")
return
last_request = world.time / 10
src.looking_for_personality = 1
looking_for_personality = 1
paiController.findPAI(src, usr)
if(href_list["wipe"])
var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No")
@@ -297,35 +299,35 @@
// WIRE_TRANSMIT = 4
/obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
src.pai = personality
src.overlays += "pai-happy"
pai = personality
overlays += "pai-happy"
/obj/item/device/paicard/proc/removePersonality()
src.pai = null
src.overlays.Cut()
src.overlays += "pai-off"
pai = null
overlays.Cut()
overlays += "pai-off"
/obj/item/device/paicard
var/current_emotion = 1
/obj/item/device/paicard/proc/setEmotion(var/emotion)
if(pai)
src.overlays.Cut()
overlays.Cut()
switch(emotion)
if(1) src.overlays += "pai-happy"
if(2) src.overlays += "pai-cat"
if(3) src.overlays += "pai-extremely-happy"
if(4) src.overlays += "pai-face"
if(5) src.overlays += "pai-laugh"
if(6) src.overlays += "pai-off"
if(7) src.overlays += "pai-sad"
if(8) src.overlays += "pai-angry"
if(9) src.overlays += "pai-what"
if(1) overlays += "pai-happy"
if(2) overlays += "pai-cat"
if(3) overlays += "pai-extremely-happy"
if(4) overlays += "pai-face"
if(5) overlays += "pai-laugh"
if(6) overlays += "pai-off"
if(7) overlays += "pai-sad"
if(8) overlays += "pai-angry"
if(9) overlays += "pai-what"
current_emotion = emotion
/obj/item/device/paicard/proc/alertUpdate()
var/turf/T = get_turf_or_move(src.loc)
var/turf/T = get_turf_or_move(loc)
for(var/mob/M in viewers(T))
M.show_message("\blue [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\blue [src] bleeps electronically.", 2)
M.show_message("<span class='notice'>[src] flashes a message across its screen, \"Additional personalities available for download.\"</span>", 3, "<span class='notice'>[src] bleeps electronically.</span>", 2)
/obj/item/device/paicard/emp_act(severity)
for(var/mob/M in src)
@@ -63,7 +63,7 @@
var/chosen_wire = input(user, "OH GOD OH GOD", "WHAT WIRE?!") in wires
if(!in_range(src, usr) || issilicon(usr) || !usr.canmove || usr.restrained())
return
playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1)
playsound(src, I.usesound, 50, 1, 1)
user.visible_message("<span class='warning'>[user] cuts the [chosen_wire] wire!</span>", "<span class='danger'>You cut the [chosen_wire] wire!</span>")
sleep(5)
if(chosen_wire == correct_wire)
@@ -84,8 +84,8 @@
to_chat(user, "<span class='warning'>You can't see the box well enough to cut the wires out.</span>")
return
user.visible_message("<span class='notice'>[user] starts removing the payload and wires from \the [src].</span>")
if(do_after(user, 40, target = src))
playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1)
if(do_after(user, 40 * I.toolspeed, target = src))
playsound(src, I.usesound, 50, 1, 1)
user.unEquip(src)
user.visible_message("<span class='notice'>[user] removes the insides of \the [src]!</span>")
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(src.loc)
+8 -6
View File
@@ -5,7 +5,7 @@
desc = "A nulling power sink which drains energy from electrical systems."
icon_state = "powersink0"
item_state = "electronic"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
throwforce = 5
throw_speed = 1
@@ -13,7 +13,7 @@
materials = list(MAT_METAL=750)
origin_tech = "powerstorage=3;syndicate=5"
var/drain_rate = 1600000 // amount of power to drain per tick
var/apc_drain_rate = 5000 // Max. amount drained from single APC. In Watts.
var/apc_drain_rate = 50 // Max. amount drained from single APC. In Watts.
var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts.
var/power_drained = 0 // Amount of power drained.
var/max_power = 1e10 // Detonation point.
@@ -27,6 +27,8 @@
/obj/item/device/powersink/Destroy()
processing_objects.Remove(src)
processing_power_items.Remove(src)
PN = null
attached = null
return ..()
/obj/item/device/powersink/attackby(var/obj/item/I, var/mob/user)
@@ -110,10 +112,10 @@
if(istype(T.master, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = T.master
if(A.operating && A.cell)
var/cur_charge = A.cell.charge / CELLRATE
var/drain_val = min(apc_drain_rate, cur_charge)
A.cell.use(drain_val * CELLRATE)
drained += drain_val
A.cell.charge = max(0, A.cell.charge - apc_drain_rate)
drained += apc_drain_rate
if(A.charging == 2) // If the cell was full
A.charging = 1 // It's no longer full
power_drained += drained
return 1
@@ -21,7 +21,7 @@
if(!emagged)
emagged = 1
syndicate = 1
to_chat(user, "\blue The This beacon now only be locked on to by emagged teleporters!")
to_chat(user, "<span class='notice'>The This beacon now only be locked on to by emagged teleporters!</span>")
/obj/item/device/radio/beacon/hear_talk()
return
@@ -58,7 +58,7 @@
/obj/item/device/radio/beacon/syndicate/attack_self(mob/user as mob)
if(user)
to_chat(user, "\blue Locked In")
to_chat(user, "<span class='notice'>Locked In</span>")
new /obj/machinery/power/singularity_beacon/syndicate( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
qdel(src)
@@ -71,7 +71,7 @@
/obj/item/device/radio/beacon/syndicate/bomb/attack_self(mob/user as mob)
if(user)
to_chat(user, "\blue Locked In")
to_chat(user, "<span class='notice'>Locked In</span>")
new /obj/machinery/syndicatebomb( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
qdel(src)
@@ -6,7 +6,7 @@
frequency = 1449
flags = CONDUCT
slot_flags = SLOT_BACK
w_class = 5
w_class = WEIGHT_CLASS_HUGE
materials = list(MAT_METAL=10000, MAT_GLASS=2500)
var/code = 2
@@ -5,6 +5,7 @@
icon = 'icons/obj/radio.dmi'
icon_state = "cypherkey"
item_state = ""
w_class = WEIGHT_CLASS_TINY
var/translate_binary = 0
var/translate_hive = 0
var/syndie = 0
@@ -147,4 +148,4 @@
name = "AI Integrated Encryption Key"
desc = "Integrated encryption key"
icon_state = "cap_cypherkey"
channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1)
channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1)
@@ -32,12 +32,8 @@
recalculateChannels(1)
/obj/item/device/radio/headset/Destroy()
if(keyslot1)
qdel(keyslot1)
if(keyslot2)
qdel(keyslot2)
keyslot1 = null
keyslot2 = null
QDEL_NULL(keyslot1)
QDEL_NULL(keyslot2)
return ..()
/obj/item/device/radio/headset/list_channels(var/mob/user)
@@ -64,17 +60,15 @@
return ..()
/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0)
if(aiOverride)
return ..(freq, level)
/obj/item/device/radio/headset/is_listening()
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.l_ear == src || H.r_ear == src)
return ..(freq, level)
else if(isanimal(loc))
// frankly, all the ones with inventory are small enough to not warrant snowflaking the slot check somehow
return ..(freq, level)
return -1
return ..()
else if(isanimal(loc) || isAI(loc))
return ..()
return FALSE
/obj/item/device/radio/headset/alt
name = "bowman headset"
@@ -304,10 +298,10 @@
var/myAi = null // Atlantis: Reference back to the AI which has this radio.
var/disabledAi = 0 // Atlantis: Used to manually disable AI's integrated radio via intellicard menu.
/obj/item/device/radio/headset/heads/ai_integrated/receive_range(freq, level)
/obj/item/device/radio/headset/heads/ai_integrated/is_listening()
if(disabledAi)
return -1 //Transciever Disabled.
return ..(freq, level, 1)
return FALSE
return ..()
/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
user.set_machine(src)
@@ -3,7 +3,7 @@
desc = "Talk through this."
icon_state = "intercom"
anchored = 1
w_class = 4
w_class = WEIGHT_CLASS_BULKY
canhear_range = 2
flags = CONDUCT
var/number = 0
@@ -120,15 +120,13 @@
attack_self(user)
/obj/item/device/radio/intercom/receive_range(freq, level)
if(!on)
if(!is_listening())
return -1
if(!(0 in level))
var/turf/position = get_turf(src)
// TODO: Integrate radio with the space manager
if(isnull(position) || !(position.z in level))
return -1
if(!src.listening)
return -1
if(freq in ANTAG_FREQS)
if(!(src.syndie))
return -1//Prevents broadcast of messages over devices lacking the encryption
@@ -140,8 +138,8 @@
if(3)
if(iswirecutter(W) && b_stat && wires.IsAllCut())
to_chat(user, "<span class='notice'>You cut out the intercoms wiring and disconnect its electronics.</span>")
playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1)
if(do_after(user, 10, target = src))
playsound(get_turf(src), W.usesound, 50, 1)
if(do_after(user, 10 * W.toolspeed, target = src))
if(buildstage != 3)
return
new /obj/item/stack/cable_coil(get_turf(src),5)
@@ -154,8 +152,8 @@
else return ..()
if(2)
if(isscrewdriver(W))
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 10, target = src))
playsound(get_turf(src), W.usesound, 50, 1)
if(do_after(user, 10 * W.toolspeed, target = src))
update_icon()
on = 1
b_stat = 0
@@ -172,15 +170,15 @@
if(coil.amount < 5)
to_chat(user, "<span class='warning'>You need more cable for this!</span>")
return
if(do_after(user, 10, target = src))
if(do_after(user, 10 * coil.toolspeed, target = src))
coil.use(5)
to_chat(user, "<span class='notice'>You wire \the [src]!</span>")
buildstage = 2
return 1
if(iscrowbar(W))
to_chat(user, "<span class='notice'>You begin removing the electronics...</span>")
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 10, target = src))
playsound(get_turf(src), W.usesound, 50, 1)
if(do_after(user, 10 * W.toolspeed, target = src))
if(buildstage != 1)
return
new /obj/item/weapon/intercom_electronics(get_turf(src))
@@ -189,19 +187,19 @@
return 1
if(0)
if(istype(W,/obj/item/weapon/intercom_electronics))
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 10, target = src))
playsound(get_turf(src), W.usesound, 50, 1)
if(do_after(user, 10 * W.toolspeed, target = src))
qdel(W)
to_chat(user, "<span class='notice'>You insert \the [W] into \the [src]!</span>")
buildstage = 1
return 1
if(iswelder(W))
var/obj/item/weapon/weldingtool/WT=W
playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
playsound(get_turf(src), WT.usesound, 50, 1)
if(!WT.remove_fuel(3, user))
to_chat(user, "<span class='warning'>You're out of welding fuel.</span>")
return 1
if(do_after(user, 10, target = src))
if(do_after(user, 10 * WT.toolspeed, target = src))
to_chat(user, "<span class='notice'>You cut the intercom frame from the wall!</span>")
new /obj/item/mounted/frame/intercom(get_turf(src))
qdel(src)
@@ -233,8 +231,10 @@
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
desc = "Looks like a circuit. Probably is."
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
toolspeed = 1
usesound = 'sound/items/Deconstruct.ogg'
/obj/item/device/radio/intercom/locked
var/locked_frequency
+47 -34
View File
@@ -30,7 +30,6 @@ var/global/list/default_medbay_channels = list(
var/frequency = PUB_FREQ //common chat
var/traitor_frequency = 0 //tune to frequency to unlock traitor supplies
var/canhear_range = 3 // the range which mobs can hear this radio from
var/obj/item/device/radio/patch_link = null
var/datum/wires/radio/wires = null
var/b_stat = 0
var/broadcasting = 0
@@ -45,7 +44,7 @@ var/global/list/default_medbay_channels = list(
slot_flags = SLOT_BELT
throw_speed = 2
throw_range = 9
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=75)
@@ -54,32 +53,31 @@ var/global/list/default_medbay_channels = list(
var/list/internal_channels
/obj/item/device/radio
var/datum/radio_frequency/radio_connection
var/list/datum/radio_frequency/secure_radio_connections = new
proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
/obj/item/device/radio/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
/obj/item/device/radio/New()
..()
wires = new(src)
if(radio_controller)
initialize()
internal_channels = default_internal_channels.Copy()
global_radios |= src
/obj/item/device/radio/Destroy()
qdel(wires)
wires = null
QDEL_NULL(wires)
if(radio_controller)
radio_controller.remove_object(src, frequency)
for(var/ch_name in channels)
radio_controller.remove_object(src, radiochannels[ch_name])
patch_link = null
global_radios -= src
follow_target = null
return ..()
@@ -92,7 +90,7 @@ var/global/list/default_medbay_channels = list(
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
/obj/item/device/radio/attack_ghost(mob/user)
return ui_interact(user)
return interact(user)
/obj/item/device/radio/attack_self(mob/user as mob)
user.set_machine(src)
@@ -178,11 +176,6 @@ var/global/list/default_medbay_channels = list(
/mob/dead/observer/has_internal_radio_channel_access(var/mob/user, var/list/req_one_accesses)
return can_admin_interact()
/obj/item/device/radio/proc/text_wires()
if(b_stat)
return wires.GetInteractWindow()
return
/obj/item/device/radio/proc/ToggleBroadcast()
broadcasting = !broadcasting && !(wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
@@ -240,7 +233,6 @@ var/global/list/default_medbay_channels = list(
var/datum/radio_frequency/connection = null
if(channel && channels && channels.len > 0)
if(channel == "department")
// to_chat(world, "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"")
channel = channels[1]
connection = secure_radio_connections[channel]
else
@@ -257,9 +249,8 @@ var/global/list/default_medbay_channels = list(
Broadcast_Message(connection, A,
0, "*garbled automated announcement*", src,
message, from, "Automated Announcement", from, "synthesized voice",
4, 0, zlevel, connection.frequency, follow_target=follow_target)
4, 0, zlevel, connection.frequency, follow_target = follow_target)
qdel(A)
return
// Just a dummy mob used for making announcements, so we don't create AIs to do this
// I'm not sure who thought that was a good idea. -- Crazylemon
@@ -276,7 +267,8 @@ var/global/list/default_medbay_channels = list(
/mob/living/automatedannouncer/Destroy()
if(lifetime_timer)
deltimer(lifetime_timer)
..()
lifetime_timer = null
return ..()
/mob/living/automatedannouncer/proc/autocleanup()
log_runtime(EXCEPTION("An announcer somehow managed to outlive the radio! Deleting!"), src, list("Message: '[message]'"))
@@ -320,7 +312,7 @@ var/global/list/default_medbay_channels = list(
actually transmit large mass. Headsets are the only radio devices capable
of sending subspace transmissions to the Communications Satellite.
A headset sends a signal to a subspace listener/reciever elsewhere in space,
A headset sends a signal to a subspace listener/receiver elsewhere in space,
the signal gets processed and logged, and an audible transmission gets sent
to each individual headset.
*/
@@ -401,6 +393,7 @@ var/global/list/default_medbay_channels = list(
// Identity-associated tags:
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"race" = signal.get_race(M),
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
@@ -462,6 +455,7 @@ var/global/list/default_medbay_channels = list(
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"race" = signal.get_race(M), // text to show next to mob in comms log console
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
@@ -532,19 +526,15 @@ var/global/list/default_medbay_channels = list(
// what the range is in which mobs will hear the radio
// returns: -1 if can't receive, range otherwise
if(!wires || wires.IsIndexCut(WIRE_RECEIVE))
return -1
if(!listening)
if(!is_listening())
return -1
if(!(0 in level))
var/turf/position = get_turf(src)
if(!position || !(position.z in level))
return -1
if(freq in ANTAG_FREQS)
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
if(!(syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
return -1
if(!on)
return -1
if(!freq) //recieved on main frequency
if(!listening)
return -1
@@ -561,19 +551,34 @@ var/global/list/default_medbay_channels = list(
return canhear_range
/obj/item/device/radio/proc/send_hear(freq, level)
var/range = receive_range(freq, level)
if(range > -1)
return get_mobs_in_view(canhear_range, src)
/obj/item/device/radio/proc/is_listening()
var/is_listening = TRUE
if(!on)
is_listening = FALSE
if(!wires || wires.IsIndexCut(WIRE_RECEIVE))
is_listening = FALSE
if(!listening)
is_listening = FALSE
return is_listening
/obj/item/device/radio/proc/send_announcement()
if(is_listening())
return get_mobs_in_view(canhear_range, src)
return null
/obj/item/device/radio/examine(mob/user, var/distance = -1)
. = ..(user, distance)
if((in_range(src, user) || loc == user))
if(b_stat)
user.show_message("\blue \the [src] can be attached and modified!")
user.show_message("<span class='notice'>\the [src] can be attached and modified!</span>")
else
user.show_message("\blue \the [src] can not be modified or attached!")
user.show_message("<span class='notice'>\the [src] can not be modified or attached!</span>")
return .
/obj/item/device/radio/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
@@ -584,9 +589,9 @@ var/global/list/default_medbay_channels = list(
b_stat = !( b_stat )
if(!istype(src, /obj/item/device/radio/beacon))
if(b_stat)
user.show_message("\blue The radio can now be attached and modified!")
user.show_message("<span class='notice'>The radio can now be attached and modified!</span>")
else
user.show_message("\blue The radio can no longer be modified or attached!")
user.show_message("<span class='notice'>The radio can no longer be modified or attached!</span>")
updateDialog()
//Foreach goto(83)
add_fingerprint(user)
@@ -594,12 +599,20 @@ var/global/list/default_medbay_channels = list(
else return
/obj/item/device/radio/emp_act(severity)
frequency = get_random_freq()
if(listening == 1)
visible_message("<span class='warning'>\The [src] screeches violently!</span>")
broadcasting = 0
listening = 0
for(var/ch_name in channels)
channels[ch_name] = 0
..()
/obj/item/device/radio/proc/get_random_freq()
var/rand_freq = round(rand(1440, 1480), 10) + pick(1, 3, 5, 9)
return rand_freq
///////////////////////////////
//////////Borg Radios//////////
///////////////////////////////
+110 -53
View File
@@ -14,7 +14,7 @@ REAGENT SCANNER
icon_state = "t-ray0"
var/on = 0
slot_flags = SLOT_BELT
w_class = 2
w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
materials = list(MAT_METAL=150)
origin_tech = "magnets=1;engineering=1"
@@ -117,7 +117,7 @@ REAGENT SCANNER
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 5
throw_range = 10
materials = list(MAT_METAL=200)
@@ -128,24 +128,24 @@ REAGENT SCANNER
/obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))
to_chat(user, text("\red You try to analyze the floor's vitals!"))
to_chat(user, text("<span class='warning'>You try to analyze the floor's vitals!</span>"))
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1)
user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1)
user.show_message(text("\blue \t Damage Specifics: [0]-[0]-[0]-[0]"), 1)
user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
user.show_message("\blue Body Temperature: ???", 1)
O.show_message(text("<span class='warning'>[user] has analyzed the floor's vitals!</span>"), 1)
user.show_message(text("<span class='notice'>Analyzing Results for The floor:\n\t Overall Status: Healthy</span>"), 1)
user.show_message(text("<span class='notice'>\t Damage Specifics: [0]-[0]-[0]-[0]</span>"), 1)
user.show_message("<span class='notice'>Key: Suffocation/Toxin/Burns/Brute</span>", 1)
user.show_message("<span class='notice'>Body Temperature: ???</span>", 1)
return
user.visible_message("<span class='notice'>[user] has analyzed [M]'s vitals.</span>","<span class='notice'> You have analyzed [M]'s vitals.</span>")
if(!istype(M,/mob/living/carbon/human) || M.isSynthetic())
//these sensors are designed for organic life
user.show_message("\blue Analyzing Results for ERROR:\n\t Overall Status: ERROR")
user.show_message("<span class='notice'>Analyzing Results for ERROR:\n\t Overall Status: ERROR</span>")
user.show_message("\t Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font>", 1)
user.show_message("\t Damage Specifics: <font color='blue'>?</font> - <font color='green'>?</font> - <font color='#FFA500'>?</font> - <font color='red'>?</font>")
user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)", 1)
user.show_message("\red <b>Warning: Blood Level ERROR: --% --cl.\blue Type: ERROR")
user.show_message("\blue Subject's pulse: <font color='red'>-- bpm.</font>")
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)</span>", 1)
user.show_message("<span class='warning'><b>Warning: Blood Level ERROR: --% --cl.</span><span class='notice'>Type: ERROR</span>")
user.show_message("<span class='notice'>Subject's pulse: <font color='red'>-- bpm.</font></span>")
return
var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss())))
@@ -155,34 +155,34 @@ REAGENT SCANNER
var/BR = M.getBruteLoss() > 50 ? "<b>[M.getBruteLoss()]</b>" : M.getBruteLoss()
if(M.status_flags & FAKEDEATH)
OX = fake_oxy > 50 ? "<b>[fake_oxy]</b>" : fake_oxy
user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: dead")
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: dead</span>")
else
user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health]% healthy"]")
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health]% healthy"]</span>")
user.show_message("\t Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font>", 1)
user.show_message("\t Damage Specifics: <font color='blue'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)", 1)
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)</span>", 1)
if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
user.show_message("\blue Time of Death: [worldtime2text(M.timeofdeath)]")
user.show_message("<span class='notice'>Time of Death: [worldtime2text(M.timeofdeath)]</span>")
if(istype(M, /mob/living/carbon/human) && mode == 1)
var/mob/living/carbon/human/H = M
var/list/damaged = H.get_damaged_organs(1,1)
user.show_message("\blue Localized Damage, Brute/Burn:",1)
user.show_message("<span class='notice'>Localized Damage, Brute/Burn:</span>",1)
if(length(damaged)>0)
for(var/obj/item/organ/external/org in damaged)
user.show_message(text("\blue \t []: [][]\blue - []", \
user.show_message(text("<span class='notice'>\t []: [][] - []</span>", \
capitalize(org.name), \
(org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
(org.brute_dam > 0) ? "<span class='warning'>[org.brute_dam]</span>" :0, \
(org.status & ORGAN_BLEEDING)?"<span class='danger'>\[Bleeding\]</span>":"\t", \
(org.burn_dam > 0) ? "<font color='#FFA500'>[org.burn_dam]</font>" :0),1)
else
user.show_message("\blue \t Limbs are OK.",1)
user.show_message("<span class='notice'>\t Limbs are OK.</span>",1)
OX = M.getOxyLoss() > 50 ? "<font color='blue'><b>Severe oxygen deprivation detected</b></font>" : "Subject bloodstream oxygen level normal"
TX = M.getToxLoss() > 50 ? "<font color='green'><b>Dangerous amount of toxins detected</b></font>" : "Subject bloodstream toxin level minimal"
BU = M.getFireLoss() > 50 ? "<font color='#FFA500'><b>Severe burn damage detected</b></font>" : "Subject burn injury status O.K"
BR = M.getBruteLoss() > 50 ? "<font color='red'><b>Severe anatomical damage detected</b></font>" : "Subject brute-force injury status O.K"
if(M.status_flags & FAKEDEATH)
OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal"
OX = fake_oxy > 50 ? "<span class='danger'>Severe oxygen deprivation detected</span>" : "<span class='notice'>Subject bloodstream oxygen level normal</span>"
user.show_message("[OX] | [TX] | [BU] | [BR]")
if(istype(M, /mob/living/carbon))
if(upgraded)
@@ -195,36 +195,36 @@ REAGENT SCANNER
if(M.getCloneLoss())
user.show_message("<span class='warning'>Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.</span>")
if(M.has_brain_worms())
user.show_message("\red Subject suffering from aberrant brain activity. Recommend further scanning.")
user.show_message("<span class='warning'>Subject suffering from aberrant brain activity. Recommend further scanning.</span>")
else if(M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain))
user.show_message("\red Subject is brain dead.")
user.show_message("<span class='warning'>Subject is brain dead.</span>")
else if(M.getBrainLoss() >= 60)
user.show_message("\red Severe brain damage detected. Subject likely to have mental retardation.")
user.show_message("<span class='warning'>Severe brain damage detected. Subject likely to have mental retardation.</span>")
else if(M.getBrainLoss() >= 10)
user.show_message("\red Significant brain damage detected. Subject may have had a concussion.")
user.show_message("<span class='warning'>Significant brain damage detected. Subject may have had a concussion.</span>")
if(ishuman(M))
var/mob/living/carbon/human/H = M
for(var/name in H.organs_by_name)
var/obj/item/organ/external/e = H.organs_by_name[name]
for(var/name in H.bodyparts_by_name)
var/obj/item/organ/external/e = H.bodyparts_by_name[name]
if(!e)
continue
var/limb = e.name
if(e.status & ORGAN_BROKEN)
if((e.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")) && !(e.status & ORGAN_SPLINTED))
user.show_message("\red Unsecured fracture in subject [limb]. Splinting recommended for transport.")
user.show_message("<span class='warning'>Unsecured fracture in subject [limb]. Splinting recommended for transport.</span>")
if(e.has_infected_wound())
user.show_message("\red Infected wound detected in subject [limb]. Disinfection recommended.")
user.show_message("<span class='warning'>Infected wound detected in subject [limb]. Disinfection recommended.</span>")
for(var/name in H.organs_by_name)
var/obj/item/organ/external/e = H.organs_by_name[name]
for(var/name in H.bodyparts_by_name)
var/obj/item/organ/external/e = H.bodyparts_by_name[name]
if(!e)
continue
if(e.status & ORGAN_BROKEN)
user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1)
user.show_message(text("<span class='warning'>Bone fractures detected. Advanced scanner required for location.</span>"), 1)
break
for(var/obj/item/organ/external/e in H.organs)
for(var/obj/item/organ/external/e in H.bodyparts)
for(var/datum/wound/W in e.wounds) if(W.internal)
user.show_message(text("\red Internal bleeding detected. Advanced scanner required for location."), 1)
user.show_message(text("<span class='warning'>Internal bleeding detected. Advanced scanner required for location.</span>"), 1)
break
if(H.vessel)
var/blood_type = H.get_blood_name()
@@ -232,17 +232,17 @@ REAGENT SCANNER
var/blood_percent = blood_volume / BLOOD_VOLUME_NORMAL
blood_percent *= 100
if(blood_volume <= 500)
user.show_message("\red <b>Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl")
user.show_message("<span class='warning'><b>Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl</span>")
else if(blood_volume <= 336)
user.show_message("\red <b>Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl")
user.show_message("<span class='warning'><b>Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl</span>")
else
user.show_message("\blue Blood Level Normal: [blood_percent]% [blood_volume]cl")
user.show_message("<span class='notice'>Blood Level Normal: [blood_percent]% [blood_volume]cl</span>")
if(H.species.exotic_blood)
user.show_message("<span class='warning'>Subject possesses exotic blood.</span>")
user.show_message("<span class='warning'>Exotic blood type: [blood_type].</span>")
if(H.heart_attack && H.stat != DEAD)
if(H.undergoing_cardiac_arrest() && H.stat != DEAD)
user.show_message("<span class='userdanger'>Subject suffering from heart attack: Apply defibrillator immediately.</span>")
user.show_message("\blue Subject's pulse: <font color='[H.pulse == PULSE_THREADY || H.pulse == PULSE_NONE ? "red" : "blue"]'>[H.get_pulse(GETPULSE_TOOL)] bpm.</font>")
user.show_message("<span class='notice'>Subject's pulse: <font color='[H.pulse == PULSE_THREADY || H.pulse == PULSE_NONE ? "red" : "blue"]'>[H.get_pulse(GETPULSE_TOOL)] bpm.</font></span>")
var/implant_detect
for(var/obj/item/organ/internal/cyberimp/CI in H.internal_organs)
if(CI.status == ORGAN_ROBOT)
@@ -253,7 +253,7 @@ REAGENT SCANNER
if(H.gene_stability < 40)
user.show_message("<span class='userdanger'>Subject's genes are quickly breaking down!</span>")
else if(H.gene_stability < 70)
user.show_message("<span class='danger'>Subject's genes are showing signs of spontenous breakdown.</span>")
user.show_message("<span class='danger'>Subject's genes are showing signs of spontaneous breakdown.</span>")
else if(H.gene_stability < 85)
user.show_message("<span class='warning'>Subject's genes are showing minor signs of instability.</span>")
else
@@ -279,7 +279,7 @@ REAGENT SCANNER
else
to_chat(user, "<span class='notice'>You install the upgrade in the [src].</span>")
overlays += "advanced"
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
playsound(loc, W.usesound, 50, 1)
upgraded = 1
qdel(W)
@@ -294,15 +294,16 @@ REAGENT SCANNER
name = "Health Analyzer Upgrade"
icon_state = "healthupgrade"
desc = "An upgrade unit that can be installed on a health analyzer for expanded functionality."
w_class = 1
w_class = WEIGHT_CLASS_TINY
origin_tech = "magnets=2;biotech=2"
usesound = 'sound/items/Deconstruct.ogg'
/obj/item/device/analyzer
desc = "A hand-held environmental scanner which reports current gas levels."
name = "analyzer"
icon_state = "atmos"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 0
@@ -368,7 +369,7 @@ REAGENT SCANNER
name = "mass-spectrometer"
icon_state = "spectrometer"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT | OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 5
@@ -378,6 +379,9 @@ REAGENT SCANNER
origin_tech = "magnets=2;biotech=2"
var/details = 0
var/recent_fail = 0
var/datatoprint = ""
var/scanning = 1
actions_types = list(/datum/action/item_action/print_report)
/obj/item/device/mass_spectrometer/New()
..()
@@ -408,13 +412,13 @@ REAGENT SCANNER
else
blood_traces = params2list(R.data["trace_chem"])
break
var/dat = "Trace Chemicals Found: "
var/dat = ""
for(var/R in blood_traces)
if(prob(reliability))
if(details)
dat += "[R] ([blood_traces[R]] units) "
else
dat += "[R] "
dat += "[R] <br>"
recent_fail = 0
else
if(recent_fail)
@@ -423,8 +427,14 @@ REAGENT SCANNER
return
else
recent_fail = 1
to_chat(user, "[dat]")
reagents.clear_reagents()
if(dat)
to_chat(user, "Trace chemicals detected in blood sample: [dat]")
datatoprint = dat
scanning = 0
reagents.clear_reagents()
else
reagents.clear_reagents()
to_chat(user, "<span class='notice'>No trace chemicals detected in blood sample.</span>")
return
/obj/item/device/mass_spectrometer/adv
@@ -433,12 +443,34 @@ REAGENT SCANNER
details = 1
origin_tech = "magnets=4;biotech=2"
/obj/item/device/mass_spectrometer/proc/print_report()
if(!scanning)
usr.visible_message("<span class='warning'>[src] rattles and prints out a sheet of paper.</span>")
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(50)
var/obj/item/weapon/paper/P = new(get_turf(src))
P.name = "Mass Spectrometer Scanner Report: [worldtime2text()]"
P.info = "<center><b>Mass Spectrometer</b></center><br><center>Data Analysis:</center><br><hr><br><b>Trace chemicals detected:</b><br>[datatoprint]<br><hr>"
if(ismob(loc))
var/mob/M = loc
M.put_in_hands(P)
to_chat(M, "<span class='notice'>Report printed. Log cleared.<span>")
datatoprint = ""
scanning = 1
else
to_chat(usr, "<span class='notice'>[src] has no logs or is already in use.</span>")
/obj/item/device/mass_spectrometer/ui_action_click()
print_report()
/obj/item/device/reagent_scanner
name = "reagent scanner"
desc = "A hand-held reagent scanner which identifies chemical agents."
icon_state = "spectrometer"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 5
@@ -448,6 +480,9 @@ REAGENT SCANNER
origin_tech = "magnets=2;biotech=2"
var/details = 0
var/recent_fail = 0
var/datatoprint = ""
var/scanning = 1
actions_types = list(/datum/action/item_action/print_report)
/obj/item/device/reagent_scanner/afterattack(obj/O, mob/user as mob)
if(user.stat)
@@ -460,7 +495,6 @@ REAGENT SCANNER
if(crit_fail)
to_chat(user, "<span class='warning'>This device has critically failed and is no longer functional!</span>")
return
if(!isnull(O.reagents))
var/dat = ""
if(O.reagents.reagent_list.len > 0)
@@ -477,11 +511,12 @@ REAGENT SCANNER
recent_fail = 1
if(dat)
to_chat(user, "<span class='notice'>Chemicals found: [dat]</span>")
datatoprint = dat
scanning = 0
else
to_chat(user, "<span class='notice'>No active chemical agents found in [O].</span>")
else
to_chat(user, "<span class='notice'>No significant chemical agents found in [O].</span>")
return
/obj/item/device/reagent_scanner/adv
@@ -490,12 +525,34 @@ REAGENT SCANNER
details = 1
origin_tech = "magnets=4;biotech=2"
/obj/item/device/reagent_scanner/proc/print_report()
if(!scanning)
usr.visible_message("<span class='warning'>[src] rattles and prints out a sheet of paper.</span>")
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(50)
var/obj/item/weapon/paper/P = new(get_turf(src))
P.name = "Reagent Scanner Report: [worldtime2text()]"
P.info = "<center><b>Reagent Scanner</b></center><br><center>Data Analysis:</center><br><hr><br><b>Chemical agents detected:</b><br> [datatoprint]<br><hr>"
if(ismob(loc))
var/mob/M = loc
M.put_in_hands(P)
to_chat(M, "<span class='notice'>Report printed. Log cleared.<span>")
datatoprint = ""
scanning = 1
else
to_chat(usr, "<span class='notice'>[src] has no logs or is already in use.</span>")
/obj/item/device/reagent_scanner/ui_action_click()
print_report()
/obj/item/device/slime_scanner
name = "slime scanner"
icon_state = "adv_spectrometer_s"
item_state = "analyzer"
origin_tech = "biotech=1"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
throwforce = 0
throw_speed = 3
@@ -530,5 +587,5 @@ REAGENT SCANNER
user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]", 1)
user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1)
if(T.cores > 1)
user.show_message("Anomalious slime core amount detected", 1)
user.show_message("Anomalous slime core amount detected", 1)
user.show_message("Growth progress: [T.amount_grown]/10", 1)
@@ -3,7 +3,7 @@
desc = "A miniature machine that tracks suit sensors across the station."
icon = 'icons/obj/device.dmi'
icon_state = "scanner"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "biotech=3;materials=3;magnets=3"
var/datum/nano_module/crew_monitor/crew_monitor
@@ -12,12 +12,11 @@
crew_monitor = new(src)
/obj/item/device/sensor_device/Destroy()
qdel(crew_monitor)
crew_monitor = null
QDEL_NULL(crew_monitor)
return ..()
/obj/item/device/sensor_device/attack_self(mob/user as mob)
ui_interact(user)
/obj/item/device/sensor_device/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
crew_monitor.ui_interact(user, ui_key, ui, force_open)
crew_monitor.ui_interact(user, ui_key, ui, force_open)
+10 -14
View File
@@ -3,7 +3,7 @@
desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback."
icon_state = "taperecorder_empty"
item_state = "analyzer"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
materials = list(MAT_METAL=60, MAT_GLASS=30)
force = 2
@@ -21,9 +21,7 @@
update_icon()
/obj/item/device/taperecorder/Destroy()
if(mytape)
qdel(mytape)
mytape = null
QDEL_NULL(mytape)
return ..()
/obj/item/device/taperecorder/examine(mob/user)
@@ -157,8 +155,7 @@
return
else if(playing)
playing = 0
var/turf/T = get_turf(src)
T.visible_message("<font color=Maroon><B>Tape Recorder</B>: Playback stopped.</font>")
atom_say("Playback stopped.")
update_icon()
@@ -187,19 +184,18 @@
break
if(mytape.storedinfo.len < i)
break
var/turf/T = get_turf(src)
T.visible_message("<font color=Maroon><B>Tape Recorder</B>: [mytape.storedinfo[i]]</font>")
atom_say("[mytape.storedinfo[i]]")
if(mytape.storedinfo.len < i + 1)
playsleepseconds = 1
sleep(10)
T = get_turf(src)
T.visible_message("<font color=Maroon><B>Tape Recorder</B>: End of recording.</font>")
atom_say("End of recording.")
else
playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i]
if(playsleepseconds > 14)
sleep(10)
T = get_turf(src)
T.visible_message("<font color=Maroon><B>Tape Recorder</B>: Skipping [playsleepseconds] seconds of silence</font>")
atom_say("Skipping [playsleepseconds] seconds of silence.")
playsleepseconds = 1
i++
@@ -231,7 +227,7 @@
return
to_chat(usr, "<span class='notice'>Transcript printed.</span>")
playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
var/t1 = "<B>Transcript:</B><BR><BR>"
for(var/i = 1, mytape.storedinfo.len >= i, i++)
@@ -253,7 +249,7 @@
desc = "A magnetic tape that can hold up to ten minutes of content."
icon_state = "tape_white"
item_state = "analyzer"
w_class = 1
w_class = WEIGHT_CLASS_TINY
materials = list(MAT_METAL=20, MAT_GLASS=5)
force = 1
throwforce = 0
@@ -303,7 +299,7 @@
/obj/item/device/tape/attackby(obj/item/I, mob/user)
if(ruined && istype(I, /obj/item/weapon/screwdriver))
to_chat(user, "<span class='notice'>You start winding the tape back in.</span>")
if(do_after(user, 120, target = src))
if(do_after(user, 120 * I.toolspeed, target = src))
to_chat(user, "<span class='notice'>You wound the tape back in!</span>")
fix()
else if(istype(I, /obj/item/weapon/pen))
@@ -316,4 +312,4 @@
//Random colour tapes
/obj/item/device/tape/random/New()
icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
@@ -19,7 +19,7 @@ effective or pretty fucking useless.
desc = "A strange device with twin antennas."
icon_state = "batterer"
throwforce = 5
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 4
throw_range = 10
flags = CONDUCT
@@ -79,7 +79,7 @@ effective or pretty fucking useless.
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=400)
@@ -2,94 +2,93 @@
icon = 'icons/obj/assemblies.dmi'
name = "tank transfer valve"
icon_state = "valve_1"
item_state = "ttv"
desc = "Regulates the transfer of air between two tanks"
var/obj/item/weapon/tank/tank_one
var/obj/item/weapon/tank/tank_two
var/obj/item/device/attached_device
var/mob/attacher = null
var/obj/item/weapon/tank/tank_one = null
var/obj/item/weapon/tank/tank_two = null
var/obj/item/device/assembly/attached_device = null
var/mob/living/attacher = null
var/valve_open = 0
var/toggle = 1
origin_tech = "materials=1;engineering=1"
/obj/item/device/transfer_valve/Destroy()
if(tank_one)
qdel(tank_one)
tank_one = null
if(tank_two)
qdel(tank_two)
tank_two = null
if(attached_device)
qdel(attached_device)
attached_device = null
QDEL_NULL(tank_one)
QDEL_NULL(tank_two)
QDEL_NULL(attached_device)
attacher = null
return ..()
/obj/item/device/transfer_valve/proc/process_activation(var/obj/item/device/D)
/obj/item/device/transfer_valve/IsAssemblyHolder()
return 1
/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params)
if(istype(item, /obj/item/weapon/tank))
/obj/item/device/transfer_valve/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/tank))
if(tank_one && tank_two)
to_chat(user, "<span class='warning'>There are already two tanks attached, remove one first.</span>")
return
if(!tank_one)
tank_one = item
user.drop_item()
item.loc = src
if(!user.unEquip(I))
return
tank_one = I
I.forceMove(src)
to_chat(user, "<span class='notice'>You attach the tank to the transfer valve.</span>")
if(I.w_class > w_class)
w_class = I.w_class
else if(!tank_two)
tank_two = item
user.drop_item()
item.loc = src
if(!user.unEquip(I))
return
tank_two = I
I.forceMove(src)
to_chat(user, "<span class='notice'>You attach the tank to the transfer valve.</span>")
if(I.w_class > w_class)
w_class = I.w_class
update_icon()
nanomanager.update_uis(src) // update all UIs attached to src
//TODO: Have this take an assemblyholder
else if(isassembly(item))
var/obj/item/device/assembly/A = item
else if(isassembly(I))
var/obj/item/device/assembly/A = I
if(A.secured)
to_chat(user, "<span class='notice'>The device is secured.</span>")
return
if(attached_device)
to_chat(user, "<span class='warning'>There is already a device attached to the valve, remove it first.</span>")
return
user.remove_from_mob(item)
user.remove_from_mob(A)
attached_device = A
A.loc = src
to_chat(user, "<span class='notice'>You attach the [item] to the valve controls and secure it.</span>")
A.forceMove(src)
to_chat(user, "<span class='notice'>You attach the [A] to the valve controls and secure it.</span>")
A.holder = src
A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
bombers += "[key_name(user)] attached a [item] to a transfer valve."
msg_admin_attack("[key_name_admin(user)]attached [item] to a transfer valve.")
log_game("[key_name_admin(user)] attached [item] to a transfer valve.")
bombers += "[key_name(user)] attached a [A] to a transfer valve."
msg_admin_attack("[key_name_admin(user)]attached [A] to a transfer valve.")
log_game("[key_name_admin(user)] attached [A] to a transfer valve.")
attacher = user
nanomanager.update_uis(src) // update all UIs attached to src
return
/obj/item/device/transfer_valve/HasProximity(atom/movable/AM as mob|obj)
if(!attached_device) return
/obj/item/device/transfer_valve/HasProximity(atom/movable/AM)
if(!attached_device)
return
attached_device.HasProximity(AM)
return
/obj/item/device/transfer_valve/hear_talk(mob/living/M as mob, msg)
/obj/item/device/transfer_valve/hear_talk(mob/living/M, msg)
..()
for(var/obj/O in contents)
O.hear_talk(M, msg)
/obj/item/device/transfer_valve/hear_message(mob/living/M as mob, msg)
/obj/item/device/transfer_valve/hear_message(mob/living/M, msg)
..()
for(var/obj/O in contents)
O.hear_message(M, msg)
/obj/item/device/transfer_valve/attack_self(mob/user as mob)
/obj/item/device/transfer_valve/attack_self(mob/user)
ui_interact(user)
/obj/item/device/transfer_valve/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
/obj/item/device/transfer_valve/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -113,36 +112,40 @@
/obj/item/device/transfer_valve/Topic(href, href_list)
..()
if( usr.stat || usr.restrained() )
if(usr.incapacitated())
return 0
if(src.loc != usr)
if(loc != usr)
return 0
if(tank_one && href_list["tankone"])
split_gases()
valve_open = 0
tank_one.loc = get_turf(src)
tank_one.forceMove(get_turf(src))
tank_one = null
update_icon()
if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
w_class = WEIGHT_CLASS_NORMAL
else if(tank_two && href_list["tanktwo"])
split_gases()
valve_open = 0
tank_two.loc = get_turf(src)
tank_two.forceMove(get_turf(src))
tank_two = null
update_icon()
if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
w_class = WEIGHT_CLASS_NORMAL
else if(href_list["open"])
toggle_valve()
else if(attached_device)
if(href_list["rem_device"])
attached_device.loc = get_turf(src)
attached_device:holder = null
attached_device.forceMove(get_turf(src))
attached_device.holder = null
attached_device = null
update_icon()
if(href_list["device"])
attached_device.attack_self(usr)
src.add_fingerprint(usr)
add_fingerprint(usr)
return 1 // Returning 1 sends an update to attached UIs
/obj/item/device/transfer_valve/process_activation(var/obj/item/device/D)
/obj/item/device/transfer_valve/proc/process_activation(obj/item/device/D)
if(toggle)
toggle = 0
toggle_valve()
@@ -188,7 +191,7 @@
*/
/obj/item/device/transfer_valve/proc/toggle_valve()
if(valve_open==0 && (tank_one && tank_two))
if(!valve_open && tank_one && tank_two)
valve_open = 1
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
@@ -206,17 +209,12 @@
log_game("Bomb valve opened at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) with [attached_device ? attached_device : "no device"], attached by [attacher_name]. Last touched by: [key_name(mob)]")
merge_gases()
spawn(20) // In case one tank bursts
for(var/i=0,i<5,i++)
src.update_icon()
for(var/i in 1 to 5)
update_icon()
sleep(10)
src.update_icon()
update_icon()
else if(valve_open==1 && (tank_one && tank_two))
else if(valve_open && tank_one && tank_two)
split_gases()
valve_open = 0
src.update_icon()
// this doesn't do anything but the timer etc. expects it to be here
// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
/obj/item/device/transfer_valve/proc/c_state()
return
update_icon()
+2 -6
View File
@@ -18,8 +18,7 @@
song.instrumentExt = "ogg"
/obj/item/device/violin/Destroy()
qdel(song)
song = null
QDEL_NULL(song)
return ..()
/obj/item/device/violin/initialize()
@@ -30,10 +29,7 @@
ui_interact(user)
/obj/item/device/violin/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
if(!isliving(user) || user.stat || user.restrained() || user.lying)
if(!isliving(user) || user.incapacitated())
return
song.ui_interact(user, ui_key, ui, force_open)
+2 -3
View File
@@ -3,7 +3,7 @@
desc = "Used by obese officers to save their breath for running."
icon_state = "voice0"
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
w_class = 1
w_class = WEIGHT_CLASS_TINY
flags = CONDUCT
var/spamcheck = 0
@@ -26,6 +26,5 @@
/obj/item/device/hailer/emag_act(user as mob)
if(!emagged)
to_chat(user, "\red You overload \the [src]'s voice synthesizer.")
to_chat(user, "<span class='warning'>You overload \the [src]'s voice synthesizer.</span>")
emagged = 1
+2 -2
View File
@@ -5,7 +5,7 @@
icon_state = "docs_generic"
item_state = "paper"
throwforce = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_range = 1
throw_speed = 1
layer = 4
@@ -26,4 +26,4 @@
/obj/item/documents/syndicate/blue
name = "'Blue' secret documents"
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Blue\"."
icon_state = "docs_blue"
icon_state = "docs_blue"
+5 -5
View File
@@ -1,6 +1,6 @@
/obj/item/flag
icon = 'icons/obj/flag.dmi'
w_class = 4
w_class = WEIGHT_CLASS_BULKY
burntime = 20
burn_state = FLAMMABLE
@@ -156,7 +156,7 @@
name = "Nar'Sie Cultist flag"
desc = "A flag proudly boasting the logo of the cultists, sworn enemies of NT."
icon_state = "cultflag"
//Chameleon
/obj/item/flag/chameleon
@@ -165,7 +165,7 @@
icon_state = "ntflag"
origin_tech = "materials=3;magnets=4;syndicate=4"
var/used = 0
/obj/item/flag/chameleon/attack_self(mob/user)
if(used)
return
@@ -190,7 +190,7 @@
icon_state = chosen_flag.icon_state
desc = chosen_flag.desc
used = 1
/obj/item/flag/chameleon/burn()
explosion(loc,1,2,4,4, flame_range = 4)
qdel(src)
qdel(src)
+3 -5
View File
@@ -5,16 +5,14 @@
item_state = "lgloves"
force = 0
throwforce = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
throw_range = 7
var/state
var/datum/gas_mixture/air_contents = null
/obj/item/latexballon/Destroy()
if(air_contents)
qdel(air_contents)
air_contents = null
QDEL_NULL(air_contents)
return ..()
/obj/item/latexballon/proc/blow(obj/item/weapon/tank/tank, mob/user)
@@ -62,4 +60,4 @@
blow(T, user)
return
if(is_sharp(W) || is_hot(W) || can_puncture(W))
burst()
burst()
+2 -2
View File
@@ -16,9 +16,9 @@
item_state = "beachball"
density = 0
anchored = 0
w_class = 1
w_class = WEIGHT_CLASS_TINY
force = 0.0
throwforce = 0.0
throw_speed = 1
throw_range = 20
flags = CONDUCT
flags = CONDUCT
@@ -3,6 +3,8 @@
desc = "Place it on a wall."
var/sheets_refunded = 2
var/list/mount_reqs = list() //can contain simfloor, nospace. Used in try_build to see if conditions are needed, then met
toolspeed = 1
usesound = 'sound/items/Deconstruct.ogg'
/obj/item/mounted/frame/attackby(obj/item/weapon/W, mob/user)
..()
+9 -11
View File
@@ -3,7 +3,7 @@
name = "tape roll"
icon = 'icons/policetape.dmi'
icon_state = "rollstart"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/turf/start
var/turf/end
var/tape_type = /obj/item/tape
@@ -66,13 +66,13 @@ var/list/tape_roll_applications = list()
/obj/item/taperoll/attack_self(mob/user as mob)
if(icon_state == "[icon_base]_start")
start = get_turf(src)
to_chat(usr, "\blue You place the first end of the [src].")
to_chat(usr, "<span class='notice'>You place the first end of the [src].</span>")
icon_state = "[icon_base]_stop"
else
icon_state = "[icon_base]_start"
end = get_turf(src)
if(start.y != end.y && start.x != end.x || start.z != end.z)
to_chat(usr, "\blue [src] can only be laid horizontally or vertically.")
to_chat(usr, "<span class='notice'>[src] can only be laid horizontally or vertically.</span>")
return
var/turf/cur = start
@@ -101,7 +101,7 @@ var/list/tape_roll_applications = list()
break
cur = get_step_towards(cur,end)
if(!can_place)
to_chat(usr, "\blue You can't run \the [src] through that!")
to_chat(usr, "<span class='notice'>You can't run \the [src] through that!</span>")
return
cur = start
@@ -115,7 +115,7 @@ var/list/tape_roll_applications = list()
P.icon_state = "[P.icon_base]_[dir]"
cur = get_step_towards(cur,end)
//is_blocked_turf(var/turf/T)
to_chat(usr, "\blue You finish placing the [src].")//Git Test
to_chat(usr, "<span class='notice'>You finish placing the [src].</span>")//Git Test
/obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity)
@@ -128,7 +128,7 @@ var/list/tape_roll_applications = list()
P.loc = locate(T.x,T.y,T.z)
P.icon_state = "[src.icon_base]_door"
P.layer = 3.2
to_chat(user, "\blue You finish placing the [src].")
to_chat(user, "<span class='notice'>You finish placing the [src].</span>")
if(istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor))
var/turf/F = A
@@ -147,11 +147,11 @@ var/list/tape_roll_applications = list()
tape_roll_applications[F] |= direction
return
/obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
/obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0)
if(!density) return 1
if(air_group || (height==0)) return 1
if(height==0) return 1
if((mover.pass_flags & PASSTABLE || istype(mover, /obj/effect/meteor) || mover.throwing == 1) )
if((mover.pass_flags & PASSTABLE || istype(mover, /obj/effect/meteor) || mover.throwing))
return 1
else if(ismob(mover) && allowed(mover))
return 1
@@ -201,5 +201,3 @@ var/list/tape_roll_applications = list()
qdel(src)
return
+1 -1
View File
@@ -263,7 +263,7 @@
/mob/living/simple_animal/hostile/creature,/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/hivebot,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/pirate)
visible_message("\red Something falls out of the [src]!")
visible_message("<span class='warning'>Something falls out of the [src]!</span>")
var/obj/item/weapon/grenade/clusterbuster/C = new(src.loc)
C.prime()
spawn(10)
+2 -2
View File
@@ -5,7 +5,7 @@
/obj/item/device/malf_upgrade
name = "combat software upgrade"
desc = "A highly illegal, highly dangerous upgrade for artificial intelligence units, granting them a variety of powers as well as the ability to hack APCs."
icon = 'icons/obj/cloning.dmi'
icon = 'icons/obj/module.dmi'
icon_state = "datadisk3"
@@ -26,7 +26,7 @@
/obj/item/device/surveillance_upgrade
name = "surveillance software upgrade"
desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
icon = 'icons/obj/cloning.dmi'
icon = 'icons/obj/module.dmi'
icon_state = "datadisk3"
/obj/item/device/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
+121 -97
View File
@@ -10,8 +10,7 @@
var/model_info
dir = SOUTH
/obj/item/robot_parts/New(var/newloc, var/model)
/obj/item/robot_parts/New(newloc, model)
..(newloc)
if(model_info && model)
model_info = model
@@ -57,9 +56,13 @@
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
icon_state = "chest"
part = list("groin","chest")
var/wires = 0.0
var/wired = FALSE
var/obj/item/weapon/stock_parts/cell/cell = null
/obj/item/robot_parts/chest/Destroy()
QDEL_NULL(cell)
return ..()
/obj/item/robot_parts/head
name = "head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
@@ -68,6 +71,11 @@
var/obj/item/device/flash/flash1 = null
var/obj/item/device/flash/flash2 = null
/obj/item/robot_parts/head/Destroy()
QDEL_NULL(flash1)
QDEL_NULL(flash2)
return ..()
/obj/item/robot_parts/robot_suit
name = "endoskeleton"
desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
@@ -88,91 +96,110 @@
/obj/item/robot_parts/robot_suit/New()
..()
src.updateicon()
updateicon()
/obj/item/robot_parts/robot_suit/Destroy()
QDEL_NULL(l_arm)
QDEL_NULL(r_arm)
QDEL_NULL(l_leg)
QDEL_NULL(r_leg)
QDEL_NULL(chest)
QDEL_NULL(head)
forced_ai = null
return ..()
/obj/item/robot_parts/robot_suit/proc/updateicon()
src.overlays.Cut()
if(src.l_arm)
src.overlays += "l_arm+o"
if(src.r_arm)
src.overlays += "r_arm+o"
if(src.chest)
src.overlays += "chest+o"
if(src.l_leg)
src.overlays += "l_leg+o"
if(src.r_leg)
src.overlays += "r_leg+o"
if(src.head)
src.overlays += "head+o"
overlays.Cut()
if(l_arm)
overlays += "l_arm+o"
if(r_arm)
overlays += "r_arm+o"
if(chest)
overlays += "chest+o"
if(l_leg)
overlays += "l_leg+o"
if(r_leg)
overlays += "r_leg+o"
if(head)
overlays += "head+o"
/obj/item/robot_parts/robot_suit/proc/check_completion()
if(src.l_arm && src.r_arm)
if(src.l_leg && src.r_leg)
if(src.chest && src.head)
if(l_arm && r_arm)
if(l_leg && r_leg)
if(chest && head)
feedback_inc("cyborg_frames_built",1)
return 1
return 0
/obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob, params)
/obj/item/robot_parts/robot_suit/attackby(obj/item/W, mob/user, params)
..()
if(istype(W, /obj/item/stack/sheet/metal) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
var/obj/item/stack/sheet/metal/M = W
var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly
B.loc = get_turf(src)
B.forceMove(get_turf(src))
to_chat(user, "You armed the robot frame")
W:use(1)
M.use(1)
if(user.get_inactive_hand()==src)
user.unEquip(src)
user.put_in_inactive_hand(B)
qdel(src)
if(istype(W, /obj/item/robot_parts/l_leg))
if(src.l_leg) return
if(l_leg)
return
user.drop_item()
W.loc = src
src.l_leg = W
src.updateicon()
W.forceMove(src)
l_leg = W
updateicon()
if(istype(W, /obj/item/robot_parts/r_leg))
if(src.r_leg) return
if(r_leg)
return
user.drop_item()
W.loc = src
src.r_leg = W
src.updateicon()
W.forceMove(src)
r_leg = W
updateicon()
if(istype(W, /obj/item/robot_parts/l_arm))
if(src.l_arm) return
if(l_arm)
return
user.drop_item()
W.loc = src
src.l_arm = W
src.updateicon()
W.forceMove(src)
l_arm = W
updateicon()
if(istype(W, /obj/item/robot_parts/r_arm))
if(src.r_arm) return
if(r_arm)
return
user.drop_item()
W.loc = src
src.r_arm = W
src.updateicon()
W.forceMove(src)
r_arm = W
updateicon()
if(istype(W, /obj/item/robot_parts/chest))
if(src.chest) return
if(W:wires && W:cell)
var/obj/item/robot_parts/chest/CH = W
if(chest)
return
if(CH.wired && CH.cell)
user.drop_item()
W.loc = src
src.chest = W
src.updateicon()
else if(!W:wires)
to_chat(user, "\blue You need to attach wires to it first!")
W.forceMove(src)
chest = W
updateicon()
else if(!CH.wired)
to_chat(user, "<span class='notice'>You need to attach wires to it first!</span>")
else
to_chat(user, "\blue You need to attach a cell to it first!")
to_chat(user, "<span class='notice'>You need to attach a cell to it first!</span>")
if(istype(W, /obj/item/robot_parts/head))
if(src.head) return
if(W:flash2 && W:flash1)
var/obj/item/robot_parts/head/HD = W
if(head)
return
if(HD.flash2 && HD.flash1)
user.drop_item()
W.loc = src
src.head = W
src.updateicon()
W.forceMove(src)
head = W
updateicon()
else
to_chat(user, "\blue You need to attach a flash to it first!")
to_chat(user, "<span class='notice'>You need to attach a flash to it first!</span>")
if(istype(W, /obj/item/device/multitool))
if(check_completion())
@@ -183,11 +210,11 @@
if(istype(W, /obj/item/device/mmi))
var/obj/item/device/mmi/M = W
if(check_completion())
if(!istype(loc,/turf))
to_chat(user, "\red You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise.")
if(!isturf(loc))
to_chat(user, "<span class='warning'>You can't put [M] in, the frame has to be standing on the ground to be perfectly precise.</span>")
return
if(!M.brainmob)
to_chat(user, "\red Sticking an empty [W] into the frame would sort of defeat the purpose.")
to_chat(user, "<span class='warning'>Sticking an empty [M] into the frame would sort of defeat the purpose.</span>")
return
if(!M.brainmob.key)
@@ -202,23 +229,24 @@
ghost_can_reenter = 1
break
if(!ghost_can_reenter)
to_chat(user, "<span class='notice'>\The [W] is completely unresponsive; there's no point.</span>")
to_chat(user, "<span class='notice'>[M] is completely unresponsive; there's no point.</span>")
return
if(M.brainmob.stat == DEAD)
to_chat(user, "\red Sticking a dead [W] into the frame would sort of defeat the purpose.")
to_chat(user, "<span class='warning'>Sticking a dead [M] into the frame would sort of defeat the purpose.</span>")
return
if(M.brainmob.mind in ticker.mode.head_revolutionaries)
to_chat(user, "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W].")
to_chat(user, "<span class='warning'>The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [M].</span>")
return
if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept"))
to_chat(user, "\red This [W] does not seem to fit.")
to_chat(user, "<span class='warning'>This [W] does not seem to fit.</span>")
return
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1)
if(!O) return
if(!O)
return
user.drop_item()
@@ -257,9 +285,9 @@
O.job = "Cyborg"
O.cell = chest.cell
chest.cell.loc = O
chest.cell.forceMove(O)
chest.cell = null
W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
M.forceMove(O) //Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
// Since we "magically" installed a cell, we also have to update the correct component.
if(O.cell)
var/datum/robot_component/cell_component = O.components["power cell"]
@@ -271,7 +299,8 @@
feedback_inc("cyborg_birth",1)
callHook("borgify", list(O))
src.loc = O
forceMove(O)
O.robot_suit = src
if(!locomotion)
O.lockcharge = 1
@@ -308,8 +337,8 @@
return
if(href_list["Name"])
var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", src.created_name),1)
if(!in_range(src, usr) && src.loc != usr)
var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", created_name),1)
if(!in_range(src, usr) && loc != usr)
return
if(new_name)
created_name = new_name
@@ -337,59 +366,54 @@
/obj/item/robot_parts/chest/attackby(obj/item/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/weapon/stock_parts/cell))
if(src.cell)
to_chat(user, "\blue You have already inserted a cell!")
if(cell)
to_chat(user, "<span class='notice'>You have already inserted a cell!</span>")
return
else
user.drop_item()
W.loc = src
src.cell = W
to_chat(user, "\blue You insert the cell!")
W.forceMove(src)
cell = W
to_chat(user, "<span class='notice'>You insert the cell!</span>")
if(istype(W, /obj/item/stack/cable_coil))
if(src.wires)
to_chat(user, "\blue You have already inserted wire!")
if(wired)
to_chat(user, "<span class='notice'>You have already inserted wire!</span>")
return
else
var/obj/item/stack/cable_coil/coil = W
coil.use(1)
src.wires = 1.0
to_chat(user, "\blue You insert the wire!")
wired = TRUE
to_chat(user, "<span class='notice'>You insert the wire!</span>")
return
/obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/device/flash))
if(istype(user,/mob/living/silicon/robot))
to_chat(user, "\red How do you propose to do that?")
to_chat(user, "<span class='warning'>How do you propose to do that?</span>")
return
else if(src.flash1 && src.flash2)
to_chat(user, "\blue You have already inserted the eyes!")
else if(flash1 && flash2)
to_chat(user, "<span class='notice'>You have already inserted the eyes!</span>")
return
else if(src.flash1)
else if(flash1)
user.drop_item()
W.loc = src
src.flash2 = W
to_chat(user, "\blue You insert the flash into the eye socket!")
W.forceMove(src)
flash2 = W
to_chat(user, "<span class='notice'>You insert the flash into the eye socket!</span>")
else
user.drop_item()
W.loc = src
src.flash1 = W
to_chat(user, "\blue You insert the flash into the eye socket!")
W.forceMove(src)
flash1 = W
to_chat(user, "<span class='notice'>You insert the flash into the eye socket!</span>")
else if(istype(W, /obj/item/weapon/stock_parts/manipulator))
to_chat(user, "\blue You install some manipulators and modify the head, creating a functional spider-bot!")
to_chat(user, "<span class='notice'>You install some manipulators and modify the head, creating a functional spider-bot!</span>")
new /mob/living/simple_animal/spiderbot(get_turf(loc))
user.drop_item()
qdel(W)
qdel(src)
return
return
/obj/item/robot_parts/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/weapon/card/emag))
if(sabotaged)
to_chat(user, "\red [src] is already sabotaged!")
else
to_chat(user, "\red You slide [W] into the dataport on [src] and short out the safeties.")
sabotaged = 1
return
..()
/obj/item/robot_parts/emag_act(user)
if(sabotaged)
to_chat(user, "<span class='warning'>[src] is already sabotaged!</span>")
else
to_chat(user, "<span class='warning'>You slide the emag into the dataport on [src] and short out the safeties.</span>")
sabotaged = 1
@@ -196,25 +196,6 @@
return 1
/obj/item/borg/upgrade/hyperka
name = "mining cyborg hyper-kinetic accelerator"
desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = /obj/item/weapon/robot_module/miner
/obj/item/borg/upgrade/hyperka/action(mob/living/silicon/robot/R)
if(..())
return
for(var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
qdel(H)
R.module.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg(R.module)
R.module.rebuild()
return 1
/obj/item/borg/upgrade/syndicate
name = "illegal equipment module"
desc = "Unlocks the hidden, deadlier functions of a cyborg"
+1 -1
View File
@@ -96,7 +96,7 @@
if(hp <= 0)
for(var/mob/O in oviewers())
if((O.client && !( O.blinded )))
to_chat(O, "\red [src] breaks into tiny pieces and collapses!")
to_chat(O, "<span class='warning'>[src] breaks into tiny pieces and collapses!</span>")
qdel(src)
// Create a temporary object to represent the damage
+10 -13
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/items.dmi'
amount = 6
max_amount = 6
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
var/heal_brute = 0
@@ -152,8 +152,6 @@
icon_state = "burnkit"
heal_burn = 25
//Medical Herbs//
@@ -161,8 +159,8 @@
name = "\improper Comfrey leaf"
singular_name = "Comfrey leaf"
desc = "A soft leaf that is rubbed on bruises."
icon = 'icons/obj/hydroponics_products.dmi'
icon_state = "alien3-product"
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "tea_aspera_leaves"
color = "#378C61"
heal_brute = 12
@@ -171,14 +169,13 @@
name = "\improper Aloe Vera leaf"
singular_name = "Aloe Vera leaf"
desc = "A cold leaf that is rubbed on burns."
icon = 'icons/obj/hydroponics_products.dmi'
icon_state = "ambrosia-product"
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "ambrosiavulgaris"
color = "#4CC5C7"
heal_burn = 12
//Splits//
//Splints//
/obj/item/stack/medical/splint
@@ -206,14 +203,14 @@
to_chat(user, "<span class='notice'>You remove the splint from [H]'s [limb].</span>")
return
if(M == user)
user.visible_message("<span class='notice'>[user] starts to apply [src] to [H]'s [limb].</span>", \
"<span class='notice'>You start to apply [src] to [H]'s [limb].</span>", \
user.visible_message("<span class='notice'>[user] starts to apply [src] to their [limb].</span>", \
"<span class='notice'>You start to apply [src] to your [limb].</span>", \
"<span class='notice'>You hear something being wrapped.</span>")
if(!do_mob(user, H, self_delay))
return
else
user.visible_message("<span class='green'>[user] applies [src] to their [limb].</span>", \
"<span class='green'>You apply [src] to your [limb].</span>", \
user.visible_message("<span class='green'>[user] applies [src] to [H]'s [limb].</span>", \
"<span class='green'>You apply [src] to [H]'s [limb].</span>", \
"<span class='green'>You hear something being wrapped.</span>")
affecting.status |= ORGAN_SPLINTED
+1 -1
View File
@@ -6,7 +6,7 @@
icon_state = "tube"
origin_tech = "materials=3;engineering=2"
amount = 10
toolspeed = 1
/obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob)
if(!istype(M) || !istype(user))
+15 -40
View File
@@ -1,3 +1,7 @@
var/global/list/datum/stack_recipe/rod_recipes = list ( \
new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/rods
name = "metal rod"
desc = "Some rods. Can be used for building, or something."
@@ -5,22 +9,24 @@
icon_state = "rods"
item_state = "rods"
flags = CONDUCT
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 9.0
throwforce = 10.0
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=1000)
max_amount = 60
max_amount = 50
attack_verb = list("hit", "bludgeoned", "whacked")
hitsound = 'sound/weapons/grenadelaunch.ogg'
toolspeed = 1
usesound = 'sound/items/Deconstruct.ogg'
/obj/item/stack/rods/cyborg
materials = list()
/obj/item/stack/rods/New(var/loc, var/amount=null)
/obj/item/stack/rods/New(loc, amount=null)
..()
recipes = rod_recipes
update_icon()
/obj/item/stack/rods/update_icon()
@@ -30,12 +36,12 @@
else
icon_state = "rods"
/obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob, params)
/obj/item/stack/rods/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(get_amount() < 2)
to_chat(user, "<span class='warning'>You need at least two rods to do this.</span>")
to_chat(user, "<span class='warning'>You need at least two rods to do this!</span>")
return
if(WT.remove_fuel(0,user))
@@ -45,9 +51,9 @@
// stack was moved into another one on the pile
new_item = locate() in user.loc
user.visible_message("<span class='warning'>[user.name] shaped [src] into metal with the weldingtool.</span>", \
"<span class='notice'>You shaped [src] into metal with the weldingtool.</span>", \
"<span class='warning'>You hear welding.</span>")
user.visible_message("[user.name] shape [src] into metal with the welding tool.", \
"<span class='notice'>You shape [src] into metal with the welding tool.</span>", \
"<span class='italics'>You hear welding.</span>")
var/replace = user.get_inactive_hand() == src
use(2)
@@ -57,34 +63,3 @@
user.put_in_hands(new_item)
return
..()
/obj/item/stack/rods/attack_self(mob/user as mob)
src.add_fingerprint(user)
if(!istype(user.loc,/turf)) return 0
if(locate(/obj/structure/grille, usr.loc))
for(var/obj/structure/grille/G in usr.loc)
if(G.destroyed)
G.health = 10
G.density = 1
G.destroyed = 0
G.icon_state = "grille"
use(1)
else
return 1
else
if(amount < 2)
to_chat(user, "\blue You need at least two rods to do this.")
return
to_chat(usr, "\blue Assembling grille...")
if(!do_after(usr, 10, target = user))
return
var /obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc )
to_chat(usr, "\blue You assemble a grille")
F.add_fingerprint(usr)
use(2)
return
@@ -22,6 +22,10 @@
origin_tech = "materials=1"
var/created_window = /obj/structure/window/basic
var/full_window = /obj/structure/window/full/basic
merge_type = /obj/item/stack/sheet/glass
/obj/item/stack/sheet/glass/fifty
amount = 50
/obj/item/stack/sheet/glass/cyborg
materials = list()
@@ -34,7 +38,7 @@
if(istype(W,/obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W
if(CC.amount < 5)
to_chat(user, "\b There is not enough wire in this coil. You need 5 lengths.")
to_chat(user, "<b>There is not enough wire in this coil. You need 5 lengths.</b>")
return
CC.use(5)
to_chat(user, "<span class='notice'>You attach wire to the [name].</span>")
@@ -152,6 +156,7 @@
origin_tech = "materials=2"
var/created_window = /obj/structure/window/reinforced
var/full_window = /obj/structure/window/full/reinforced
merge_type = /obj/item/stack/sheet/rglass
/obj/item/stack/sheet/rglass/cyborg
materials = list()
@@ -102,19 +102,49 @@ var/global/list/datum/stack_recipe/human_recipes = list( \
icon_state = "sheet-leather"
origin_tech = "materials=2"
/obj/item/stack/sheet/sinew
name = "watcher sinew"
icon = 'icons/obj/mining.dmi'
desc = "Long stringy filaments which presumably came from a watcher's wings."
singular_name = "watcher sinew"
icon_state = "sinew"
origin_tech = "biotech=4"
var/global/list/datum/stack_recipe/sinew_recipes = list ( \
new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \
)
/obj/item/stack/sheet/sinew/New(var/loc, var/amount=null)
recipes = sinew_recipes
return ..()
/obj/item/stack/sheet/animalhide/goliath_hide
name = "goliath hide plates"
desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
icon = 'icons/obj/mining.dmi'
icon_state = "goliath_hide"
singular_name = "hide plate"
flags = NOBLUDGEON
w_class = WEIGHT_CLASS_NORMAL
layer = MOB_LAYER
/obj/item/stack/sheet/animalhide/ashdrake
name = "ash drake hide"
desc = "The strong, scaled hide of an ash drake."
icon = 'icons/obj/mining.dmi'
icon_state = "dragon_hide"
singular_name = "drake plate"
flags = NOBLUDGEON
w_class = WEIGHT_CLASS_NORMAL
layer = MOB_LAYER
//Step one - dehairing.
/obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if( istype(W, /obj/item/weapon/kitchen/knife) || \
istype(W, /obj/item/weapon/twohanded/fireaxe) || \
istype(W, /obj/item/weapon/hatchet) )
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
usr.visible_message("\blue \the [usr] starts cutting hair off \the [src]", "\blue You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh")
if(do_after(user,50, target = src))
to_chat(usr, "\blue You cut the hair from this [src.singular_name]")
if(W.sharp)
user.visible_message("[user] starts cutting hair off \the [src].", "<span class='notice'>You start cutting the hair off \the [src]...</span>", "<span class='italics'>You hear the sound of a knife rubbing against flesh.</span>")
if(do_after(user, 50 * W.toolspeed, target = src))
to_chat(user, "<span class='notice'>You cut the hair from this [src.singular_name].</span>")
//Try locating an exisitng stack on the tile and add to there if possible
for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc)
if(HS.amount < 50)
@@ -128,7 +158,6 @@ var/global/list/datum/stack_recipe/human_recipes = list( \
else
..()
//Step two - washing..... it's actually in washing machine code.
//Step three - drying
@@ -148,4 +177,4 @@ var/global/list/datum/stack_recipe/human_recipes = list( \
var/obj/item/stack/sheet/leather/HS = new(src.loc)
HS.amount = 1
wetness = initial(wetness)
src.use(1)
src.use(1)
@@ -3,8 +3,9 @@
gender = PLURAL
singular_name = "wired glass floor tile"
desc = "A glass tile, which is wired, somehow."
icon = 'icons/obj/tiles.dmi'
icon_state = "glass_wire"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 3.0
throwforce = 5.0
throw_speed = 5
@@ -5,75 +5,106 @@ Mineral Sheets
- Diamond
- Uranium
- Plasma
- Plastic
- Gold
- Silver
- Bananium
- Tranqillite
- Enriched Uranium
- Platinum
- Metallic Hydrogen
- Tritium
- Osmium
*/
var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("Breakdown into sand", /obj/item/weapon/ore/glass, 1, one_per_turf = 0, on_floor = 1), \
)
var/global/list/datum/stack_recipe/silver_recipes = list ( \
new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20), \
null, \
new/datum/stack_recipe("Janitor Statue", /obj/structure/statue/silver/janitor, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Sec Officer Statue", /obj/structure/statue/silver/sec, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Sec Borg Statue", /obj/structure/statue/silver/secborg, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Med Doctor Statue", /obj/structure/statue/silver/md, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Med Borg Statue", /obj/structure/statue/silver/medborg, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/diamond_recipes = list ( \
new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20), \
null, \
new/datum/stack_recipe("Captain Statue", /obj/structure/statue/diamond/captain, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("AI Hologram Statue", /obj/structure/statue/diamond/ai1, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("AI Core Statue", /obj/structure/statue/diamond/ai2, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/uranium_recipes = list ( \
new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20), \
null, \
new/datum/stack_recipe("Nuke Statue", /obj/structure/statue/uranium/nuke, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Engineer Statue", /obj/structure/statue/uranium/eng, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/gold_recipes = list ( \
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20), \
null, \
new/datum/stack_recipe("HoS Statue", /obj/structure/statue/gold/hos, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("HoP Statue", /obj/structure/statue/gold/hop, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("CE Statue", /obj/structure/statue/gold/ce, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("RD Statue", /obj/structure/statue/gold/rd, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("CMO Statue", /obj/structure/statue/gold/cmo, 5, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/crown, 5), \
)
var/global/list/datum/stack_recipe/plasma_recipes = list ( \
new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/plastic_recipes = list ( \
new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("plastic fork", /obj/item/weapon/kitchen/utensil/pfork, 1, on_floor = 1), \
new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \
new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/knife/plastic, 1, on_floor = 1), \
new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \
new/datum/stack_recipe("bear mould", /obj/item/weapon/kitchen/mould/bear, 1, on_floor = 1), \
new/datum/stack_recipe("worm mould", /obj/item/weapon/kitchen/mould/worm, 1, on_floor = 1), \
new/datum/stack_recipe("bean mould", /obj/item/weapon/kitchen/mould/bean, 1, on_floor = 1), \
new/datum/stack_recipe("ball mould", /obj/item/weapon/kitchen/mould/ball, 1, on_floor = 1), \
new/datum/stack_recipe("cane mould", /obj/item/weapon/kitchen/mould/cane, 1, on_floor = 1), \
new/datum/stack_recipe("cash mould", /obj/item/weapon/kitchen/mould/cash, 1, on_floor = 1), \
new/datum/stack_recipe("coin mould", /obj/item/weapon/kitchen/mould/coin, 1, on_floor = 1), \
new/datum/stack_recipe("sucker mould", /obj/item/weapon/kitchen/mould/loli, 1, on_floor = 1), \
null, \
new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \
null, \
new/datum/stack_recipe("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Xenomorph Statue", /obj/structure/statue/plasma/xeno, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/bananium_recipes = list ( \
new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \
null, \
new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("bananium computer frame", /obj/structure/computerframe/HONKputer, 50, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("bananium grenade casing", /obj/item/weapon/grenade/bananade/casing, 4, on_floor = 1), \
)
var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
new/datum/stack_recipe("silent tile", /obj/item/stack/tile/silent, 1, 4, 20), \
new/datum/stack_recipe("invisible wall", /obj/structure/barricade/mime, 5, one_per_turf = 1, on_floor = 1, time = 50), \
null, \
new/datum/stack_recipe("silent tile", /obj/item/stack/tile/mineral/tranquillite, 1, 4, 20), \
null, \
new/datum/stack_recipe("Mime Statue", /obj/structure/statue/tranquillite/mime, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/abductor_recipes = list ( \
new/datum/stack_recipe("alien bed", /obj/structure/stool/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien table frame", /obj/structure/abductor_tableframe, 1, time = 15, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \
)
/obj/item/stack/sheet/mineral
force = 5.0
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
throw_range = 3
@@ -100,11 +131,11 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/diamond
name = "diamond"
icon_state = "sheet-diamond"
singular_name = "diamond"
origin_tech = "materials=6"
sheettype = "diamond"
materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT)
/obj/item/stack/sheet/mineral/diamond/New()
..()
recipes = diamond_recipes
@@ -112,6 +143,7 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/uranium
name = "uranium"
icon_state = "sheet-uranium"
singular_name = "uranium sheet"
origin_tech = "materials=5"
sheettype = "uranium"
materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT)
@@ -123,6 +155,7 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/plasma
name = "solid plasma"
icon_state = "sheet-plasma"
singular_name = "plasma sheet"
origin_tech = "plasmatech=2;materials=2"
sheettype = "plasma"
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT)
@@ -145,22 +178,10 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, amount*10)
qdel(src)
/obj/item/stack/sheet/mineral/plastic
name = "Plastic"
icon_state = "sheet-plastic"
origin_tech = "materials=3"
/obj/item/stack/sheet/mineral/plastic/New()
..()
recipes = plastic_recipes
/obj/item/stack/sheet/mineral/plastic/cyborg
name = "plastic sheets"
icon_state = "sheet-plastic"
/obj/item/stack/sheet/mineral/gold
name = "gold"
icon_state = "sheet-gold"
singular_name = "gold bar"
origin_tech = "materials=4"
sheettype = "gold"
materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT)
@@ -172,6 +193,7 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/silver
name = "silver"
icon_state = "sheet-silver"
singular_name = "silver bar"
origin_tech = "materials=3"
sheettype = "silver"
materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT)
@@ -183,23 +205,24 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/bananium
name = "bananium"
icon_state = "sheet-clown"
singular_name = "bananium sheet"
origin_tech = "materials=4"
sheettype = "bananium"
materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT)
/obj/item/stack/sheet/mineral/bananium/New(var/loc, var/amount=null)
/obj/item/stack/sheet/mineral/bananium/New(loc, amount=null)
..()
recipes = bananium_recipes
/obj/item/stack/sheet/mineral/tranquillite
name = "tranquillite"
singular_name = "beret"
icon_state = "sheet-mime"
singular_name = "beret"
origin_tech = "materials=4"
sheettype = "tranquillite"
materials = list(MAT_TRANQUILLITE=MINERAL_MATERIAL_AMOUNT)
/obj/item/stack/sheet/mineral/tranquillite/New(var/loc, var/amount=null)
/obj/item/stack/sheet/mineral/tranquillite/New(loc, amount=null)
..()
recipes = tranquillite_recipes
@@ -209,9 +232,7 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
origin_tech = "materials=6"
materials = list(MAT_URANIUM=3000)
/*
* Alien Alloy
*/
//Alien Alloy
/obj/item/stack/sheet/mineral/abductor
name = "alien alloy"
icon = 'icons/obj/abductor.dmi'
@@ -219,20 +240,12 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
singular_name = "alien alloy sheet"
force = 5
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 1
throw_range = 3
origin_tech = "materials=6;abductor=1"
sheettype = "abductor"
var/global/list/datum/stack_recipe/abductor_recipes = list ( \
new/datum/stack_recipe("alien bed", /obj/structure/stool/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien table frame", /obj/structure/abductor_tableframe, 1, time = 15, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \
)
/obj/item/stack/sheet/mineral/abductor/New(var/loc, var/amount=null)
/obj/item/stack/sheet/mineral/abductor/New(loc, amount=null)
recipes = abductor_recipes
..()
..()
@@ -4,7 +4,9 @@
* Plasteel
* Wood
* Cloth
* Plastic
* Cardboard
* Runed Metal (cult)
*/
/*
@@ -20,6 +22,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
new /datum/stack_recipe("barber chair", /obj/structure/stool/bed/chair/barber, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wheelchair", /obj/structure/stool/bed/chair/wheelchair, 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("psychiatrist bed", /obj/structure/stool/psychbed, 5, one_per_turf = 1, on_floor = 1),
null,
new /datum/stack_recipe_list("office chairs",list(
new /datum/stack_recipe("dark office chair", /obj/structure/stool/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1),
@@ -47,12 +50,14 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
new /datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1),
null,
new /datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20),
new /datum/stack_recipe/rods("metal rod", /obj/item/stack/rods, 1, 2, 60),
new /datum/stack_recipe/rods("metal rod", /obj/item/stack/rods, 1, 2, 50),
null,
new /datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = 1, on_floor = 1),
null,
new /datum/stack_recipe_list("airlock assemblies", list(
@@ -63,7 +68,6 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
new /datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1),
/* new /datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 50, one_per_turf = 1, on_floor = 1), */
new /datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1),
@@ -97,15 +101,19 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
throwforce = 10.0
flags = CONDUCT
origin_tech = "materials=1"
merge_type = /obj/item/stack/sheet/metal
/obj/item/stack/sheet/metal/cyborg
materials = list()
/obj/item/stack/sheet/metal/fifty
amount = 50
/obj/item/stack/sheet/metal/narsie_act()
if(prob(20))
new /obj/item/stack/sheet/runed_metal(loc, amount)
qdel(src)
/obj/item/stack/sheet/metal/cyborg
materials = list()
/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
recipes = metal_recipes
return ..()
@@ -130,6 +138,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list(
throwforce = 10.0
flags = CONDUCT
origin_tech = "materials=2"
merge_type = /obj/item/stack/sheet/plasteel
/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
recipes = plasteel_recipes
@@ -145,13 +154,17 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("wooden chair", /obj/structure/stool/bed/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("dresser", /obj/structure/dresser, 30, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("dog bed", /obj/structure/stool/bed/dogbed, 10, time = 10, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40),
new /datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wooden buckler", /obj/item/weapon/shield/riot/buckler, 20, time = 40),
new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),
new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10)
new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),
new /datum/stack_recipe("baseball bat", /obj/item/weapon/melee/baseball_bat, 5, time = 15)
)
/obj/item/stack/sheet/wood
@@ -162,6 +175,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
icon_state = "sheet-wood"
origin_tech = "materials=1;biotech=1"
burn_state = FLAMMABLE
merge_type = /obj/item/stack/sheet/wood
/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
recipes = wood_recipes
@@ -170,13 +184,43 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
/*
* Cloth
*/
var/global/list/datum/stack_recipe/cloth_recipes = list ( \
new/datum/stack_recipe("grey jumpsuit", /obj/item/clothing/under/color/grey, 3), \
new/datum/stack_recipe("black shoes", /obj/item/clothing/shoes/black, 2), \
null, \
new/datum/stack_recipe("backpack", /obj/item/weapon/storage/backpack, 4), \
new/datum/stack_recipe("dufflebag", /obj/item/weapon/storage/backpack/duffel, 6), \
null, \
new/datum/stack_recipe("plant bag", /obj/item/weapon/storage/bag/plants, 4), \
new/datum/stack_recipe("book bag", /obj/item/weapon/storage/bag/books, 4), \
new/datum/stack_recipe("mining satchel", /obj/item/weapon/storage/bag/ore, 4), \
new/datum/stack_recipe("chemistry bag", /obj/item/weapon/storage/bag/chemistry, 4), \
new/datum/stack_recipe("bio bag", /obj/item/weapon/storage/bag/bio, 4), \
null, \
new/datum/stack_recipe("rag", /obj/item/weapon/reagent_containers/glass/rag, 1), \
new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 3), \
null, \
new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \
new/datum/stack_recipe("black gloves", /obj/item/clothing/gloves/color/black, 3), \
)
/obj/item/stack/sheet/cloth
name = "cloth"
desc = "This roll of cloth is made from only the finest chemicals and bunny rabbits."
desc = "Is it cotton? Linen? Denim? Burlap? Canvas? You can't tell."
singular_name = "cloth roll"
icon_state = "sheet-cloth"
origin_tech = "materials=2"
burn_state = FLAMMABLE
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/cloth
/obj/item/stack/sheet/cloth/New(loc, amount=null)
recipes = cloth_recipes
..()
/obj/item/stack/sheet/cloth/ten
amount = 10
/*
* Cardboard
@@ -202,6 +246,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list (
icon_state = "sheet-card"
origin_tech = "materials=1"
burn_state = FLAMMABLE
merge_type = /obj/item/stack/sheet/cardboard
/obj/item/stack/sheet/cardboard/New(var/loc, var/amt = null)
recipes = cardboard_recipes
@@ -213,7 +258,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list (
var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
new/datum/stack_recipe("runed door", /obj/machinery/door/airlock/cult, 1, time = 50, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("runed girder", /obj/structure/cultgirder, 1, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("runed girder", /obj/structure/girder/cult, 1, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("pylon", /obj/structure/cult/functional/pylon, 3, time = 40, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("forge", /obj/structure/cult/functional/forge, 5, time = 40, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("archives", /obj/structure/cult/functional/tome, 2, time = 40, one_per_turf = 1, on_floor = 1), \
@@ -227,6 +272,7 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
icon_state = "sheet-runed"
icon = 'icons/obj/items.dmi'
sheettype = "runed"
merge_type = /obj/item/stack/sheet/runed_metal
/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user)
if(!iscultist(user))
@@ -240,3 +286,56 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
/obj/item/stack/sheet/runed_metal/New(var/loc, var/amount=null)
recipes = runed_metal_recipes
return ..()
/*
* Bones
*/
/obj/item/stack/sheet/bone
name = "bones"
icon = 'icons/obj/mining.dmi'
icon_state = "bone"
singular_name = "bone"
desc = "Someone's been drinking their milk."
force = 7
throwforce = 5
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 1
throw_range = 3
origin_tech = "materials=2;biotech=2"
var/global/list/datum/stack_recipe/plastic_recipes = list ( \
new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = 1, on_floor = 1, time = 40), \
new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("plastic fork", /obj/item/weapon/kitchen/utensil/pfork, 1, on_floor = 1), \
new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \
new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/knife/plastic, 1, on_floor = 1), \
new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \
new/datum/stack_recipe("bear mould", /obj/item/weapon/kitchen/mould/bear, 1, on_floor = 1), \
new/datum/stack_recipe("worm mould", /obj/item/weapon/kitchen/mould/worm, 1, on_floor = 1), \
new/datum/stack_recipe("bean mould", /obj/item/weapon/kitchen/mould/bean, 1, on_floor = 1), \
new/datum/stack_recipe("ball mould", /obj/item/weapon/kitchen/mould/ball, 1, on_floor = 1), \
new/datum/stack_recipe("cane mould", /obj/item/weapon/kitchen/mould/cane, 1, on_floor = 1), \
new/datum/stack_recipe("cash mould", /obj/item/weapon/kitchen/mould/cash, 1, on_floor = 1), \
new/datum/stack_recipe("coin mould", /obj/item/weapon/kitchen/mould/coin, 1, on_floor = 1), \
new/datum/stack_recipe("sucker mould", /obj/item/weapon/kitchen/mould/loli, 1, on_floor = 1), \
)
/obj/item/stack/sheet/plastic
name = "plastic"
desc = "Compress dinosaur over millions of years, then refine, split and mold, and voila! You have plastic."
singular_name = "plastic sheet"
icon_state = "sheet-plastic"
throwforce = 7
origin_tech = "materials=1;biotech=1"
merge_type = /obj/item/stack/sheet/plastic
/obj/item/stack/sheet/plastic/New()
recipes = plastic_recipes
. = ..()
/obj/item/stack/sheet/plastic/fifty
amount = 50
/obj/item/stack/sheet/plastic/five
amount = 5
@@ -1,6 +1,6 @@
/obj/item/stack/sheet
name = "sheet"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 5
throwforce = 5
max_amount = 50
@@ -9,6 +9,8 @@
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
var/perunit = MINERAL_MATERIAL_AMOUNT
var/sheettype = null //this is used for girders in the creation of walls/false walls
usesound = 'sound/items/Deconstruct.ogg'
toolspeed = 1
// Since the sheetsnatcher was consolidated into weapon/storage/bag we now use
@@ -22,4 +24,4 @@
else
for(var/obj/item/stack/sheet/stack in locate(src.x,src.y,src.z))
S.add(stack,user)
..()*/
..()*/
+4 -1
View File
@@ -14,11 +14,14 @@
var/singular_name
var/amount = 1
var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
var/merge_type = null // This path and its children should merge with this stack, defaults to src.type
/obj/item/stack/New(var/loc, var/amt = null)
..()
if(amt != null) //Allow for stacks with the amount=0
amount = amt
if(!merge_type)
merge_type = type
/obj/item/stack/Destroy()
if(usr && usr.machine == src)
@@ -232,7 +235,7 @@
/obj/item/stack/attackby(obj/item/W, mob/user, params)
..()
if(istype(W, type))
if(istype(W, merge_type))
var/obj/item/stack/S = W
if(S.amount >= max_amount)
return 1
@@ -5,7 +5,7 @@
singular_name = "telecrystal"
icon = 'icons/obj/telescience.dmi'
icon_state = "telecrystal"
w_class = 1
w_class = WEIGHT_CLASS_TINY
max_amount = 50
flags = NOBLUDGEON
origin_tech = "materials=6;syndicate=1"
@@ -1,3 +1,108 @@
/obj/item/stack/tile/mineral/plasma
name = "plasma tile"
singular_name = "plasma floor tile"
desc = "A tile made out of highly flammable plasma. This can only end well."
icon_state = "tile_plasma"
origin_tech = "plasmatech=1"
turf_type = /turf/simulated/floor/mineral/plasma
mineralType = "plasma"
materials = list(MAT_PLASMA=500)
/obj/item/stack/tile/mineral/uranium
name = "uranium tile"
singular_name = "uranium floor tile"
desc = "A tile made out of uranium. You feel a bit woozy."
icon_state = "tile_uranium"
turf_type = /turf/simulated/floor/mineral/uranium
mineralType = "uranium"
materials = list(MAT_URANIUM=500)
var/global/list/datum/stack_recipe/gold_tile_recipes = list ( \
new/datum/stack_recipe("fancy gold tile", /obj/item/stack/tile/mineral/gold/fancy, max_res_amount = 20), \
)
/obj/item/stack/tile/mineral/gold
name = "gold tile"
singular_name = "gold floor tile"
desc = "A tile made out of gold, the swag seems strong here."
icon_state = "tile_gold"
turf_type = /turf/simulated/floor/mineral/gold
mineralType = "gold"
materials = list(MAT_GOLD=500)
/obj/item/stack/tile/mineral/gold/New(loc, amount=null)
..()
recipes = gold_tile_recipes
var/global/list/datum/stack_recipe/goldfancy_tile_recipes = list ( \
new/datum/stack_recipe("regular gold tile", /obj/item/stack/tile/mineral/gold, max_res_amount = 20), \
)
/obj/item/stack/tile/mineral/gold/fancy
icon_state = "tile_goldfancy"
turf_type = /turf/simulated/floor/mineral/gold/fancy
/obj/item/stack/tile/mineral/gold/fancy/New(loc, amount=null)
..()
recipes = goldfancy_tile_recipes
var/global/list/datum/stack_recipe/silver_tile_recipes = list ( \
new/datum/stack_recipe("fancy silver tile", /obj/item/stack/tile/mineral/silver/fancy, max_res_amount = 20), \
)
/obj/item/stack/tile/mineral/silver
name = "silver tile"
singular_name = "silver floor tile"
desc = "A tile made out of silver, the light shining from it is blinding."
icon_state = "tile_silver"
turf_type = /turf/simulated/floor/mineral/silver
mineralType = "silver"
materials = list(MAT_SILVER=500)
/obj/item/stack/tile/mineral/silver/New(loc, amount=null)
..()
recipes = silver_tile_recipes
var/global/list/datum/stack_recipe/silverfancy_tile_recipes = list ( \
new/datum/stack_recipe("regular silver tile", /obj/item/stack/tile/mineral/silver, max_res_amount = 20), \
)
/obj/item/stack/tile/mineral/silver/fancy
icon_state = "tile_silverfancy"
turf_type = /turf/simulated/floor/mineral/silver/fancy
/obj/item/stack/tile/mineral/silver/fancy/New(loc, amount=null)
..()
recipes = silverfancy_tile_recipes
/obj/item/stack/tile/mineral/diamond
name = "diamond tile"
singular_name = "diamond floor tile"
desc = "A tile made out of diamond. Wow, just, wow."
icon_state = "tile_diamond"
origin_tech = "materials=2"
turf_type = /turf/simulated/floor/mineral/diamond
mineralType = "diamond"
materials = list(MAT_DIAMOND=500)
/obj/item/stack/tile/mineral/bananium
name = "bananium tile"
singular_name = "bananium floor tile"
desc = "A tile made out of bananium, HOOOOOOOOONK!"
icon_state = "tile_bananium"
turf_type = /turf/simulated/floor/mineral/bananium
mineralType = "bananium"
materials = list(MAT_BANANIUM=500)
/obj/item/stack/tile/mineral/tranquillite
name = "silent tile"
singular_name = "silent floor tile"
desc = "A tile made out of tranquillite, SHHHHHHHHH!"
icon_state = "tile_tranquillite"
turf_type = /turf/simulated/floor/mineral/tranquillite
mineralType = "tranquillite"
materials = list(MAT_TRANQUILLITE=500)
/obj/item/stack/tile/mineral/abductor
name = "alien floor tile"
singular_name = "alien floor tile"
@@ -1,34 +1,75 @@
/* Different misc types of tiles
* Contains:
* Grass
* Wood
* Carpet
* Plasteel
* Light
* Fakespace
* High-traction
\\ If you don't update the contains list, I'm going to shank you
*/
/obj/item/stack/tile
name = "broken tile"
singular_name = "broken tile"
desc = "A broken tile. This should not exist."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tiles.dmi'
icon_state = "tile"
item_state = "tile"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
force = 1
throwforce = 1
throw_speed = 5
throw_range = 20
max_amount = 60
flags = CONDUCT
origin_tech = "materials=1"
var/turf_type = null
var/mineralType = null
/*
* Grass
*/
/obj/item/stack/tile/New(loc, amount)
..()
pixel_x = rand(-3, 3)
pixel_y = rand(-3, 3) //randomize a little
/obj/item/stack/tile/attackby(obj/item/W, mob/user, params)
if(iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
if(is_hot(W) && !mineralType)
to_chat(user, "<span class='warning'>You can not reform this!</span>")
return
if(get_amount() < 4)
to_chat(user, "<span class='warning'>You need at least four tiles to do this!</span>")
return
if(WT.remove_fuel(0,user))
if(mineralType == "plasma")
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 5)
user.visible_message("<span class='warning'>[user.name] sets the plasma tiles on fire!</span>", \
"<span class='warning'>You set the plasma tiles on fire!</span>")
qdel(src)
return
if (mineralType == "metal")
var/obj/item/stack/sheet/metal/new_item = new(user.loc)
user.visible_message("[user.name] shaped [src] into metal with the welding tool.", \
"<span class='notice'>You shaped [src] into metal with the welding tool.</span>", \
"<span class='italics'>You hear welding.</span>")
var/obj/item/stack/rods/R = src
src = null
var/replace = (user.get_inactive_hand()==R)
R.use(4)
if(!R && replace)
user.put_in_hands(new_item)
else
var/sheet_type = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
var/obj/item/stack/sheet/mineral/new_item = new sheet_type(user.loc)
user.visible_message("[user.name] shaped [src] into a sheet with the welding tool.", \
"<span class='notice'>You shaped [src] into a sheet with the welding tool.</span>", \
"<span class='italics'>You hear welding.</span>")
var/obj/item/stack/rods/R = src
src = null
var/replace = (user.get_inactive_hand()==R)
R.use(4)
if (!R && replace)
user.put_in_hands(new_item)
else
return ..()
//Grass
/obj/item/stack/tile/grass
name = "grass tiles"
gender = PLURAL
@@ -39,21 +80,18 @@
turf_type = /turf/simulated/floor/grass
burn_state = FLAMMABLE
/*
* Wood
*/
//Wood
/obj/item/stack/tile/wood
name = "wood floor tiles"
gender = PLURAL
singular_name = "wood floor tile"
desc = "an easy to fit wood floor tile"
icon_state = "tile-wood"
origin_tech = "biotech=1"
turf_type = /turf/simulated/floor/wood
burn_state = FLAMMABLE
/*
* Carpets
*/
//Carpets
/obj/item/stack/tile/carpet
name = "carpet"
singular_name = "carpet"
@@ -62,9 +100,7 @@
turf_type = /turf/simulated/floor/carpet
burn_state = FLAMMABLE
/*
* Plasteel
*/
//Plasteel
/obj/item/stack/tile/plasteel
name = "floor tiles"
gender = PLURAL
@@ -80,9 +116,7 @@
turf_type = /turf/simulated/floor/plasteel
mineralType = "metal"
/*
* Light
*/
//Light
/obj/item/stack/tile/light
name = "light tiles"
gender = PLURAL
@@ -94,9 +128,7 @@
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
turf_type = /turf/simulated/floor/light
/*
* Fakespace
*/
//Fakespace
/obj/item/stack/tile/fakespace
name = "astral carpet"
singular_name = "astral carpet"
@@ -104,6 +136,7 @@
icon_state = "tile_space"
turf_type = /turf/simulated/floor/fakespace
burn_state = FLAMMABLE
merge_type = /obj/item/stack/tile/fakespace
/obj/item/stack/tile/fakespace/loaded
amount = 30
@@ -116,24 +149,15 @@
icon_state = "tile_noslip"
turf_type = /turf/simulated/floor/noslip
origin_tech = "materials=3"
merge_type = /obj/item/stack/tile/noslip
/obj/item/stack/tile/noslip/loaded
amount = 20
/obj/item/stack/tile/silent
name = "silent tile"
singular_name = "silent floor tile"
desc = "A tile made out of tranquillite, SHHHHHHHHH!"
icon_state = "tile-silent"
origin_tech = "materials=1"
turf_type = /turf/simulated/floor/silent
mineralType = "tranquillite"
materials = list(MAT_TRANQUILLITE=500)
//Pod floor
/obj/item/stack/tile/pod
name = "pod floor tile"
singular_name = "pod floor tile"
desc = "A grooved floor tile."
icon_state = "tile_pod"
turf_type = /turf/simulated/floor/pod
turf_type = /turf/simulated/floor/pod
+42 -36
View File
@@ -43,14 +43,20 @@
/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob)
return
/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob, proximity)
if(!proximity) return
if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1)
A.reagents.trans_to(src, 10)
to_chat(user, "<span class='notice'>You fill the balloon with the contents of [A].</span>")
desc = "A translucent balloon with some form of liquid sloshing around in it."
update_icon()
return
/obj/item/toy/balloon/afterattack(atom/A, mob/user, proximity)
if(!proximity)
return
if(istype(A, /obj/structure/reagent_dispensers))
var/obj/structure/reagent_dispensers/RD = A
if(RD.reagents.total_volume <= 0)
to_chat(user, "<span class='warning'>[RD] is empty.</span>")
else if(reagents.total_volume >= 10)
to_chat(user, "<span class='warning'>[src] is full.</span>")
else
A.reagents.trans_to(src, 10)
to_chat(user, "<span class='notice'>You fill the balloon with the contents of [A].</span>")
desc = "A translucent balloon with some form of liquid sloshing around in it."
update_icon()
/obj/item/toy/balloon/wash(mob/user, atom/source)
if(reagents.total_volume < 10)
@@ -107,7 +113,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "syndballoon"
item_state = "syndballoon"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
/*
* Fake telebeacon
@@ -138,7 +144,7 @@
icon_state = "sword0"
item_state = "sword0"
var/active = 0.0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
/obj/item/toy/sword/attack_self(mob/user as mob)
@@ -148,13 +154,13 @@
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
icon_state = "swordblue"
item_state = "swordblue"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
else
to_chat(user, "<span class='notice'>You push the plastic blade back down into the handle.</span>")
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
icon_state = "sword0"
item_state = "sword0"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -212,7 +218,7 @@
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -233,7 +239,7 @@
throwforce = 5.0
throw_speed = 10
throw_range = 30
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/toy/snappop/virus/throw_impact(atom/hit_atom)
@@ -254,7 +260,7 @@
desc = "Wow!"
icon = 'icons/obj/toy.dmi'
icon_state = "snappop"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/ash_type = /obj/effect/decal/cleanable/ash
/obj/item/toy/snappop/proc/pop_burst(var/n=3, var/c=1)
@@ -397,7 +403,7 @@
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
throwforce = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
@@ -432,7 +438,7 @@ obj/item/toy/cards/deck
icon = 'icons/obj/toy.dmi'
deckstyle = "nanotrasen"
icon_state = "deck_nanotrasen_full"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
var/list/cards = list()
@@ -562,7 +568,7 @@ obj/item/toy/cards/cardhand
desc = "A number of cards not in a deck, customarily held in ones hand."
icon = 'icons/obj/toy.dmi'
icon_state = "nanotrasen_hand2"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/list/currenthand = list()
var/choice = null
@@ -655,7 +661,7 @@ obj/item/toy/cards/singlecard
desc = "a card"
icon = 'icons/obj/toy.dmi'
icon_state = "singlecard_nanotrasen_down"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/cardname = null
var/flipped = 0
pixel_x = -5
@@ -781,7 +787,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A plastic model of a Nuclear Fission Explosive."
icon = 'icons/obj/toy.dmi'
icon_state = "nuketoyidle"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/nuke/attack_self(mob/user)
@@ -804,7 +810,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A toy for therapeutic and recreational purposes."
icon_state = "therapyred"
item_state = "egg4"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/cooldown = 0
/obj/item/toy/therapy/New()
@@ -857,7 +863,7 @@ obj/item/toy/cards/deck/syndicate/black
name = "toddler"
desc = "This baby looks almost real. Wait, did it just burp?"
force = 5
w_class = 4
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
@@ -877,10 +883,10 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/minimeteor
name = "Mini-Meteor"
desc = "Relive the excitement of a meteor shower! SweetMeat-eor. Co is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor™"
desc = "Relive the excitement of a meteor shower! SweetMeat-eor. Co is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor."
icon = 'icons/obj/toy.dmi'
icon_state = "minimeteor"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
/obj/item/toy/minimeteor/throw_impact(atom/hit_atom)
..()
@@ -1089,7 +1095,7 @@ obj/item/toy/cards/deck/syndicate/black
icon_state = "foamblade"
item_state = "arm_blade"
attack_verb = list("pricked", "absorbed", "gored")
w_class = 2
w_class = WEIGHT_CLASS_SMALL
burn_state = FLAMMABLE
/*
@@ -1101,7 +1107,7 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/device.dmi'
icon_state = "flash"
item_state = "flashtool"
w_class = 1
w_class = WEIGHT_CLASS_TINY
/obj/item/toy/flash/attack(mob/living/M, mob/user)
playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
@@ -1117,7 +1123,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A big, plastic red button. Reads 'From HonkCo Pranks?' on the back."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/redbutton/attack_self(mob/user)
@@ -1142,7 +1148,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A little toy model AI core with real law announcing action!"
icon = 'icons/obj/toy.dmi'
icon_state = "AI"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/AI/attack_self(mob/user)
@@ -1161,7 +1167,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "An action figure modeled after 'The Owl', defender of justice."
icon = 'icons/obj/toy.dmi'
icon_state = "owlprize"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/owl/attack_self(mob/user)
@@ -1180,7 +1186,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "An action figure modeled after 'The Griffin', criminal mastermind."
icon = 'icons/obj/toy.dmi'
icon_state = "griffinprize"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/griffin/attack_self(mob/user)
@@ -1197,7 +1203,7 @@ obj/item/toy/cards/deck/syndicate/black
// DND Character minis. Use the naming convention (type)character for the icon states.
/obj/item/toy/character
icon = 'icons/obj/toy.dmi'
w_class = 2
w_class = WEIGHT_CLASS_SMALL
pixel_z = 5
/obj/item/toy/character/alien
@@ -1250,7 +1256,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "The perfect pet!"
icon = 'icons/obj/toy.dmi'
icon_state = "pet_rock"
w_class = 2
w_class = WEIGHT_CLASS_SMALL
force = 5
throwforce = 5
attack_verb = list("attacked", "bashed", "smashed", "stoned")
@@ -1274,7 +1280,7 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/toy.dmi'
icon_state = "minigibber"
attack_verb = list("grinded", "gibbed")
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
var/obj/stored_minature = null
@@ -1295,7 +1301,7 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/minigibber/attackby(var/obj/O, var/mob/user, params)
if(istype(O,/obj/item/toy/character) && O.loc == user)
to_chat(user, "<span class='notice'>You start feeding \the [O] [bicon(O)] into \the [src]'s mini-input.</span>")
if(do_after(user,10, target = src))
if(do_after(user, 10, target = src))
if(O.loc != user)
to_chat(user, "<span class='alert'>\The [O] is too far away to feed into \the [src]!</span>")
else
@@ -1316,7 +1322,7 @@ obj/item/toy/cards/deck/syndicate/black
icon_state = "toy_xeno"
name = "xenomorph action figure"
desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
w_class = 2
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/toy_xeno/attack_self(mob/user)
@@ -1346,7 +1352,7 @@ obj/item/toy/cards/deck/syndicate/black
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=2000)
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throwforce = 5
throw_speed = 4
throw_range = 5
+1 -1
View File
@@ -4,7 +4,7 @@
//Added by Jack Rost
/obj/item/trash
icon = 'icons/obj/trash.dmi'
w_class = 1
w_class = WEIGHT_CLASS_TINY
desc = "This is rubbish."
burn_state = FLAMMABLE
@@ -14,7 +14,7 @@ AI MODULES
desc = "An AI Module for transmitting encrypted instructions to the AI."
flags = CONDUCT
force = 5.0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
throwforce = 5.0
throw_speed = 3
throw_range = 15
@@ -367,7 +367,7 @@ AI MODULES
log_law_changes(target, sender)
lawchanges.Add("The law is '[newFreeFormLaw]'")
to_chat(target, "\red BZZZZT")
to_chat(target, "<span class='warning'>BZZZZT</span>")
var/law = "[newFreeFormLaw]"
target.add_ion_law(law)
target.show_laws()
@@ -397,4 +397,4 @@ AI MODULES
laws[1] = generate_ion_law()
to_chat(user, "<span class='notice'>You press the button on [src].</span>")
playsound(user, 'sound/machines/click.ogg', 20, 1)
src.loc.visible_message("<span class='warning'>[bicon(src)] [laws[1]]</span>")
src.loc.visible_message("<span class='warning'>[bicon(src)] [laws[1]]</span>")
+27 -16
View File
@@ -7,7 +7,7 @@ RCD
/obj/item/weapon/rcd
name = "rapid-construction-device (RCD)"
desc = "A device used to rapidly build and deconstruct walls and floors."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
opacity = 0
density = 0
@@ -17,9 +17,11 @@ RCD
throwforce = 10.0
throw_speed = 3
throw_range = 5
w_class = 3
materials = list(MAT_METAL=100000)
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL = 30000)
origin_tech = "engineering=4;materials=2"
toolspeed = 1
usesound = 'sound/items/Deconstruct.ogg'
var/datum/effect/system/spark_spread/spark_system
var/max_matter = 100
var/matter = 0
@@ -28,6 +30,7 @@ RCD
var/canRwall = 0
var/menu = 1
var/door_type = /obj/machinery/door/airlock
var/door_name = "Airlock"
req_access = list(access_engine)
var/list/door_accesses = list()
var/list/door_accesses_list = list()
@@ -56,8 +59,7 @@ RCD
return
/obj/item/weapon/rcd/Destroy()
qdel(spark_system)
spark_system = null
QDEL_NULL(spark_system)
rcd_list -= src
return ..()
@@ -85,7 +87,7 @@ RCD
/obj/item/weapon/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 400, 400, state = state)
ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 450, 400, state = state)
ui.open()
ui.set_auto_update(1)
@@ -93,6 +95,7 @@ RCD
var/data[0]
data["mode"] = mode
data["door_type"] = door_type
data["door_name"] = door_name
data["menu"] = menu
data["matter"] = matter
data["max_matter"] = max_matter
@@ -164,8 +167,13 @@ RCD
door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses))
. = 1
if(href_list["choice"] && !locked)
var/temp_t = sanitize(copytext(input("Enter a custom Airlock Name.","Airlock Name"),1,MAX_MESSAGE_LEN))
if(temp_t)
door_name = temp_t
/obj/item/weapon/rcd/proc/activate()
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
playsound(loc, usesound, 50, 1)
/obj/item/weapon/rcd/afterattack(atom/A, mob/user, proximity)
@@ -190,7 +198,7 @@ RCD
if(checkResource(3, user))
to_chat(user, "Building Wall ...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 20, target = A))
if(do_after(user, 20 * toolspeed, target = A))
if(!useResource(3, user)) return 0
activate()
var/turf/AT = A
@@ -203,10 +211,11 @@ RCD
if(checkResource(10, user))
to_chat(user, "Building Airlock...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 50, target = A))
if(do_after(user, 50 * toolspeed, target = A))
if(!useResource(10, user)) return 0
activate()
var/obj/machinery/door/airlock/T = new door_type(A)
T.name = door_name
T.autoclose = 1
if(one_access)
T.req_one_access = door_accesses.Copy()
@@ -223,7 +232,7 @@ RCD
if(checkResource(5, user))
to_chat(user, "Deconstructing Wall...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 40, target = A))
if(do_after(user, 40 * toolspeed, target = A))
if(!useResource(5, user)) return 0
activate()
var/turf/AT = A
@@ -235,7 +244,7 @@ RCD
if(checkResource(5, user))
to_chat(user, "Deconstructing Floor...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 50, target = A))
if(do_after(user, 50 * toolspeed, target = A))
if(!useResource(5, user)) return 0
activate()
var/turf/AT = A
@@ -247,7 +256,7 @@ RCD
if(checkResource(20, user))
to_chat(user, "Deconstructing Airlock...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 50, target = A))
if(do_after(user, 50 * toolspeed, target = A))
if(!useResource(20, user)) return 0
activate()
qdel(A)
@@ -262,7 +271,7 @@ RCD
return 0
to_chat(user, "Deconstructing window...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
if(!do_after(user, 20, target = A))
if(!do_after(user, 20 * toolspeed, target = A))
return 0
if(locate(/obj/structure/window/full/shuttle) in A.contents)
return 0 // Let's not give shuttle-griefers an easy time.
@@ -270,8 +279,7 @@ RCD
return 0
activate()
var/turf/T1 = get_turf(A)
qdel(A)
A = null
QDEL_NULL(A)
for(var/obj/structure/window/W in T1.contents)
W.disassembled = 1
W.density = 0
@@ -299,7 +307,7 @@ RCD
return 0
to_chat(user, "Constructing window...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
if(!do_after(user, 20, target = A))
if(!do_after(user, 20 * toolspeed, target = A))
return 0
if(locate(/obj/structure/grille) in A.contents)
return 0 // We already have window
@@ -368,6 +376,9 @@ RCD
explosion(src, 0, 0, 3, 1, flame_range = 1)
qdel(src)
/obj/item/weapon/rcd/preloaded
matter = 100
/obj/item/weapon/rcd/combat
name = "combat RCD"
max_matter = 500
+149
View File
@@ -0,0 +1,149 @@
/obj/item/weapon/twohanded/rcl
name = "rapid cable layer (RCL)"
desc = "A device used to rapidly deploy cables. It has screws on the side which can be removed to slide off the cables."
icon = 'icons/obj/tools.dmi'
icon_state = "rcl-0"
item_state = "rcl-0"
opacity = 0
force = 5 //Plastic is soft
throwforce = 5
throw_speed = 1
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL
origin_tech = "engineering=4;materials=4"
var/max_amount = 90
var/active = 0
var/obj/structure/cable/last = null
var/obj/item/stack/cable_coil/loaded = null
/obj/item/weapon/twohanded/rcl/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
if(!loaded)
if(user.drop_item())
loaded = W
loaded.forceMove(src)
loaded.max_amount = max_amount //We store a lot.
else
to_chat(user, "<span class='warning'>[user.get_active_hand()] is stuck to your hand!</span>")
return
else
if(loaded.amount < max_amount)
var/amount = min(loaded.amount + C.amount, max_amount)
C.use(amount - loaded.amount)
loaded.amount = amount
else
return
update_icon()
to_chat(user, "<span class='notice'>You add the cables to the [src]. It now contains [loaded.amount].</span>")
else if(isscrewdriver(W))
if(!loaded)
return
to_chat(user, "<span class='notice'>You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires.</span>")
while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
var/diff = loaded.amount % 30
if(diff)
loaded.use(diff)
new /obj/item/stack/cable_coil(user.loc, diff)
else
loaded.use(30)
new /obj/item/stack/cable_coil(user.loc, 30)
loaded.max_amount = initial(loaded.max_amount)
loaded.forceMove(user.loc)
user.put_in_hands(loaded)
loaded = null
update_icon()
else
..()
/obj/item/weapon/twohanded/rcl/examine(mob/user)
..()
if(loaded)
to_chat(user, "<span class='info'>It contains [loaded.amount]/[max_amount] cables.</span>")
/obj/item/weapon/twohanded/rcl/Destroy()
QDEL_NULL(loaded)
last = null
active = 0
return ..()
/obj/item/weapon/twohanded/rcl/update_icon()
if(!loaded)
icon_state = "rcl-0"
item_state = "rcl-0"
return
switch(loaded.amount)
if(61 to INFINITY)
icon_state = "rcl-30"
item_state = "rcl"
if(31 to 60)
icon_state = "rcl-20"
item_state = "rcl"
if(1 to 30)
icon_state = "rcl-10"
item_state = "rcl"
else
icon_state = "rcl-0"
item_state = "rcl-0"
/obj/item/weapon/twohanded/rcl/proc/is_empty(mob/user, loud = 1)
update_icon()
if(!loaded || !loaded.amount)
if(loud)
to_chat(user, "<span class='notice'>The last of the cables unreel from [src].</span>")
if(loaded)
qdel(loaded)
loaded = null
unwield(user)
active = wielded
return 1
return 0
/obj/item/weapon/twohanded/rcl/dropped(mob/wearer)
..()
active = 0
last = null
/obj/item/weapon/twohanded/rcl/attack_self(mob/user)
..()
active = wielded
if(!active)
last = null
else if(!last)
for(var/obj/structure/cable/C in get_turf(user))
if(C.d1 == 0 || C.d2 == 0)
last = C
break
/obj/item/weapon/twohanded/rcl/on_mob_move(direct, mob/user)
if(active)
trigger(user)
/obj/item/weapon/twohanded/rcl/proc/trigger(mob/user)
if(is_empty(user, 0))
to_chat(user, "<span class='warning'>\The [src] is empty!</span>")
return
if(last)
if(get_dist(last, user) == 1) //hacky, but it works
var/turf/T = get_turf(user)
if(!isturf(T) || T.intact || !T.can_have_cabling())
last = null
return
if(get_dir(last, user) == last.d2)
//Did we just walk backwards? Well, that's the one direction we CAN'T complete a stub.
last = null
return
loaded.cable_join(last, user)
if(is_empty(user))
return //If we've run out, display message and exit
else
last = null
last = loaded.place_turf(get_turf(loc), user, turn(user.dir, 180))
is_empty(user) //If we've run out, display message
/obj/item/weapon/twohanded/rcl/pre_loaded/New() //Comes preloaded with cable, for testing stuff
..()
loaded = new()
loaded.max_amount = max_amount
loaded.amount = max_amount
update_icon()
+6 -6
View File
@@ -6,14 +6,14 @@ RSF
/obj/item/weapon/rsf
name = "\improper Rapid-Service-Fabricator"
desc = "A device used to rapidly deploy service items."
icon = 'icons/obj/items.dmi'
icon_state = "rcd"
icon = 'icons/obj/tools.dmi'
icon_state = "rsf"
opacity = 0
density = 0
anchored = 0.0
var/matter = 0
var/mode = 1
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/rsf/New()
desc = "A RSF. It currently holds [matter]/30 fabrication-units."
@@ -69,7 +69,7 @@ RSF
if(istype(A, /obj/structure/table) && matter >= 1)
to_chat(user, "Dispensing Dosh...")
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
new /obj/item/weapon/spacecash/c10( A.loc )
new /obj/item/stack/spacecash/c10( A.loc )
if(isrobot(user))
var/mob/living/silicon/robot/engy = user
engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh!
@@ -83,7 +83,7 @@ RSF
if(istype(A, /turf/simulated/floor) && matter >= 1)
to_chat(user, "Dispensing Dosh...")
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
new /obj/item/weapon/spacecash/c10( A )
new /obj/item/stack/spacecash/c10( A )
if(isrobot(user))
var/mob/living/silicon/robot/engy = user
engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh!
@@ -231,4 +231,4 @@ RSF
matter--
to_chat(user, "The RSF now holds [matter]/30 fabrication-units.")
desc = "A RSF. It currently holds [matter]/30 fabrication-units."
return
return
@@ -12,8 +12,8 @@
throwforce_on = 5
throw_speed = 1
throw_range = 5
w_class = 2
w_class_on = 2
w_class = WEIGHT_CLASS_SMALL
w_class_on = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "slashed", "gored", "sliced", "torn", "ripped", "butchered", "cut")
attack_verb_on = list()
@@ -11,13 +11,17 @@
force = 10
throw_speed = 2
throw_range = 4
w_class = 4
w_class = WEIGHT_CLASS_BULKY
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
var/bees_left = 10
var/list/blood_list = list()
var/sound_file = 'sound/misc/briefcase_bees.ogg'
var/next_sound = 0
/obj/item/weapon/bee_briefcase/Destroy()
blood_list.Cut()
return ..()
/obj/item/weapon/bee_briefcase/examine(mob/user)
..()
if(loc == user)
@@ -46,13 +50,10 @@
to_chat(user, "<span class='warning'>The buzzing inside the briefcase swells momentarily, then returns to normal. Guess it was too cramped...</span>")
S.reagents.clear_reagents()
S.update_icon()
else if(istype(I, /obj/item/weapon/plantspray))
var/obj/item/weapon/plantspray/PS = I
user.drop_item(PS)
bees_left = max(0, (bees_left - PS.pest_kill_str))
to_chat(user, "You spray [PS] into \the [src].")
else if(istype(I, /obj/item/weapon/reagent_containers/spray/pestspray))
bees_left = max(0, (bees_left - 6))
to_chat(user, "You spray [I] into [src].")
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
qdel(PS)
/obj/item/weapon/bee_briefcase/attack_self(mob/user as mob)
if(!bees_left)
@@ -73,6 +74,6 @@
//Release up to 5 bees per use. Without using strange reagent, that means two uses. WITH strange reagent, you can get more if you don't release the last bee
for(var/bee = min(5, bees_left), bee > 0, bee--)
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 //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
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
+23 -2
View File
@@ -15,7 +15,7 @@
name = "card"
desc = "A card."
icon = 'icons/obj/card.dmi'
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/associated_account_number = 0
var/list/files = list( )
@@ -397,6 +397,7 @@
"medical",
"HoS",
"research",
"cargo",
"engineering",
"CMO",
"RD",
@@ -605,6 +606,12 @@
name = "Prisoner #13-007"
registered_name = "Prisoner #13-007"
/obj/item/weapon/card/id/prisoner/random
/obj/item/weapon/card/id/prisoner/random/New()
var/random_number = "#[rand(0, 99)]-[rand(0, 999)]"
name = "Prisoner [random_number]"
registered_name = name
/obj/item/weapon/card/id/salvage_captain
name = "Captain's ID"
registered_name = "Captain"
@@ -714,6 +721,18 @@
desc = "A modified ID card given only to those people who have devoted their lives to the better interests of Nanotrasen. It sparkles blue."
icon_state = "lifetimeid"
/obj/item/weapon/card/id/ert
name = "ERT ID"
icon_state = "ERT_empty"
/obj/item/weapon/card/id/ert/commander
icon_state = "ERT_leader"
/obj/item/weapon/card/id/ert/security
icon_state = "ERT_security"
/obj/item/weapon/card/id/ert/engineering
icon_state = "ERT_engineering"
/obj/item/weapon/card/id/ert/medic
icon_state = "ERT_medical"
// Decals
/obj/item/weapon/id_decal
name = "identification card decal"
@@ -757,7 +776,7 @@
override_name = 1
/proc/get_station_card_skins()
return list("data","id","gold","silver","security","medical","research","engineering","HoS","CMO","RD","CE","clown","mime","rainbow","prisoner")
return list("data","id","gold","silver","security","medical","research","cargo","engineering","HoS","CMO","RD","CE","clown","mime","rainbow","prisoner")
/proc/get_centcom_card_skins()
return list("centcom","centcom_old","nanotrasen","ERT_leader","ERT_empty","ERT_security","ERT_engineering","ERT_medical","ERT_janitorial","deathsquad","commander","syndie","TDred","TDgreen")
@@ -769,6 +788,8 @@
switch(skin)
if("id")
return "Standard"
if("cargo")
return "Supply"
if("HoS")
return "Head of Security"
if("CMO")
+44 -110
View File
@@ -1,125 +1,59 @@
var/global/list/moneytypes=list(
/obj/item/weapon/spacecash/c1000 = 1000,
/obj/item/weapon/spacecash/c500 = 500,
/obj/item/weapon/spacecash/c200 = 200,
/obj/item/weapon/spacecash/c100 = 100,
/obj/item/weapon/spacecash/c50 = 50,
/obj/item/weapon/spacecash/c20 = 20,
/obj/item/weapon/spacecash/c10 = 10,
/obj/item/weapon/spacecash = 1,
)
/obj/item/weapon/spacecash
name = "credit chip"
/obj/item/stack/spacecash
name = "1 Credit"
desc = "Money money money."
gender = PLURAL
icon = 'icons/obj/money.dmi'
icon_state = "cash1"
opacity = 0
density = 0
anchored = 0.0
force = 1.0
throwforce = 1.0
icon = 'icons/goonstation/objects/money.dmi'
icon_state = "cashgreen"
hitsound = "swing_hit"
force = 1
throwforce = 1
throw_speed = 1
throw_range = 2
w_class = 1
throw_range = 7
w_class = WEIGHT_CLASS_TINY
burn_state = FLAMMABLE
var/access = list()
access = access_crate_cash
var/worth = 1 // Per chip
var/amount = 1 // number of chips
var/stack_color = "#4E054F"
singular_name = "credit"
max_amount = 1000000
merge_type = /obj/item/stack/spacecash
/obj/item/weapon/spacecash/New(var/new_loc,var/new_amount=1)
loc = new_loc
name = "[worth] credit chip"
amount = new_amount
/obj/item/stack/spacecash/New(loc, amt = null)
..()
update_icon()
/obj/item/weapon/spacecash/examine(mob/user)
if(amount>1)
to_chat(user, "[bicon(src)] This is a stack of [amount] [src]s.")
/obj/item/stack/spacecash/update_icon()
..()
name = "[amount == max_amount ? "1000000" : amount] Credit[amount > 1 ? "s" : ""]"
if(amount >= 1 && amount < 10)
icon_state = "cashgreen"
else if(amount >= 10 && amount < 50)
icon_state = "spacecash"
else if(amount >= 50 && amount < 500)
icon_state = "cashblue"
else if(amount >= 500 && amount < 1000)
icon_state = "cashindi"
else if(amount >= 1000 && amount < 1000000)
icon_state = "cashpurp"
else
to_chat(user, "[bicon(src)] This is \a [src]s.")
to_chat(user, "It's worth [worth*amount] credits.")
icon_state = "cashrbow"
/obj/item/weapon/spacecash/update_icon()
icon_state = "cash[worth]"
// Up to 100 items per stack.
pixel_x=rand(-7,7)
pixel_y=rand(-14,14)
/obj/item/stack/spacecash/c10
amount = 10
/obj/item/weapon/spacecash/proc/collect_from(var/obj/item/weapon/spacecash/cash)
if(cash.worth == src.worth)
var/taking = min(100-src.amount,cash.amount)
cash.amount -= taking
src.amount += taking
if(cash.amount <= 0)
qdel(cash)
return taking
return 0
/obj/item/stack/spacecash/c20
amount = 20
/obj/item/weapon/spacecash/afterattack(atom/A as mob|obj, mob/user as mob)
if(istype(A, /turf) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack))
var/turf/T = get_turf(A)
var/collected = 0
for(var/obj/item/weapon/spacecash/cash in T)
if(cash.worth == src.worth)
collected += collect_from(cash)
if(collected)
update_icon()
to_chat(user, "<span class='notice'>You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash.</span>")
else if(istype(A,/obj/item/weapon/spacecash))
var/obj/item/weapon/spacecash/cash = A
var/collected = src.collect_from(cash)
if(collected)
update_icon()
to_chat(user, "<span class='notice'>You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash.</span>")
/obj/item/stack/spacecash/c50
amount = 50
/obj/item/stack/spacecash/c100
amount = 100
/obj/item/weapon/spacecash/proc/get_total()
return worth * amount
/obj/item/stack/spacecash/c200
amount = 200
/obj/item/weapon/spacecash/c10
icon_state = "cash10"
worth = 10
/obj/item/stack/spacecash/c500
amount = 500
/obj/item/weapon/spacecash/c20
icon_state = "cash10"
worth = 20
/obj/item/stack/spacecash/c1000
amount = 1000
/obj/item/weapon/spacecash/c50
icon_state = "cash10"
worth = 50
/obj/item/weapon/spacecash/c100
icon_state = "cash100"
worth = 100
/obj/item/weapon/spacecash/c200
icon_state = "cash200"
worth = 200
/obj/item/weapon/spacecash/c500
icon_state = "cash500"
worth = 500
/obj/item/weapon/spacecash/c1000
icon_state = "cash1000"
worth = 1000
/proc/dispense_cash(var/amount, var/loc)
for(var/cashtype in moneytypes)
var/slice = moneytypes[cashtype]
var/dispense_count = Floor(amount/slice)
amount = amount % slice
while(dispense_count>0)
var/dispense_this_time = min(dispense_count,100)
if(dispense_this_time > 0)
new cashtype(loc,dispense_this_time)
dispense_count -= dispense_this_time
/proc/count_cash(var/list/cash)
. = 0
for(var/obj/item/weapon/spacecash/C in cash)
. += C.get_total()
/obj/item/stack/spacecash/c1000000
amount = 1000000
+3 -3
View File
@@ -7,7 +7,7 @@
throwforce = 3.0
throw_speed = 1
throw_range = 5
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("warned", "cautioned", "smashed")
proximity_sign
@@ -22,7 +22,7 @@
return
if(armed)
armed = 0
to_chat(user, "\blue You disarm \the [src].")
to_chat(user, "<span class='notice'>You disarm \the [src].</span>")
return
timing = !timing
if(timing)
@@ -30,7 +30,7 @@
else
armed = 0
timepassed = 0
to_chat(H, "\blue You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]")
to_chat(H, "<span class='notice'>You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]</span>")
process()
if(!timing)
@@ -6,7 +6,7 @@
icon = 'icons/obj/chronos.dmi'
icon_state = "chronobackpack"
item_state = "backpack"
w_class = 4
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
slowdown = 1
actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun)
@@ -46,7 +46,7 @@
icon = 'icons/obj/chronos.dmi'
icon_state = "chronogun"
item_state = "chronogun"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
flags = NODROP
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
can_charge = 0
+47 -70
View File
@@ -20,7 +20,7 @@ LIGHTERS ARE IN LIGHTERS.DM
throw_speed = 0.5
item_state = "cigoff"
slot_flags = SLOT_EARS|SLOT_MASK
w_class = 1
w_class = WEIGHT_CLASS_TINY
body_parts_covered = null
attack_verb = list("burnt", "singed")
var/lit = 0
@@ -42,11 +42,12 @@ LIGHTERS ARE IN LIGHTERS.DM
/obj/item/clothing/mask/cigarette/New()
..()
flags |= NOREACT // so it doesn't react until you light it
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 30
reagents.set_reacting(FALSE) // so it doesn't react until you light it
/obj/item/clothing/mask/cigarette/Destroy()
qdel(reagents)
QDEL_NULL(reagents)
processing_objects -= src
return ..()
/obj/item/clothing/mask/cigarette/attack(var/mob/living/M, var/mob/living/user, def_zone)
@@ -92,6 +93,17 @@ LIGHTERS ARE IN LIGHTERS.DM
else if(istype(W, /obj/item/device/assembly/igniter))
light("<span class='notice'>[user] fiddles with [W], and manages to light their [name].</span>")
else if(istype(W, /obj/item/weapon/gun/magic/wand/fireball))
var/obj/item/weapon/gun/magic/wand/fireball/F = W
if(F.charges)
if(prob(50) || user.mind.assigned_role == "Wizard")
light("<span class='notice'>Holy shit, did [user] just manage to light their [name] with [W], with only moderate eyebrow singing?</span>")
else
to_chat(user, "<span class='warning'>Unsure which end of the wand is which, [user] fails to light [name] with [W].</span>")
explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
F.charges--
//can't think of any other way to update the overlays :<
user.update_inv_wear_mask()
user.update_inv_l_hand()
@@ -135,7 +147,7 @@ LIGHTERS ARE IN LIGHTERS.DM
M.unEquip(src, 1)
qdel(src)
return
flags &= ~NOREACT // allowing reagents to react after being lit
reagents.set_reacting(TRUE)
reagents.handle_reactions()
icon_state = icon_on
item_state = icon_on
@@ -205,9 +217,9 @@ LIGHTERS ARE IN LIGHTERS.DM
var/random_reagent = pick("fuel","saltpetre","synaptizine","green_vomit","potass_iodide","msg","lexorin","mannitol","spaceacillin","cryoxadone","holywater","tea","egg","haloperidol","mutagen","omnizine","carpet","aranesp","cryostylane","chocolate","bilk","cheese","rum","blood","charcoal","coffee","ectoplasm","space_drugs","milk","mutadone","antihol","teporone","insulin","salbutamol","toxin")
reagents.add_reagent(random_reagent, 10)
/obj/item/clothing/mask/cigarette/joint
name = "joint"
desc = "A roll of ambrosium vulgaris wrapped in a thin paper. Dude."
/obj/item/clothing/mask/cigarette/rollie
name = "rollie"
desc = "A roll of dried plant matter wrapped in thin paper."
icon_state = "spliffoff"
icon_on = "spliffon"
icon_off = "spliffoff"
@@ -217,35 +229,21 @@ LIGHTERS ARE IN LIGHTERS.DM
smoketime = 180
chem_volume = 50
/obj/item/clothing/mask/cigarette/joint/New()
/obj/item/clothing/mask/cigarette/rollie/New()
..()
var/list/jointnames = list("joint","doobie","spliff","blunt")
name = pick(jointnames)
src.pixel_x = rand(-5.0, 5)
src.pixel_y = rand(-5.0, 5)
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
/obj/item/clothing/mask/cigarette/joint/deus
desc = "A roll of ambrosium deus wrapped in a thin paper. Dude."
/obj/item/weapon/cigbutt/roach
name = "roach"
desc = "A manky old roach."
desc = "A manky old roach, or for non-stoners, a used rollup."
icon_state = "roach"
/obj/item/weapon/cigbutt/roach/New()
..()
src.pixel_x = rand(-5.0, 5)
src.pixel_y = rand(-5.0, 5)
/obj/item/clothing/mask/cigarette/handroll
name = "hand-rolled cigarette"
desc = "A roll of tobacco and nicotine, freshly rolled by hand."
icon_state = "hr_cigoff"
item_state = "hr_cigoff"
icon_on = "hr_cigon" //Note - these are in masks.dmi not in cigarette.dmi
icon_off = "hr_cigoff"
type_butt = /obj/item/weapon/cigbutt
chem_volume = 50
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
////////////
// CIGARS //
@@ -287,7 +285,7 @@ LIGHTERS ARE IN LIGHTERS.DM
desc = "A manky old cigarette butt."
icon = 'icons/obj/clothing/masks.dmi'
icon_state = "cigbutt"
w_class = 1
w_class = WEIGHT_CLASS_TINY
throwforce = 1
/obj/item/weapon/cigbutt/New()
@@ -386,51 +384,30 @@ LIGHTERS ARE IN LIGHTERS.DM
///////////
//ROLLING//
///////////
obj/item/weapon/rollingpaper
/obj/item/weapon/rollingpaper
name = "rolling paper"
desc = "A thin piece of paper used to make fine smokeables."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "cig_paper"
w_class = 1
w_class = WEIGHT_CLASS_TINY
obj/item/weapon/rollingpaperpack
name = "rolling paper pack"
desc = "A pack of Nanotrasen brand rolling papers."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "cig_paper_pack"
w_class = 1
var/papers = 25
obj/item/weapon/rollingpaperpack/attack_self(mob/user)
if(papers > 1)
var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper()
user.put_in_inactive_hand(P)
to_chat(user, "You take a paper out of the pack.")
papers --
else
var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper()
user.put_in_inactive_hand(P)
to_chat(user, "You take the last paper out of the pack, and throw the pack away.")
qdel(src)
/obj/item/weapon/rollingpaperpack/MouseDrop(atom/over_object)
var/mob/M = usr
if(M.restrained() || M.stat)
/obj/item/weapon/rollingpaper/afterattack(atom/target, mob/user, proximity)
if(!proximity)
return
if(over_object == M)
M.put_in_hands(src)
else if(istype(over_object, /obj/screen))
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)
/obj/item/weapon/rollingpaperpack/examine(mob/user)
..(user)
to_chat(user, "There are [src.papers] left")
if(istype(target, /obj/item/weapon/reagent_containers/food/snacks/grown))
var/obj/item/weapon/reagent_containers/food/snacks/grown/O = target
if(O.dry)
user.unEquip(target, 1)
user.unEquip(src, 1)
var/obj/item/clothing/mask/cigarette/rollie/R = new /obj/item/clothing/mask/cigarette/rollie(user.loc)
R.chem_volume = target.reagents.total_volume
target.reagents.trans_to(R, R.chem_volume)
user.put_in_active_hand(R)
to_chat(user, "<span class='notice'>You roll the [target.name] into a rolling paper.</span>")
R.desc = "Dried [target.name] rolled up in a thin piece of paper."
qdel(target)
qdel(src)
else
to_chat(user, "<span class='warning'>You need to dry this first!</span>")
else
..()
+7 -24
View File
@@ -5,26 +5,6 @@
* Bike Horns
*/
/*
* Banana Peals
*/
/obj/item/weapon/bananapeel
name = "banana peel"
desc = "A peel from a banana."
icon = 'icons/obj/items.dmi'
icon_state = "banana_peel"
item_state = "banana_peel"
w_class = 1
throwforce = 0
throw_speed = 4
throw_range = 20
/obj/item/weapon/bananapeel/Crossed(AM as mob|obj)
if(istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
M.slip("banana peel", 4, 2)
/*
* Soap
*/
@@ -33,7 +13,7 @@
var/mob/living/carbon/M = AM
M.slip("soap", 4, 2)
/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity)
/obj/item/weapon/soap/afterattack(atom/target, mob/user, proximity)
if(!proximity) return
//I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing.
//So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
@@ -57,11 +37,14 @@
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
target.clean_blood()
if(istype(target, /turf/simulated))
var/turf/simulated/T = target
T.dirt = 0
return
/obj/item/weapon/soap/attack(mob/target as mob, mob/user as mob)
if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" )
user.visible_message("\red \the [user] washes \the [target]'s mouth out with [src.name]!")
user.visible_message("<span class='warning'>\the [user] washes \the [target]'s mouth out with [src.name]!</span>")
return
..()
@@ -77,7 +60,7 @@
item_state = "bike_horn"
hitsound = null
throwforce = 3
w_class = 1
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 15
attack_verb = list("HONKED")
@@ -129,4 +112,4 @@
var/mob/living/carbon/human/H = M
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf)
continue
M.emote("flip")
M.emote("flip")
+16 -11
View File
@@ -3,7 +3,7 @@
desc = "A generic brand of lipstick."
icon = 'icons/obj/items.dmi'
icon_state = "lipstick"
w_class = 1
w_class = WEIGHT_CLASS_TINY
var/colour = "red"
var/open = 0
@@ -86,7 +86,9 @@
icon = 'icons/obj/items.dmi'
icon_state = "razor"
flags = CONDUCT
w_class = 1
w_class = WEIGHT_CLASS_TINY
usesound = 'sound/items/Welder2.ogg'
toolspeed = 1
/obj/item/weapon/razor/attack(mob/living/carbon/M as mob, mob/user as mob)
if(ishuman(M))
@@ -106,24 +108,24 @@
if(H == user) //shaving yourself
user.visible_message("<span class='notice'>[user] starts to shave their facial hair with \the [src].</span>", \
"<span class='notice'>You take a moment shave your facial hair with \the [src].</span>")
if(do_after(user, 50, target = H))
if(do_after(user, 50 * toolspeed, target = H))
user.visible_message("<span class='notice'>[user] shaves his facial hair clean with the [src].</span>", \
"<span class='notice'>You finish shaving with the [src]. Fast and clean!</span>")
C.f_style = "Shaved"
H.update_fhair()
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
playsound(src.loc, usesound, 20, 1)
else
var/turf/user_loc = user.loc
var/turf/H_loc = H.loc
user.visible_message("<span class='danger'>[user] tries to shave [H]'s facial hair with \the [src].</span>", \
"<span class='warning'>You start shaving [H]'s facial hair.</span>")
if(do_after(user, 50, target = H))
if(do_after(user, 50 * toolspeed, target = H))
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("<span class='danger'>[user] shaves off [H]'s facial hair with \the [src].</span>", \
"<span class='notice'>You shave [H]'s facial hair clean off.</span>")
C.f_style = "Shaved"
H.update_fhair()
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
playsound(src.loc, usesound, 20, 1)
if(user.zone_sel.selecting == "head")
if(!get_location_accessible(H, "head"))
to_chat(user, "<span class='warning'>The headgear is in the way.</span>")
@@ -134,28 +136,31 @@
if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead")
to_chat(user, "<span class='notice'>There is not enough hair left to shave...</span>")
return
if(M.get_species() == "Skrell")
to_chat(user, "<span class='warning'>Your razor isn't going to cut through tentacles.</span>")
return
if(H == user) //shaving yourself
user.visible_message("<span class='warning'>[user] starts to shave their head with \the [src].</span>", \
"<span class='warning'>You start to shave your head with \the [src].</span>")
if(do_after(user, 50, target = H))
if(do_after(user, 50 * toolspeed, target = H))
user.visible_message("<span class='notice'>[user] shaves his head with the [src].</span>", \
"<span class='notice'>You finish shaving with the [src].</span>")
C.h_style = "Skinhead"
H.update_hair()
playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
playsound(src.loc, usesound, 40, 1)
else
var/turf/user_loc = user.loc
var/turf/H_loc = H.loc
user.visible_message("<span class='danger'>[user] tries to shave [H]'s head with \the [src]!</span>", \
"<span class='warning'>You start shaving [H]'s head.</span>")
if(do_after(user, 50, target = H))
if(do_after(user, 50 * toolspeed, target = H))
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("<span class='danger'>[user] shaves [H]'s head bald with \the [src]!</span>", \
"<span class='warning'>You shave [H]'s head bald.</span>")
C.h_style = "Skinhead"
H.update_hair()
playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
playsound(src.loc, usesound, 40, 1)
else
..()
else
..()
..()
+3 -3
View File
@@ -9,7 +9,7 @@
icon_state = "gavelhammer"
force = 5.0
throwforce = 6.0
w_class = 2
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("bashed", "battered", "judged", "whacked")
burn_state = FLAMMABLE
@@ -25,7 +25,7 @@
icon_state = "gavelblock"
force = 2.0
throwforce = 2.0
w_class = 1
w_class = WEIGHT_CLASS_TINY
burn_state = FLAMMABLE
/obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params)
@@ -33,4 +33,4 @@
playsound(loc, 'sound/items/gavel.ogg', 100, 1)
user.visible_message("<span class='warning'>[user] strikes \the [src] with \the [I].</span>")
else
return
return
+22 -22
View File
@@ -9,7 +9,7 @@
slot_flags = SLOT_BACK
force = 5
throwforce = 6
w_class = 4
w_class = WEIGHT_CLASS_BULKY
origin_tech = "biotech=4"
actions_types = list(/datum/action/item_action/toggle_paddles)
species_fit = list("Vox")
@@ -172,12 +172,8 @@
if(on)
var/M = get(paddles, /mob)
remove_paddles(M)
if(paddles)
qdel(paddles)
paddles = null
if(bcell)
qdel(bcell)
bcell = null
QDEL_NULL(paddles)
QDEL_NULL(bcell)
return ..()
/obj/item/weapon/defibrillator/proc/deductcharge(var/chrgdeductamt)
@@ -210,7 +206,7 @@
desc = "A belt-equipped defibrillator that can be rapidly deployed."
icon_state = "defibcompact"
item_state = "defibcompact"
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
slot_flags = SLOT_BELT
origin_tech = "biotech=4"
@@ -255,7 +251,8 @@
item_state = "defibpaddles"
force = 0
throwforce = 6
w_class = 4
w_class = WEIGHT_CLASS_BULKY
toolspeed = 1
var/revivecost = 1000
var/cooldown = 0
@@ -333,8 +330,8 @@
H.updatehealth() //forces health update before next life tick
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
if(!H.heart_attack && (prob(10) || defib.combat)) // Your heart explodes.
H.heart_attack = 1
if(!H.undergoing_cardiac_arrest() && (prob(10) || defib.combat)) // Your heart explodes.
H.set_heartattack(TRUE)
add_logs(user, M, "stunned", object="defibrillator")
defib.deductcharge(revivecost)
cooldown = 1
@@ -346,7 +343,7 @@
user.visible_message("<span class='warning'>[user] begins to place [src] on [M.name]'s chest.</span>", "<span class='warning'>You begin to place [src] on [M.name]'s chest.</span>")
busy = 1
update_icon()
if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("<span class='notice'>[user] places [src] on [M.name]'s chest.</span>", "<span class='warning'>You place [src] on [M.name]'s chest.</span>")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
@@ -362,7 +359,7 @@
var/tloss = 600 //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, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
for(var/obj/item/carried_item in H.contents)
if(istype(carried_item, /obj/item/clothing/suit/space))
if(!defib.combat)
@@ -371,7 +368,7 @@
busy = 0
update_icon()
return
if(H.heart_attack)
if(H.undergoing_cardiac_arrest())
if(!H.get_int_organ(/obj/item/organ/internal/heart) && !H.get_int_organ(/obj/item/organ/internal/brain/slime)) //prevents defibing someone still alive suffering from a heart attack attack if they lack a heart
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Failed to pick up any heart electrical activity.</span>")
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
@@ -379,7 +376,7 @@
update_icon()
return
else
H.heart_attack = 0
H.set_heartattack(FALSE)
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)
@@ -396,7 +393,7 @@
M.visible_message("<span class='warning'>[M]'s body convulses a bit.")
playsound(get_turf(src), "bodyfall", 50, 1)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
for(var/obj/item/organ/external/O in H.organs)
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)))
@@ -424,6 +421,7 @@
else if(ghost)
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed.</span>")
@@ -448,12 +446,13 @@
icon_state = "defibpaddles0"
item_state = "defibpaddles0"
force = 0
w_class = 4
w_class = WEIGHT_CLASS_BULKY
var/revivecost = 1000
var/cooldown = 0
var/busy = 0
var/safety = 1
flags = NODROP
toolspeed = 1
/obj/item/weapon/borg_defib/attack(mob/M, mob/user)
var/tobehealed
@@ -475,8 +474,8 @@
H.adjustStaminaLoss(50)
H.Weaken(5)
H.updatehealth() //forces health update before next life tick
if(!H.heart_attack && prob(10)) // Your heart explodes.
H.heart_attack = 1
if(!H.undergoing_cardiac_arrest() && prob(10)) // Your heart explodes.
H.set_heartattack(TRUE)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
add_logs(user, M, "stunned", object="defibrillator")
@@ -494,7 +493,7 @@
user.visible_message("<span class='warning'>[user] begins to place [src] on [M.name]'s chest.</span>", "<span class='warning'>You begin to place [src] on [M.name]'s chest.</span>")
busy = 1
update_icon()
if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("<span class='notice'>[user] places [src] on [M.name]'s chest.</span>", "<span class='warning'>You place [src] on [M.name]'s chest.</span>")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
@@ -510,13 +509,13 @@
var/tloss = 600 //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, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
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)
var/health = H.health
M.visible_message("<span class='warning'>[M]'s body convulses a bit.")
playsound(get_turf(src), "bodyfall", 50, 1)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
for(var/obj/item/organ/external/O in H.organs)
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))
@@ -546,6 +545,7 @@
else if(ghost)
user.visible_message("<span class='notice'>[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("<span class='warning'>[user] buzzes: Resuscitation failed.</span>")

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