mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-20 03:26:37 +01:00
Merge branch 'master' into aro-tether-wip
# Conflicts: # code/ZAS/_docs.dm # code/game/area/areas.dm # code/game/objects/explosion.dm # code/modules/holodeck/HolodeckControl.dm # code/modules/mob/living/say.dm
This commit is contained in:
@@ -152,7 +152,7 @@
|
||||
if(passed_smoke)
|
||||
smoke = passed_smoke
|
||||
else
|
||||
smoke = PoolOrNew(/obj/effect/effect/smoke/chem, location)
|
||||
smoke = new /obj/effect/effect/smoke/chem(location)
|
||||
|
||||
if(chemholder.reagents.reagent_list.len)
|
||||
chemholder.reagents.trans_to_obj(smoke, chemholder.reagents.total_volume / dist, copy = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents
|
||||
@@ -169,7 +169,7 @@
|
||||
qdel(src)
|
||||
|
||||
/datum/effect/effect/system/smoke_spread/chem/spores/spawnSmoke(var/turf/T, var/icon/I, var/dist = 1)
|
||||
var/obj/effect/effect/smoke/chem/spores = PoolOrNew(/obj/effect/effect/smoke/chem, location)
|
||||
var/obj/effect/effect/smoke/chem/spores = new /obj/effect/effect/smoke/chem(location)
|
||||
spores.name = "cloud of [seed.seed_name] [seed.seed_noun]"
|
||||
..(T, I, dist, spores)
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
F.amount += amount
|
||||
return
|
||||
|
||||
F = PoolOrNew(/obj/effect/effect/foam, list(location, metal))
|
||||
F = new /obj/effect/effect/foam(location, metal)
|
||||
F.amount = amount
|
||||
|
||||
if(!metal) // don't carry other chemicals if a metal foam
|
||||
|
||||
@@ -222,7 +222,7 @@ var/global/list/image/splatter_cache=list()
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
var/obj/effect/decal/cleanable/blood/b = PoolOrNew(/obj/effect/decal/cleanable/blood/splatter, src.loc)
|
||||
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
|
||||
b.basecolor = src.basecolor
|
||||
b.update_icon()
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ steam.start() -- spawns the effect
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/steam/steam = PoolOrNew(/obj/effect/effect/steam, src.location)
|
||||
var/obj/effect/effect/steam/steam = new /obj/effect/effect/steam(src.location)
|
||||
var/direction
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
@@ -146,7 +146,7 @@ steam.start() -- spawns the effect
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/sparks/sparks = PoolOrNew(/obj/effect/effect/sparks, src.location)
|
||||
var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location)
|
||||
src.total_sparks++
|
||||
var/direction
|
||||
if(src.cardinals)
|
||||
@@ -283,7 +283,7 @@ steam.start() -- spawns the effect
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/smoke/smoke = PoolOrNew(smoke_type, src.location)
|
||||
var/obj/effect/effect/smoke/smoke = new smoke_type(src.location)
|
||||
src.total_smoke++
|
||||
smoke.color = I
|
||||
var/direction = src.direction
|
||||
@@ -334,7 +334,7 @@ steam.start() -- spawns the effect
|
||||
var/turf/T = get_turf(src.holder)
|
||||
if(T != src.oldposition)
|
||||
if(isturf(T))
|
||||
var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, src.oldposition)
|
||||
var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
|
||||
src.oldposition = T
|
||||
I.set_dir(src.holder.dir)
|
||||
flick("ion_fade", I)
|
||||
@@ -380,7 +380,7 @@ steam.start() -- spawns the effect
|
||||
src.processing = 0
|
||||
spawn(0)
|
||||
if(src.number < 3)
|
||||
var/obj/effect/effect/steam/I = PoolOrNew(/obj/effect/effect/steam, src.oldposition)
|
||||
var/obj/effect/effect/steam/I = new /obj/effect/effect/steam(src.oldposition)
|
||||
src.number++
|
||||
src.oldposition = get_turf(holder)
|
||||
I.set_dir(src.holder.dir)
|
||||
@@ -420,7 +420,7 @@ steam.start() -- spawns the effect
|
||||
|
||||
start()
|
||||
if (amount <= 2)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(2, 1, location)
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gib = null
|
||||
|
||||
if(sparks)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(2, 1, get_turf(location)) // Not sure if it's safe to pass an arbitrary object to set_up, todo
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
call(src,triggerproc)(M)
|
||||
|
||||
/obj/effect/mine/proc/triggerrad(obj)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
obj:radiation += 50
|
||||
@@ -39,7 +39,7 @@
|
||||
if(ismob(obj))
|
||||
var/mob/M = obj
|
||||
M.Stun(30)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
spawn(0)
|
||||
@@ -67,7 +67,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggerkick(obj)
|
||||
var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
qdel(obj:client)
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
O = loc
|
||||
|
||||
for(var/i=0, i<num, i++)
|
||||
var/spiderling = PoolOrNew(/obj/effect/spider/spiderling, list(src.loc, src))
|
||||
var/spiderling = new /obj/effect/spider/spiderling(src.loc, src)
|
||||
if(O)
|
||||
O.implants += spiderling
|
||||
qdel(src)
|
||||
@@ -148,7 +148,7 @@
|
||||
|
||||
/obj/effect/spider/spiderling/proc/die()
|
||||
visible_message("<span class='alert'>[src] dies!</span>")
|
||||
PoolOrNew(/obj/effect/decal/cleanable/spiderling_remains, src.loc)
|
||||
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/spiderling/healthcheck()
|
||||
|
||||
@@ -15,7 +15,7 @@ proc/empulse(turf/epicenter, first_range, second_range, third_range, fourth_rang
|
||||
log_game("EMP with size ([first_range], [second_range], [third_range], [fourth_range]) in area [epicenter.loc.name] ")
|
||||
|
||||
if(first_range > 1)
|
||||
var/obj/effect/overlay/pulse = PoolOrNew(/obj/effect/overlay, epicenter)
|
||||
var/obj/effect/overlay/pulse = new /obj/effect/overlay(epicenter)
|
||||
pulse.icon = 'icons/effects/effects.dmi'
|
||||
pulse.icon_state = "emppulse"
|
||||
pulse.name = "emp pulse"
|
||||
|
||||
@@ -44,6 +44,16 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
|
||||
far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
|
||||
M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5)
|
||||
|
||||
var/close = range(world.view+round(devastation_range,1), epicenter)
|
||||
// to all distanced mobs play a different sound
|
||||
for(var/mob/M in world)
|
||||
if(M.z == epicenter.z)
|
||||
if(!(M in close))
|
||||
// check if the mob can hear
|
||||
if(M.ear_deaf <= 0 || !M.ear_deaf)
|
||||
if(!istype(M.loc,/turf/space))
|
||||
M << 'sound/effects/explosionfar.ogg'
|
||||
|
||||
if(adminlog)
|
||||
message_admins("Explosion with [shaped ? "shaped" : "non-shaped"] size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[epicenter.x];Y=[epicenter.y];Z=[epicenter.z]'>JMP</a>)")
|
||||
log_game("Explosion with [shaped ? "shaped" : "non-shaped"] size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ")
|
||||
@@ -80,8 +90,8 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
|
||||
var/atom/movable/AM = atom_movable
|
||||
if(AM && AM.simulated) AM.ex_act(dist)
|
||||
|
||||
T.ex_act(dist)
|
||||
|
||||
T.ex_act(dist)
|
||||
|
||||
var/took = (world.timeofday-start)/10
|
||||
//You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare
|
||||
if(Debug2) world.log << "## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds."
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
var/zoomdevicename = null //name used for message when binoculars/scope is used
|
||||
var/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars.
|
||||
|
||||
var/embed_chance = -1 //-1 makes it calculate embed chance, 0 won't embed, and 100 will always embed
|
||||
var/embed_chance = -1 //0 won't embed, and 100 will always embed
|
||||
|
||||
var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc.
|
||||
|
||||
@@ -79,12 +79,12 @@
|
||||
var/list/sprite_sheets_obj = list()
|
||||
|
||||
/obj/item/New()
|
||||
if(embed_chance == -1)
|
||||
if(sharp)
|
||||
embed_chance = force/w_class
|
||||
else
|
||||
embed_chance = force/(w_class*3)
|
||||
..()
|
||||
if(embed_chance < 0)
|
||||
if(sharp)
|
||||
embed_chance = max(5, round(force/w_class))
|
||||
else
|
||||
embed_chance = max(5, round(force/(w_class*3)))
|
||||
|
||||
/obj/item/equipped()
|
||||
..()
|
||||
|
||||
@@ -77,14 +77,14 @@
|
||||
/obj/structure/closet/body_bag/MouseDrop(over_object, src_location, over_location)
|
||||
..()
|
||||
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
|
||||
if(!ishuman(usr)) return
|
||||
if(!ishuman(usr)) return 0
|
||||
if(opened) return 0
|
||||
if(contents.len) return 0
|
||||
visible_message("[usr] folds up the [src.name]")
|
||||
new item_path(get_turf(src))
|
||||
var/folded = new item_path(get_turf(src))
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
return
|
||||
return folded
|
||||
|
||||
/obj/structure/closet/body_bag/relaymove(mob/user,direction)
|
||||
if(src.loc != get_turf(src))
|
||||
@@ -115,34 +115,43 @@
|
||||
|
||||
/obj/item/bodybag/cryobag
|
||||
name = "stasis bag"
|
||||
desc = "A folded, non-reusable bag designed to prevent additional damage to an occupant, especially useful if short on time or in \
|
||||
a hostile enviroment."
|
||||
desc = "A non-reusable plastic bag designed to slow down bodily functions such as circulation and breathing, \
|
||||
especially useful if short on time or in a hostile enviroment."
|
||||
icon = 'icons/obj/cryobag.dmi'
|
||||
icon_state = "bodybag_folded"
|
||||
item_state = "bodybag_cryo_folded"
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
var/obj/item/weapon/reagent_containers/syringe/syringe
|
||||
|
||||
/obj/item/bodybag/cryobag/attack_self(mob/user)
|
||||
var/obj/structure/closet/body_bag/cryobag/R = new /obj/structure/closet/body_bag/cryobag(user.loc)
|
||||
R.add_fingerprint(user)
|
||||
if(syringe)
|
||||
R.syringe = syringe
|
||||
syringe = null
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/closet/body_bag/cryobag
|
||||
name = "stasis bag"
|
||||
desc = "A non-reusable plastic bag designed to prevent additional damage to an occupant, especially useful if short on time or in \
|
||||
a hostile enviroment."
|
||||
desc = "A non-reusable plastic bag designed to slow down bodily functions such as circulation and breathing, \
|
||||
especially useful if short on time or in a hostile enviroment."
|
||||
icon = 'icons/obj/cryobag.dmi'
|
||||
item_path = /obj/item/bodybag/cryobag
|
||||
store_misc = 0
|
||||
store_items = 0
|
||||
var/used = 0
|
||||
var/obj/item/weapon/tank/tank = null
|
||||
var/stasis_level = 3 //Every 'this' life ticks are applied to the mob (when life_ticks%stasis_level == 1)
|
||||
var/obj/item/weapon/reagent_containers/syringe/syringe
|
||||
|
||||
/obj/structure/closet/body_bag/cryobag/New()
|
||||
tank = new /obj/item/weapon/tank/emergency/oxygen(null) //It's in nullspace to prevent ejection when the bag is opened.
|
||||
..()
|
||||
|
||||
/obj/structure/closet/body_bag/cryobag/Destroy()
|
||||
if(syringe)
|
||||
qdel(syringe)
|
||||
syringe = null
|
||||
qdel(tank)
|
||||
tank = null
|
||||
..()
|
||||
@@ -157,11 +166,19 @@
|
||||
O.desc = "Pretty useless now.."
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/closet/body_bag/cryobag/MouseDrop(over_object, src_location, over_location)
|
||||
. = ..()
|
||||
if(. && syringe)
|
||||
var/obj/item/bodybag/cryobag/folded = .
|
||||
folded.syringe = syringe
|
||||
syringe = null
|
||||
|
||||
/obj/structure/closet/body_bag/cryobag/Entered(atom/movable/AM)
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
H.in_stasis = 1
|
||||
H.Stasis(stasis_level)
|
||||
src.used = 1
|
||||
inject_occupant(H)
|
||||
|
||||
if(istype(AM, /obj/item/organ))
|
||||
var/obj/item/organ/O = AM
|
||||
@@ -173,7 +190,7 @@
|
||||
/obj/structure/closet/body_bag/cryobag/Exited(atom/movable/AM)
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
H.in_stasis = 0
|
||||
H.Stasis(0)
|
||||
|
||||
if(istype(AM, /obj/item/organ))
|
||||
var/obj/item/organ/O = AM
|
||||
@@ -187,10 +204,19 @@
|
||||
return tank.air_contents
|
||||
..()
|
||||
|
||||
/obj/structure/closet/body_bag/cryobag/proc/inject_occupant(var/mob/living/carbon/human/H)
|
||||
if(!syringe)
|
||||
return
|
||||
|
||||
if(H.reagents)
|
||||
syringe.reagents.trans_to_mob(H, 30, CHEM_BLOOD)
|
||||
|
||||
/obj/structure/closet/body_bag/cryobag/examine(mob/user)
|
||||
..()
|
||||
if(Adjacent(user)) //The bag's rather thick and opaque from a distance.
|
||||
user << "<span class='info'>You peer into \the [src].</span>"
|
||||
if(syringe)
|
||||
user << "<span class='info'>It has a syringe added to it.</span>"
|
||||
for(var/mob/living/L in contents)
|
||||
L.examine(user)
|
||||
|
||||
@@ -202,5 +228,28 @@
|
||||
var/obj/item/device/healthanalyzer/analyzer = W
|
||||
for(var/mob/living/L in contents)
|
||||
analyzer.attack(L,user)
|
||||
|
||||
else if(istype(W,/obj/item/weapon/reagent_containers/syringe))
|
||||
if(syringe)
|
||||
to_chat(user,"<span class='warning'>\The [src] already has an injector! Remove it first.</span>")
|
||||
else
|
||||
var/obj/item/weapon/reagent_containers/syringe/syringe = W
|
||||
to_chat(user,"<span class='info'>You insert \the [syringe] into \the [src], and it locks into place.</span>")
|
||||
user.unEquip(syringe)
|
||||
src.syringe = syringe
|
||||
syringe.loc = null
|
||||
for(var/mob/living/carbon/human/H in contents)
|
||||
inject_occupant(H)
|
||||
break
|
||||
|
||||
else if(istype(W,/obj/item/weapon/screwdriver))
|
||||
if(syringe)
|
||||
if(used)
|
||||
to_chat(user,"<span class='warning'>The injector cannot be removed now that the stasis bag has been used!</span>")
|
||||
else
|
||||
syringe.forceMove(src.loc)
|
||||
to_chat(user,"<span class='info'>You pry \the [syringe] out of \the [src].</span>")
|
||||
syringe = null
|
||||
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -1105,6 +1105,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
if(M.stat == DEAD && M.client && (M.is_preference_enabled(/datum/client_preference/ghost_ears))) // src.client is so that ghosts don't have to listen to mice
|
||||
if(istype(M, /mob/new_player))
|
||||
continue
|
||||
if(M.forbid_seeing_deadchat)
|
||||
continue
|
||||
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>")
|
||||
|
||||
if(!conversations.Find("\ref[P]"))
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
qdel(active_dummy)
|
||||
active_dummy = null
|
||||
usr << "<span class='notice'>You deactivate the [src].</span>"
|
||||
var/obj/effect/overlay/T = PoolOrNew(/obj/effect/overlay, get_turf(src))
|
||||
var/obj/effect/overlay/T = new /obj/effect/overlay(get_turf(src))
|
||||
T.icon = 'icons/effects/effects.dmi'
|
||||
flick("emppulse",T)
|
||||
spawn(8) qdel(T)
|
||||
@@ -55,7 +55,7 @@
|
||||
playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
|
||||
var/obj/O = new saved_item(src)
|
||||
if(!O) return
|
||||
var/obj/effect/dummy/chameleon/C = PoolOrNew(/obj/effect/dummy/chameleon, usr.loc)
|
||||
var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(usr.loc)
|
||||
C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src)
|
||||
qdel(O)
|
||||
usr << "<span class='notice'>You activate the [src].</span>"
|
||||
|
||||
@@ -212,6 +212,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
|
||||
alert_called = 0
|
||||
update_icon()
|
||||
ui_interact(user)
|
||||
if(video_source)
|
||||
watch_video(user)
|
||||
|
||||
// Proc: MouseDrop()
|
||||
//Same thing PDAs do
|
||||
@@ -1041,7 +1043,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
|
||||
if(!Adjacent(user) || !video_source) return
|
||||
user.set_machine(video_source)
|
||||
user.reset_view(video_source)
|
||||
user << "<span class='notice'>Now viewing video session. To leave camera view: OOC -> Cancel Camera View</span>"
|
||||
to_chat(user,"<span class='notice'>Now viewing video session. To leave camera view, close the communicator window OR: OOC -> Cancel Camera View</span>")
|
||||
to_chat(user,"<span class='notice'>To return to an active video session, use the communicator in your hand.</span>")
|
||||
spawn(0)
|
||||
while(user.machine == video_source && (Adjacent(user) || loc == user))
|
||||
var/turf/T = get_turf(video_source)
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
singular_name = "advanced trauma kit"
|
||||
desc = "An advanced trauma kit for severe injuries."
|
||||
icon_state = "traumakit"
|
||||
heal_brute = 0
|
||||
heal_brute = 5
|
||||
origin_tech = list(TECH_BIO = 1)
|
||||
|
||||
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
@@ -213,7 +213,7 @@
|
||||
singular_name = "advanced burn kit"
|
||||
desc = "An advanced treatment kit for severe burns."
|
||||
icon_state = "burnkit"
|
||||
heal_burn = 0
|
||||
heal_burn = 5
|
||||
origin_tech = list(TECH_BIO = 1)
|
||||
|
||||
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
/obj/item/weapon/dice
|
||||
name = "d6"
|
||||
desc = "A dice with six sides."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "d66"
|
||||
w_class = ITEMSIZE_TINY
|
||||
var/sides = 6
|
||||
attack_verb = list("diced")
|
||||
|
||||
/obj/item/weapon/dice/New()
|
||||
icon_state = "[name][rand(1,sides)]"
|
||||
|
||||
/obj/item/weapon/dice/d4
|
||||
name = "d4"
|
||||
desc = "A dice with four sides."
|
||||
icon_state = "d44"
|
||||
sides = 4
|
||||
|
||||
/obj/item/weapon/dice/d8
|
||||
name = "d8"
|
||||
desc = "A dice with eight sides."
|
||||
icon_state = "d88"
|
||||
sides = 8
|
||||
|
||||
/obj/item/weapon/dice/d10
|
||||
name = "d10"
|
||||
desc = "A dice with ten sides."
|
||||
icon_state = "d1010"
|
||||
sides = 10
|
||||
|
||||
/obj/item/weapon/dice/d12
|
||||
name = "d12"
|
||||
desc = "A dice with twelve sides."
|
||||
icon_state = "d1212"
|
||||
sides = 12
|
||||
|
||||
/obj/item/weapon/dice/d20
|
||||
name = "d20"
|
||||
desc = "A dice with twenty sides."
|
||||
icon_state = "d2020"
|
||||
sides = 20
|
||||
|
||||
/obj/item/weapon/dice/d100
|
||||
name = "d100"
|
||||
desc = "A dice with ten sides. This one is for the tens digit."
|
||||
icon_state = "d10010"
|
||||
sides = 10
|
||||
|
||||
/obj/item/weapon/dice/attack_self(mob/user as mob)
|
||||
var/result = rand(1, sides)
|
||||
var/comment = ""
|
||||
if(sides == 20 && result == 20)
|
||||
comment = "Nat 20!"
|
||||
else if(sides == 20 && result == 1)
|
||||
comment = "Ouch, bad luck."
|
||||
icon_state = "[name][result]"
|
||||
user.visible_message("<span class='notice'>[user] has thrown [src]. It lands on [result]. [comment]</span>", \
|
||||
"<span class='notice'>You throw [src]. It lands on a [result]. [comment]</span>", \
|
||||
"<span class='notice'>You hear [src] landing on a [result]. [comment]</span>")
|
||||
@@ -107,7 +107,7 @@
|
||||
spawn(0)
|
||||
if(!src || !reagents.total_volume) return
|
||||
|
||||
var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(src))
|
||||
var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(src))
|
||||
var/turf/my_target
|
||||
if(a <= the_targets.len)
|
||||
my_target = the_targets[a]
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
if(ptank)
|
||||
ptank.loc = T
|
||||
ptank = null
|
||||
PoolOrNew(/obj/item/stack/rods, T)
|
||||
new /obj/item/stack/rods(T)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
/obj/item/weapon/grenade/smokebomb/New()
|
||||
..()
|
||||
src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad)
|
||||
src.smoke = new /datum/effect/effect/system/smoke_spread/bad()
|
||||
src.smoke.attach(src)
|
||||
|
||||
/obj/item/weapon/grenade/smokebomb/Destroy()
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
user << "<span class='danger'>You need to have a firm grip on [C] before you can put \the [src] on!</span>"
|
||||
|
||||
/obj/item/weapon/handcuffs/proc/can_place(var/mob/target, var/mob/user)
|
||||
if(user == target)
|
||||
return 1
|
||||
if(istype(user, /mob/living/silicon/robot))
|
||||
if(user.Adjacent(target))
|
||||
return 1
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
/obj/item/weapon/implant/reagent_generator
|
||||
name = "reagent generator implant"
|
||||
desc = "This is an implant that has attached storage and generates a reagent."
|
||||
implant_color = "r"
|
||||
var/datum/reagent/generated_reagent = null
|
||||
var/gen_amount = 2 //amount of reagent generated per process tick
|
||||
var/gen_cost = 0.5 //amount of nutrient taken from the host per process tick
|
||||
var/transfer_amount = 30 //amount transferred when using verb
|
||||
var/usable_volume = 120
|
||||
|
||||
var/list/empty_message = list("You feel as though your internal reagent implant is almost empty.")
|
||||
var/list/full_message = "You feel as though your internal reagent implant is full."
|
||||
var/list/emote_descriptor = list("tranfers something") //In format of [x] [emote_descriptor] into [container]
|
||||
var/list/self_emote_descriptor = list("transfer") //In format of You [self_emote_descriptor] some [generated_reagent] into [container]
|
||||
var/list/random_emote = list() //An emote the person with the implant may be forced to perform after a prob check, such as [X] meows.
|
||||
var/assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/New()
|
||||
..()
|
||||
create_reagents(usable_volume)
|
||||
|
||||
/obj/item/weapon/implanter/reagent_generator
|
||||
var/implant_type = /obj/item/weapon/implant/reagent_generator
|
||||
|
||||
/obj/item/weapon/implanter/reagent_generator/New()
|
||||
..()
|
||||
imp = new implant_type(src)
|
||||
update()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/implanted(mob/living/carbon/source)
|
||||
processing_objects += src
|
||||
to_chat(source, "<span class='notice'>You implant [source] with \the [src].</span>")
|
||||
source.verbs |= assigned_proc
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/process()
|
||||
var/before_gen
|
||||
if(imp_in && generated_reagent)
|
||||
before_gen = reagents.total_volume
|
||||
if(reagents.total_volume < reagents.maximum_volume)
|
||||
if(imp_in.nutrition >= gen_cost)
|
||||
do_generation()
|
||||
else
|
||||
return
|
||||
else
|
||||
imp_in.verbs -= assigned_proc
|
||||
return
|
||||
|
||||
if(reagents)
|
||||
if(reagents.total_volume == reagents.maximum_volume * 0.05)
|
||||
to_chat(imp_in, "<span class='notice'>[pick(empty_message)]</span>")
|
||||
else if(reagents.total_volume == reagents.maximum_volume && before_gen < reagents.maximum_volume)
|
||||
to_chat(imp_in, "<span class='warning'>[pick(full_message)]</span>")
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/proc/do_generation()
|
||||
imp_in.nutrition -= gen_cost
|
||||
reagents.add_reagent(generated_reagent, gen_amount)
|
||||
|
||||
/mob/living/carbon/human/proc/use_reagent_implant()
|
||||
set name = "Transfer From Reagent Implant"
|
||||
set desc = "Remove reagents from am internal reagent into a container."
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
do_reagent_implant(usr)
|
||||
|
||||
/mob/living/carbon/human/proc/do_reagent_implant(var/mob/living/carbon/human/user = usr)
|
||||
if(!isliving(user) || !user.canClick())
|
||||
return
|
||||
|
||||
if(user.incapacitated() || user.stat > CONSCIOUS)
|
||||
return
|
||||
|
||||
var/obj/item/weapon/reagent_containers/container = user.get_active_hand()
|
||||
if(!container)
|
||||
to_chat(user,"<span class='notice'>You need an open container to do this!</span>")
|
||||
return
|
||||
|
||||
|
||||
var/obj/item/weapon/implant/reagent_generator/rimplant
|
||||
for(var/I in src.contents)
|
||||
if(istype(I, /obj/item/weapon/implant/reagent_generator))
|
||||
rimplant = I
|
||||
break
|
||||
if(rimplant)
|
||||
if(container.reagents.total_volume < container.volume)
|
||||
var/container_name = container.name
|
||||
if(rimplant.reagents.trans_to(container, amount = rimplant.transfer_amount))
|
||||
user.visible_message("<span class='notice'>[usr] [pick(rimplant.emote_descriptor)] into \the [container_name].</span>",
|
||||
"<span class='notice'>You [pick(rimplant.self_emote_descriptor)] some [rimplant.generated_reagent] into \the [container_name].</span>")
|
||||
if(prob(5))
|
||||
src.visible_message("<span class='notice'>[src] [pick(rimplant.random_emote)].</span>") // M-mlem.
|
||||
if(rimplant.reagents.total_volume == rimplant.reagents.maximum_volume * 0.05)
|
||||
to_chat(src, "<span class='notice'>[pick(rimplant.empty_message)]</span>")
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
. = ..()
|
||||
|
||||
if(.)
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, user.loc)
|
||||
spark_system.start()
|
||||
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
new /obj/item/weapon/storage/pill_bottle/dylovene(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/tramadol(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/spaceacillin(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting(src)
|
||||
new /obj/item/stack/medical/splint(src)
|
||||
return
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
if (empty)
|
||||
return
|
||||
for(var/i = 1 to 8)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting(src)
|
||||
return
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,30 +1,3 @@
|
||||
/obj/item/weapon/storage/pill_bottle/dice //7d6
|
||||
name = "bag of dice"
|
||||
desc = "It's a small bag with dice inside."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "dicebag"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice/New()
|
||||
..()
|
||||
for(var/i = 1 to 7)
|
||||
new /obj/item/weapon/dice( src )
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice_nerd //DnD dice
|
||||
name = "bag of gaming dice"
|
||||
desc = "It's a small bag with gaming dice inside."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "magicdicebag"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice_nerd/New()
|
||||
..()
|
||||
new /obj/item/weapon/dice/d4( src )
|
||||
new /obj/item/weapon/dice( src )
|
||||
new /obj/item/weapon/dice/d8( src )
|
||||
new /obj/item/weapon/dice/d10( src )
|
||||
new /obj/item/weapon/dice/d12( src )
|
||||
new /obj/item/weapon/dice/d20( src )
|
||||
new /obj/item/weapon/dice/d100( src )
|
||||
|
||||
/*
|
||||
* Donut Box
|
||||
*/
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
new /obj/item/clothing/under/sl_suit(src)
|
||||
new /obj/item/clothing/under/rank/bartender(src)
|
||||
new /obj/item/clothing/under/rank/bartender(src)
|
||||
new /obj/item/clothing/under/rank/bartender/skirt(src)
|
||||
new /obj/item/clothing/under/dress/dress_saloon(src)
|
||||
new /obj/item/clothing/accessory/wcoat(src)
|
||||
new /obj/item/clothing/accessory/wcoat(src)
|
||||
@@ -97,16 +98,24 @@
|
||||
new /obj/item/clothing/under/lawyer/female(src)
|
||||
new /obj/item/clothing/under/lawyer/black(src)
|
||||
new /obj/item/clothing/under/lawyer/black(src)
|
||||
new /obj/item/clothing/under/lawyer/black/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/black/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/red(src)
|
||||
new /obj/item/clothing/under/lawyer/red(src)
|
||||
new /obj/item/clothing/under/lawyer/red/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/red/skirt(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/internalaffairs(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/internalaffairs(src)
|
||||
new /obj/item/clothing/under/lawyer/bluesuit(src)
|
||||
new /obj/item/clothing/under/lawyer/bluesuit(src)
|
||||
new /obj/item/clothing/under/lawyer/bluesuit/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/bluesuit/skirt(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src)
|
||||
new /obj/item/clothing/under/lawyer/purpsuit(src)
|
||||
new /obj/item/clothing/under/lawyer/purpsuit(src)
|
||||
new /obj/item/clothing/under/lawyer/purpsuit/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/purpsuit/skirt(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
@@ -119,5 +128,7 @@
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/under/lawyer/blue(src)
|
||||
new /obj/item/clothing/under/lawyer/blue(src)
|
||||
new /obj/item/clothing/under/lawyer/blue/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/blue/skirt(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
@@ -65,7 +65,9 @@
|
||||
new /obj/item/clothing/under/dress/dress_hr(src)
|
||||
new /obj/item/clothing/under/lawyer/female(src)
|
||||
new /obj/item/clothing/under/lawyer/black(src)
|
||||
new /obj/item/clothing/under/lawyer/black/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/red(src)
|
||||
new /obj/item/clothing/under/lawyer/red/skirt(src)
|
||||
new /obj/item/clothing/under/lawyer/oldman(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
@@ -74,6 +76,7 @@
|
||||
new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src)
|
||||
new /obj/item/clothing/head/caphat/hop(src)
|
||||
new /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit(src)
|
||||
new /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
new /obj/item/clothing/under/det/grey/waistcoat(src)
|
||||
new /obj/item/clothing/under/det/black(src)
|
||||
new /obj/item/clothing/under/det/black(src)
|
||||
new /obj/item/clothing/under/det/skirt(src)
|
||||
new /obj/item/clothing/under/det/corporate(src)
|
||||
new /obj/item/clothing/under/det/corporate(src)
|
||||
new /obj/item/clothing/suit/storage/det_trench(src)
|
||||
@@ -600,17 +601,25 @@
|
||||
..()
|
||||
new /obj/item/clothing/under/assistantformal(src)
|
||||
new /obj/item/clothing/under/suit_jacket/charcoal(src)
|
||||
new /obj/item/clothing/under/suit_jacket/charcoal/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/navy(src)
|
||||
new /obj/item/clothing/under/suit_jacket/navy/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/burgundy(src)
|
||||
new /obj/item/clothing/under/suit_jacket/burgundy/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/checkered(src)
|
||||
new /obj/item/clothing/under/suit_jacket/checkered/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/tan(src)
|
||||
new /obj/item/clothing/under/suit_jacket/tan/skirt(src)
|
||||
new /obj/item/clothing/under/sl_suit(src)
|
||||
new /obj/item/clothing/under/suit_jacket(src)
|
||||
new /obj/item/clothing/under/suit_jacket/female(src)
|
||||
new /obj/item/clothing/under/suit_jacket/female/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black/skirt(src)
|
||||
new /obj/item/clothing/under/suit_jacket/red(src)
|
||||
new /obj/item/clothing/under/suit_jacket/red/skirt(src)
|
||||
new /obj/item/clothing/under/scratch(src)
|
||||
new /obj/item/clothing/under/scratch/skirt(src)
|
||||
new /obj/item/weapon/storage/backpack/satchel(src)
|
||||
new /obj/item/weapon/storage/backpack/satchel(src)
|
||||
return
|
||||
@@ -637,5 +646,6 @@
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/captain(src)
|
||||
new /obj/item/clothing/head/beret/centcom/captain(src)
|
||||
new /obj/item/clothing/under/gimmick/rank/captain/suit(src)
|
||||
new /obj/item/clothing/under/gimmick/rank/captain/suit/skirt(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
return
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
if(iswirecutter(W))
|
||||
if(!shock(user, 100))
|
||||
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
|
||||
PoolOrNew(/obj/item/stack/rods, list(get_turf(src), destroyed ? 1 : 2))
|
||||
new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2)
|
||||
qdel(src)
|
||||
else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
|
||||
if(!shock(user, 90))
|
||||
@@ -152,7 +152,7 @@
|
||||
|
||||
else if(!(W.flags & CONDUCT) || !shock(user, 70))
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
user.do_attack_animation(src)
|
||||
user.do_attack_animation(src)
|
||||
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
@@ -170,11 +170,11 @@
|
||||
density = 0
|
||||
destroyed = 1
|
||||
update_icon()
|
||||
PoolOrNew(/obj/item/stack/rods, get_turf(src))
|
||||
new /obj/item/stack/rods(get_turf(src))
|
||||
|
||||
else
|
||||
if(health <= -6)
|
||||
PoolOrNew(/obj/item/stack/rods, get_turf(src))
|
||||
new /obj/item/stack/rods(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
if(WT.welding == 1)
|
||||
if(WT.remove_fuel(0, user))
|
||||
user << "<span class='notice'>Slicing lattice joints ...</span>"
|
||||
PoolOrNew(/obj/item/stack/rods, src.loc)
|
||||
new /obj/item/stack/rods(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
if (istype(C, /obj/item/stack/rods))
|
||||
|
||||
@@ -182,13 +182,13 @@
|
||||
spawn(50)
|
||||
if(src && on)
|
||||
ismist = 1
|
||||
mymist = PoolOrNew(/obj/effect/mist,loc)
|
||||
mymist = new /obj/effect/mist(loc)
|
||||
else
|
||||
ismist = 1
|
||||
mymist = PoolOrNew(/obj/effect/mist,loc)
|
||||
mymist = new /obj/effect/mist(loc)
|
||||
else if(ismist)
|
||||
ismist = 1
|
||||
mymist = PoolOrNew(/obj/effect/mist,loc)
|
||||
mymist = new /obj/effect/mist(loc)
|
||||
spawn(250)
|
||||
if(src && !on)
|
||||
qdel(mymist)
|
||||
|
||||
@@ -92,11 +92,11 @@
|
||||
index = 0
|
||||
while(index < 2)
|
||||
new shardtype(loc) //todo pooling?
|
||||
if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
|
||||
if(reinf) new /obj/item/stack/rods(loc)
|
||||
index++
|
||||
else
|
||||
new shardtype(loc) //todo pooling?
|
||||
if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
|
||||
if(reinf) new /obj/item/stack/rods(loc)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
/obj/effect/wingrille_spawn/proc/activate()
|
||||
if(activated) return
|
||||
if (!locate(/obj/structure/grille) in get_turf(src))
|
||||
var/obj/structure/grille/G = PoolOrNew(/obj/structure/grille, src.loc)
|
||||
var/obj/structure/grille/G = new /obj/structure/grille(src.loc)
|
||||
handle_grille_spawn(G)
|
||||
var/list/neighbours = list()
|
||||
for (var/dir in cardinal)
|
||||
@@ -49,7 +49,7 @@
|
||||
found_connection = 1
|
||||
qdel(W)
|
||||
if(!found_connection)
|
||||
var/obj/structure/window/new_win = PoolOrNew(win_path, src.loc)
|
||||
var/obj/structure/window/new_win = new win_path(src.loc)
|
||||
new_win.set_dir(dir)
|
||||
handle_window_spawn(new_win)
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user