mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-26 14:39:58 +01:00
Merge remote-tracking branch 'upstream/master' into airlocking
Conflicts: _maps/map_files/MetaStation/MetaStation.v41F.dmm code/game/objects/structures/door_assembly.dm
This commit is contained in:
@@ -72,7 +72,7 @@
|
||||
|
||||
//Wrapper procs that handle sanity and user feedback
|
||||
/obj/proc/user_buckle_mob(mob/living/M, mob/user)
|
||||
if(!user.Adjacent(M) || user.restrained() || user.lying || user.stat)
|
||||
if(!user.Adjacent(M) || user.lying || user.incapacitated())
|
||||
return
|
||||
|
||||
add_fingerprint(user)
|
||||
@@ -88,7 +88,7 @@
|
||||
M.visible_message(\
|
||||
"<span class='warning'>[M.name] is buckled to [src] by [user.name]!</span>",\
|
||||
"<span class='danger'>You are buckled to [src] by [user.name]!</span>",\
|
||||
"<span class='italics'>You heat metal clanking.</span>")
|
||||
"<span class='italics'>You hear metal clanking.</span>")
|
||||
|
||||
/obj/proc/user_unbuckle_mob(mob/user)
|
||||
var/mob/living/M = unbuckle_mob()
|
||||
|
||||
@@ -419,7 +419,7 @@
|
||||
return
|
||||
|
||||
var/mob/living/carbon/C = AM
|
||||
if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST)
|
||||
if(C.stat == CONSCIOUS && C.getorgan(/obj/item/organ/internal/body_egg/alien_embryo))
|
||||
return
|
||||
|
||||
Burst(0)
|
||||
|
||||
@@ -58,14 +58,14 @@
|
||||
for(var/obj/O in range(0,src))
|
||||
if(O.type == src.type)
|
||||
continue
|
||||
reagents.reaction(O, TOUCH, fraction)
|
||||
reagents.reaction(O, VAPOR, fraction)
|
||||
var/hit = 0
|
||||
for(var/mob/living/L in range(0,src))
|
||||
hit += foam_mob(L)
|
||||
if(hit)
|
||||
lifetime++ //this is so the decrease from mobs hit and the natural decrease don't cumulate.
|
||||
var/T = get_turf(src)
|
||||
reagents.reaction(T, TOUCH, fraction)
|
||||
reagents.reaction(T, VAPOR, fraction)
|
||||
|
||||
if(--amount < 0)
|
||||
return
|
||||
@@ -77,7 +77,7 @@
|
||||
if(!istype(L))
|
||||
return 0
|
||||
var/fraction = 1/initial(lifetime)
|
||||
reagents.reaction(L, TOUCH, fraction)
|
||||
reagents.reaction(L, VAPOR, fraction)
|
||||
lifetime--
|
||||
return 1
|
||||
|
||||
|
||||
@@ -156,10 +156,10 @@
|
||||
for(var/obj/O in range(1,src))
|
||||
if(O.type == src.type)
|
||||
continue
|
||||
reagents.reaction(O, TOUCH, fraction)
|
||||
reagents.reaction(O, VAPOR, fraction)
|
||||
|
||||
for(var/turf/T in range(1,src))
|
||||
reagents.reaction(T, TOUCH, fraction)
|
||||
reagents.reaction(T, VAPOR, fraction)
|
||||
|
||||
var/hit = 0
|
||||
for(var/mob/living/L in range(1,src))
|
||||
@@ -173,7 +173,7 @@
|
||||
if(!istype(M))
|
||||
return 0
|
||||
var/fraction = 1/initial(lifetime)
|
||||
reagents.reaction(M, TOUCH, fraction)
|
||||
reagents.reaction(M, VAPOR, fraction)
|
||||
lifetime--
|
||||
return 1
|
||||
|
||||
|
||||
@@ -1,11 +1,5 @@
|
||||
//TODO: Flash range does nothing currently
|
||||
|
||||
//A very crude linear approximatiaon of pythagoras theorem.
|
||||
/proc/cheap_pythag(dx, dy)
|
||||
dx = abs(dx); dy = abs(dy);
|
||||
if(dx>=dy) return dx + (0.5*dy) //The longest side add half the shortest side approximates the hypotenuse
|
||||
else return dy + (0.5*dx)
|
||||
|
||||
/proc/trange(Dist=0,turf/Center=null)//alternative to range (ONLY processes turfs and thus less intensive)
|
||||
if(Center==null) return
|
||||
|
||||
@@ -41,6 +35,7 @@
|
||||
if(!epicenter) return
|
||||
|
||||
var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range)
|
||||
var/list/cached_exp_block = list()
|
||||
|
||||
if(adminlog)
|
||||
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])")
|
||||
@@ -87,24 +82,31 @@
|
||||
var/y0 = epicenter.y
|
||||
var/z0 = epicenter.z
|
||||
|
||||
for(var/turf/T in trange(max_range, epicenter))
|
||||
var/list/affected_turfs = trange(max_range, epicenter)
|
||||
|
||||
var/dist = cheap_pythag(T.x - x0,T.y - y0)
|
||||
if(config.reactionary_explosions)
|
||||
for(var/turf/T in affected_turfs) // we cache the explosion block rating of every turf in the explosion area
|
||||
cached_exp_block[T] = 0
|
||||
if(T.density && T.explosion_block)
|
||||
cached_exp_block[T] += T.explosion_block
|
||||
|
||||
for(var/obj/machinery/door/D in T)
|
||||
if(D.density && D.explosion_block)
|
||||
cached_exp_block[T] += D.explosion_block
|
||||
|
||||
for(var/obj/structure/window/W in T)
|
||||
if(W.reinf && W.fulltile)
|
||||
cached_exp_block[T] += W.explosion_block
|
||||
|
||||
for(var/turf/T in affected_turfs)
|
||||
|
||||
var/dist = cheap_hypotenuse(T.x, T.y, x0, y0)
|
||||
|
||||
if(config.reactionary_explosions)
|
||||
var/turf/Trajectory = T
|
||||
while(Trajectory != epicenter)
|
||||
Trajectory = get_step_towards(Trajectory, epicenter)
|
||||
if(Trajectory.density && Trajectory.explosion_block)
|
||||
dist += Trajectory.explosion_block
|
||||
|
||||
for(var/obj/machinery/door/D in Trajectory)
|
||||
if(D.density && D.explosion_block)
|
||||
dist += D.explosion_block
|
||||
|
||||
for(var/obj/structure/window/W in Trajectory)
|
||||
if(W.reinf && W.fulltile)
|
||||
dist += W.explosion_block
|
||||
dist += cached_exp_block[Trajectory]
|
||||
|
||||
var/flame_dist = 0
|
||||
var/throw_dist = dist
|
||||
@@ -196,7 +198,7 @@
|
||||
var/list/wipe_colours = list()
|
||||
for(var/turf/T in trange(max_range, epicenter))
|
||||
wipe_colours += T
|
||||
var/dist = cheap_pythag(T.x - x0, T.y - y0)
|
||||
var/dist = cheap_hypotenuse(T.x, T.y, x0, y0)
|
||||
|
||||
if(newmode == "Yes")
|
||||
var/turf/TT = T
|
||||
|
||||
@@ -450,7 +450,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
|
||||
var/melting_threshold = 100
|
||||
if(meltingpwr <= melting_threshold) // so a single unit can't melt items. You need 5.1+ unit for fluoro and 10.1+ for sulphuric
|
||||
return
|
||||
|
||||
for(var/V in armor)
|
||||
if(armor[V] > 0)
|
||||
.-- //it survives the acid...
|
||||
|
||||
@@ -1,32 +1,78 @@
|
||||
// APC HULL
|
||||
/obj/item/wallframe
|
||||
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT*2)
|
||||
flags = CONDUCT
|
||||
origin_tech = "materials=1;engineering=1"
|
||||
item_state = "syringe_kit"
|
||||
w_class = 2
|
||||
var/result_path
|
||||
var/inverse = 0
|
||||
// For inverse dir frames like light fixtures.
|
||||
|
||||
/obj/item/apc_frame
|
||||
/obj/item/wallframe/proc/try_build(turf/on_wall)
|
||||
if(get_dist(on_wall,usr)>1)
|
||||
return
|
||||
var/ndir = get_dir(on_wall, usr)
|
||||
if(!(ndir in cardinal))
|
||||
return
|
||||
var/turf/loc = get_turf(usr)
|
||||
var/area/A = loc.loc
|
||||
if(!istype(loc, /turf/simulated/floor))
|
||||
usr << "<span class='warning'>You cannot place [src] on this spot!</span>"
|
||||
return
|
||||
if(A.requires_power == 0 || istype(A, /area/space))
|
||||
usr << "<span class='warning'>You cannot place [src] in this area!</span>"
|
||||
return
|
||||
if(gotwallitem(loc, ndir, inverse*2))
|
||||
usr << "<span class='warning'>There's already an item on this wall!</span>"
|
||||
return
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/wallframe/proc/attach(turf/on_wall)
|
||||
if(result_path)
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
|
||||
usr.visible_message("[usr.name] attaches [src] to the wall.",
|
||||
"<span class='notice'>You attach [src] to the wall.</span>",
|
||||
"<span class='italics'>You hear clicking.</span>")
|
||||
var/ndir = get_dir(on_wall,usr)
|
||||
if(inverse)
|
||||
ndir = turn(ndir, 180)
|
||||
|
||||
var/obj/O = new result_path(get_turf(usr), ndir, 1)
|
||||
transfer_fingerprints_to(O)
|
||||
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/wallframe/attackby(obj/item/weapon/W, mob/user, params)
|
||||
..()
|
||||
var/metal_amt = round(materials[MAT_METAL]/MINERAL_MATERIAL_AMOUNT)
|
||||
var/glass_amt = round(materials[MAT_GLASS]/MINERAL_MATERIAL_AMOUNT)
|
||||
|
||||
if (istype(W, /obj/item/weapon/wrench) && (metal_amt || glass_amt))
|
||||
user << "<span class='notice'>You dismantle [src].</span>"
|
||||
if(metal_amt)
|
||||
new /obj/item/stack/sheet/metal(get_turf(src), metal_amt)
|
||||
if(glass_amt)
|
||||
new /obj/item/stack/sheet/glass(get_turf(src), glass_amt)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
// APC HULL
|
||||
/obj/item/wallframe/apc
|
||||
name = "\improper APC frame"
|
||||
desc = "Used for repairing or building APCs"
|
||||
icon = 'icons/obj/apc_repair.dmi'
|
||||
icon_state = "apc_frame"
|
||||
flags = CONDUCT
|
||||
result_path = /obj/machinery/power/apc
|
||||
|
||||
/obj/item/apc_frame/attackby(obj/item/weapon/W, mob/user, params)
|
||||
..()
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 )
|
||||
qdel(src)
|
||||
|
||||
/obj/item/apc_frame/proc/try_build(turf/on_wall)
|
||||
if (get_dist(on_wall,usr)>1)
|
||||
return
|
||||
var/ndir = get_dir(usr,on_wall)
|
||||
if (!(ndir in cardinal))
|
||||
/obj/item/wallframe/apc/try_build(turf/on_wall)
|
||||
if(!..())
|
||||
return
|
||||
var/turf/loc = get_turf(usr)
|
||||
var/area/A = loc.loc
|
||||
if (!istype(loc, /turf/simulated/floor))
|
||||
usr << "<span class='warning'>APC cannot be placed on this spot!</span>"
|
||||
return
|
||||
if (A.requires_power == 0 || istype(A, /area/space))
|
||||
usr << "<span class='warning'>APC cannot be placed in this area!</span>"
|
||||
return
|
||||
if (A.get_apc())
|
||||
usr << "<span class='warning'>This area already has APC!</span>"
|
||||
return //only one APC per area
|
||||
@@ -39,5 +85,15 @@
|
||||
C.amount = 10
|
||||
usr << "<span class='notice'>You cut the cables and disassemble the unused power terminal.</span>"
|
||||
qdel(T)
|
||||
new /obj/machinery/power/apc(loc, ndir, 1)
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/weapon/electronics
|
||||
desc = "Looks like a circuit. Probably is."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "door_electronics"
|
||||
item_state = "electronic"
|
||||
flags = CONDUCT
|
||||
w_class = 2
|
||||
origin_tech = "engineering=2;programming=1"
|
||||
materials = list(MAT_METAL=50, MAT_GLASS=50)
|
||||
@@ -65,9 +65,6 @@
|
||||
..()
|
||||
if (tagged)
|
||||
overlays += "bodybag_label"
|
||||
else
|
||||
overlays.Cut()
|
||||
|
||||
|
||||
/obj/structure/closet/body_bag/close()
|
||||
if(..())
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
if(expansion)
|
||||
qdel(expansion)
|
||||
expansion = null
|
||||
del(src)
|
||||
qdel(src)
|
||||
//Easier to just call del() than this nonsense
|
||||
// ya no, del() takes 0.8ds to run on avg. this takes less than 0.01
|
||||
get_cameras()
|
||||
|
||||
@@ -244,10 +244,10 @@
|
||||
for (var/obj/item/holotape/P in cur)
|
||||
if(P.icon_state == icon_dir)
|
||||
N = 0
|
||||
del(P)
|
||||
qdel(P)
|
||||
cur = get_step(cur,dir[i])
|
||||
|
||||
del(src)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
#undef MAX_TAPE_RANGE
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
var/stop_bleeding = 0
|
||||
var/self_delay = 50
|
||||
|
||||
/obj/item/stack/medical/attack(mob/living/carbon/M, mob/user)
|
||||
/obj/item/stack/medical/attack(mob/living/M, mob/user)
|
||||
|
||||
if(M.stat == 2)
|
||||
var/t_him = "it"
|
||||
@@ -25,8 +25,8 @@
|
||||
user << "<span class='danger'>\The [M] is dead, you cannot help [t_him]!</span>"
|
||||
return
|
||||
|
||||
if(!istype(M))
|
||||
user << "<span class='danger'>You don't know how to apply \the [src] to [M]...</span>"
|
||||
if(!istype(M, /mob/living/carbon) && !istype(M, /mob/living/simple_animal))
|
||||
user << "<span class='danger'>You don't know how to apply \the [src] to [M]!</span>"
|
||||
return 1
|
||||
|
||||
if(!user.IsAdvancedToolUser())
|
||||
@@ -48,7 +48,18 @@
|
||||
return
|
||||
|
||||
if(user)
|
||||
if(M != user)
|
||||
if (M != user)
|
||||
if (istype(M, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/critter = M
|
||||
if (!(critter.healable))
|
||||
user << "<span class='notice'> You cannot use [src] on [M]!</span>"
|
||||
return
|
||||
else if (critter.health == critter.maxHealth)
|
||||
user << "<span class='notice'> [M] is at full health.</span>"
|
||||
return
|
||||
else if(src.heal_brute < 1)
|
||||
user << "<span class='notice'> [src] won't help [M] at all.</span>"
|
||||
return
|
||||
user.visible_message("<span class='green'>[user] applies [src] on [M].</span>", "<span class='green'>You apply [src] on [M].</span>")
|
||||
else
|
||||
var/t_himself = "itself"
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!H.gloves)
|
||||
if(!H.gloves && !(PIERCEIMMUNE in H.dna.species.specflags)) // golems, etc
|
||||
H << "<span class='warning'>[src] cuts into your hand!</span>"
|
||||
var/organ = (H.hand ? "l_" : "r_") + "arm"
|
||||
var/obj/item/organ/limb/affecting = H.get_organ(organ)
|
||||
|
||||
@@ -33,12 +33,13 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
|
||||
new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
|
||||
new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \
|
||||
new/datum/stack_recipe("small light fixture frame", /obj/item/light_fixture_frame/small, 1), \
|
||||
new/datum/stack_recipe("light fixture frame", /obj/item/wallframe/light_fixture, 2), \
|
||||
new/datum/stack_recipe("small light fixture frame", /obj/item/wallframe/light_fixture/small, 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
|
||||
new/datum/stack_recipe("air alarm frame", /obj/item/alarm_frame, 2), \
|
||||
new/datum/stack_recipe("fire alarm frame", /obj/item/firealarm_frame, 2), \
|
||||
new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2), \
|
||||
new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/alarm, 2), \
|
||||
new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2), \
|
||||
new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
@@ -357,7 +357,7 @@ RCD
|
||||
activate()
|
||||
var/obj/machinery/door/airlock/T = new airlock_type( A )
|
||||
|
||||
T.electronics = new/obj/item/weapon/airlock_electronics( src.loc )
|
||||
T.electronics = new/obj/item/weapon/electronics/airlock( src.loc )
|
||||
|
||||
if(conf_access)
|
||||
T.electronics.conf_access = conf_access.Copy()
|
||||
|
||||
@@ -5,7 +5,7 @@ CONTAINS:
|
||||
RPD
|
||||
*/
|
||||
#define PIPE_BINARY 0
|
||||
#define PIPE_BENT 1
|
||||
#define PIPE_BENDABLE 1
|
||||
#define PIPE_TRINARY 2
|
||||
#define PIPE_TRIN_M 3
|
||||
#define PIPE_UNARY 4
|
||||
@@ -24,14 +24,14 @@ RPD
|
||||
var/id=-1
|
||||
var/categoryId = CATEGORY_ATMOS
|
||||
var/dir=SOUTH
|
||||
var/dirtype=PIPE_BINARY
|
||||
var/dirtype = PIPE_BENDABLE
|
||||
var/icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi'
|
||||
var/icon_state=""
|
||||
var/selected=0
|
||||
|
||||
/datum/pipe_info/New(pid,direction,dt)
|
||||
src.id=pid
|
||||
src.icon_state=pipeID2State[pid+1]
|
||||
src.icon_state=pipeID2State["[pid]"]
|
||||
src.dir=direction
|
||||
src.dirtype=dt
|
||||
|
||||
@@ -81,8 +81,8 @@ var/global/list/disposalpipeID2State=list(
|
||||
//find these defines in code\game\machinery\pipe\consruction.dm
|
||||
var/global/list/RPD_recipes=list(
|
||||
"Regular Pipes" = list(
|
||||
"Pipe" = new /datum/pipe_info(PIPE_SIMPLE_STRAIGHT, 1, PIPE_BINARY),
|
||||
"Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE_BENT, 5, PIPE_BENT),
|
||||
"Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 1, PIPE_BENDABLE),
|
||||
//"Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE, 5, PIPE_BENT),
|
||||
"Manifold" = new /datum/pipe_info(PIPE_MANIFOLD, 1, PIPE_TRINARY),
|
||||
"Manual Valve" = new /datum/pipe_info(PIPE_MVALVE, 1, PIPE_BINARY),
|
||||
"Digital Valve" = new /datum/pipe_info(PIPE_DVALVE, 1, PIPE_BINARY),
|
||||
@@ -101,19 +101,19 @@ var/global/list/RPD_recipes=list(
|
||||
// "Injector" = new /datum/pipe_info(PIPE_INJECTOR, 1, PIPE_UNARY),
|
||||
),
|
||||
"Heat Exchange" = list(
|
||||
"Pipe" = new /datum/pipe_info(PIPE_HE_STRAIGHT, 1, PIPE_BINARY),
|
||||
"Bent Pipe" = new /datum/pipe_info(PIPE_HE_BENT, 5, PIPE_BENT),
|
||||
"Pipe" = new /datum/pipe_info(PIPE_HE, 1, PIPE_BENDABLE),
|
||||
//"Bent Pipe" = new /datum/pipe_info(PIPE_HE, 5, PIPE_BENT),
|
||||
"Junction" = new /datum/pipe_info(PIPE_JUNCTION, 1, PIPE_UNARY),
|
||||
"Heat Exchanger" = new /datum/pipe_info(PIPE_HEAT_EXCHANGE, 1, PIPE_UNARY),
|
||||
),
|
||||
"Disposal Pipes" = list(
|
||||
"Pipe" = new /datum/pipe_info/disposal(DISP_PIPE_STRAIGHT, PIPE_BINARY),
|
||||
"Bent Pipe" = new /datum/pipe_info/disposal(DISP_PIPE_BENT, PIPE_TRINARY),
|
||||
"Junction" = new /datum/pipe_info/disposal(DISP_JUNCTION, PIPE_TRINARY),
|
||||
"Junction" = new /datum/pipe_info/disposal(DISP_JUNCTION, PIPE_TRINARY),
|
||||
"Y-Junction" = new /datum/pipe_info/disposal(DISP_YJUNCTION, PIPE_TRINARY),
|
||||
"Trunk" = new /datum/pipe_info/disposal(DISP_END_TRUNK, PIPE_TRINARY),
|
||||
"Bin" = new /datum/pipe_info/disposal(DISP_END_BIN, PIPE_QUAD),
|
||||
"Outlet" = new /datum/pipe_info/disposal(DISP_END_OUTLET, PIPE_UNARY),
|
||||
"Bin" = new /datum/pipe_info/disposal(DISP_END_BIN, PIPE_QUAD),
|
||||
"Outlet" = new /datum/pipe_info/disposal(DISP_END_OUTLET, PIPE_UNARY),
|
||||
"Chute" = new /datum/pipe_info/disposal(DISP_END_CHUTE, PIPE_UNARY),
|
||||
"Sort Junction" = new /datum/pipe_info/disposal(DISP_SORTJUNCTION, PIPE_TRINARY),
|
||||
)
|
||||
@@ -261,14 +261,20 @@ var/global/list/RPD_recipes=list(
|
||||
<a href="?src=\ref[src];setdir=4; flipped=0" title="horizontal">↔</a>
|
||||
</p>
|
||||
"}
|
||||
if(PIPE_BENT) // Bent, N-W, N-E etc
|
||||
|
||||
if(PIPE_BENDABLE) // Bent, N-W, N-E etc
|
||||
if(preview)
|
||||
user << browse_rsc(new /icon(preview, dir=NORTH), "vertical.png")
|
||||
user << browse_rsc(new /icon(preview, dir=EAST), "horizontal.png")
|
||||
user << browse_rsc(new /icon(preview, dir=NORTHWEST), "nw.png")
|
||||
user << browse_rsc(new /icon(preview, dir=NORTHEAST), "ne.png")
|
||||
user << browse_rsc(new /icon(preview, dir=SOUTHWEST), "sw.png")
|
||||
user << browse_rsc(new /icon(preview, dir=SOUTHEAST), "se.png")
|
||||
|
||||
dirsel += "<p>"
|
||||
dirsel += render_dir_img(1,"vertical.png","Vertical")
|
||||
dirsel += render_dir_img(4,"horizontal.png","Horizontal")
|
||||
dirsel += "<br />"
|
||||
dirsel += render_dir_img(9,"nw.png","West to North")
|
||||
dirsel += render_dir_img(5,"ne.png","North to East")
|
||||
dirsel += "<br />"
|
||||
@@ -278,6 +284,9 @@ var/global/list/RPD_recipes=list(
|
||||
else
|
||||
dirsel+={"
|
||||
<p>
|
||||
<a href="?src=\ref[src];setdir=1; flipped=0" title="vertical">↕</a>
|
||||
<a href="?src=\ref[src];setdir=4; flipped=0" title="horizontal">↔</a>
|
||||
<br />
|
||||
<a href="?src=\ref[src];setdir=9; flipped=0" title="West to North">╝</a>
|
||||
<a href="?src=\ref[src];setdir=5; flipped=0" title="North to East">╚</a>
|
||||
<br />
|
||||
@@ -349,7 +358,7 @@ var/global/list/RPD_recipes=list(
|
||||
<a href="?src=\ref[src];setdir=10; flipped=1" title="South, East, North">╠</a>
|
||||
</p>
|
||||
"}
|
||||
if(PIPE_UNARY) // Unary
|
||||
if(PIPE_UNARY) // Stuff with four directions - includes pumps etc.
|
||||
if(preview)
|
||||
user << browse_rsc(new /icon(preview, dir=NORTH), "n.png")
|
||||
user << browse_rsc(new /icon(preview, dir=EAST), "e.png")
|
||||
@@ -471,7 +480,7 @@ var/global/list/RPD_recipes=list(
|
||||
show_menu(usr)
|
||||
|
||||
if(href_list["makepipe"])
|
||||
p_type = text2num(href_list["makepipe"])
|
||||
p_type = text2path(href_list["makepipe"])
|
||||
p_dir = text2num(href_list["dir"])
|
||||
p_conntype = text2num(href_list["type"])
|
||||
p_class = ATMOS_MODE
|
||||
|
||||
@@ -437,7 +437,7 @@
|
||||
else if ((tplus > tlimit) || !H.getorgan(/obj/item/organ/internal/heart))
|
||||
failed = "<span class='warning'>[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return. Further attempts futile.</span>"
|
||||
else if(total_burn >= 180 || total_brute >= 180)
|
||||
failed = "<span class='warning'>[defib] buzzes: Resuscitation failed - Severe tissue damage detected.</span>"
|
||||
failed = "<span class='warning'>[defib] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile.</span>"
|
||||
else if(H.get_ghost() || !H.getorgan(/obj/item/organ/internal/brain))
|
||||
failed = "<span class='warning'>[defib] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful.</span>"
|
||||
|
||||
@@ -480,4 +480,4 @@
|
||||
update_icon()
|
||||
else
|
||||
user << "<span class='warning'>You need to target your patient's chest with [src]!</span>"
|
||||
return
|
||||
return
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
..()
|
||||
|
||||
/obj/item/weapon/c4/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] activates the [src.name] and holds it above his head! It looks like \he's going out with a bang!</span>")
|
||||
user.visible_message("<span class='suicide'>[user] activates the [src.name] and holds it above \his head! It looks like \he's going out with a bang!</span>")
|
||||
var/message_say = "FOR NO RAISIN!"
|
||||
if(user.mind)
|
||||
if(user.mind.special_role)
|
||||
|
||||
@@ -83,3 +83,11 @@
|
||||
/obj/item/weapon/implantcase/weapons_auth/New()
|
||||
imp = new /obj/item/weapon/implant/weapons_auth(src)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/implantcase/adrenaline
|
||||
name = "implant case - 'Adrenaline'"
|
||||
desc = "A glass case containing an adrenaline implant."
|
||||
|
||||
/obj/item/weapon/implantcase/adrenaline/New()
|
||||
imp = new /obj/item/weapon/implant/adrenalin(src)
|
||||
..()
|
||||
|
||||
@@ -25,9 +25,6 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A)
|
||||
if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1))
|
||||
A.clean_blood()
|
||||
A.thermite = 0
|
||||
var/turf/simulated/floor/F = A
|
||||
if(istype(F))
|
||||
F.dirt = 0
|
||||
for(var/obj/effect/O in A)
|
||||
if(is_cleanable(O))
|
||||
qdel(O)
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
slot_flags = SLOT_BACK //ERROOOOO
|
||||
max_w_class = 3
|
||||
max_combined_w_class = 21
|
||||
storage_slots = 21
|
||||
burn_state = 0 //Burnable
|
||||
burntime = 20
|
||||
|
||||
@@ -109,7 +110,6 @@
|
||||
icon_state = "giftbag0"
|
||||
item_state = "giftbag"
|
||||
w_class = 4.0
|
||||
storage_slots = 20 //Can store a lot.
|
||||
max_w_class = 3
|
||||
max_combined_w_class = 60
|
||||
|
||||
@@ -270,7 +270,6 @@
|
||||
desc = "A very slim satchel that can easily fit into tight spaces."
|
||||
icon_state = "satchel-flat"
|
||||
w_class = 3 //Can fit in backpacks itself.
|
||||
storage_slots = 5
|
||||
max_combined_w_class = 15
|
||||
level = 1
|
||||
cant_hold = list(/obj/item/weapon/storage/backpack/satchel_flat) //muh recursive backpacks
|
||||
@@ -292,12 +291,11 @@
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag
|
||||
name = "dufflebag"
|
||||
desc = "A large dufflebag for holding extra things"
|
||||
desc = "A large dufflebag for holding extra things."
|
||||
icon_state = "duffle"
|
||||
item_state = "duffle"
|
||||
storage_slots = 9
|
||||
slowdown = 1
|
||||
max_combined_w_class = 27
|
||||
max_combined_w_class = 30
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie
|
||||
name = "suspicious looking dufflebag"
|
||||
@@ -342,7 +340,6 @@
|
||||
desc = "A suspicious looking dufflebag for holding surgery tools."
|
||||
icon_state = "duffle-syndiemed"
|
||||
item_state = "duffle-syndiemed"
|
||||
storage_slots = 10
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie/surgery/New()
|
||||
..()
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/salicyclic(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/salicyclic(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/oxandrolone(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/oxandrolone(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
|
||||
new /obj/item/device/healthanalyzer(src)
|
||||
return
|
||||
|
||||
@@ -196,7 +196,7 @@
|
||||
|
||||
New(obj/item/sample)
|
||||
if(!istype(sample))
|
||||
del(src)
|
||||
qdel(src)
|
||||
sample_object = sample
|
||||
number = 1
|
||||
|
||||
@@ -269,7 +269,7 @@
|
||||
|
||||
if(sum_w_class > max_combined_w_class)
|
||||
if(!stop_messages)
|
||||
usr << "<span class='warning'>[src] is full, make some space!</span>"
|
||||
usr << "<span class='warning'>[W] won't fit in [src], make some space!</span>"
|
||||
return 0
|
||||
|
||||
if(W.w_class >= w_class && (istype(W, /obj/item/weapon/storage)))
|
||||
@@ -481,4 +481,5 @@
|
||||
|
||||
/obj/item/weapon/storage/handle_atom_del(atom/A)
|
||||
if(A in contents)
|
||||
remove_from_storage(A,null)
|
||||
usr = null
|
||||
remove_from_storage(A, loc)
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
/obj/item/weapon/tank/Destroy()
|
||||
if(air_contents)
|
||||
del(air_contents)
|
||||
qdel(air_contents)
|
||||
|
||||
SSobj.processing.Remove(src)
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
/datum/barsign/emergencyrumparty
|
||||
name = "The Emergency Rum Party"
|
||||
icon = "emergencyrumparty"
|
||||
desc = "Still serving drinks that were banned years ago."
|
||||
desc = "Recently relicensed after a long closure."
|
||||
|
||||
/datum/barsign/combocafe
|
||||
name = "The Combo Cafe"
|
||||
@@ -276,7 +276,7 @@
|
||||
/datum/barsign/thenet
|
||||
name = "The Net"
|
||||
icon = "thenet"
|
||||
desc = "The sea of drinkformation." //you couldn't come up with something better?
|
||||
desc = "You just seem to get caught up in it for hours."
|
||||
|
||||
|
||||
/datum/barsign/hiddensigns
|
||||
|
||||
@@ -166,6 +166,7 @@
|
||||
|
||||
/obj/structure/closet/ex_act(severity, target)
|
||||
contents_explosion(severity, target)
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
dump_contents()
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
new /obj/item/weapon/storage/toolbox/electrical(src)
|
||||
new /obj/item/weapon/storage/toolbox/electrical(src)
|
||||
new /obj/item/weapon/storage/toolbox/electrical(src)
|
||||
new /obj/item/weapon/module/power_control(src)
|
||||
new /obj/item/weapon/module/power_control(src)
|
||||
new /obj/item/weapon/module/power_control(src)
|
||||
new /obj/item/weapon/electronics/apc(src)
|
||||
new /obj/item/weapon/electronics/apc(src)
|
||||
new /obj/item/weapon/electronics/apc(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/mineral = null
|
||||
var/typetext = ""
|
||||
var/icontext = ""
|
||||
var/obj/item/weapon/airlock_electronics/electronics = null
|
||||
var/obj/item/weapon/electronics/airlock/electronics = null
|
||||
var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed
|
||||
var/glass_type = /obj/machinery/door/airlock/glass
|
||||
var/created_name = null
|
||||
@@ -540,7 +540,7 @@
|
||||
src.state = 0
|
||||
src.name = "secured airlock assembly"
|
||||
|
||||
else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 )
|
||||
else if(istype(W, /obj/item/weapon/electronics/airlock) && state == 1 )
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
|
||||
user.visible_message("[user] installs the electronics into the airlock assembly.", \
|
||||
"<span class='notice'>You start to install electronics into the airlock assembly...</span>")
|
||||
@@ -568,9 +568,9 @@
|
||||
user << "<span class='notice'>You remove the airlock electronics.</span>"
|
||||
src.state = 1
|
||||
src.name = "wired airlock assembly"
|
||||
var/obj/item/weapon/airlock_electronics/ae
|
||||
var/obj/item/weapon/electronics/airlock/ae
|
||||
if (!electronics)
|
||||
ae = new/obj/item/weapon/airlock_electronics( src.loc )
|
||||
ae = new/obj/item/weapon/electronics/airlock( src.loc )
|
||||
else
|
||||
ae = electronics
|
||||
electronics = null
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(15))
|
||||
if (prob(40))
|
||||
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
|
||||
new remains(loc)
|
||||
qdel(src)
|
||||
|
||||
@@ -79,7 +79,8 @@
|
||||
|
||||
/obj/structure/grille/attack_animal(var/mob/living/simple_animal/M)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
if(M.melee_damage_upper == 0) return
|
||||
if(M.melee_damage_upper == 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
|
||||
return
|
||||
M.do_attack_animation(src)
|
||||
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
|
||||
M.visible_message("<span class='warning'>[M] smashes against [src].</span>", \
|
||||
|
||||
@@ -181,9 +181,6 @@
|
||||
var/turf/tile = loc
|
||||
if(isturf(tile))
|
||||
tile.clean_blood()
|
||||
if (istype(tile, /turf/simulated/floor))
|
||||
var/turf/simulated/floor/F = tile
|
||||
F.dirt = 0
|
||||
for(var/A in tile)
|
||||
if(istype(A, /obj/effect))
|
||||
if(is_cleanable(A))
|
||||
@@ -238,14 +235,6 @@
|
||||
step(src, direction)
|
||||
update_mob()
|
||||
handle_rotation()
|
||||
if(istype(src.loc, /turf/simulated))
|
||||
var/turf/simulated/T = src.loc
|
||||
if(T.wet == 2) //Lube! Fall off!
|
||||
playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
|
||||
buckled_mob.Stun(7)
|
||||
buckled_mob.Weaken(7)
|
||||
unbuckle_mob()
|
||||
step(src, dir)
|
||||
move_delay = 1
|
||||
spawn(2)
|
||||
move_delay = 0
|
||||
@@ -300,11 +289,6 @@
|
||||
buckled_mob.pixel_x = -12
|
||||
buckled_mob.pixel_y = 7
|
||||
|
||||
|
||||
/obj/structure/stool/bed/chair/janicart/bullet_act(obj/item/projectile/Proj)
|
||||
if(buckled_mob)
|
||||
buckled_mob.bullet_act(Proj)
|
||||
|
||||
/obj/item/key
|
||||
name = "key"
|
||||
desc = "A small grey key."
|
||||
|
||||
@@ -176,10 +176,11 @@ var/global/list/crematoriums = new/list()
|
||||
for(var/mob/living/M in contents)
|
||||
if (M.stat!=2)
|
||||
M.emote("scream")
|
||||
//Logging for this causes runtimes resulting in the cremator locking up. Commenting it out until that's figured out.
|
||||
//M.attack_log += "\[[time_stamp()]\] Has been cremated by <b>[user]/[user.ckey]</b>" //No point in this when the mob's about to be deleted
|
||||
user.attack_log +="\[[time_stamp()]\] Cremated <b>[M]/[M.ckey]</b>"
|
||||
log_attack("\[[time_stamp()]\] <b>[user]/[user.ckey]</b> cremated <b>[M]/[M.ckey]</b>")
|
||||
if(user)
|
||||
user.attack_log +="\[[time_stamp()]\] Cremated <b>[M]/[M.ckey]</b>"
|
||||
log_attack("\[[time_stamp()]\] <b>[user]/[user.ckey]</b> cremated <b>[M]/[M.ckey]</b>")
|
||||
else
|
||||
log_attack("\[[time_stamp()]\] <b>UNKNOWN</b> cremated <b>[M]/[M.ckey]</b>")
|
||||
M.death(1)
|
||||
M.ghostize()
|
||||
qdel(M)
|
||||
@@ -194,26 +195,6 @@ var/global/list/crematoriums = new/list()
|
||||
update_icon()
|
||||
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //you horrible people
|
||||
|
||||
/*
|
||||
Crematorium Switch
|
||||
*/
|
||||
/obj/machinery/crema_switch/attack_hand(mob/user)
|
||||
if(src.allowed(usr))
|
||||
for (var/obj/structure/bodycontainer/crematorium/C in crematoriums)
|
||||
if (C.id != id)
|
||||
continue
|
||||
|
||||
C.cremate(user)
|
||||
else
|
||||
usr << "<span class='danger'>Access denied.</span>"
|
||||
return
|
||||
|
||||
/obj/machinery/crema_switch/attackby(obj/item/W, mob/user, params)
|
||||
if(W.GetID())
|
||||
attack_hand(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/*
|
||||
* Generic Tray
|
||||
@@ -286,4 +267,4 @@ Crematorium Switch
|
||||
if(locate(/obj/structure/table) in get_turf(mover))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -24,14 +24,12 @@
|
||||
/obj/structure/stool/bed/Move(atom/newloc, direct) //Some bed children move
|
||||
. = ..()
|
||||
if(buckled_mob)
|
||||
buckled_mob.buckled = null
|
||||
if(!buckled_mob.Move(loc, direct))
|
||||
loc = buckled_mob.loc //we gotta go back
|
||||
last_move = buckled_mob.last_move
|
||||
inertia_dir = last_move
|
||||
buckled_mob.inertia_dir = last_move
|
||||
. = 0
|
||||
buckled_mob.buckled = src
|
||||
|
||||
/obj/structure/stool/bed/Process_Spacemove(movement_dir = 0)
|
||||
if(buckled_mob)
|
||||
|
||||
@@ -11,11 +11,13 @@
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
if (prob(70))
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
if (prob(50))
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
dir = NORTH
|
||||
|
||||
var/ini_dir
|
||||
var/obj/item/weapon/airlock_electronics/electronics = null
|
||||
var/obj/item/weapon/electronics/airlock/electronics = null
|
||||
var/created_name = null
|
||||
|
||||
//Vars to help with the icon's name
|
||||
@@ -189,7 +189,7 @@
|
||||
name = "anchored windoor assembly"
|
||||
|
||||
//Adding airlock electronics for access. Step 6 complete.
|
||||
else if(istype(W, /obj/item/weapon/airlock_electronics))
|
||||
else if(istype(W, /obj/item/weapon/electronics/airlock))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
|
||||
@@ -219,7 +219,7 @@
|
||||
return
|
||||
user << "<span class='notice'>You remove the airlock electronics.</span>"
|
||||
name = "wired windoor assembly"
|
||||
var/obj/item/weapon/airlock_electronics/ae
|
||||
var/obj/item/weapon/electronics/airlock/ae
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.loc = loc
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
|
||||
var/mob/living/simple_animal/M = user
|
||||
M.do_attack_animation(src)
|
||||
if(M.melee_damage_upper <= 0)
|
||||
if(M.melee_damage_upper <= 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
|
||||
return
|
||||
|
||||
attack_generic(M, M.melee_damage_upper)
|
||||
|
||||
Reference in New Issue
Block a user