mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-21 19:17:50 +01:00
radio-emp
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
. = ..()
|
||||
|
||||
@@ -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>")
|
||||
@@ -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..."
|
||||
|
||||
@@ -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)
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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//////////
|
||||
///////////////////////////////
|
||||
|
||||
@@ -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]°C ([M.bodytemperature*1.8-459.67]°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]°C ([M.bodytemperature*1.8-459.67]°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]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
|
||||
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
..()*/
|
||||
..()*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user