Merge branch 'dev' of https://github.com/Baystation12/Baystation12 into 5/10/2015_bay_merge_attempt_two

Conflicts:
	code/game/turfs/simulated/floor.dm
	icons/mob/back.dmi
	maps/exodus-3.dmm
	polaris.dme
This commit is contained in:
Neerti
2015-05-10 04:21:37 -04:00
233 changed files with 12838 additions and 11596 deletions

View File

@@ -54,9 +54,6 @@
air2.volume = ATMOS_DEFAULT_VOLUME_FILTER air2.volume = ATMOS_DEFAULT_VOLUME_FILTER
air3.volume = ATMOS_DEFAULT_VOLUME_FILTER air3.volume = ATMOS_DEFAULT_VOLUME_FILTER
if(radio_controller)
initialize()
/obj/machinery/atmospherics/trinary/filter/update_icon() /obj/machinery/atmospherics/trinary/filter/update_icon()
if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter)) if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter))
icon_state = "m" icon_state = "m"

View File

@@ -73,9 +73,6 @@
if (!id_tag) if (!id_tag)
assign_uid() assign_uid()
id_tag = num2text(uid) id_tag = num2text(uid)
if(ticker && ticker.current_state == 3)//if the game is running
src.initialize()
src.broadcast_status()
/obj/machinery/atmospherics/unary/vent_pump/high_volume /obj/machinery/atmospherics/unary/vent_pump/high_volume
name = "Large Air Vent" name = "Large Air Vent"
@@ -259,11 +256,12 @@
/obj/machinery/atmospherics/unary/vent_pump/initialize() /obj/machinery/atmospherics/unary/vent_pump/initialize()
..() ..()
//some vents work his own spesial way //some vents work his own special way
radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null
radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null
if(frequency) if(frequency)
set_frequency(frequency) set_frequency(frequency)
src.broadcast_status()
/obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal) /obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal)
if(stat & (NOPOWER|BROKEN)) if(stat & (NOPOWER|BROKEN))

View File

@@ -42,9 +42,6 @@
if (!id_tag) if (!id_tag)
assign_uid() assign_uid()
id_tag = num2text(uid) id_tag = num2text(uid)
if(ticker && ticker.current_state == 3)//if the game is running
src.initialize()
src.broadcast_status()
/obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0) /obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0)
if(!check_icon_cache()) if(!check_icon_cache())
@@ -121,6 +118,7 @@
radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null
if (frequency) if (frequency)
set_frequency(frequency) set_frequency(frequency)
src.broadcast_status()
/obj/machinery/atmospherics/unary/vent_scrubber/process() /obj/machinery/atmospherics/unary/vent_scrubber/process()
..() ..()

View File

@@ -45,8 +45,6 @@ obj/machinery/atmospherics/pipe/zpipe/New()
initialize_directions = EAST initialize_directions = EAST
if(SOUTHWEST) if(SOUTHWEST)
initialize_directions = SOUTH initialize_directions = SOUTH
initialize()
obj/machinery/atmospherics/pipe/zpipe/hide(var/i) obj/machinery/atmospherics/pipe/zpipe/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated)) if(level == 1 && istype(loc, /turf/simulated))

View File

@@ -97,7 +97,7 @@
src.d_state = 1 src.d_state = 1
if(target) if(target)
var/obj/item/stack/rods/R = new /obj/item/stack/rods(target.loc) var/obj/item/stack/rods/R = PoolOrNew(/obj/item/stack/rods, target.loc)
R.amount = 2 R.amount = 2
qdel(Target) qdel(Target)

View File

@@ -50,7 +50,7 @@ atom/proc/c_airblock(turf/other)
#ifdef ZASDBG #ifdef ZASDBG
ASSERT(isturf(other)) ASSERT(isturf(other))
#endif #endif
return !CanPass(null, other, 0, 0) + 2*!CanPass(null, other, 1.5, 1) return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1))
turf/c_airblock(turf/other) turf/c_airblock(turf/other)

View File

@@ -154,7 +154,18 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
#ifdef ZASDBG #ifdef ZASDBG
var/updated = 0 var/updated = 0
#endif #endif
//defer updating of self-zone-blocked turfs until after all other turfs have been updated.
//this hopefully ensures that non-self-zone-blocked turfs adjacent to self-zone-blocked ones
//have valid zones when the self-zone-blocked turfs update.
var/list/deferred = list()
for(var/turf/T in updating) for(var/turf/T in updating)
//check if the turf is self-zone-blocked
if(T.c_airblock(T) & ZONE_BLOCKED)
deferred += T
continue
T.update_air_properties() T.update_air_properties()
T.post_update_air_properties() T.post_update_air_properties()
T.needs_air_update = 0 T.needs_air_update = 0
@@ -164,6 +175,15 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
#endif #endif
//sleep(1) //sleep(1)
for(var/turf/T in deferred)
T.update_air_properties()
T.post_update_air_properties()
T.needs_air_update = 0
#ifdef ZASDBG
T.overlays -= mark
updated++
#endif
#ifdef ZASDBG #ifdef ZASDBG
if(updated != updating.len) if(updated != updating.len)
tick_progress = "[updating.len - updated] tiles left unupdated." tick_progress = "[updating.len - updated] tiles left unupdated."
@@ -307,7 +327,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
/datum/controller/air_system/proc/mark_edge_sleeping(connection_edge/E) /datum/controller/air_system/proc/mark_edge_sleeping(connection_edge/E)
#ifdef ZASDBG #ifdef ZASDBG
ASSERT(istype(E) ASSERT(istype(E))
#endif #endif
if(E.sleeping) return if(E.sleeping) return
active_edges.Remove(E) active_edges.Remove(E)
@@ -315,7 +335,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
/datum/controller/air_system/proc/mark_edge_active(connection_edge/E) /datum/controller/air_system/proc/mark_edge_active(connection_edge/E)
#ifdef ZASDBG #ifdef ZASDBG
ASSERT(istype(E) ASSERT(istype(E))
#endif #endif
if(!E.sleeping) return if(!E.sleeping) return
active_edges.Add(E) active_edges.Add(E)

View File

@@ -1,255 +1,259 @@
/turf/simulated/var/zone/zone /turf/simulated/var/zone/zone
/turf/simulated/var/open_directions /turf/simulated/var/open_directions
/turf/var/needs_air_update = 0 /turf/var/needs_air_update = 0
/turf/var/datum/gas_mixture/air /turf/var/datum/gas_mixture/air
/turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) /turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null)
if(graphic_add && graphic_add.len) if(graphic_add && graphic_add.len)
overlays += graphic_add overlays += graphic_add
if(graphic_remove && graphic_remove.len) if(graphic_remove && graphic_remove.len)
overlays -= graphic_remove overlays -= graphic_remove
/turf/proc/update_air_properties() /turf/proc/update_air_properties()
var/block = c_airblock(src) var/block = c_airblock(src)
if(block & AIR_BLOCKED) if(block & AIR_BLOCKED)
//dbg(blocked) //dbg(blocked)
return 1 return 1
#ifdef ZLEVELS #ifdef ZLEVELS
for(var/d = 1, d < 64, d *= 2) for(var/d = 1, d < 64, d *= 2)
#else #else
for(var/d = 1, d < 16, d *= 2) for(var/d = 1, d < 16, d *= 2)
#endif #endif
var/turf/unsim = get_step(src, d) var/turf/unsim = get_step(src, d)
if(!unsim) if(!unsim)
continue continue
block = unsim.c_airblock(src) block = unsim.c_airblock(src)
if(block & AIR_BLOCKED) if(block & AIR_BLOCKED)
//unsim.dbg(air_blocked, turn(180,d)) //unsim.dbg(air_blocked, turn(180,d))
continue continue
var/r_block = c_airblock(unsim) var/r_block = c_airblock(unsim)
if(r_block & AIR_BLOCKED) if(r_block & AIR_BLOCKED)
continue continue
if(istype(unsim, /turf/simulated)) if(istype(unsim, /turf/simulated))
var/turf/simulated/sim = unsim var/turf/simulated/sim = unsim
if(air_master.has_valid_zone(sim)) if(air_master.has_valid_zone(sim))
air_master.connect(sim, src) air_master.connect(sim, src)
/turf/simulated/update_air_properties() /turf/simulated/update_air_properties()
if(zone && zone.invalid)
c_copy_air() if(zone && zone.invalid)
zone = null //Easier than iterating through the list at the zone. c_copy_air()
zone = null //Easier than iterating through the list at the zone.
var/s_block = c_airblock(src)
if(s_block & AIR_BLOCKED) var/s_block = c_airblock(src)
#ifdef ZASDBG if(s_block & AIR_BLOCKED)
if(verbose) world << "Self-blocked." #ifdef ZASDBG
//dbg(blocked) if(verbose) world << "Self-blocked."
#endif //dbg(blocked)
if(zone) #endif
var/zone/z = zone if(zone)
if(locate(/obj/machinery/door/airlock) in src) //Hacky, but prevents normal airlocks from rebuilding zones all the time var/zone/z = zone
z.remove(src)
else if(s_block & ZONE_BLOCKED) //Hacky, but prevents normal airlocks from rebuilding zones all the time
z.rebuild() z.remove(src)
else
return 1 z.rebuild()
var/previously_open = open_directions return 1
open_directions = 0
var/previously_open = open_directions
var/list/postponed open_directions = 0
#ifdef ZLEVELS
for(var/d = 1, d < 64, d *= 2) var/list/postponed
#else #ifdef ZLEVELS
for(var/d = 1, d < 16, d *= 2) for(var/d = 1, d < 64, d *= 2)
#endif #else
for(var/d = 1, d < 16, d *= 2)
var/turf/unsim = get_step(src, d) #endif
if(!unsim) //edge of map var/turf/unsim = get_step(src, d)
continue
if(!unsim) //edge of map
var/block = unsim.c_airblock(src) continue
if(block & AIR_BLOCKED)
var/block = unsim.c_airblock(src)
#ifdef ZASDBG if(block & AIR_BLOCKED)
if(verbose) world << "[d] is blocked."
//unsim.dbg(air_blocked, turn(180,d)) #ifdef ZASDBG
#endif if(verbose) world << "[d] is blocked."
//unsim.dbg(air_blocked, turn(180,d))
continue #endif
var/r_block = c_airblock(unsim) continue
if(r_block & AIR_BLOCKED)
var/r_block = c_airblock(unsim)
#ifdef ZASDBG if(r_block & AIR_BLOCKED)
if(verbose) world << "[d] is blocked."
//dbg(air_blocked, d) #ifdef ZASDBG
#endif if(verbose) world << "[d] is blocked."
//dbg(air_blocked, d)
//Check that our zone hasn't been cut off recently. #endif
//This happens when windows move or are constructed. We need to rebuild.
if((previously_open & d) && istype(unsim, /turf/simulated)) //Check that our zone hasn't been cut off recently.
var/turf/simulated/sim = unsim //This happens when windows move or are constructed. We need to rebuild.
if(zone && sim.zone == zone) if((previously_open & d) && istype(unsim, /turf/simulated))
zone.rebuild() var/turf/simulated/sim = unsim
return if(zone && sim.zone == zone)
zone.rebuild()
continue return
open_directions |= d continue
if(istype(unsim, /turf/simulated)) open_directions |= d
var/turf/simulated/sim = unsim if(istype(unsim, /turf/simulated))
sim.open_directions |= reverse_dir[d]
var/turf/simulated/sim = unsim
if(air_master.has_valid_zone(sim)) sim.open_directions |= reverse_dir[d]
//Might have assigned a zone, since this happens for each direction. if(air_master.has_valid_zone(sim))
if(!zone)
//Might have assigned a zone, since this happens for each direction.
//if((block & ZONE_BLOCKED) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED))) if(!zone)
if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED)))
#ifdef ZASDBG //We do not merge if
if(verbose) world << "[d] is zone blocked." // they are blocking us and we are not blocking them, or if
//dbg(zone_blocked, d) // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways.
#endif if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED)))
#ifdef ZASDBG
//Postpone this tile rather than exit, since a connection can still be made. if(verbose) world << "[d] is zone blocked."
if(!postponed) postponed = list() //dbg(zone_blocked, d)
postponed.Add(sim) #endif
else //Postpone this tile rather than exit, since a connection can still be made.
if(!postponed) postponed = list()
sim.zone.add(src) postponed.Add(sim)
#ifdef ZASDBG else
dbg(assigned)
if(verbose) world << "Added to [zone]" sim.zone.add(src)
#endif
#ifdef ZASDBG
else if(sim.zone != zone) dbg(assigned)
if(verbose) world << "Added to [zone]"
#ifdef ZASDBG #endif
if(verbose) world << "Connecting to [sim.zone]"
#endif else if(sim.zone != zone)
air_master.connect(src, sim) #ifdef ZASDBG
if(verbose) world << "Connecting to [sim.zone]"
#endif
#ifdef ZASDBG
else if(verbose) world << "[d] has same zone." air_master.connect(src, sim)
else if(verbose) world << "[d] has invalid zone."
#endif #ifdef ZASDBG
else if(verbose) world << "[d] has same zone."
else
else if(verbose) world << "[d] has invalid zone."
//Postponing connections to tiles until a zone is assured. #endif
if(!postponed) postponed = list()
postponed.Add(unsim) else
if(!air_master.has_valid_zone(src)) //Still no zone, make a new one. //Postponing connections to tiles until a zone is assured.
var/zone/newzone = new/zone() if(!postponed) postponed = list()
newzone.add(src) postponed.Add(unsim)
#ifdef ZASDBG if(!air_master.has_valid_zone(src)) //Still no zone, make a new one.
dbg(created) var/zone/newzone = new/zone()
newzone.add(src)
ASSERT(zone)
#endif #ifdef ZASDBG
dbg(created)
//At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug.
ASSERT(zone)
for(var/turf/T in postponed) #endif
air_master.connect(src, T)
//At this point, a zone should have happened. If it hasn't, don't add more checks, fix the bug.
/turf/proc/post_update_air_properties()
if(connections) connections.update_all() for(var/turf/T in postponed)
air_master.connect(src, T)
/turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
return 0 /turf/proc/post_update_air_properties()
if(connections) connections.update_all()
/turf/proc/assume_gas(gasid, moles, temp = 0)
return 0 /turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
return 0
/turf/return_air()
//Create gas mixture to hold data for passing /turf/proc/assume_gas(gasid, moles, temp = 0)
var/datum/gas_mixture/GM = new return 0
GM.adjust_multi("oxygen", oxygen, "carbon_dioxide", carbon_dioxide, "nitrogen", nitrogen, "phoron", phoron) /turf/return_air()
GM.temperature = temperature //Create gas mixture to hold data for passing
var/datum/gas_mixture/GM = new
return GM
GM.adjust_multi("oxygen", oxygen, "carbon_dioxide", carbon_dioxide, "nitrogen", nitrogen, "phoron", phoron)
/turf/remove_air(amount as num) GM.temperature = temperature
var/datum/gas_mixture/GM = new
return GM
var/sum = oxygen + carbon_dioxide + nitrogen + phoron
if(sum>0) /turf/remove_air(amount as num)
GM.gas["oxygen"] = (oxygen/sum)*amount var/datum/gas_mixture/GM = new
GM.gas["carbon_dioxide"] = (carbon_dioxide/sum)*amount
GM.gas["nitrogen"] = (nitrogen/sum)*amount var/sum = oxygen + carbon_dioxide + nitrogen + phoron
GM.gas["phoron"] = (phoron/sum)*amount if(sum>0)
GM.gas["oxygen"] = (oxygen/sum)*amount
GM.temperature = temperature GM.gas["carbon_dioxide"] = (carbon_dioxide/sum)*amount
GM.update_values() GM.gas["nitrogen"] = (nitrogen/sum)*amount
GM.gas["phoron"] = (phoron/sum)*amount
return GM
GM.temperature = temperature
/turf/simulated/assume_air(datum/gas_mixture/giver) GM.update_values()
var/datum/gas_mixture/my_air = return_air()
my_air.merge(giver) return GM
/turf/simulated/assume_gas(gasid, moles, temp = null) /turf/simulated/assume_air(datum/gas_mixture/giver)
var/datum/gas_mixture/my_air = return_air() var/datum/gas_mixture/my_air = return_air()
my_air.merge(giver)
if(isnull(temp))
my_air.adjust_gas(gasid, moles) /turf/simulated/assume_gas(gasid, moles, temp = null)
else var/datum/gas_mixture/my_air = return_air()
my_air.adjust_gas_temp(gasid, moles, temp)
if(isnull(temp))
return 1 my_air.adjust_gas(gasid, moles)
else
/turf/simulated/remove_air(amount as num) my_air.adjust_gas_temp(gasid, moles, temp)
var/datum/gas_mixture/my_air = return_air()
return my_air.remove(amount) return 1
/turf/simulated/return_air() /turf/simulated/remove_air(amount as num)
if(zone) var/datum/gas_mixture/my_air = return_air()
if(!zone.invalid) return my_air.remove(amount)
air_master.mark_zone_update(zone)
return zone.air /turf/simulated/return_air()
else if(zone)
if(!air) if(!zone.invalid)
make_air() air_master.mark_zone_update(zone)
c_copy_air() return zone.air
return air else
else if(!air)
if(!air) make_air()
make_air() c_copy_air()
return air return air
else
/turf/proc/make_air() if(!air)
air = new/datum/gas_mixture make_air()
air.temperature = temperature return air
air.adjust_multi("oxygen", oxygen, "carbon_dioxide", carbon_dioxide, "nitrogen", nitrogen, "phoron", phoron)
air.group_multiplier = 1 /turf/proc/make_air()
air.volume = CELL_VOLUME air = new/datum/gas_mixture
air.temperature = temperature
/turf/simulated/proc/c_copy_air() air.adjust_multi("oxygen", oxygen, "carbon_dioxide", carbon_dioxide, "nitrogen", nitrogen, "phoron", phoron)
if(!air) air = new/datum/gas_mixture air.group_multiplier = 1
air.copy_from(zone.air) air.volume = CELL_VOLUME
air.group_multiplier = 1
/turf/simulated/proc/c_copy_air()
if(!air) air = new/datum/gas_mixture
air.copy_from(zone.air)
air.group_multiplier = 1

View File

@@ -111,6 +111,13 @@ Class Procs:
#ifdef ZASDBG #ifdef ZASDBG
T.dbg(merged) T.dbg(merged)
#endif #endif
//rebuild the old zone's edges so that the will be possesed by the new zone
for(var/connection_edge/E in edges)
if(E.contains_zone(into))
continue //don't need to rebuild this edge
for(var/turf/T in E.connecting_turfs)
air_master.mark_for_update(T)
/zone/proc/c_invalidate() /zone/proc/c_invalidate()
invalid = 1 invalid = 1

View File

@@ -23,24 +23,20 @@ var/global/list/GlobalPool = list()
//Either way it gets passed to new //Either way it gets passed to new
/proc/PoolOrNew(var/get_type,var/second_arg) /proc/PoolOrNew(var/get_type,var/second_arg)
if(!get_type)
return
var/datum/D var/datum/D
D = GetFromPool(get_type,second_arg) D = GetFromPool(get_type,second_arg)
if(!D) if(!D)
if(ispath(get_type)) // So the GC knows we're pooling this type.
if(islist(second_arg)) if(!GlobalPool[get_type])
return new get_type (arglist(second_arg)) GlobalPool[get_type] = list(new get_type)
else if(islist(second_arg))
return new get_type (second_arg) return new get_type (arglist(second_arg))
else
return new get_type (second_arg)
return D return D
/proc/GetFromPool(var/get_type,var/second_arg) /proc/GetFromPool(var/get_type,var/second_arg)
if(!get_type)
return 0
if(isnull(GlobalPool[get_type])) if(isnull(GlobalPool[get_type]))
return 0 return 0
@@ -75,9 +71,10 @@ var/global/list/GlobalPool = list()
D.Destroy() D.Destroy()
D.ResetVars() D.ResetVars()
D.disposed = 1 //Set to stop processing while pooled
/proc/IsPooled(var/datum/D) /proc/IsPooled(var/datum/D)
if(isnull(GlobalPool[D.type]) || length(GlobalPool[D.type]) == 0) if(isnull(GlobalPool[D.type]))
return 0 return 0
return 1 return 1
@@ -86,10 +83,13 @@ var/global/list/GlobalPool = list()
New(arglist(args)) New(arglist(args))
else else
New(args) New(args)
disposed = null
/atom/movable/Prepare(args) /atom/movable/Prepare(args)
if(islist(args)) var/list/args_list = args
if(istype(args_list) && args_list.len)
loc = args[1] loc = args[1]
else
loc = args loc = args
..() ..()

View File

@@ -16,6 +16,9 @@
return 1 return 1
return 0 return 0
/proc/max_default_z_level()
return max(config.station_levels, max(config.admin_levels, config.player_levels))
/proc/get_area(O) /proc/get_area(O)
var/turf/loc = get_turf(O) var/turf/loc = get_turf(O)
if(loc) if(loc)
@@ -27,7 +30,7 @@
if(A.name == N) if(A.name == N)
return A return A
return 0 return 0
/proc/get_area_master(const/O) /proc/get_area_master(const/O)
var/area/A = get_area(O) var/area/A = get_area(O)
if (isarea(A)) if (isarea(A))
@@ -435,6 +438,34 @@ datum/projectile_data
var/b = mixOneColor(weights, blues) var/b = mixOneColor(weights, blues)
return rgb(r,g,b) return rgb(r,g,b)
/proc/mixOneColor(var/list/weight, var/list/color)
if (!weight || !color || length(weight)!=length(color))
return 0
var/contents = length(weight)
var/i
//normalize weights
var/listsum = 0
for(i=1; i<=contents; i++)
listsum += weight[i]
for(i=1; i<=contents; i++)
weight[i] /= listsum
//mix them
var/mixedcolor = 0
for(i=1; i<=contents; i++)
mixedcolor += weight[i]*color[i]
mixedcolor = round(mixedcolor)
//until someone writes a formal proof for this algorithm, let's keep this in
// if(mixedcolor<0x00 || mixedcolor>0xFF)
// return 0
//that's not the kind of operation we are running here, nerd
mixedcolor=min(max(mixedcolor,0),255)
return mixedcolor
/** /**
* Gets the highest and lowest pressures from the tiles in cardinal directions * Gets the highest and lowest pressures from the tiles in cardinal directions
* around us, then checks the difference. * around us, then checks the difference.

View File

@@ -927,30 +927,6 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
refined_trg -= B refined_trg -= B
continue moving continue moving
var/list/doors = new/list()
if(toupdate.len)
for(var/turf/simulated/T1 in toupdate)
for(var/obj/machinery/door/D2 in T1)
doors += D2
/*if(T1.parent)
air_master.groups_to_rebuild += T1.parent
else
air_master.tiles_to_update += T1*/
if(fromupdate.len)
for(var/turf/simulated/T2 in fromupdate)
for(var/obj/machinery/door/D2 in T2)
doors += D2
/*if(T2.parent)
air_master.groups_to_rebuild += T2.parent
else
air_master.tiles_to_update += T2*/
for(var/obj/O in doors)
O:update_nearby_tiles(1)
proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0)
if(!original) if(!original)

View File

@@ -52,7 +52,7 @@ return_location()
var/offset_x = 0 // distance to increment each step var/offset_x = 0 // distance to increment each step
var/offset_y = 0 var/offset_y = 0
/datum/plot_vector/proc/setup(var/turf/S, var/turf/T, var/xo = 0, var/yo = 0) /datum/plot_vector/proc/setup(var/turf/S, var/turf/T, var/xo = 0, var/yo = 0, var/angle_offset=0)
source = S source = S
target = T target = T
@@ -78,7 +78,7 @@ return_location()
return return
// calculate the angle // calculate the angle
angle = Atan2(dx, dy) angle = Atan2(dx, dy) + angle_offset
// and some rounding to stop the increments jumping whole turfs - because byond favours certain angles // and some rounding to stop the increments jumping whole turfs - because byond favours certain angles
if(angle > -135 && angle < 45) if(angle > -135 && angle < 45)
@@ -118,7 +118,7 @@ return_location()
/datum/plot_vector/proc/return_location(var/datum/vector_loc/data) /datum/plot_vector/proc/return_location(var/datum/vector_loc/data)
if(!data) if(!data)
data = new() data = new()
data.loc = locate(round(loc_x / world.icon_size), round(loc_y / world.icon_size), loc_z) data.loc = locate(round(loc_x / world.icon_size, 1), round(loc_y / world.icon_size, 1), loc_z)
if(!data.loc) if(!data.loc)
return return
data.pixel_x = loc_x - (data.loc.x * world.icon_size) data.pixel_x = loc_x - (data.loc.x * world.icon_size)

View File

@@ -341,6 +341,7 @@ datum/hud/New(mob/owner)
if(src.hud_used.item_action_list) if(src.hud_used.item_action_list)
src.client.screen -= src.hud_used.item_action_list src.client.screen -= src.hud_used.item_action_list
src.client.screen -= src.internals src.client.screen -= src.internals
src.client.screen += src.hud_used.action_intent //we want the intent swticher visible
else else
hud_used.hud_shown = 1 hud_used.hud_shown = 1
if(src.hud_used.adding) if(src.hud_used.adding)

View File

@@ -18,7 +18,7 @@ var/list/delayed_garbage = list()
/datum/controller/process/garbage_collector/setup() /datum/controller/process/garbage_collector/setup()
name = "garbage" name = "garbage"
schedule_interval = 6 SECONDS schedule_interval = 2 SECONDS
if(!garbage_collector) if(!garbage_collector)
garbage_collector = src garbage_collector = src
@@ -94,8 +94,9 @@ var/list/delayed_garbage = list()
if(!istype(A)) if(!istype(A))
//warning("qdel() passed object of type [A.type]. qdel() can only handle /datum types.") //warning("qdel() passed object of type [A.type]. qdel() can only handle /datum types.")
del(A) del(A)
garbage_collector.dels++ if(garbage_collector)
garbage_collector.hard_dels++ garbage_collector.dels++
garbage_collector.hard_dels++
else if(isnull(A.gcDestroyed)) else if(isnull(A.gcDestroyed))
// Let our friend know they're about to get collected // Let our friend know they're about to get collected
. = !A.Destroy() . = !A.Destroy()

View File

@@ -11,5 +11,10 @@
powernets.Remove(powerNetwork) powernets.Remove(powerNetwork)
// This is necessary to ensure powersinks are always the first devices that drain power from powernet.
// Otherwise APCs or other stuff go first, resulting in bad things happening.
for(var/obj/item/device/powersink/S in processing_objects)
S.drain()
/datum/controller/process/powernet/getStatName() /datum/controller/process/powernet/getStatName()
return ..()+"([powernets.len])" return ..()+"([powernets.len])"

View File

@@ -186,6 +186,7 @@ var/list/gamemode_cache = list()
var/ninjas_allowed = 0 var/ninjas_allowed = 0
var/abandon_allowed = 1 var/abandon_allowed = 1
var/ooc_allowed = 1 var/ooc_allowed = 1
var/looc_allowed = 1
var/dooc_allowed = 1 var/dooc_allowed = 1
var/dsay_allowed = 1 var/dsay_allowed = 1
@@ -402,6 +403,7 @@ var/list/gamemode_cache = list()
if ("disable_ooc") if ("disable_ooc")
config.ooc_allowed = 0 config.ooc_allowed = 0
config.looc_allowed = 0
if ("disable_entry") if ("disable_entry")
config.enter_allowed = 0 config.enter_allowed = 0

View File

@@ -14,179 +14,177 @@
var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation) var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation)
New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) /datum/teleport/New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
..() ..()
if(!initTeleport(arglist(args))) if(!initTeleport(arglist(args)))
return 0
return 1
proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout)
if(!setTeleatom(ateleatom))
return 0
if(!setDestination(adestination))
return 0
if(!setPrecision(aprecision))
return 0
setEffects(aeffectin,aeffectout)
setForceTeleport(afteleport)
setSounds(asoundin,asoundout)
return 1
//must succeed
proc/setPrecision(aprecision)
if(isnum(aprecision))
precision = aprecision
return 1
return 0 return 0
return 1
//must succeed /datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout)
proc/setDestination(atom/adestination) if(!setTeleatom(ateleatom))
if(istype(adestination))
destination = adestination
return 1
return 0 return 0
if(!setDestination(adestination))
//must succeed in most cases
proc/setTeleatom(atom/movable/ateleatom)
if(istype(ateleatom, /obj/effect) && !istype(ateleatom, /obj/effect/dummy/chameleon))
qdel(ateleatom)
return 0
if(istype(ateleatom))
teleatom = ateleatom
return 1
return 0 return 0
if(!setPrecision(aprecision))
return 0
setEffects(aeffectin,aeffectout)
setForceTeleport(afteleport)
setSounds(asoundin,asoundout)
return 1
//custom effects must be properly set up first for instant-type teleports //must succeed
//optional /datum/teleport/proc/setPrecision(aprecision)
proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null) if(isnum(aprecision))
effectin = istype(aeffectin) ? aeffectin : null precision = aprecision
effectout = istype(aeffectout) ? aeffectout : null
return 1 return 1
return 0
//optional //must succeed
proc/setForceTeleport(afteleport) /datum/teleport/proc/setDestination(atom/adestination)
if(istype(adestination))
destination = adestination
return 1
return 0
//must succeed in most cases
/datum/teleport/proc/setTeleatom(atom/movable/ateleatom)
if(istype(ateleatom, /obj/effect) && !istype(ateleatom, /obj/effect/dummy/chameleon))
qdel(ateleatom)
return 0
if(istype(ateleatom))
teleatom = ateleatom
return 1
return 0
//custom effects must be properly set up first for instant-type teleports
//optional
/datum/teleport/proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null)
effectin = istype(aeffectin) ? aeffectin : null
effectout = istype(aeffectout) ? aeffectout : null
return 1
//optional
/datum/teleport/proc/setForceTeleport(afteleport)
force_teleport = afteleport force_teleport = afteleport
return 1 return 1
//optional //optional
proc/setSounds(asoundin=null,asoundout=null) /datum/teleport/proc/setSounds(asoundin=null,asoundout=null)
soundin = isfile(asoundin) ? asoundin : null soundin = isfile(asoundin) ? asoundin : null
soundout = isfile(asoundout) ? asoundout : null soundout = isfile(asoundout) ? asoundout : null
return 1 return 1
//placeholder //placeholder
proc/teleportChecks() /datum/teleport/proc/teleportChecks()
return 1 return 1
proc/playSpecials(atom/location,datum/effect/effect/system/effect,sound) /datum/teleport/proc/playSpecials(atom/location,datum/effect/effect/system/effect,sound)
if(location) if(location)
if(effect) if(effect)
spawn(-1) spawn(-1)
src = null src = null
effect.attach(location) effect.attach(location)
effect.start() effect.start()
if(sound) if(sound)
spawn(-1) spawn(-1)
src = null src = null
playsound(location,sound,60,1) playsound(location,sound,60,1)
return return
//do the monkey dance //do the monkey dance
proc/doTeleport() /datum/teleport/proc/doTeleport()
var/turf/destturf var/turf/destturf
var/turf/curturf = get_turf(teleatom) var/turf/curturf = get_turf(teleatom)
var/area/destarea = get_area(destination) var/area/destarea = get_area(destination)
if(precision) if(precision)
var/list/posturfs = circlerangeturfs(destination,precision) var/list/posturfs = circlerangeturfs(destination,precision)
destturf = safepick(posturfs) destturf = safepick(posturfs)
else else
destturf = get_turf(destination) destturf = get_turf(destination)
if(!destturf || !curturf) if(!destturf || !curturf)
return 0
playSpecials(curturf,effectin,soundin)
var/obj/structure/bed/chair/C = null
if(isliving(teleatom))
var/mob/living/L = teleatom
if(L.buckled)
C = L.buckled
if(force_teleport)
teleatom.forceMove(destturf)
playSpecials(destturf,effectout,soundout)
else
if(teleatom.Move(destturf))
playSpecials(destturf,effectout,soundout)
if(C)
C.forceMove(destturf)
destarea.Entered(teleatom)
return 1
proc/teleport()
if(teleportChecks())
return doTeleport()
return 0 return 0
playSpecials(curturf,effectin,soundin)
var/obj/structure/bed/chair/C = null
if(isliving(teleatom))
var/mob/living/L = teleatom
if(L.buckled)
C = L.buckled
if(force_teleport)
teleatom.forceMove(destturf)
playSpecials(destturf,effectout,soundout)
else
if(teleatom.Move(destturf))
playSpecials(destturf,effectout,soundout)
if(C)
C.forceMove(destturf)
destarea.Entered(teleatom)
return 1
/datum/teleport/proc/teleport()
if(teleportChecks())
return doTeleport()
return 0
/datum/teleport/instant //teleports when datum is created /datum/teleport/instant //teleports when datum is created
New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) /datum/teleport/instant/New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
if(..()) if(..())
teleport() teleport()
return return
/datum/teleport/instant/science /datum/teleport/instant/science/setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout)
if(!aeffectin || !aeffectout)
setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout) var/datum/effect/effect/system/spark_spread/aeffect = new
if(!aeffectin || !aeffectout) aeffect.set_up(5, 1, teleatom)
var/datum/effect/effect/system/spark_spread/aeffect = new effectin = effectin || aeffect
aeffect.set_up(5, 1, teleatom) effectout = effectout || aeffect
effectin = effectin || aeffect
effectout = effectout || aeffect
return 1
else
return ..()
setPrecision(aprecision)
..()
if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
precision = rand(1,100)
var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
if(bagholding.len)
precision = max(rand(1,100)*bagholding.len,100)
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM << "\red The Bluespace interface on your Bag of Holding interferes with the teleport!"
return 1 return 1
else
return ..()
teleportChecks() /datum/teleport/instant/science/setPrecision(aprecision)
if(istype(teleatom, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite ..()
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>") if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
precision = rand(1,100)
var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
if(bagholding.len)
precision = max(rand(1,100)*bagholding.len,100)
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM << "<span class='danger>The Bluespace interface on your [teleatom] interferes with the teleport!</span>"
return 1
/datum/teleport/instant/science/teleportChecks()
if(istype(teleatom, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
teleatom.visible_message("<span class='danger'>\The [teleatom] bounces off of the portal!</span>")
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear)))
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM.visible_message("<span class='danger'>\The [MM] bounces off of the portal!</span>","<span class='warning'>Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.</span>")
else
teleatom.visible_message("<span class='danger'>\The [teleatom] bounces off of the portal!</span>")
return 0
if(destination.z in config.admin_levels) //centcomm z-level
if(istype(teleatom, /obj/mecha))
var/obj/mecha/MM = teleatom
MM.occupant << "<span class='danger'>\The [MM] would not survive the jump to a location so far away!</span>"
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)))
teleatom.visible_message("<span class='danger'>\The [teleatom] bounces off of the portal!</span>")
return 0 return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear)))
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM.visible_message("\red <B>The [MM] bounces off of the portal!</B>","\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.")
else
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>")
return 0
if(destination.z == 2) //centcomm z-level if(destination.z > max_default_z_level()) //Away mission z-levels
if(istype(teleatom, /obj/mecha)) return 0
var/obj/mecha/MM = teleatom return 1
MM.occupant << "\red <B>The mech would not survive the jump to a location so far away!</B>"
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)))
teleatom.visible_message("\red <B>The Bag of Holding bounces off of the portal!</B>")
return 0
if(destination.z > 7) //Away mission z-levels
return 0
return 1

View File

@@ -80,7 +80,8 @@
for(var/datum/data/record/t in data_core.general) for(var/datum/data/record/t in data_core.general)
var/name = t.fields["name"] var/name = t.fields["name"]
var/rank = t.fields["rank"] var/rank = t.fields["rank"]
var/real_rank = t.fields["real_rank"] var/real_rank = make_list_rank(t.fields["real_rank"])
if(OOC) if(OOC)
var/active = 0 var/active = 0
for(var/mob/M in player_list) for(var/mob/M in player_list)
@@ -165,6 +166,15 @@
return dat return dat
/var/list/acting_rank_prefixes = list("acting", "temporary", "interim")
/proc/make_list_rank(rank)
for(var/prefix in acting_rank_prefixes)
if(findtext(rank, "[prefix] ", 1, 2+length(prefix)))
return copytext(rank, 2+length(prefix))
return rank
/* /*
We can't just insert in HTML into the nanoUI so we need the raw data to play with. 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 Instead of creating this list over and over when someone leaves their PDA open to the page
@@ -189,7 +199,8 @@ var/global/ManifestJSON
for(var/datum/data/record/t in data_core.general) for(var/datum/data/record/t in data_core.general)
var/name = sanitize(t.fields["name"]) var/name = sanitize(t.fields["name"])
var/rank = sanitize(t.fields["rank"]) var/rank = sanitize(t.fields["rank"])
var/real_rank = t.fields["real_rank"] var/real_rank = make_list_rank(t.fields["real_rank"])
var/isactive = t.fields["p_stat"] var/isactive = t.fields["p_stat"]
var/department = 0 var/department = 0
var/depthead = 0 // Department Heads will be placed at the top of their lists. var/depthead = 0 // Department Heads will be placed at the top of their lists.

View File

@@ -32,13 +32,9 @@ var/datum/antagonist/ert/ert
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves) player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses) player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses)
var/obj/item/weapon/card/id/W = new(src) var/obj/item/weapon/card/id/centcom/ERT/W = new(src)
W.assignment = "Emergency Response Team"
W.registered_name = player.real_name W.registered_name = player.real_name
W.name = "[player.real_name]'s ID Card ([W.assignment])" W.name = "[player.real_name]'s ID Card ([W.assignment])"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
player.equip_to_slot_or_del(W, slot_wear_id) player.equip_to_slot_or_del(W, slot_wear_id)
return 1 return 1

View File

@@ -30,6 +30,12 @@
power_change() // all machines set to current power level, also updates lighting icon power_change() // all machines set to current power level, also updates lighting icon
InitializeLighting() InitializeLighting()
/area/proc/get_contents()
var/list/concat_contents = list()
for (var/area/RA in related)
concat_contents |= RA.contents
return concat_contents
/area/proc/get_cameras() /area/proc/get_cameras()
var/list/cameras = list() var/list/cameras = list()
for (var/area/RA in related) for (var/area/RA in related)

View File

@@ -14,6 +14,11 @@
var/moved_recently = 0 var/moved_recently = 0
var/mob/pulledby = null var/mob/pulledby = null
/atom/movable/New()
..()
if(ticker && ticker.current_state == GAME_STATE_PLAYING)
initialize()
/atom/movable/Del() /atom/movable/Del()
if(isnull(gcDestroyed) && loc) if(isnull(gcDestroyed) && loc)
testing("GC: -- [type] was deleted via del() rather than qdel() --") testing("GC: -- [type] was deleted via del() rather than qdel() --")
@@ -33,6 +38,10 @@
..() ..()
/atom/movable/proc/initialize()
return
/atom/movable/Bump(var/atom/A, yes) /atom/movable/Bump(var/atom/A, yes)
if(src.throwing) if(src.throwing)
src.throw_impact(A) src.throw_impact(A)

View File

@@ -1,11 +1,5 @@
var/global/datum/controller/gameticker/ticker var/global/datum/controller/gameticker/ticker
#define GAME_STATE_PREGAME 1
#define GAME_STATE_SETTING_UP 2
#define GAME_STATE_PLAYING 3
#define GAME_STATE_FINISHED 4
/datum/controller/gameticker /datum/controller/gameticker
var/const/restart_timeout = 600 var/const/restart_timeout = 600
var/current_state = GAME_STATE_PREGAME var/current_state = GAME_STATE_PREGAME
@@ -424,7 +418,7 @@ var/global/datum/controller/gameticker/ticker
robo.laws.show_laws(world) robo.laws.show_laws(world)
if(dronecount) if(dronecount)
world << "<b>There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round." world << "<b>There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round.</b>"
mode.declare_completion()//To declare normal completion. mode.declare_completion()//To declare normal completion.

View File

@@ -231,7 +231,7 @@
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/rainbow(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/rainbow(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/fancy/crayons(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/storage/fancy/crayons(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/toy/waterflower(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/toy/waterflower(H), slot_in_backpack)
H.mutations.Add(CLUMSY) H.mutations.Add(CLUMSY)
@@ -265,11 +265,11 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit)
if(H.backbag == 1) if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/mime(H), slot_l_store) H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_l_hand) H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_l_hand)
else else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/mime(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack)
H.verbs += /client/proc/mimespeak H.verbs += /client/proc/mimespeak
H.verbs += /client/proc/mimewall H.verbs += /client/proc/mimewall

View File

@@ -118,8 +118,6 @@
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
update_icon() update_icon()
if(ticker && ticker.current_state == 3)//if the game is running
src.initialize()
return return
first_run() first_run()
@@ -624,7 +622,7 @@
if(buildstage != 2) if(buildstage != 2)
return STATUS_CLOSE return STATUS_CLOSE
if(aidisabled && user.isAI()) if(aidisabled && user.isMobAI())
user << "<span class='warning'>AI control for \the [src] interface has been disabled.</span>" user << "<span class='warning'>AI control for \the [src] interface has been disabled.</span>"
return STATUS_CLOSE return STATUS_CLOSE

View File

@@ -67,12 +67,6 @@
/obj/machinery/air_sensor/initialize() /obj/machinery/air_sensor/initialize()
set_frequency(frequency) set_frequency(frequency)
/obj/machinery/air_sensor/New()
..()
if(radio_controller)
set_frequency(frequency)
obj/machinery/air_sensor/Destroy() obj/machinery/air_sensor/Destroy()
if(radio_controller) if(radio_controller)
radio_controller.remove_object(src,frequency) radio_controller.remove_object(src,frequency)

View File

@@ -21,7 +21,8 @@
return 1 return 1
/obj/machinery/portable_atmospherics/Destroy() /obj/machinery/portable_atmospherics/Destroy()
del(air_contents) qdel(air_contents)
qdel(holding)
..() ..()
/obj/machinery/portable_atmospherics/initialize() /obj/machinery/portable_atmospherics/initialize()

View File

@@ -7,7 +7,10 @@
var/on = 0 var/on = 0
var/direction_out = 0 //0 = siphoning, 1 = releasing var/direction_out = 0 //0 = siphoning, 1 = releasing
var/target_pressure = 100 var/target_pressure = ONE_ATMOSPHERE
var/pressuremin = 0
var/pressuremax = 10 * ONE_ATMOSPHERE
volume = 1000 volume = 1000
@@ -106,64 +109,59 @@
/obj/machinery/portable_atmospherics/powered/pump/return_air() /obj/machinery/portable_atmospherics/powered/pump/return_air()
return air_contents return air_contents
/obj/machinery/portable_atmospherics/powered/pump/attack_ai(var/mob/user as mob) /obj/machinery/portable_atmospherics/powered/pump/attack_ai(var/mob/user)
src.add_hiddenprint(user)
return src.attack_hand(user) return src.attack_hand(user)
/obj/machinery/portable_atmospherics/powered/pump/attack_hand(var/mob/user as mob) /obj/machinery/portable_atmospherics/powered/pump/attack_ghost(var/mob/user)
return src.attack_hand(user)
user.set_machine(src) /obj/machinery/portable_atmospherics/powered/pump/attack_hand(var/mob/user)
var/holding_text ui_interact(user)
if(holding) /obj/machinery/portable_atmospherics/powered/pump/ui_interact(mob/user, ui_key = "rcon", datum/nanoui/ui=null, force_open=1)
holding_text = {"<BR><B>Tank Pressure</B>: [round(holding.air_contents.return_pressure(), 0.01)] kPa<BR> var/list/data[0]
<A href='?src=\ref[src];remove_tank=1'>Remove Tank</A> data["portConnected"] = connected_port ? 1 : 0
"} data["tankPressure"] = round(air_contents.return_pressure() > 0 ? air_contents.return_pressure() : 0)
var/output_text = {"<TT><B>[capitalize(name)]</B><BR> data["targetpressure"] = round(target_pressure)
Pressure: [round(air_contents.return_pressure(), 0.01)] kPa<BR> data["pump_dir"] = direction_out
Flow Rate: [round(last_flow_rate, 0.1)] L/s<BR> data["minpressure"] = round(pressuremin)
Port Status: [(connected_port)?("Connected"):("Disconnected")] data["maxpressure"] = round(pressuremax)
[holding_text]<BR> data["powerDraw"] = round(last_power_draw)
<BR> data["cellCharge"] = cell ? cell.charge : 0
Cell Charge: [cell? "[round(cell.percent())]%" : "N/A"] | Load: [round(last_power_draw)] W<BR> data["cellMaxCharge"] = cell ? cell.maxcharge : 1
Power Switch: <A href='?src=\ref[src];power=1'>[on?("On"):("Off")]</A><BR> data["on"] = on ? 1 : 0
Pump Direction: <A href='?src=\ref[src];direction=1'>[direction_out?("Out"):("In")]</A><BR>
Target Pressure: <A href='?src=\ref[src];pressure_adj=-1000'>-</A> <A href='?src=\ref[src];pressure_adj=-100'>-</A> <A href='?src=\ref[src];pressure_adj=-10'>-</A> <A href='?src=\ref[src];pressure_adj=-1'>-</A> [target_pressure] kPa<A href='?src=\ref[src];pressure_adj=1'>+</A> <A href='?src=\ref[src];pressure_adj=10'>+</A> <A href='?src=\ref[src];pressure_adj=100'>+</A> <A href='?src=\ref[src];pressure_adj=1000'>+</A><BR>
<HR>
<A href='?src=\ref[user];mach_close=pump'>Close</A><BR>
"}
user << browse(output_text, "window=pump;size=600x300") data["hasHoldingTank"] = holding ? 1 : 0
onclose(user, "pump") if (holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0))
return ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "portpump.tmpl", "Portable Pump", 480, 410, state = physical_state)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/portable_atmospherics/powered/pump/Topic(href, href_list) /obj/machinery/portable_atmospherics/powered/pump/Topic(href, href_list)
..() if(..())
if (usr.stat || usr.restrained()) return 1
return
if (((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) if(href_list["power"])
usr.set_machine(src) on = !on
. = 1
if(href_list["direction"])
direction_out = !direction_out
. = 1
if (href_list["remove_tank"])
if(holding)
holding.loc = loc
holding = null
. = 1
if (href_list["pressure_adj"])
var/diff = text2num(href_list["pressure_adj"])
target_pressure = min(10*ONE_ATMOSPHERE, max(0, target_pressure+diff))
. = 1
if(href_list["power"]) if(.)
on = !on
if(href_list["direction"])
direction_out = !direction_out
if (href_list["remove_tank"])
if(holding)
holding.loc = loc
holding = null
if (href_list["pressure_adj"])
var/diff = text2num(href_list["pressure_adj"])
target_pressure = min(10*ONE_ATMOSPHERE, max(0, target_pressure+diff))
src.updateUsrDialog()
src.add_fingerprint(usr)
update_icon() update_icon()
else
usr << browse(null, "window=pump")
return
return

View File

@@ -13,6 +13,9 @@
power_rating = 7500 //7500 W ~ 10 HP power_rating = 7500 //7500 W ~ 10 HP
power_losses = 150 power_losses = 150
var/minrate = 0
var/maxrate = 10 * ONE_ATMOSPHERE
var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent", "oxygen_agent_b") var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent", "oxygen_agent_b")
/obj/machinery/portable_atmospherics/powered/scrubber/New() /obj/machinery/portable_atmospherics/powered/scrubber/New()
@@ -82,63 +85,58 @@
/obj/machinery/portable_atmospherics/powered/scrubber/return_air() /obj/machinery/portable_atmospherics/powered/scrubber/return_air()
return air_contents return air_contents
/obj/machinery/portable_atmospherics/powered/scrubber/attack_ai(var/mob/user as mob) /obj/machinery/portable_atmospherics/powered/scrubber/attack_ai(var/mob/user)
src.add_hiddenprint(user)
return src.attack_hand(user) return src.attack_hand(user)
/obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(var/mob/user as mob) /obj/machinery/portable_atmospherics/powered/scrubber/attack_ghost(var/mob/user)
return src.attack_hand(user)
user.set_machine(src) /obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(var/mob/user)
var/holding_text ui_interact(user)
if(holding)
holding_text = {"<BR><B>Tank Pressure</B>: [round(holding.air_contents.return_pressure(), 0.01)] kPa<BR>
<A href='?src=\ref[src];remove_tank=1'>Remove Tank</A>
"}
var/output_text = {"<TT><B>[name]</B><BR>
Pressure: [round(air_contents.return_pressure(), 0.01)] kPa<BR>
Flow Rate: [round(last_flow_rate, 0.1)] L/s<BR>
Port Status: [(connected_port)?("Connected"):("Disconnected")]
[holding_text]<BR>
<BR>
Cell Charge: [cell? "[round(cell.percent())]%" : "N/A"] | Load: [round(last_power_draw)] W<BR>
Power Switch: <A href='?src=\ref[src];power=1'>[on?("On"):("Off")]</A><BR>
Flow Rate Regulator: <A href='?src=\ref[src];volume_adj=-1000'>-</A> <A href='?src=\ref[src];volume_adj=-100'>-</A> <A href='?src=\ref[src];volume_adj=-10'>-</A> <A href='?src=\ref[src];volume_adj=-1'>-</A> [volume_rate] L/s <A href='?src=\ref[src];volume_adj=1'>+</A> <A href='?src=\ref[src];volume_adj=10'>+</A> <A href='?src=\ref[src];volume_adj=100'>+</A> <A href='?src=\ref[src];volume_adj=1000'>+</A><BR>
<HR>
<A href='?src=\ref[user];mach_close=scrubber'>Close</A><BR>
"}
user << browse(output_text, "window=scrubber;size=600x300")
onclose(user, "scrubber")
return return
/obj/machinery/portable_atmospherics/powered/scrubber/ui_interact(mob/user, ui_key = "rcon", datum/nanoui/ui=null, force_open=1)
var/list/data[0]
data["portConnected"] = connected_port ? 1 : 0
data["tankPressure"] = round(air_contents.return_pressure() > 0 ? air_contents.return_pressure() : 0)
data["rate"] = round(volume_rate)
data["minrate"] = round(minrate)
data["maxrate"] = round(maxrate)
data["powerDraw"] = round(last_power_draw)
data["cellCharge"] = cell ? cell.charge : 0
data["cellMaxCharge"] = cell ? cell.maxcharge : 1
data["on"] = on ? 1 : 0
data["hasHoldingTank"] = holding ? 1 : 0
if (holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0))
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "portscrubber.tmpl", "Portable Scrubber", 480, 400, state = physical_state)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/portable_atmospherics/powered/scrubber/Topic(href, href_list) /obj/machinery/portable_atmospherics/powered/scrubber/Topic(href, href_list)
..() if(..())
if (usr.stat || usr.restrained()) return 1
return
if (((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) if(href_list["power"])
usr.set_machine(src) on = !on
. = 1
if(href_list["power"]) if (href_list["remove_tank"])
on = !on if(holding)
holding.loc = loc
if (href_list["remove_tank"]) holding = null
if(holding) . = 1
holding.loc = loc if (href_list["volume_adj"])
holding = null var/diff = text2num(href_list["volume_adj"])
volume_rate = Clamp(volume_rate+diff, minrate, maxrate)
if (href_list["volume_adj"]) . = 1
var/diff = text2num(href_list["volume_adj"]) update_icon()
volume_rate = min(initial(volume_rate), max(0, volume_rate+diff))
src.updateUsrDialog()
src.add_fingerprint(usr)
update_icon()
else
usr << browse(null, "window=scrubber")
return
return
//Huge scrubber //Huge scrubber

View File

@@ -868,8 +868,8 @@
var/turf/Tsec = get_turf(src) var/turf/Tsec = get_turf(src)
new /obj/item/device/assembly/prox_sensor(Tsec) new /obj/item/device/assembly/prox_sensor(Tsec)
new /obj/item/stack/rods(Tsec) PoolOrNew(/obj/item/stack/rods, Tsec)
new /obj/item/stack/rods(Tsec) PoolOrNew(/obj/item/stack/rods, Tsec)
new /obj/item/stack/cable_coil/cut(Tsec) new /obj/item/stack/cable_coil/cut(Tsec)
if (cell) if (cell)
cell.loc = Tsec cell.loc = Tsec

View File

@@ -102,6 +102,12 @@ var/global/list/engineering_networks = list(
..() ..()
upgradeMotion() upgradeMotion()
/obj/machinery/camera/motion/engineering_outpost
network = list(NETWORK_ENGINEERING_OUTPOST)
/obj/machinery/camera/motion/security
network = list(NETWORK_SECURITY)
// ALL UPGRADES // ALL UPGRADES

View File

@@ -1,9 +1,10 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/proc/invalidateCameraCache() /proc/invalidateCameraCache()
for(var/obj/machinery/computer/security/s in world) for(var/obj/machinery/computer/security/s in machines)
s.camera_cache = null s.camera_cache = null
for(var/datum/alarm/A in world) var/datum/alarm_handler/AHandler = new /datum/alarm_handler()
for(var/datum/alarm/A in AHandler.alarms)
A.cameras = null A.cameras = null
/obj/machinery/computer/security /obj/machinery/computer/security

View File

@@ -14,20 +14,18 @@
var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything. var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything.
var/loading = 0 // Nice loading text var/loading = 0 // Nice loading text
/obj/machinery/computer/cloning/New() /obj/machinery/computer/cloning/initialize()
..()
updatemodules()
/obj/machinery/computer/cloning/Destroy()
releasecloner()
..() ..()
spawn(5)
updatemodules()
return
return
/obj/machinery/computer/cloning/proc/updatemodules() /obj/machinery/computer/cloning/proc/updatemodules()
src.scanner = findscanner() src.scanner = findscanner()
releasecloner()
findcloner() findcloner()
var/num = 1
for (var/obj/machinery/clonepod/pod in pods)
pod.connected = src
pod.name = "[initial(pod.name)] #[num++]"
/obj/machinery/computer/cloning/proc/findscanner() /obj/machinery/computer/cloning/proc/findscanner()
var/obj/machinery/dna_scannernew/scannerf = null var/obj/machinery/dna_scannernew/scannerf = null
@@ -40,18 +38,26 @@
//Then look for a free one in the area //Then look for a free one in the area
if(!scannerf) if(!scannerf)
for(var/obj/machinery/dna_scannernew/S in get_area(src)) var/area/A = get_area(src)
for(var/obj/machinery/dna_scannernew/S in A.get_contents())
return S return S
return return
/obj/machinery/computer/cloning/proc/findcloner() /obj/machinery/computer/cloning/proc/releasecloner()
for(var/obj/machinery/clonepod/P in pods)
P.connected = null
P.name = initial(P.name)
pods.Cut() pods.Cut()
for(var/obj/machinery/clonepod/P in get_area(src))
/obj/machinery/computer/cloning/proc/findcloner()
var/num = 1
var/area/A = get_area(src)
for(var/obj/machinery/clonepod/P in A.get_contents())
if(!P.connected) if(!P.connected)
pods += P pods += P
P.connected = src
return P.name = "[initial(P.name)] #[num++]"
/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob) /obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES

View File

@@ -9,12 +9,6 @@
var/circuit = null //The path to the circuit board type. If circuit==null, the computer can't be disassembled. var/circuit = null //The path to the circuit board type. If circuit==null, the computer can't be disassembled.
var/processing = 0 var/processing = 0
/obj/machinery/computer/New()
..()
if(ticker)
initialize()
/obj/machinery/computer/initialize() /obj/machinery/computer/initialize()
power_change() power_change()
@@ -60,6 +54,9 @@
return return
/obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj) /obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj)
if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
return
if(prob(Proj.damage)) if(prob(Proj.damage))
set_broken() set_broken()
..() ..()

View File

@@ -3,13 +3,17 @@
name = "Station Alert Console" name = "Station Alert Console"
desc = "Used to access the station's automated alert system." desc = "Used to access the station's automated alert system."
icon_state = "alert:0" icon_state = "alert:0"
circuit = "/obj/item/weapon/circuitboard/stationalert" circuit = /obj/item/weapon/circuitboard/stationalert_engineering
var/obj/nano_module/alarm_monitor/alarm_monitor var/obj/nano_module/alarm_monitor/alarm_monitor
var/monitor_type = /obj/nano_module/alarm_monitor/engineering var/monitor_type = /obj/nano_module/alarm_monitor/engineering
/obj/machinery/computer/station_alert/security /obj/machinery/computer/station_alert/security
name = "Security Alert Console"
monitor_type = /obj/nano_module/alarm_monitor/security monitor_type = /obj/nano_module/alarm_monitor/security
circuit = /obj/item/weapon/circuitboard/stationalert_security
/obj/machinery/computer/station_alert/all
monitor_type = /obj/nano_module/alarm_monitor/all
circuit = /obj/item/weapon/circuitboard/stationalert_all
/obj/machinery/computer/station_alert/New() /obj/machinery/computer/station_alert/New()
..() ..()
@@ -18,6 +22,7 @@
/obj/machinery/computer/station_alert/Destroy() /obj/machinery/computer/station_alert/Destroy()
alarm_monitor.unregister(src) alarm_monitor.unregister(src)
qdel(alarm_monitor)
..() ..()
/obj/machinery/computer/station_alert/attack_ai(mob/user) /obj/machinery/computer/station_alert/attack_ai(mob/user)

View File

@@ -264,7 +264,7 @@ for reference:
var/turf/Tsec = get_turf(src) var/turf/Tsec = get_turf(src)
/* var/obj/item/stack/rods/ =*/ /* var/obj/item/stack/rods/ =*/
new /obj/item/stack/rods(Tsec) PoolOrNew(/obj/item/stack/rods, Tsec)
var/datum/effect/effect/system/spark_spread/s = new /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.set_up(3, 1, src)

View File

@@ -1,27 +1,10 @@
#define CONTROL_POD_DOORS 0 /obj/machinery/button/remote
#define CONTROL_NORMAL_DOORS 1 name = "remote object control"
#define CONTROL_EMITTERS 2 desc = "It controls objects, remotely."
/obj/machinery/door_control
name = "remote door-control"
desc = "It controls doors, remotely."
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "doorctrl0" icon_state = "doorctrl0"
desc = "A remote control-switch for a door."
power_channel = ENVIRON power_channel = ENVIRON
var/id = null var/desiredstate = 0
var/normaldoorcontrol = CONTROL_POD_DOORS
var/desiredstate = 0 // Zero is closed, 1 is open.
var/specialfunctions = 1
/*
Bitflag, 1= open
2= idscan,
4= bolts
8= shock
16= door safties
*/
var/exposedwires = 0 var/exposedwires = 0
var/wires = 3 var/wires = 3
/* /*
@@ -34,14 +17,13 @@
idle_power_usage = 2 idle_power_usage = 2
active_power_usage = 4 active_power_usage = 4
/obj/machinery/button/remote/attack_ai(mob/user as mob)
/obj/machinery/door_control/attack_ai(mob/user as mob)
if(wires & 2) if(wires & 2)
return src.attack_hand(user) return src.attack_hand(user)
else else
user << "Error, no route to host." user << "Error, no route to host."
/obj/machinery/door_control/attackby(obj/item/weapon/W, mob/user as mob) /obj/machinery/button/remote/attackby(obj/item/weapon/W, mob/user as mob)
/* For later implementation /* For later implementation
if (istype(W, /obj/item/weapon/screwdriver)) if (istype(W, /obj/item/weapon/screwdriver))
{ {
@@ -64,7 +46,56 @@
playsound(src.loc, "sparks", 100, 1) playsound(src.loc, "sparks", 100, 1)
return src.attack_hand(user) return src.attack_hand(user)
/obj/machinery/door_control/proc/handle_door() /obj/machinery/button/remote/attack_hand(mob/user as mob)
if(..())
return
src.add_fingerprint(user)
if(stat & (NOPOWER|BROKEN))
return
if(!allowed(user) && (wires & 1))
user << "<span class='warning'>Access Denied</span>"
flick("doorctrl-denied",src)
return
use_power(5)
icon_state = "doorctrl1"
desiredstate = !desiredstate
trigger()
spawn(15)
update_icon()
/obj/machinery/button/remote/proc/trigger()
return
/obj/machinery/button/remote/power_change()
..()
update_icon()
/obj/machinery/button/remote/update_icon()
if(stat & NOPOWER)
icon_state = "doorctrl-p"
else
icon_state = "doorctrl0"
/*
Airlock remote control
*/
/obj/machinery/button/remote/airlock
name = "remote door-control"
desc = "It controls doors, remotely."
var/specialfunctions = 1
/*
Bitflag, 1= open
2= idscan,
4= bolts
8= shock
16= door safties
*/
/obj/machinery/button/remote/airlock/trigger()
for(var/obj/machinery/door/airlock/D in world) for(var/obj/machinery/door/airlock/D in world)
if(D.id_tag == src.id) if(D.id_tag == src.id)
if(specialfunctions & OPEN) if(specialfunctions & OPEN)
@@ -78,24 +109,31 @@
return return
if(desiredstate == 1) if(desiredstate == 1)
if(specialfunctions & IDSCAN) if(specialfunctions & IDSCAN)
D.aiDisabledIdScanner = 1 D.set_idscan(0)
if(specialfunctions & BOLTS) if(specialfunctions & BOLTS)
D.lock() D.lock()
if(specialfunctions & SHOCK) if(specialfunctions & SHOCK)
D.electrify(-1) D.electrify(-1)
if(specialfunctions & SAFE) if(specialfunctions & SAFE)
D.safe = 0 D.set_safeties(0)
else else
if(specialfunctions & IDSCAN) if(specialfunctions & IDSCAN)
D.aiDisabledIdScanner = 0 D.set_idscan(1)
if(specialfunctions & BOLTS) if(specialfunctions & BOLTS)
D.unlock() D.unlock()
if(specialfunctions & SHOCK) if(specialfunctions & SHOCK)
D.electrify(0) D.electrify(0)
if(specialfunctions & SAFE) if(specialfunctions & SAFE)
D.safe = 1 D.set_safeties(1)
/obj/machinery/door_control/proc/handle_pod() /*
Blast door remote control
*/
/obj/machinery/button/remote/blast_door
name = "remote blast door-control"
desc = "It controls blast doors, remotely."
/obj/machinery/button/remote/blast_door/trigger()
for(var/obj/machinery/door/blast/M in world) for(var/obj/machinery/door/blast/M in world)
if(M.id == src.id) if(M.id == src.id)
if(M.density) if(M.density)
@@ -107,59 +145,32 @@
M.close() M.close()
return return
/obj/machinery/door_control/proc/handle_emitters(mob/user as mob) /*
Emitter remote control
*/
/obj/machinery/button/remote/emitter
name = "remote emitter control"
desc = "It controls emitters, remotely."
/obj/machinery/button/remote/emitter/trigger(mob/user as mob)
for(var/obj/machinery/power/emitter/E in world) for(var/obj/machinery/power/emitter/E in world)
if(E.id == src.id) if(E.id == src.id)
spawn(0) spawn(0)
E.activate(user) E.activate(user)
return return
/obj/machinery/door_control/attack_hand(mob/user as mob) /*
src.add_fingerprint(user) Mass driver remote control
if(stat & (NOPOWER|BROKEN)) */
return /obj/machinery/button/remote/driver
if(!allowed(user) && (wires & 1))
user << "\red Access Denied"
flick("doorctrl-denied",src)
return
use_power(5)
icon_state = "doorctrl1"
add_fingerprint(user)
switch(normaldoorcontrol)
if(CONTROL_NORMAL_DOORS)
handle_door()
if(CONTROL_POD_DOORS)
handle_pod()
if(CONTROL_EMITTERS)
handle_emitters(user)
desiredstate = !desiredstate
spawn(15)
if(!(stat & NOPOWER))
icon_state = "doorctrl0"
/obj/machinery/door_control/power_change()
..()
if(stat & NOPOWER)
icon_state = "doorctrl-p"
else
icon_state = "doorctrl0"
/obj/machinery/button/driver
name = "mass driver button" name = "mass driver button"
desc = "A remote control switch for a mass driver." desc = "A remote control switch for a mass driver."
icon = 'icons/obj/objects.dmi'
icon_state = "launcherbtt"
/obj/machinery/button/driver/attack_hand(mob/user as mob) /obj/machinery/button/remote/driver/trigger(mob/user as mob)
if(..())
return
use_power(5)
active = 1 active = 1
icon_state = "launcheract" update_icon()
for(var/obj/machinery/door/blast/M in machines) for(var/obj/machinery/door/blast/M in machines)
if (M.id == src.id) if (M.id == src.id)
@@ -177,11 +188,17 @@
for(var/obj/machinery/door/blast/M in machines) for(var/obj/machinery/door/blast/M in machines)
if (M.id == src.id) if (M.id == src.id)
spawn( 0 ) spawn(0)
M.close() M.close()
return return
icon_state = "launcherbtt" icon_state = "launcherbtt"
active = 0 update_icon()
return return
/obj/machinery/button/remote/driver/update_icon()
if(!active || (stat & NOPOWER))
icon_state = "launcherbtt"
else
icon_state = "launcheract"

View File

@@ -4,7 +4,7 @@
icon_state = "door_closed" icon_state = "door_closed"
power_channel = ENVIRON power_channel = ENVIRON
explosion_resistance = 15 explosion_resistance = 10
var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
var/hackProof = 0 // if 1, this door can't be hacked by the AI var/hackProof = 0 // if 1, this door can't be hacked by the AI
var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it.
@@ -80,6 +80,7 @@
icon = 'icons/obj/doors/Doorglass.dmi' icon = 'icons/obj/doors/Doorglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg' hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300 maxhealth = 300
explosion_resistance = 5
opacity = 0 opacity = 0
glass = 1 glass = 1
@@ -91,6 +92,7 @@
/obj/machinery/door/airlock/vault /obj/machinery/door/airlock/vault
name = "Vault" name = "Vault"
icon = 'icons/obj/doors/vault.dmi' icon = 'icons/obj/doors/vault.dmi'
explosion_resistance = 20
opacity = 1 opacity = 1
secured_wires = 1 secured_wires = 1
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites.
@@ -108,12 +110,14 @@
/obj/machinery/door/airlock/hatch /obj/machinery/door/airlock/hatch
name = "Airtight Hatch" name = "Airtight Hatch"
icon = 'icons/obj/doors/Doorhatchele.dmi' icon = 'icons/obj/doors/Doorhatchele.dmi'
explosion_resistance = 20
opacity = 1 opacity = 1
assembly_type = /obj/structure/door_assembly/door_assembly_hatch assembly_type = /obj/structure/door_assembly/door_assembly_hatch
/obj/machinery/door/airlock/maintenance_hatch /obj/machinery/door/airlock/maintenance_hatch
name = "Maintenance Hatch" name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorhatchmaint2.dmi' icon = 'icons/obj/doors/Doorhatchmaint2.dmi'
explosion_resistance = 20
opacity = 1 opacity = 1
assembly_type = /obj/structure/door_assembly/door_assembly_mhatch assembly_type = /obj/structure/door_assembly/door_assembly_mhatch
@@ -122,6 +126,7 @@
icon = 'icons/obj/doors/Doorcomglass.dmi' icon = 'icons/obj/doors/Doorcomglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg' hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300 maxhealth = 300
explosion_resistance = 5
opacity = 0 opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_com assembly_type = /obj/structure/door_assembly/door_assembly_com
glass = 1 glass = 1
@@ -131,6 +136,7 @@
icon = 'icons/obj/doors/Doorengglass.dmi' icon = 'icons/obj/doors/Doorengglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg' hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300 maxhealth = 300
explosion_resistance = 5
opacity = 0 opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_eng assembly_type = /obj/structure/door_assembly/door_assembly_eng
glass = 1 glass = 1
@@ -140,6 +146,7 @@
icon = 'icons/obj/doors/Doorsecglass.dmi' icon = 'icons/obj/doors/Doorsecglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg' hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300 maxhealth = 300
explosion_resistance = 5
opacity = 0 opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_sec assembly_type = /obj/structure/door_assembly/door_assembly_sec
glass = 1 glass = 1
@@ -149,6 +156,7 @@
icon = 'icons/obj/doors/Doormedglass.dmi' icon = 'icons/obj/doors/Doormedglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg' hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300 maxhealth = 300
explosion_resistance = 5
opacity = 0 opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_med assembly_type = /obj/structure/door_assembly/door_assembly_med
glass = 1 glass = 1
@@ -173,6 +181,7 @@
icon = 'icons/obj/doors/Doorresearchglass.dmi' icon = 'icons/obj/doors/Doorresearchglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg' hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300 maxhealth = 300
explosion_resistance = 5
opacity = 0 opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_research assembly_type = /obj/structure/door_assembly/door_assembly_research
glass = 1 glass = 1
@@ -183,6 +192,7 @@
icon = 'icons/obj/doors/Doorminingglass.dmi' icon = 'icons/obj/doors/Doorminingglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg' hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300 maxhealth = 300
explosion_resistance = 5
opacity = 0 opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_min assembly_type = /obj/structure/door_assembly/door_assembly_min
glass = 1 glass = 1
@@ -192,6 +202,7 @@
icon = 'icons/obj/doors/Dooratmoglass.dmi' icon = 'icons/obj/doors/Dooratmoglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg' hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300 maxhealth = 300
explosion_resistance = 5
opacity = 0 opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_atmo assembly_type = /obj/structure/door_assembly/door_assembly_atmo
glass = 1 glass = 1
@@ -292,6 +303,7 @@
/obj/machinery/door/airlock/highsecurity /obj/machinery/door/airlock/highsecurity
name = "Secure Airlock" name = "Secure Airlock"
icon = 'icons/obj/doors/hightechsecurity.dmi' icon = 'icons/obj/doors/hightechsecurity.dmi'
explosion_resistance = 20
secured_wires = 1 secured_wires = 1
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity
@@ -421,6 +433,33 @@ About the new airlock wires panel:
if(feedback && message) if(feedback && message)
usr << message usr << message
/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0)
var/message = ""
if(src.isWireCut(AIRLOCK_WIRE_IDSCAN))
message = "The IdScan wire is cut - IdScan feature permanently disabled."
else if(activate && src.aiDisabledIdScanner)
src.aiDisabledIdScanner = 0
message = "IdScan feature has been enabled."
else if(!activate && !src.aiDisabledIdScanner)
src.aiDisabledIdScanner = 1
message = "IdScan feature has been disabled."
if(feedback && message)
usr << message
/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0)
var/message = ""
// Safeties! We don't need no stinking safeties!
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
message = text("The safety wire is cut - Cannot enable safeties.")
else if (!activate && src.safe)
safe = 0
else if (activate && !src.safe)
safe = 1
if(feedback && message)
usr << message
// shock user with probability prb (if all connections & power are working) // shock user with probability prb (if all connections & power are working)
// returns 1 if shocked, 0 otherwise // returns 1 if shocked, 0 otherwise
// The preceding comment was borrowed from the grille's shock script // The preceding comment was borrowed from the grille's shock script
@@ -490,7 +529,8 @@ About the new airlock wires panel:
if("deny") if("deny")
if(density && src.arePowerSystemsOn()) if(density && src.arePowerSystemsOn())
flick("door_deny", src) flick("door_deny", src)
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) if(secured_wires)
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
return return
/obj/machinery/door/airlock/attack_ai(mob/user as mob) /obj/machinery/door/airlock/attack_ai(mob/user as mob)
@@ -636,14 +676,7 @@ About the new airlock wires panel:
var/activate = text2num(href_list["activate"]) var/activate = text2num(href_list["activate"])
switch (href_list["command"]) switch (href_list["command"])
if("idscan") if("idscan")
if(src.isWireCut(AIRLOCK_WIRE_IDSCAN)) set_idscan(activate, 1)
usr << "The IdScan wire has been cut - IdScan feature permanently disabled."
else if(activate && src.aiDisabledIdScanner)
src.aiDisabledIdScanner = 0
usr << "IdScan feature has been enabled."
else if(!activate && !src.aiDisabledIdScanner)
src.aiDisabledIdScanner = 1
usr << "IdScan feature has been disabled."
if("main_power") if("main_power")
if(!main_power_lost_until) if(!main_power_lost_until)
src.loseMainPower() src.loseMainPower()
@@ -652,7 +685,7 @@ About the new airlock wires panel:
src.loseBackupPower() src.loseBackupPower()
if("bolts") if("bolts")
if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
usr << "The door bolt control wire has been cut - Door bolts permanently dropped." usr << "The door bolt control wire is cut - Door bolts permanently dropped."
else if(activate && src.lock()) else if(activate && src.lock())
usr << "The door bolts have been dropped." usr << "The door bolts have been dropped."
else if(!activate && src.unlock()) else if(!activate && src.unlock())
@@ -671,13 +704,7 @@ About the new airlock wires panel:
else if(!activate && !density) else if(!activate && !density)
close() close()
if("safeties") if("safeties")
// Safeties! We don't need no stinking safeties! set_safeties(!activate, 1)
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
usr << text("The safety wire is cut - Cannot secure the door.")
else if (activate && src.safe)
safe = 0
else if (!activate && !src.safe)
safe = 1
if("timing") if("timing")
// Door speed control // Door speed control
if(src.isWireCut(AIRLOCK_WIRE_SPEED)) if(src.isWireCut(AIRLOCK_WIRE_SPEED))
@@ -689,7 +716,7 @@ About the new airlock wires panel:
if("lights") if("lights")
// Bolt lights // Bolt lights
if(src.isWireCut(AIRLOCK_WIRE_LIGHT)) if(src.isWireCut(AIRLOCK_WIRE_LIGHT))
usr << "The bolt lights wire has been cut - The door bolt lights are permanently disabled." usr << "The bolt lights wire is cut - The door bolt lights are permanently disabled."
else if (!activate && src.lights) else if (!activate && src.lights)
lights = 0 lights = 0
usr << "The door bolt lights have been disabled." usr << "The door bolt lights have been disabled."
@@ -856,40 +883,68 @@ About the new airlock wires panel:
return ..() return ..()
/atom/movable/proc/blocks_airlock()
return density
/obj/machinery/door/blocks_airlock()
return 0
/obj/machinery/mech_sensor/blocks_airlock()
return 0
/mob/living/blocks_airlock()
return 1
/atom/movable/proc/airlock_crush(var/crush_damage)
return 0
/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage)
. = ..()
health -= crush_damage
healthcheck()
/obj/structure/closet/airlock_crush(var/crush_damage)
..()
damage(crush_damage)
for(var/atom/movable/AM in src)
AM.airlock_crush()
return 1
/mob/living/airlock_crush(var/crush_damage)
. = ..()
adjustBruteLoss(crush_damage)
SetStunned(5)
SetWeakened(5)
var/turf/T = get_turf(src)
T.add_blood(src)
/mob/living/carbon/airlock_crush(var/crush_damage)
. = ..()
if (!(species && (species.flags & NO_PAIN)))
emote("scream")
/mob/living/silicon/robot/airlock_crush(var/crush_damage)
adjustBruteLoss(crush_damage)
return 0
/obj/machinery/door/airlock/close(var/forced=0) /obj/machinery/door/airlock/close(var/forced=0)
if(!can_close(forced)) if(!can_close(forced))
return 0 return 0
if(safe) if(safe)
for(var/turf/turf in locs) for(var/turf/turf in locs)
if(locate(/mob/living) in turf) for(var/atom/movable/AM in turf)
if(world.time > next_beep_at) if(AM.blocks_airlock())
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) if(world.time > next_beep_at)
next_beep_at = world.time + SecondsToTicks(10) playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
close_door_at = world.time + 6 next_beep_at = world.time + SecondsToTicks(10)
return close_door_at = world.time + 6
return
for(var/turf/turf in locs) for(var/turf/turf in locs)
for(var/mob/living/M in turf) for(var/atom/movable/AM in turf)
if(isrobot(M)) if(AM.airlock_crush(DOOR_CRUSH_DAMAGE))
M.adjustBruteLoss(DOOR_CRUSH_DAMAGE) take_damage(DOOR_CRUSH_DAMAGE)
else
M.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
M.SetStunned(5)
M.SetWeakened(5)
var/obj/effect/stop/S
S = new /obj/effect/stop
S.victim = M
S.loc = M.loc
spawn(20)
qdel(S)
if (iscarbon(M))
var/mob/living/carbon/C = M
if (!(C.species && (C.species.flags & NO_PAIN)))
M.emote("scream")
var/turf/location = src.loc
if(istype(location, /turf/simulated))
location.add_blood(M)
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
if(istype(src, /obj/machinery/door/airlock/glass)) if(istype(src, /obj/machinery/door/airlock/glass))
@@ -928,6 +983,11 @@ About the new airlock wires panel:
update_icon() update_icon()
return 1 return 1
/obj/machinery/door/airlock/allowed(mob/M)
if(locked)
return 0
return ..(M)
/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) /obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null)
..() ..()

View File

@@ -164,7 +164,7 @@
switch (Proj.damage_type) switch (Proj.damage_type)
if(BRUTE) if(BRUTE)
new /obj/item/stack/sheet/metal(src.loc, 2) new /obj/item/stack/sheet/metal(src.loc, 2)
new /obj/item/stack/rods(src.loc, 3) PoolOrNew(/obj/item/stack/rods, list(src.loc, 3))
if(BURN) if(BURN)
new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes! new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes!
qdel(src) qdel(src)
@@ -388,7 +388,9 @@
/obj/machinery/door/proc/open(var/forced = 0) /obj/machinery/door/proc/open(var/forced = 0)
if(!can_open(forced)) return if(!can_open(forced))
return
operating = 1
do_animate("opening") do_animate("opening")
icon_state = "door0" icon_state = "door0"
@@ -401,8 +403,7 @@
update_icon() update_icon()
SetOpacity(0) SetOpacity(0)
update_nearby_tiles() update_nearby_tiles()
operating = 0
if(operating) operating = 0
if(autoclose) if(autoclose)
close_door_at = next_close_time() close_door_at = next_close_time()

View File

@@ -32,7 +32,7 @@
if(80 to 90) filling.icon_state = "reagent80" if(80 to 90) filling.icon_state = "reagent80"
if(91 to INFINITY) filling.icon_state = "reagent100" if(91 to INFINITY) filling.icon_state = "reagent100"
filling.icon += mix_color_from_reagents(reagents.reagent_list) filling.icon += reagents.get_color()
overlays += filling overlays += filling
/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location) /obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location)

View File

@@ -504,42 +504,12 @@
/obj/machinery/porta_turret/proc/assess_perp(var/mob/living/carbon/human/H) /obj/machinery/porta_turret/proc/assess_perp(var/mob/living/carbon/human/H)
if(!H || !istype(H)) if(!H || !istype(H))
return return 0
if(emagged) if(emagged)
return 10 return 10
var/threatcount = 0 return H.assess_perp(src, check_weapons, check_records, check_arrest)
var/obj/item/weapon/card/id/id = GetIdCard(H) //Agent cards lower threatlevel.
if(id && istype(id, /obj/item/weapon/card/id/syndicate))
threatcount -= 2
if(check_weapons && !allowed(H))
if(istype(H.l_hand, /obj/item/weapon/gun) || istype(H.l_hand, /obj/item/weapon/melee))
threatcount += 4
if(istype(H.r_hand, /obj/item/weapon/gun) || istype(H.r_hand, /obj/item/weapon/melee))
threatcount += 4
if(istype(H.belt, /obj/item/weapon/gun) || istype(H.belt, /obj/item/weapon/melee))
threatcount += 2
if(H.species.name != "Human")
threatcount += 2
if(check_records || check_arrest)
var/perpname = H.name
if(id)
perpname = id.registered_name
var/datum/data/record/R = find_security_record("name", perpname)
if(check_records && !R)
threatcount += 4
if(check_arrest && R && (R.fields["criminal"] == "*Arrest*"))
threatcount += 4
return threatcount
/obj/machinery/porta_turret/proc/tryToShootAt(var/list/mob/living/targets) /obj/machinery/porta_turret/proc/tryToShootAt(var/list/mob/living/targets)
if(targets.len && last_target && (last_target in targets) && target(last_target)) if(targets.len && last_target && (last_target in targets) && target(last_target))
@@ -587,17 +557,6 @@
invisibility = INVISIBILITY_LEVEL_TWO invisibility = INVISIBILITY_LEVEL_TWO
update_icon() update_icon()
/*
/obj/machinery/porta_turret/on_assess_perp(mob/living/carbon/human/perp)
if((check_access || attacked) && !allowed(perp))
//if the turret has been attacked or is angry, target all non-authorized personnel, see req_access
return 10
return ..()
*/
/obj/machinery/porta_turret/proc/target(var/mob/living/target) /obj/machinery/porta_turret/proc/target(var/mob/living/target)
if(disabled) if(disabled)
return return
@@ -613,7 +572,7 @@
/obj/machinery/porta_turret/proc/shootAt(var/mob/living/target) /obj/machinery/porta_turret/proc/shootAt(var/mob/living/target)
//any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power! //any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
if(!emagged) //if it hasn't been emagged, it has to obey a cooldown rate if(!(emagged || attacked)) //if it hasn't been emagged or attacked, it has to obey a cooldown rate
if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged
return return
last_fired = 1 last_fired = 1

View File

@@ -987,7 +987,6 @@
helmet.name = "engineering voidsuit helmet" helmet.name = "engineering voidsuit helmet"
helmet.icon_state = "rig0-engineering" helmet.icon_state = "rig0-engineering"
helmet.item_state = "eng_helm" helmet.item_state = "eng_helm"
helmet.item_color = "engineering"
if(suit) if(suit)
suit.name = "engineering voidsuit" suit.name = "engineering voidsuit"
suit.icon_state = "rig-engineering" suit.icon_state = "rig-engineering"
@@ -997,7 +996,6 @@
helmet.name = "mining voidsuit helmet" helmet.name = "mining voidsuit helmet"
helmet.icon_state = "rig0-mining" helmet.icon_state = "rig0-mining"
helmet.item_state = "mining_helm" helmet.item_state = "mining_helm"
helmet.item_color = "mining"
if(suit) if(suit)
suit.name = "mining voidsuit" suit.name = "mining voidsuit"
suit.icon_state = "rig-mining" suit.icon_state = "rig-mining"
@@ -1007,7 +1005,6 @@
helmet.name = "medical voidsuit helmet" helmet.name = "medical voidsuit helmet"
helmet.icon_state = "rig0-medical" helmet.icon_state = "rig0-medical"
helmet.item_state = "medical_helm" helmet.item_state = "medical_helm"
helmet.item_color = "medical"
if(suit) if(suit)
suit.name = "medical voidsuit" suit.name = "medical voidsuit"
suit.icon_state = "rig-medical" suit.icon_state = "rig-medical"
@@ -1017,7 +1014,6 @@
helmet.name = "security voidsuit helmet" helmet.name = "security voidsuit helmet"
helmet.icon_state = "rig0-sec" helmet.icon_state = "rig0-sec"
helmet.item_state = "sec_helm" helmet.item_state = "sec_helm"
helmet.item_color = "sec"
if(suit) if(suit)
suit.name = "security voidsuit" suit.name = "security voidsuit"
suit.icon_state = "rig-sec" suit.icon_state = "rig-sec"
@@ -1027,7 +1023,6 @@
helmet.name = "atmospherics voidsuit helmet" helmet.name = "atmospherics voidsuit helmet"
helmet.icon_state = "rig0-atmos" helmet.icon_state = "rig0-atmos"
helmet.item_state = "atmos_helm" helmet.item_state = "atmos_helm"
helmet.item_color = "atmos"
if(suit) if(suit)
suit.name = "atmospherics voidsuit" suit.name = "atmospherics voidsuit"
suit.icon_state = "rig-atmos" suit.icon_state = "rig-atmos"
@@ -1037,7 +1032,6 @@
helmet.name = "blood-red voidsuit helmet" helmet.name = "blood-red voidsuit helmet"
helmet.icon_state = "rig0-syndie" helmet.icon_state = "rig0-syndie"
helmet.item_state = "syndie_helm" helmet.item_state = "syndie_helm"
helmet.item_color = "syndie"
if(suit) if(suit)
suit.name = "blood-red voidsuit" suit.name = "blood-red voidsuit"
suit.item_state = "syndie_voidsuit" suit.item_state = "syndie_voidsuit"

View File

@@ -63,64 +63,37 @@
// If the log is a speech file // If the log is a speech file
if(C.input_type == "Speech File") if(C.input_type == "Speech File")
dat += "<li><font color = #008F00>[C.name]</font color> <font color = #FF0000><a href='?src=\ref[src];delete=[i]'>\[X\]</a></font color><br>" dat += "<li><font color = #008F00>[C.name]</font> <font color = #FF0000><a href='?src=\ref[src];delete=[i]'>\[X\]</a></font><br>"
// -- Determine race of orator -- // -- Determine race of orator --
var/race // The actual race of the mob var/race = C.parameters["race"] // The actual race of the mob
var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human var/language = C.parameters["language"] // The language spoken, or null/""
var/mobtype = C.parameters["mobtype"]
var/mob/M = new mobtype
if(ishuman(M) || isbrain(M))
var/mob/living/carbon/human/H = M
race = "[H.species.name]"
else if(issmall(M))
race = "Monkey"
language = race
else if(issilicon(M) || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job
race = "Artificial Life"
else if(isslime(M)) // NT knows a lot about slimes, but not aliens. Can identify slimes
race = "slime"
language = race
else if(isanimal(M))
race = "Domestic Animal"
language = race
else
race = "<i>Unidentifiable</i>"
language = race
qdel(M)
// -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- // -- If the orator is a human, or universal translate is active, OR mob has universal speech on --
if(language == "Human" || universal_translate || C.parameters["uspeech"]) if(universal_translate || C.parameters["uspeech"] || C.parameters["intelligible"])
dat += "<u><font color = #18743E>Data type</font color></u>: [C.input_type]<br>" dat += "<u><font color = #18743E>Data type</font></u>: [C.input_type]<br>"
dat += "<u><font color = #18743E>Source</font color></u>: [C.parameters["name"]] (Job: [C.parameters["job"]])<br>" dat += "<u><font color = #18743E>Source</font></u>: [C.parameters["name"]] (Job: [C.parameters["job"]])<br>"
dat += "<u><font color = #18743E>Class</font color></u>: [race]<br>" dat += "<u><font color = #18743E>Class</font></u>: [race]<br>"
dat += "<u><font color = #18743E>Contents</font color></u>: \"[C.parameters["message"]]\"<br>" dat += "<u><font color = #18743E>Contents</font></u>: \"[C.parameters["message"]]\"<br>"
if(language)
dat += "<u><font color = #18743E>Language</font></u>: [language]<br/>"
// -- Orator is not human and universal translate not active -- // -- Orator is not human and universal translate not active --
else else
dat += "<u><font color = #18743E>Data type</font color></u>: Audio File<br>" dat += "<u><font color = #18743E>Data type</font></u>: Audio File<br>"
dat += "<u><font color = #18743E>Source</font color></u>: <i>Unidentifiable</i><br>" dat += "<u><font color = #18743E>Source</font></u>: <i>Unidentifiable</i><br>"
dat += "<u><font color = #18743E>Class</font color></u>: [race]<br>" dat += "<u><font color = #18743E>Class</font></u>: [race]<br>"
dat += "<u><font color = #18743E>Contents</font color></u>: <i>Unintelligble</i><br>" dat += "<u><font color = #18743E>Contents</font></u>: <i>Unintelligble</i><br>"
dat += "</li><br>" dat += "</li><br>"
else if(C.input_type == "Execution Error") else if(C.input_type == "Execution Error")
dat += "<li><font color = #990000>[C.name]</font color> <font color = #FF0000><a href='?src=\ref[src];delete=[i]'>\[X\]</a></font color><br>" dat += "<li><font color = #990000>[C.name]</font> <font color = #FF0000><a href='?src=\ref[src];delete=[i]'>\[X\]</a></font color><br>"
dat += "<u><font color = #787700>Output</font color></u>: \"[C.parameters["message"]]\"<br>" dat += "<u><font color = #787700>Output</font></u>: \"[C.parameters["message"]]\"<br>"
dat += "</li><br>" dat += "</li><br>"

View File

@@ -537,6 +537,28 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
log.parameters["message"] = signal.data["message"] log.parameters["message"] = signal.data["message"]
log.parameters["name"] = signal.data["name"] log.parameters["name"] = signal.data["name"]
log.parameters["realname"] = signal.data["realname"] log.parameters["realname"] = signal.data["realname"]
log.parameters["language"] = signal.data["language"]
var/race = "unknown"
if(ishuman(M))
var/mob/living/carbon/human/H = M
race = "[H.species.name]"
log.parameters["intelligible"] = 1
else if(isbrain(M))
var/mob/living/carbon/brain/B = M
race = "[B.species.name]"
log.parameters["intelligible"] = 1
else if(M.isMonkey())
race = "Monkey"
else if(M.isSilicon())
race = "Artificial Life"
log.parameters["intelligible"] = 1
else if(isslime(M))
race = "Slime"
else if(isanimal(M))
race = "Domestic Animal"
log.parameters["race"] = race
if(!istype(M, /mob/new_player) && M) if(!istype(M, /mob/new_player) && M)
log.parameters["uspeech"] = M.universal_speak log.parameters["uspeech"] = M.universal_speak

View File

@@ -51,128 +51,7 @@
var/obj/item/stack/sheet/wetleather/WL = new(src) var/obj/item/stack/sheet/wetleather/WL = new(src)
WL.amount = HH.amount WL.amount = HH.amount
qdel(HH) qdel(HH)
if(crayon)
var/wash_color
if(istype(crayon,/obj/item/toy/crayon))
var/obj/item/toy/crayon/CR = crayon
wash_color = CR.colourName
else if(istype(crayon,/obj/item/weapon/stamp))
var/obj/item/weapon/stamp/ST = crayon
wash_color = ST.item_color
if(wash_color)
var/new_jumpsuit_icon_state = ""
var/new_jumpsuit_item_state = ""
var/new_jumpsuit_name = ""
var/new_glove_icon_state = ""
var/new_glove_item_state = ""
var/new_glove_name = ""
var/new_shoe_icon_state = ""
var/new_shoe_name = ""
var/new_sheet_icon_state = ""
var/new_sheet_name = ""
var/new_softcap_icon_state = ""
var/new_softcap_name = ""
var/new_desc = "The colors are a bit dodgy."
for(var/T in typesof(/obj/item/clothing/under))
var/obj/item/clothing/under/J = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == J.item_color)
new_jumpsuit_icon_state = J.icon_state
new_jumpsuit_item_state = J.item_state
new_jumpsuit_name = J.name
qdel(J)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(J)
for(var/T in typesof(/obj/item/clothing/gloves))
var/obj/item/clothing/gloves/G = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == G.item_color)
new_glove_icon_state = G.icon_state
new_glove_item_state = G.item_state
new_glove_name = G.name
qdel(G)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(G)
for(var/T in typesof(/obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == S.item_color)
new_shoe_icon_state = S.icon_state
new_shoe_name = S.name
qdel(S)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(S)
for(var/T in typesof(/obj/item/weapon/bedsheet))
var/obj/item/weapon/bedsheet/B = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == B.item_color)
new_sheet_icon_state = B.icon_state
new_sheet_name = B.name
qdel(B)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(B)
for(var/T in typesof(/obj/item/clothing/head/soft))
var/obj/item/clothing/head/soft/H = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == H.item_color)
new_softcap_icon_state = H.icon_state
new_softcap_name = H.name
qdel(H)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(H)
if(new_jumpsuit_icon_state && new_jumpsuit_item_state && new_jumpsuit_name)
for(var/obj/item/clothing/under/J in contents)
//world << "DEBUG: YUP! FOUND IT!"
J.item_state = new_jumpsuit_item_state
J.icon_state = new_jumpsuit_icon_state
J.item_color = wash_color
J.name = new_jumpsuit_name
J.desc = new_desc
if(new_glove_icon_state && new_glove_item_state && new_glove_name)
for(var/obj/item/clothing/gloves/G in contents)
//world << "DEBUG: YUP! FOUND IT!"
G.item_state = new_glove_item_state
G.icon_state = new_glove_icon_state
G.item_color = wash_color
G.name = new_glove_name
G.desc = new_desc
if(new_shoe_icon_state && new_shoe_name)
for(var/obj/item/clothing/shoes/S in contents)
//world << "DEBUG: YUP! FOUND IT!"
if (istype(S,/obj/item/clothing/shoes/orange))
var/obj/item/clothing/shoes/orange/L = S
if (L.chained)
L.remove_cuffs()
S.icon_state = new_shoe_icon_state
S.item_color = wash_color
S.name = new_shoe_name
S.desc = new_desc
if(new_sheet_icon_state && new_sheet_name)
for(var/obj/item/weapon/bedsheet/B in contents)
//world << "DEBUG: YUP! FOUND IT!"
B.icon_state = new_sheet_icon_state
B.item_color = wash_color
B.name = new_sheet_name
B.desc = new_desc
if(new_softcap_icon_state && new_softcap_name)
for(var/obj/item/clothing/head/soft/H in contents)
//world << "DEBUG: YUP! FOUND IT!"
H.icon_state = new_softcap_icon_state
H.item_color = wash_color
H.name = new_softcap_name
H.desc = new_desc
qdel(crayon)
crayon = null
if( locate(/mob,contents) ) if( locate(/mob,contents) )
state = 7 state = 7
gibs_ready = 1 gibs_ready = 1
@@ -197,7 +76,7 @@
/*if(istype(W,/obj/item/weapon/screwdriver)) /*if(istype(W,/obj/item/weapon/screwdriver))
panel = !panel panel = !panel
user << "\blue you [panel ? "open" : "close"] the [src]'s maintenance panel"*/ user << "\blue you [panel ? "open" : "close"] the [src]'s maintenance panel"*/
if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp)) if(istype(W,/obj/item/weapon/pen/crayon) || istype(W,/obj/item/weapon/stamp))
if( state in list( 1, 3, 6 ) ) if( state in list( 1, 3, 6 ) )
if(!crayon) if(!crayon)
user.drop_item() user.drop_item()

View File

@@ -511,7 +511,7 @@
src.updateUsrDialog() src.updateUsrDialog()
sleep(30) //only sleep if called by user sleep(30) //only sleep if called by user
var/found = 0 var/found = 0
for(var/obj/machinery/computer/rdconsole/RDC in get_area(src)) for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src)))
if(!RDC.sync) if(!RDC.sync)
continue continue
found++ found++

View File

@@ -497,6 +497,11 @@
/obj/mecha/proc/dynabsorbdamage(damage,damage_type) /obj/mecha/proc/dynabsorbdamage(damage,damage_type)
return damage*(listgetindex(damage_absorption,damage_type) || 1) return damage*(listgetindex(damage_absorption,damage_type) || 1)
/obj/mecha/airlock_crush(var/crush_damage)
..()
take_damage(crush_damage)
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return 1
/obj/mecha/proc/update_health() /obj/mecha/proc/update_health()
if(src.health > 0) if(src.health > 0)

View File

@@ -155,7 +155,7 @@
//build smoke icon //build smoke icon
var/color = mix_color_from_reagents(chemholder.reagents.reagent_list) var/color = chemholder.reagents.get_color()
var/icon/I var/icon/I
if(color) if(color)
I = icon('icons/effects/chemsmoke.dmi') I = icon('icons/effects/chemsmoke.dmi')
@@ -229,6 +229,10 @@
// Fades out the smoke smoothly using it's alpha variable. // Fades out the smoke smoothly using it's alpha variable.
//------------------------------------------ //------------------------------------------
/datum/effect/effect/system/smoke_spread/chem/proc/fadeOut(var/atom/A, var/frames = 16) /datum/effect/effect/system/smoke_spread/chem/proc/fadeOut(var/atom/A, var/frames = 16)
if(A.alpha == 0) //Handle already transparent case
return
if(frames == 0)
frames = 1 //We will just assume that by 0 frames, the coder meant "during one frame".
var/step = A.alpha / frames var/step = A.alpha / frames
for(var/i = 0, i < frames, i++) for(var/i = 0, i < frames, i++)
A.alpha -= step A.alpha -= step

View File

@@ -22,9 +22,9 @@
/obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user) /obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user)
if(W.attack_verb.len) if(W.attack_verb.len)
visible_message("\red <B>\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") visible_message("<span class='warning'>\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
else else
visible_message("\red <B>\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") visible_message("<span class='warning'>\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
var/damage = W.force / 4.0 var/damage = W.force / 4.0

View File

@@ -65,7 +65,7 @@ proc/explosion_rec(turf/epicenter, power)
var/explosion_resistance var/explosion_resistance
/turf/space /turf/space
explosion_resistance = 10 explosion_resistance = 3
/turf/simulated/floor /turf/simulated/floor
explosion_resistance = 1 explosion_resistance = 1
@@ -83,10 +83,10 @@ proc/explosion_rec(turf/epicenter, power)
explosion_resistance = 1 explosion_resistance = 1
/turf/simulated/shuttle/wall /turf/simulated/shuttle/wall
explosion_resistance = 5 explosion_resistance = 10
/turf/simulated/wall /turf/simulated/wall
explosion_resistance = 5 explosion_resistance = 10
/turf/simulated/wall/r_wall /turf/simulated/wall/r_wall
explosion_resistance = 25 explosion_resistance = 25
@@ -107,24 +107,16 @@ proc/explosion_rec(turf/epicenter, power)
explosion_turfs[src] = power explosion_turfs[src] = power
var/spread_power = power - src.explosion_resistance //This is the amount of power that will be spread to the tile in the direction of the blast var/spread_power = power - src.explosion_resistance //This is the amount of power that will be spread to the tile in the direction of the blast
var/side_spread_power = power - 2 * src.explosion_resistance //This is the amount of power that will be spread to the side tiles
for(var/obj/O in src) for(var/obj/O in src)
if(O.explosion_resistance) if(O.explosion_resistance)
spread_power -= O.explosion_resistance spread_power -= O.explosion_resistance
side_spread_power -= O.explosion_resistance
var/turf/T = get_step(src, direction) var/turf/T = get_step(src, direction)
T.explosion_spread(spread_power, direction) T.explosion_spread(spread_power, direction)
T = get_step(src, turn(direction,90)) T = get_step(src, turn(direction,90))
T.explosion_spread(side_spread_power, turn(direction,90)) T.explosion_spread(spread_power, turn(direction,90))
T = get_step(src, turn(direction,-90)) T = get_step(src, turn(direction,-90))
T.explosion_spread(side_spread_power, turn(direction,90)) T.explosion_spread(spread_power, turn(direction,90))
/*
for(var/direction in cardinal)
var/turf/T = get_step(src, direction)
T.explosion_spread(spread_power)
*/
/turf/unsimulated/explosion_spread(power) /turf/unsimulated/explosion_spread(power)
return //So it doesn't get to the parent proc, which simulates explosions return //So it doesn't get to the parent proc, which simulates explosions

View File

@@ -3,7 +3,6 @@
icon = 'icons/obj/items.dmi' icon = 'icons/obj/items.dmi'
var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
var/abstract = 0 var/abstract = 0
var/item_state = null
var/r_speed = 1.0 var/r_speed = 1.0
var/health = null var/health = null
var/burn_point = null var/burn_point = null
@@ -26,7 +25,6 @@
//Since any item can now be a piece of clothing, this has to be put here so all items share it. //Since any item can now be a piece of clothing, this has to be put here so all items share it.
var/flags_inv //This flag is used to determine when items in someone's inventory cover others. IE helmets making it so you can't see glasses, etc. var/flags_inv //This flag is used to determine when items in someone's inventory cover others. IE helmets making it so you can't see glasses, etc.
var/item_color = null
var/body_parts_covered = 0 //see setup.dm for appropriate bit flags var/body_parts_covered = 0 //see setup.dm for appropriate bit flags
//var/heat_transfer_coefficient = 1 //0 prevents all transfers, 1 is invisible //var/heat_transfer_coefficient = 1 //0 prevents all transfers, 1 is invisible
var/gas_transfer_coefficient = 1 // for leaking gas from turf to mask and vice-versa (for masks right now, but at some point, i'd like to include space helmets) var/gas_transfer_coefficient = 1 // for leaking gas from turf to mask and vice-versa (for masks right now, but at some point, i'd like to include space helmets)
@@ -40,6 +38,9 @@
var/zoomdevicename = null //name used for message when binoculars/scope is used 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/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars.
var/item_state = null // Used to specify the item state for the on-mob overlays.
var/item_state_slots = null //overrides the default item_state for particular slots.
// Used to specify the icon file to be used when the item is worn. If not set the default icon for that slot will be used. // Used to specify the icon file to be used when the item is worn. If not set the default icon for that slot will be used.
// If icon_override or sprite_sheets are set they will take precendence over this, assuming they apply to the slot in question. // If icon_override or sprite_sheets are set they will take precendence over this, assuming they apply to the slot in question.
// Only slot_l_hand/slot_r_hand are implemented at the moment. Others to be implemented as needed. // Only slot_l_hand/slot_r_hand are implemented at the moment. Others to be implemented as needed.

View File

@@ -1,40 +1,40 @@
/obj/item/toy/crayon/red /obj/item/weapon/pen/crayon/red
icon_state = "crayonred" icon_state = "crayonred"
colour = "#DA0000" colour = "#DA0000"
shadeColour = "#810C0C" shadeColour = "#810C0C"
colourName = "red" colourName = "red"
/obj/item/toy/crayon/orange /obj/item/weapon/pen/crayon/orange
icon_state = "crayonorange" icon_state = "crayonorange"
colour = "#FF9300" colour = "#FF9300"
shadeColour = "#A55403" shadeColour = "#A55403"
colourName = "orange" colourName = "orange"
/obj/item/toy/crayon/yellow /obj/item/weapon/pen/crayon/yellow
icon_state = "crayonyellow" icon_state = "crayonyellow"
colour = "#FFF200" colour = "#FFF200"
shadeColour = "#886422" shadeColour = "#886422"
colourName = "yellow" colourName = "yellow"
/obj/item/toy/crayon/green /obj/item/weapon/pen/crayon/green
icon_state = "crayongreen" icon_state = "crayongreen"
colour = "#A8E61D" colour = "#A8E61D"
shadeColour = "#61840F" shadeColour = "#61840F"
colourName = "green" colourName = "green"
/obj/item/toy/crayon/blue /obj/item/weapon/pen/crayon/blue
icon_state = "crayonblue" icon_state = "crayonblue"
colour = "#00B7EF" colour = "#00B7EF"
shadeColour = "#0082A8" shadeColour = "#0082A8"
colourName = "blue" colourName = "blue"
/obj/item/toy/crayon/purple /obj/item/weapon/pen/crayon/purple
icon_state = "crayonpurple" icon_state = "crayonpurple"
colour = "#DA00FF" colour = "#DA00FF"
shadeColour = "#810CFF" shadeColour = "#810CFF"
colourName = "purple" colourName = "purple"
/obj/item/toy/crayon/mime /obj/item/weapon/pen/crayon/mime
icon_state = "crayonmime" icon_state = "crayonmime"
desc = "A very sad-looking crayon." desc = "A very sad-looking crayon."
colour = "#FFFFFF" colour = "#FFFFFF"
@@ -42,7 +42,7 @@
colourName = "mime" colourName = "mime"
uses = 0 uses = 0
/obj/item/toy/crayon/mime/attack_self(mob/living/user as mob) //inversion /obj/item/weapon/pen/crayon/mime/attack_self(mob/living/user as mob) //inversion
if(colour != "#FFFFFF" && shadeColour != "#000000") if(colour != "#FFFFFF" && shadeColour != "#000000")
colour = "#FFFFFF" colour = "#FFFFFF"
shadeColour = "#000000" shadeColour = "#000000"
@@ -53,19 +53,19 @@
user << "You will now draw in black and white with this crayon." user << "You will now draw in black and white with this crayon."
return return
/obj/item/toy/crayon/rainbow /obj/item/weapon/pen/crayon/rainbow
icon_state = "crayonrainbow" icon_state = "crayonrainbow"
colour = "#FFF000" colour = "#FFF000"
shadeColour = "#000FFF" shadeColour = "#000FFF"
colourName = "rainbow" colourName = "rainbow"
uses = 0 uses = 0
/obj/item/toy/crayon/rainbow/attack_self(mob/living/user as mob) /obj/item/weapon/pen/crayon/rainbow/attack_self(mob/living/user as mob)
colour = input(user, "Please select the main colour.", "Crayon colour") as color colour = input(user, "Please select the main colour.", "Crayon colour") as color
shadeColour = input(user, "Please select the shade colour.", "Crayon colour") as color shadeColour = input(user, "Please select the shade colour.", "Crayon colour") as color
return return
/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity) /obj/item/weapon/pen/crayon/afterattack(atom/target, mob/user as mob, proximity)
if(!proximity) return if(!proximity) return
if(istype(target,/turf/simulated/floor)) if(istype(target,/turf/simulated/floor))
var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter") var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter")
@@ -88,7 +88,7 @@
qdel(src) qdel(src)
return return
/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob) /obj/item/weapon/pen/crayon/attack(mob/M as mob, mob/user as mob)
if(M == user) if(M == user)
user << "You take a bite of the crayon and swallow it." user << "You take a bite of the crayon and swallow it."
user.nutrition += 1 user.nutrition += 1

View File

@@ -58,10 +58,9 @@
icon_state = "cart-s" icon_state = "cart-s"
access_security = 1 access_security = 1
/obj/item/weapon/cartridge/security/New() /obj/item/weapon/cartridge/security/initialize()
radio = new /obj/item/radio/integrated/beepsky(src)
..() ..()
spawn(5)
radio = new /obj/item/radio/integrated/beepsky(src)
/obj/item/weapon/cartridge/detective /obj/item/weapon/cartridge/detective
name = "\improper D.E.T.E.C.T. cartridge" name = "\improper D.E.T.E.C.T. cartridge"
@@ -102,6 +101,7 @@
/obj/item/weapon/cartridge/signal /obj/item/weapon/cartridge/signal
name = "generic signaler cartridge" name = "generic signaler cartridge"
desc = "A data cartridge with an integrated radio signaler module." desc = "A data cartridge with an integrated radio signaler module."
var/qdeled = 0
/obj/item/weapon/cartridge/signal/science /obj/item/weapon/cartridge/signal/science
name = "\improper Signal Ace 2 cartridge" name = "\improper Signal Ace 2 cartridge"
@@ -110,10 +110,9 @@
access_reagent_scanner = 1 access_reagent_scanner = 1
access_atmos = 1 access_atmos = 1
/obj/item/weapon/cartridge/signal/New() /obj/item/weapon/cartridge/signal/initialize()
..() radio = new /obj/item/radio/integrated/signal(src)
spawn(5) ..()
radio = new /obj/item/radio/integrated/signal(src)
/obj/item/weapon/cartridge/signal/Destroy() /obj/item/weapon/cartridge/signal/Destroy()
qdel(radio) qdel(radio)
@@ -125,10 +124,9 @@
icon_state = "cart-q" icon_state = "cart-q"
access_quartermaster = 1 access_quartermaster = 1
/obj/item/weapon/cartridge/quartermaster/New() /obj/item/weapon/cartridge/quartermaster/initialize()
radio = new /obj/item/radio/integrated/mule(src)
..() ..()
spawn(5)
radio = new /obj/item/radio/integrated/mule(src)
/obj/item/weapon/cartridge/head /obj/item/weapon/cartridge/head
name = "\improper Easy-Record DELUXE" name = "\improper Easy-Record DELUXE"
@@ -143,10 +141,8 @@
access_janitor = 1 access_janitor = 1
access_security = 1 access_security = 1
/obj/item/weapon/cartridge/hop/New() /obj/item/weapon/cartridge/hop/initialize()
..() radio = new /obj/item/radio/integrated/mule(src)
spawn(5)
radio = new /obj/item/radio/integrated/mule(src)
/obj/item/weapon/cartridge/hos /obj/item/weapon/cartridge/hos
name = "\improper R.O.B.U.S.T. DELUXE" name = "\improper R.O.B.U.S.T. DELUXE"
@@ -154,10 +150,9 @@
access_status_display = 1 access_status_display = 1
access_security = 1 access_security = 1
/obj/item/weapon/cartridge/hos/New() /obj/item/weapon/cartridge/hos/initialize()
radio = new /obj/item/radio/integrated/beepsky(src)
..() ..()
spawn(5)
radio = new /obj/item/radio/integrated/beepsky(src)
/obj/item/weapon/cartridge/ce /obj/item/weapon/cartridge/ce
name = "\improper Power-On DELUXE" name = "\improper Power-On DELUXE"
@@ -180,10 +175,9 @@
access_reagent_scanner = 1 access_reagent_scanner = 1
access_atmos = 1 access_atmos = 1
/obj/item/weapon/cartridge/rd/New() /obj/item/weapon/cartridge/rd/initialize()
radio = new /obj/item/radio/integrated/signal(src)
..() ..()
spawn(5)
radio = new /obj/item/radio/integrated/signal(src)
/obj/item/weapon/cartridge/captain /obj/item/weapon/cartridge/captain
name = "\improper Value-PAK cartridge" name = "\improper Value-PAK cartridge"

View File

@@ -217,12 +217,10 @@
var/last_transmission var/last_transmission
var/datum/radio_frequency/radio_connection var/datum/radio_frequency/radio_connection
New()
..()
if(radio_controller)
initialize()
initialize() initialize()
if(!radio_controller)
return
if (src.frequency < 1441 || src.frequency > 1489) if (src.frequency < 1441 || src.frequency > 1489)
src.frequency = sanitize_frequency(src.frequency) src.frequency = sanitize_frequency(src.frequency)

View File

@@ -14,108 +14,114 @@
matter = list("metal" = 750,"waste" = 750) matter = list("metal" = 750,"waste" = 750)
origin_tech = "powerstorage=3;syndicate=5" origin_tech = "powerstorage=3;syndicate=5"
var/drain_rate = 1000000 // amount of power to drain per tick var/drain_rate = 1500000 // amount of power to drain per tick
var/dissipation_rate = 20000 var/apc_drain_rate = 5000 // Max. amount drained from single APC. In Watts.
var/power_drained = 0 // has drained this much power var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts.
var/max_power = 5e9 // maximum power that can be drained before exploding var/power_drained = 0 // Amount of power drained.
var/mode = 0 // 0 = off, 1=clamped (off), 2=operating var/max_power = 5e9 // Detonation point.
var/mode = 0 // 0 = off, 1=clamped (off), 2=operating
var/drained_this_tick = 0 // This is unfortunately necessary to ensure we process powersinks BEFORE other machinery such as APCs.
var/datum/powernet/PN // Our powernet
var/obj/structure/cable/attached // the attached cable var/obj/structure/cable/attached // the attached cable
attackby(var/obj/item/I, var/mob/user) /obj/item/device/powersink/Destroy()
if(istype(I, /obj/item/weapon/screwdriver)) processing_objects.Remove(src)
if(mode == 0) ..()
var/turf/T = loc
if(isturf(T) && !T.intact) /obj/item/device/powersink/attackby(var/obj/item/I, var/mob/user)
attached = locate() in T if(istype(I, /obj/item/weapon/screwdriver))
if(!attached) if(mode == 0)
user << "No exposed cable here to attach to." var/turf/T = loc
return if(isturf(T) && !T.intact)
else attached = locate() in T
anchored = 1 if(!attached)
mode = 1 user << "No exposed cable here to attach to."
user << "You attach the device to the cable." return
for(var/mob/M in viewers(user))
if(M == user) continue
M << "[user] attaches the power sink to the cable."
return
else else
user << "Device must be placed over an exposed cable to attach to it." anchored = 1
mode = 1
src.visible_message("<span class='notice'>[user] attaches [src] to the cable!</span>")
return return
else else
if (mode == 2) user << "Device must be placed over an exposed cable to attach to it."
processing_objects.Remove(src) // Now the power sink actually stops draining the station's power if you unhook it. --NeoFite
anchored = 0
mode = 0
user << "You detach the device from the cable."
for(var/mob/M in viewers(user))
if(M == user) continue
M << "[user] detaches the power sink from the cable."
SetLuminosity(0)
icon_state = "powersink0"
return return
else else
..() if (mode == 2)
processing_objects.Remove(src) // Now the power sink actually stops draining the station's power if you unhook it. --NeoFite
anchored = 0
mode = 0
src.visible_message("<span class='notice'>[user] detaches [src] from the cable!</span>")
SetLuminosity(0)
icon_state = "powersink0"
attack_ai() return
else
..()
/obj/item/device/powersink/attack_ai()
return
/obj/item/device/powersink/attack_hand(var/mob/user)
switch(mode)
if(0)
..()
if(1)
src.visible_message("<span class='notice'>[user] activates [src]!</span>")
mode = 2
icon_state = "powersink1"
processing_objects.Add(src)
if(2) //This switch option wasn't originally included. It exists now. --NeoFite
src.visible_message("<span class='notice'>[user] deactivates [src]!</span>")
mode = 1
SetLuminosity(0)
icon_state = "powersink0"
processing_objects.Remove(src)
/obj/item/device/powersink/proc/drain()
if(!attached)
return return
attack_hand(var/mob/user) if(drained_this_tick)
switch(mode) return
if(0) drained_this_tick = 1
..()
if(1) var/drained = 0
user << "You activate the device!"
for(var/mob/M in viewers(user))
if(M == user) continue
M << "[user] activates the power sink!"
mode = 2
icon_state = "powersink1"
processing_objects.Add(src)
if(2) //This switch option wasn't originally included. It exists now. --NeoFite if(!PN)
user << "You deactivate the device!" return
for(var/mob/M in viewers(user))
if(M == user) continue
M << "[user] deactivates the power sink!"
mode = 1
SetLuminosity(0)
icon_state = "powersink0"
processing_objects.Remove(src)
process() SetLuminosity(12)
power_drained -= min(dissipation_rate, power_drained) PN.trigger_warning()
if(attached) // found a powernet, so drain up to max power from it
var/datum/powernet/PN = attached.get_powernet() drained = PN.draw_power(drain_rate)
if(PN) // if tried to drain more than available on powernet
SetLuminosity(12) // now look for APCs and drain their cells
PN.trigger_warning() if(drained < drain_rate)
// found a powernet, so drain up to max power from it for(var/obj/machinery/power/terminal/T in PN.nodes)
var/drained = PN.draw_power(drain_rate) // Enough power drained this tick, no need to torture more APCs
if(drained >= drain_rate)
// if tried to drain more than available on powernet break
// now look for APCs and drain their cells if(istype(T.master, /obj/machinery/power/apc))
if(drained < drain_rate) var/obj/machinery/power/apc/A = T.master
for(var/obj/machinery/power/terminal/T in PN.nodes) if(A.operating && A.cell)
// Enough power drained this tick, no need to torture more APCs var/cur_charge = A.cell.charge / CELLRATE
if(drained >= drain_rate) var/drain_val = min(apc_drain_rate, cur_charge)
break A.cell.use(drain_val * CELLRATE)
if(istype(T.master, /obj/machinery/power/apc)) drained += drain_val
var/obj/machinery/power/apc/A = T.master power_drained += drained
if(A.operating && A.cell)
var/cur_charge = A.cell.charge / CELLRATE
var/drain_val = min(2000, cur_charge)
A.cell.use(drain_val * CELLRATE)
drained += drain_val
if(power_drained > max_power * 0.95) /obj/item/device/powersink/process()
playsound(src, 'sound/effects/screech.ogg', 100, 1, 1) drained_this_tick = 0
if(power_drained >= max_power) power_drained -= min(dissipation_rate, power_drained)
processing_objects.Remove(src) if(power_drained > max_power * 0.95)
explosion(src.loc, 3,6,9,12) playsound(src, 'sound/effects/screech.ogg', 100, 1, 1)
qdel(src) if(power_drained >= max_power)
explosion(src.loc, 3,6,9,12)
qdel(src)
return
if(attached && attached.powernet)
PN = attached.powernet
else
PN = null

View File

@@ -42,8 +42,6 @@
/obj/item/device/radio/New() /obj/item/device/radio/New()
..() ..()
wires = new(src) wires = new(src)
if(radio_controller)
initialize()
/obj/item/device/radio/Destroy() /obj/item/device/radio/Destroy()
qdel(wires) qdel(wires)

View File

@@ -35,9 +35,6 @@
R.notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, R.module.name) R.notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, R.module.name)
R.module.Reset(R) R.module.Reset(R)
qdel(R.module)
R.module = null
R.updatename("Default") R.updatename("Default")
return 1 return 1

View File

@@ -8,7 +8,6 @@
* Toy swords * Toy swords
* Toy bosun's whistle * Toy bosun's whistle
* Toy mechs * Toy mechs
* Crayons
* Snap pops * Snap pops
* Water flower * Water flower
* Therapy dolls * Therapy dolls
@@ -375,31 +374,6 @@
w_class = 3 w_class = 3
attack_verb = list("attacked", "slashed", "stabbed", "sliced") attack_verb = list("attacked", "slashed", "stabbed", "sliced")
/*
* Crayons
*/
/obj/item/toy/crayon
name = "crayon"
desc = "A colourful crayon. Please refrain from eating it or putting it in your nose."
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonred"
w_class = 1.0
attack_verb = list("attacked", "coloured")
var/colour = "#FF0000" //RGB
var/shadeColour = "#220000" //RGB
var/uses = 30 //0 for unlimited uses
var/instant = 0
var/colourName = "red" //for updateIcon purposes
suicide_act(mob/user)
viewers(user) << "\red <b>[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.</b>"
return (BRUTELOSS|OXYLOSS)
New()
name = "[colourName] crayon"
..()
/* /*
* Snap pops * Snap pops
*/ */

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/flame/candle /obj/item/weapon/flame/candle
name = "red candle" name = "red candle"
desc = "a candle" desc = "a small pillar candle. Its specially-formulated fuel-oxidizer wax mixture allows continued combustion in airless environments."
icon = 'icons/obj/candle.dmi' icon = 'icons/obj/candle.dmi'
icon_state = "candle1" icon_state = "candle1"
item_state = "candle1" item_state = "candle1"
@@ -8,6 +8,10 @@
var/wax = 2000 var/wax = 2000
/obj/item/weapon/flame/candle/New()
wax = rand(800, 1000) // Enough for 27-33 minutes. 30 minutes on average.
..()
/obj/item/weapon/flame/candle/update_icon() /obj/item/weapon/flame/candle/update_icon()
var/i var/i
if(wax > 1500) if(wax > 1500)
@@ -80,4 +84,4 @@
/obj/item/weapon/flame/candle/dropped(mob/user) /obj/item/weapon/flame/candle/dropped(mob/user)
if(lit) if(lit)
user.SetLuminosity(user.luminosity - CANDLE_LUM) user.SetLuminosity(user.luminosity - CANDLE_LUM)
SetLuminosity(CANDLE_LUM) SetLuminosity(CANDLE_LUM)

View File

@@ -92,7 +92,7 @@
/obj/machinery/shield_gen, /obj/machinery/shield_gen,
/obj/machinery/clonepod, /obj/machinery/clonepod,
/obj/machinery/deployable, /obj/machinery/deployable,
/obj/machinery/door_control, /obj/machinery/button/remote,
/obj/machinery/porta_turret, /obj/machinery/porta_turret,
/obj/machinery/shieldgen, /obj/machinery/shieldgen,
/obj/machinery/turretid, /obj/machinery/turretid,
@@ -293,3 +293,11 @@
New() New()
access = get_all_centcom_access() access = get_all_centcom_access()
..() ..()
/obj/item/weapon/card/id/centcom/ERT
name = "\improper Emergency Response Team ID"
assignment = "Emergency Response Team"
/obj/item/weapon/card/id/centcom/ERT/New()
..()
access += get_all_accesses()

View File

@@ -57,9 +57,17 @@
name = T_BOARD("employment records console") name = T_BOARD("employment records console")
build_path = /obj/machinery/computer/skills build_path = /obj/machinery/computer/skills
/obj/item/weapon/circuitboard/stationalert /obj/item/weapon/circuitboard/stationalert_engineering
name = T_BOARD("station alert console") name = T_BOARD("station alert console (engineering)")
build_path = /obj/machinery/computer/station_alert build_path = /obj/machinery/computer/station_alert
/obj/item/weapon/circuitboard/stationalert_security
name = T_BOARD("station alert console (security)")
build_path = /obj/machinery/computer/station_alert
/obj/item/weapon/circuitboard/stationalert_all
name = T_BOARD("station alert console (all)")
build_path = /obj/machinery/computer/station_alert/all
/obj/item/weapon/circuitboard/atmos_alert /obj/item/weapon/circuitboard/atmos_alert
name = T_BOARD("atmospheric alert console") name = T_BOARD("atmospheric alert console")

View File

@@ -82,7 +82,7 @@
if(ptank) if(ptank)
ptank.loc = T ptank.loc = T
ptank = null ptank = null
new /obj/item/stack/rods(T) PoolOrNew(/obj/item/stack/rods, T)
qdel(src) qdel(src)
return return

View File

@@ -9,7 +9,7 @@
var/implanted = null var/implanted = null
var/mob/imp_in = null var/mob/imp_in = null
var/obj/item/organ/external/part = null var/obj/item/organ/external/part = null
item_color = "b" var/implant_color = "b"
var/allow_reagents = 0 var/allow_reagents = 0
var/malfunction = 0 var/malfunction = 0

View File

@@ -13,7 +13,7 @@
/obj/item/weapon/implantcase/proc/update() /obj/item/weapon/implantcase/proc/update()
if (src.imp) if (src.imp)
src.icon_state = text("implantcase-[]", src.imp.item_color) src.icon_state = text("implantcase-[]", src.imp.implant_color)
else else
src.icon_state = "implantcase-0" src.icon_state = "implantcase-0"
return return

View File

@@ -3,7 +3,7 @@
/obj/item/weapon/implant/freedom /obj/item/weapon/implant/freedom
name = "freedom implant" name = "freedom implant"
desc = "Use this to escape from those evil Red Shirts." desc = "Use this to escape from those evil Red Shirts."
item_color = "r" implant_color = "r"
var/activation_emote = "chuckle" var/activation_emote = "chuckle"
var/uses = 1.0 var/uses = 1.0

View File

@@ -113,6 +113,7 @@
origin_tech = "magnets=3;syndicate=4" origin_tech = "magnets=3;syndicate=4"
sharp = 1 sharp = 1
edge = 1 edge = 1
var/blade_color
/obj/item/weapon/melee/energy/sword/dropped(var/mob/user) /obj/item/weapon/melee/energy/sword/dropped(var/mob/user)
..() ..()
@@ -120,26 +121,26 @@
deactivate(user) deactivate(user)
/obj/item/weapon/melee/energy/sword/New() /obj/item/weapon/melee/energy/sword/New()
item_color = pick("red","blue","green","purple") blade_color = pick("red","blue","green","purple")
/obj/item/weapon/melee/energy/sword/green/New() /obj/item/weapon/melee/energy/sword/green/New()
item_color = "green" blade_color = "green"
/obj/item/weapon/melee/energy/sword/red/New() /obj/item/weapon/melee/energy/sword/red/New()
item_color = "red" blade_color = "red"
/obj/item/weapon/melee/energy/sword/blue/New() /obj/item/weapon/melee/energy/sword/blue/New()
item_color = "blue" blade_color = "blue"
/obj/item/weapon/melee/energy/sword/purple/New() /obj/item/weapon/melee/energy/sword/purple/New()
item_color = "purple" blade_color = "purple"
/obj/item/weapon/melee/energy/sword/activate(mob/living/user) /obj/item/weapon/melee/energy/sword/activate(mob/living/user)
if(!active) if(!active)
user << "<span class='notice'>\The [src] is now energised.</span>" user << "<span class='notice'>\The [src] is now energised.</span>"
..() ..()
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
icon_state = "sword[item_color]" icon_state = "sword[blade_color]"
/obj/item/weapon/melee/energy/sword/deactivate(mob/living/user) /obj/item/weapon/melee/energy/sword/deactivate(mob/living/user)
if(active) if(active)

View File

@@ -6,8 +6,17 @@
/obj/item/weapon/storage/backpack /obj/item/weapon/storage/backpack
name = "backpack" name = "backpack"
desc = "You wear this on your back and put items into it." desc = "You wear this on your back and put items into it."
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_backpacks.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_backpacks.dmi',
)
icon_state = "backpack" icon_state = "backpack"
item_state = "backpack" item_state = null
//most backpacks use the default backpack state for inhand overlays
item_state_slots = list(
slot_l_hand_str = "backpack",
slot_r_hand_str = "backpack",
)
w_class = 4 w_class = 4
slot_flags = SLOT_BACK slot_flags = SLOT_BACK
max_w_class = 3 max_w_class = 3
@@ -95,6 +104,7 @@
storage_slots = 20 storage_slots = 20
max_w_class = 3 max_w_class = 3
max_storage_space = 400 // can store a ton of shit! max_storage_space = 400 // can store a ton of shit!
item_state_slots = null
/obj/item/weapon/storage/backpack/cultpack /obj/item/weapon/storage/backpack/cultpack
name = "trophy rack" name = "trophy rack"
@@ -105,61 +115,56 @@
name = "Giggles von Honkerton" name = "Giggles von Honkerton"
desc = "It's a backpack made by Honk! Co." desc = "It's a backpack made by Honk! Co."
icon_state = "clownpack" icon_state = "clownpack"
item_state = "clownpack" item_state_slots = null
/obj/item/weapon/storage/backpack/medic /obj/item/weapon/storage/backpack/medic
name = "medical backpack" name = "medical backpack"
desc = "It's a backpack especially designed for use in a sterile environment." desc = "It's a backpack especially designed for use in a sterile environment."
icon_state = "medicalpack" icon_state = "medicalpack"
item_state = "medicalpack" item_state_slots = null
/obj/item/weapon/storage/backpack/security /obj/item/weapon/storage/backpack/security
name = "security backpack" name = "security backpack"
desc = "It's a very robust backpack." desc = "It's a very robust backpack."
icon_state = "securitypack" icon_state = "securitypack"
item_state = "securitypack" item_state_slots = null
/obj/item/weapon/storage/backpack/captain /obj/item/weapon/storage/backpack/captain
name = "captain's backpack" name = "captain's backpack"
desc = "It's a special backpack made exclusively for Nanotrasen officers." desc = "It's a special backpack made exclusively for Nanotrasen officers."
icon_state = "captainpack" icon_state = "captainpack"
item_state = "captainpack" item_state_slots = null
/obj/item/weapon/storage/backpack/industrial /obj/item/weapon/storage/backpack/industrial
name = "industrial backpack" name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life." desc = "It's a tough backpack for the daily grind of station life."
icon_state = "engiepack" icon_state = "engiepack"
item_state = "engiepack" item_state_slots = null
/obj/item/weapon/storage/backpack/toxins /obj/item/weapon/storage/backpack/toxins
name = "laboratory backpack" name = "laboratory backpack"
desc = "It's a light backpack modeled for use in laboratories and other scientific institutions." desc = "It's a light backpack modeled for use in laboratories and other scientific institutions."
icon_state = "toxpack" icon_state = "toxpack"
item_state = "toxpack"
/obj/item/weapon/storage/backpack/hydroponics /obj/item/weapon/storage/backpack/hydroponics
name = "herbalist's backpack" name = "herbalist's backpack"
desc = "It's a green backpack with many pockets to store plants and tools in." desc = "It's a green backpack with many pockets to store plants and tools in."
icon_state = "hydpack" icon_state = "hydpack"
item_state = "hydpack"
/obj/item/weapon/storage/backpack/genetics /obj/item/weapon/storage/backpack/genetics
name = "geneticist backpack" name = "geneticist backpack"
desc = "It's a backpack fitted with slots for diskettes and other workplace tools." desc = "It's a backpack fitted with slots for diskettes and other workplace tools."
icon_state = "genpack" icon_state = "genpack"
item_state = "genpack"
/obj/item/weapon/storage/backpack/virology /obj/item/weapon/storage/backpack/virology
name = "sterile backpack" name = "sterile backpack"
desc = "It's a sterile backpack able to withstand different pathogens from entering its fabric." desc = "It's a sterile backpack able to withstand different pathogens from entering its fabric."
icon_state = "viropack" icon_state = "viropack"
item_state = "viropack"
/obj/item/weapon/storage/backpack/chemistry /obj/item/weapon/storage/backpack/chemistry
name = "chemistry backpack" name = "chemistry backpack"
desc = "It's an orange backpack which was designed to hold beakers, pill bottles and bottles." desc = "It's an orange backpack which was designed to hold beakers, pill bottles and bottles."
icon_state = "chempack" icon_state = "chempack"
item_state = "chempack"
/* /*
* Satchel Types * Satchel Types
@@ -184,13 +189,19 @@
name = "industrial satchel" name = "industrial satchel"
desc = "A tough satchel with extra pockets." desc = "A tough satchel with extra pockets."
icon_state = "satchel-eng" icon_state = "satchel-eng"
item_state = "engiepack" item_state_slots = list(
slot_l_hand_str = "engiepack",
slot_r_hand_str = "engiepack",
)
/obj/item/weapon/storage/backpack/satchel_med /obj/item/weapon/storage/backpack/satchel_med
name = "medical satchel" name = "medical satchel"
desc = "A sterile satchel used in medical departments." desc = "A sterile satchel used in medical departments."
icon_state = "satchel-med" icon_state = "satchel-med"
item_state = "medicalpack" item_state_slots = list(
slot_l_hand_str = "medicalpack",
slot_r_hand_str = "medicalpack",
)
/obj/item/weapon/storage/backpack/satchel_vir /obj/item/weapon/storage/backpack/satchel_vir
name = "virologist satchel" name = "virologist satchel"
@@ -216,7 +227,10 @@
name = "security satchel" name = "security satchel"
desc = "A robust satchel for security related needs." desc = "A robust satchel for security related needs."
icon_state = "satchel-sec" icon_state = "satchel-sec"
item_state = "securitypack" item_state_slots = list(
slot_l_hand_str = "securitypack",
slot_r_hand_str = "securitypack",
)
/obj/item/weapon/storage/backpack/satchel_hyd /obj/item/weapon/storage/backpack/satchel_hyd
name = "hydroponics satchel" name = "hydroponics satchel"
@@ -228,13 +242,17 @@
desc = "An exclusive satchel for Nanotrasen officers." desc = "An exclusive satchel for Nanotrasen officers."
icon_state = "satchel-cap" icon_state = "satchel-cap"
item_state = "captainpack" item_state = "captainpack"
item_state_slots = null
//ERT backpacks. //ERT backpacks.
/obj/item/weapon/storage/backpack/ert /obj/item/weapon/storage/backpack/ert
name = "emergency response team backpack" name = "emergency response team backpack"
desc = "A spacious backpack with lots of pockets, used by members of the Nanotrasen Emergency Response Team." desc = "A spacious backpack with lots of pockets, used by members of the Nanotrasen Emergency Response Team."
icon_state = "ert_commander" icon_state = "ert_commander"
item_state = "backpack" item_state_slots = list(
slot_l_hand_str = "securitypack",
slot_r_hand_str = "securitypack",
)
//Commander //Commander
/obj/item/weapon/storage/backpack/ert/commander /obj/item/weapon/storage/backpack/ert/commander

View File

@@ -93,27 +93,27 @@
storage_slots = 6 storage_slots = 6
icon_type = "crayon" icon_type = "crayon"
can_hold = list( can_hold = list(
/obj/item/toy/crayon /obj/item/weapon/pen/crayon
) )
/obj/item/weapon/storage/fancy/crayons/New() /obj/item/weapon/storage/fancy/crayons/New()
..() ..()
new /obj/item/toy/crayon/red(src) new /obj/item/weapon/pen/crayon/red(src)
new /obj/item/toy/crayon/orange(src) new /obj/item/weapon/pen/crayon/orange(src)
new /obj/item/toy/crayon/yellow(src) new /obj/item/weapon/pen/crayon/yellow(src)
new /obj/item/toy/crayon/green(src) new /obj/item/weapon/pen/crayon/green(src)
new /obj/item/toy/crayon/blue(src) new /obj/item/weapon/pen/crayon/blue(src)
new /obj/item/toy/crayon/purple(src) new /obj/item/weapon/pen/crayon/purple(src)
update_icon() update_icon()
/obj/item/weapon/storage/fancy/crayons/update_icon() /obj/item/weapon/storage/fancy/crayons/update_icon()
overlays = list() //resets list overlays = list() //resets list
overlays += image('icons/obj/crayons.dmi',"crayonbox") overlays += image('icons/obj/crayons.dmi',"crayonbox")
for(var/obj/item/toy/crayon/crayon in contents) for(var/obj/item/weapon/pen/crayon/crayon in contents)
overlays += image('icons/obj/crayons.dmi',crayon.colourName) overlays += image('icons/obj/crayons.dmi',crayon.colourName)
/obj/item/weapon/storage/fancy/crayons/attackby(obj/item/W as obj, mob/user as mob) /obj/item/weapon/storage/fancy/crayons/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W,/obj/item/toy/crayon)) if(istype(W,/obj/item/weapon/pen/crayon))
switch(W:colourName) switch(W:colourName)
if("mime") if("mime")
usr << "This crayon is too sad to be contained in this box." usr << "This crayon is too sad to be contained in this box."

View File

@@ -131,6 +131,7 @@
/obj/item/weapon/storage/firstaid/surgery /obj/item/weapon/storage/firstaid/surgery
name = "surgery kit" name = "surgery kit"
desc = "Contains tools for surgery." desc = "Contains tools for surgery."
storage_slots = 10
/obj/item/weapon/storage/firstaid/surgery/New() /obj/item/weapon/storage/firstaid/surgery/New()
..() ..()
@@ -142,6 +143,9 @@
new /obj/item/weapon/retractor(src) new /obj/item/weapon/retractor(src)
new /obj/item/weapon/scalpel(src) new /obj/item/weapon/scalpel(src)
new /obj/item/weapon/surgicaldrill(src) new /obj/item/weapon/surgicaldrill(src)
new /obj/item/weapon/bonegel(src)
new /obj/item/weapon/FixOVein(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
return return
/* /*

View File

@@ -37,5 +37,4 @@
i++ i++
/obj/item/weapon/storage/box/donut/empty /obj/item/weapon/storage/box/donut/empty
icon_state = "donutbox0"
startswith = 0 startswith = 0

View File

@@ -11,7 +11,6 @@
/obj/item/device/flashlight/pen, /obj/item/device/flashlight/pen,
/obj/item/seeds, /obj/item/seeds,
/obj/item/stack/medical, /obj/item/stack/medical,
/obj/item/toy/crayon,
/obj/item/weapon/coin, /obj/item/weapon/coin,
/obj/item/weapon/dice, /obj/item/weapon/dice,
/obj/item/weapon/disk, /obj/item/weapon/disk,

View File

@@ -144,11 +144,11 @@
var/obj/structure/window/W = A var/obj/structure/window/W = A
new /obj/item/weapon/shard( W.loc ) new /obj/item/weapon/shard( W.loc )
if(W.reinf) new /obj/item/stack/rods( W.loc) if(W.reinf) PoolOrNew(/obj/item/stack/rods, W.loc)
if (W.dir == SOUTHWEST) if (W.dir == SOUTHWEST)
new /obj/item/weapon/shard( W.loc ) new /obj/item/weapon/shard( W.loc )
if(W.reinf) new /obj/item/stack/rods( W.loc) if(W.reinf) PoolOrNew(/obj/item/stack/rods, W.loc)
qdel(A) qdel(A)

View File

@@ -61,9 +61,6 @@
else else
return null return null
/atom/movable/proc/initialize()
return
/obj/proc/updateUsrDialog() /obj/proc/updateUsrDialog()
if(in_use) if(in_use)
var/is_in_use = 0 var/is_in_use = 0

View File

@@ -15,8 +15,6 @@ LINEN BINS
throw_speed = 1 throw_speed = 1
throw_range = 2 throw_range = 2
w_class = 2.0 w_class = 2.0
item_color = "white"
/obj/item/weapon/bedsheet/attack_self(mob/user as mob) /obj/item/weapon/bedsheet/attack_self(mob/user as mob)
user.drop_item() user.drop_item()
@@ -30,67 +28,51 @@ LINEN BINS
/obj/item/weapon/bedsheet/blue /obj/item/weapon/bedsheet/blue
icon_state = "sheetblue" icon_state = "sheetblue"
item_color = "blue"
/obj/item/weapon/bedsheet/green /obj/item/weapon/bedsheet/green
icon_state = "sheetgreen" icon_state = "sheetgreen"
item_color = "green"
/obj/item/weapon/bedsheet/orange /obj/item/weapon/bedsheet/orange
icon_state = "sheetorange" icon_state = "sheetorange"
item_color = "orange"
/obj/item/weapon/bedsheet/purple /obj/item/weapon/bedsheet/purple
icon_state = "sheetpurple" icon_state = "sheetpurple"
item_color = "purple"
/obj/item/weapon/bedsheet/rainbow /obj/item/weapon/bedsheet/rainbow
icon_state = "sheetrainbow" icon_state = "sheetrainbow"
item_color = "rainbow"
/obj/item/weapon/bedsheet/red /obj/item/weapon/bedsheet/red
icon_state = "sheetred" icon_state = "sheetred"
item_color = "red"
/obj/item/weapon/bedsheet/yellow /obj/item/weapon/bedsheet/yellow
icon_state = "sheetyellow" icon_state = "sheetyellow"
item_color = "yellow"
/obj/item/weapon/bedsheet/mime /obj/item/weapon/bedsheet/mime
icon_state = "sheetmime" icon_state = "sheetmime"
item_color = "mime"
/obj/item/weapon/bedsheet/clown /obj/item/weapon/bedsheet/clown
icon_state = "sheetclown" icon_state = "sheetclown"
item_color = "clown"
/obj/item/weapon/bedsheet/captain /obj/item/weapon/bedsheet/captain
icon_state = "sheetcaptain" icon_state = "sheetcaptain"
item_color = "captain"
/obj/item/weapon/bedsheet/rd /obj/item/weapon/bedsheet/rd
icon_state = "sheetrd" icon_state = "sheetrd"
item_color = "director"
/obj/item/weapon/bedsheet/medical /obj/item/weapon/bedsheet/medical
icon_state = "sheetmedical" icon_state = "sheetmedical"
item_color = "medical"
/obj/item/weapon/bedsheet/hos /obj/item/weapon/bedsheet/hos
icon_state = "sheethos" icon_state = "sheethos"
item_color = "hosred"
/obj/item/weapon/bedsheet/hop /obj/item/weapon/bedsheet/hop
icon_state = "sheethop" icon_state = "sheethop"
item_color = "hop"
/obj/item/weapon/bedsheet/ce /obj/item/weapon/bedsheet/ce
icon_state = "sheetce" icon_state = "sheetce"
item_color = "chief"
/obj/item/weapon/bedsheet/brown /obj/item/weapon/bedsheet/brown
icon_state = "sheetbrown" icon_state = "sheetbrown"
item_color = "brown"
/obj/structure/bedsheetbin /obj/structure/bedsheetbin

View File

@@ -10,7 +10,7 @@
var/welded = 0 var/welded = 0
var/wall_mounted = 0 //never solid (You can always pass over it) var/wall_mounted = 0 //never solid (You can always pass over it)
var/health = 100 var/health = 100
var/lastbang var/breakout = 0 //if someone is currently breaking out. mutex
var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate
//then open it in a populated area to crash clients. //then open it in a populated area to crash clients.
var/open_sound = 'sound/machines/click.ogg' var/open_sound = 'sound/machines/click.ogg'
@@ -160,16 +160,19 @@
A.ex_act(severity++) A.ex_act(severity++)
qdel(src) qdel(src)
/obj/structure/closet/proc/damage(var/damage)
health -= damage
if(health <= 0)
for(var/atom/movable/A in src)
A.loc = src.loc
qdel(src)
/obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) /obj/structure/closet/bullet_act(var/obj/item/projectile/Proj)
if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
return return
health -= Proj.damage
..() ..()
if(health <= 0) damage(Proj.damage)
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
qdel(src)
return return
@@ -259,12 +262,6 @@
if(!src.open()) if(!src.open())
user << "<span class='notice'>It won't budge!</span>" user << "<span class='notice'>It won't budge!</span>"
if(!lastbang)
lastbang = 1
for (var/mob/M in hearers(src, null))
M << text("<FONT size=[]>BANG, bang!</FONT>", max(0, 5 - get_dist(src, M)))
spawn(30)
lastbang = 0
/obj/structure/closet/attack_hand(mob/user as mob) /obj/structure/closet/attack_hand(mob/user as mob)
src.add_fingerprint(user) src.add_fingerprint(user)
@@ -312,3 +309,64 @@
dump_contents() dump_contents()
spawn(1) qdel(src) spawn(1) qdel(src)
return 1 return 1
/obj/structure/closet/proc/req_breakout()
if(breakout)
return 0 //Already breaking out.
if(opened)
return 0 //Door's open... wait, why are you in it's contents then?
if(!welded)
return 0 //closed but not welded...
return 1
/obj/structure/closet/proc/mob_breakout(var/mob/living/escapee)
var/breakout_time = 2 //2 minutes by default
if(!req_breakout())
return
//okay, so the closet is either welded or locked... resist!!!
escapee.next_move = world.time + 100
escapee.last_special = world.time + 100
escapee << "<span class='warning'>You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)</span>"
visible_message("<span class='danger'>The [src] begins to shake violently!</span>")
breakout = 1 //can't think of a better way to do this right now.
for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2
playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1)
animate_shake()
if(!do_after(escapee, 50)) //5 seconds
breakout = 0
return
if(!escapee || escapee.stat || escapee.loc != src)
breakout = 0
return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened
//Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'...
if(!req_breakout())
breakout = 0
return
//Well then break it!
breakout = 0
escapee << "<span class='warning'>You successfully break out!</span>"
visible_message("<span class='danger'>\the [escapee] successfully broke out of \the [src]!</span>")
playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1)
break_open()
animate_shake()
/obj/structure/closet/proc/break_open()
welded = 0
update_icon()
//Do this to prevent contents from being opened into nullspace (read: bluespace)
if(istype(loc, /obj/structure/bigDelivery))
var/obj/structure/bigDelivery/BD = loc
BD.unwrap()
open()
/obj/structure/closet/proc/animate_shake()
var/init_px = pixel_x
var/shake_dir = pick(-1, 1)
animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)

View File

@@ -132,3 +132,25 @@
overlays += "welded" overlays += "welded"
else else
icon_state = icon_opened icon_state = icon_opened
/obj/structure/closet/secure_closet/req_breakout()
if(!opened && locked) return 1
return ..() //It's a secure closet, but isn't locked.
/obj/structure/closet/secure_closet/break_open()
desc += " It appears to be broken."
icon_state = icon_off
spawn()
flick(icon_broken, src)
sleep(10)
flick(icon_broken, src)
sleep(10)
broken = 1
locked = 0
update_icon()
//Do this to prevent contents from being opened into nullspace (read: bluespace)
if(istype(loc, /obj/structure/bigDelivery))
var/obj/structure/bigDelivery/BD = loc
BD.unwrap()
open()

View File

@@ -8,7 +8,7 @@
flags = CONDUCT flags = CONDUCT
pressure_resistance = 5*ONE_ATMOSPHERE pressure_resistance = 5*ONE_ATMOSPHERE
layer = 2.9 layer = 2.9
explosion_resistance = 5 explosion_resistance = 1
var/health = 10 var/health = 10
var/destroyed = 0 var/destroyed = 0
@@ -103,7 +103,7 @@
if(iswirecutter(W)) if(iswirecutter(W))
if(!shock(user, 100)) if(!shock(user, 100))
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
new /obj/item/stack/rods(loc, 2) PoolOrNew(/obj/item/stack/rods, list(get_turf(src), destroyed ? 1 : 2))
qdel(src) qdel(src)
else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored)) else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
if(!shock(user, 90)) if(!shock(user, 90))
@@ -173,11 +173,11 @@
density = 0 density = 0
destroyed = 1 destroyed = 1
update_icon() update_icon()
new /obj/item/stack/rods(loc) PoolOrNew(/obj/item/stack/rods, get_turf(src))
else else
if(health <= -6) if(health <= -6)
new /obj/item/stack/rods(loc) PoolOrNew(/obj/item/stack/rods, get_turf(src))
qdel(src) qdel(src)
return return
return return
@@ -221,6 +221,16 @@
spawn(1) healthcheck() spawn(1) healthcheck()
return 1 return 1
// Used in mapping to avoid
/obj/structure/grille/broken
destroyed = 1
icon_state = "grille-b"
density = 0
New()
..()
health = rand(-5, -1) //In the destroyed but not utterly threshold.
healthcheck() //Send this to healthcheck just in case we want to do something else with it.
/obj/structure/grille/cult /obj/structure/grille/cult
name = "cult grille" name = "cult grille"
desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it" desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it"

View File

@@ -61,7 +61,7 @@
var/obj/item/weapon/weldingtool/WT = C var/obj/item/weapon/weldingtool/WT = C
if(WT.remove_fuel(0, user)) if(WT.remove_fuel(0, user))
user << "\blue Slicing lattice joints ..." user << "\blue Slicing lattice joints ..."
new /obj/item/stack/rods(src.loc) PoolOrNew(/obj/item/stack/rods, src.loc)
qdel(src) qdel(src)
return return

View File

@@ -78,7 +78,7 @@ obj/structure/windoor_assembly/Destroy()
user << "\blue You dissasembled the windoor assembly!" user << "\blue You dissasembled the windoor assembly!"
new /obj/item/stack/sheet/glass/reinforced(get_turf(src), 5) new /obj/item/stack/sheet/glass/reinforced(get_turf(src), 5)
if(secure) if(secure)
new /obj/item/stack/rods(get_turf(src), 4) PoolOrNew(/obj/item/stack/rods, list(get_turf(src), 4))
qdel(src) qdel(src)
else else
user << "\blue You need more welding fuel to dissassemble the windoor assembly." user << "\blue You need more welding fuel to dissassemble the windoor assembly."

View File

@@ -88,11 +88,11 @@
index = 0 index = 0
while(index < 2) while(index < 2)
new shardtype(loc) new shardtype(loc)
if(reinf) new /obj/item/stack/rods(loc) if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
index++ index++
else else
new shardtype(loc) new shardtype(loc)
if(reinf) new /obj/item/stack/rods(loc) if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
qdel(src) qdel(src)
return return

View File

@@ -64,7 +64,7 @@
user << "\blue Removing rods..." user << "\blue Removing rods..."
playsound(src, 'sound/items/Ratchet.ogg', 80, 1) playsound(src, 'sound/items/Ratchet.ogg', 80, 1)
if(do_after(user, 30)) if(do_after(user, 30))
new /obj/item/stack/rods(src, 2) PoolOrNew(/obj/item/stack/rods, list(loc, 2))
ChangeTurf(/turf/simulated/floor) ChangeTurf(/turf/simulated/floor)
var/turf/simulated/floor/F = src var/turf/simulated/floor/F = src
F.make_plating() F.make_plating()

View File

@@ -98,7 +98,7 @@
playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
src.d_state = 1 src.d_state = 1
src.icon_state = "r_wall-1" src.icon_state = "r_wall-1"
new /obj/item/stack/rods( src ) PoolOrNew(/obj/item/stack/rods, src)
user << "<span class='notice'>You cut the outer grille.</span>" user << "<span class='notice'>You cut the outer grille.</span>"
return return
@@ -206,7 +206,7 @@
if( d_state == 5 && user.loc == T && user.get_active_hand() == WT ) if( d_state == 5 && user.loc == T && user.get_active_hand() == WT )
src.d_state = 6 src.d_state = 6
src.icon_state = "r_wall-6" src.icon_state = "r_wall-6"
new /obj/item/stack/rods( src ) PoolOrNew(/obj/item/stack/rods, src)
user << "<span class='notice'>The support rods drop out as you cut them loose from the frame.</span>" user << "<span class='notice'>The support rods drop out as you cut them loose from the frame.</span>"
else else
user << "<span class='notice'>You need more welding fuel to complete this task.</span>" user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
@@ -223,7 +223,7 @@
if( d_state == 5 && user.loc == T && user.get_active_hand() == W ) if( d_state == 5 && user.loc == T && user.get_active_hand() == W )
src.d_state = 6 src.d_state = 6
src.icon_state = "r_wall-6" src.icon_state = "r_wall-6"
new /obj/item/stack/rods( src ) PoolOrNew(/obj/item/stack/rods, src)
user << "<span class='notice'>The support rods drop out as you cut them loose from the frame.</span>" user << "<span class='notice'>The support rods drop out as you cut them loose from the frame.</span>"
return return

View File

@@ -233,12 +233,6 @@
if(S.zone) S.zone.rebuild() if(S.zone) S.zone.rebuild()
if(ispath(N, /turf/simulated/floor)) if(ispath(N, /turf/simulated/floor))
//if the old turf had a zone, connect the new turf to it as well - Cael
//Adjusted by SkyMarshal 5/10/13 - The air master will handle the addition of the new turf.
//if(zone)
// zone.RemoveTurf(src)
// if(!zone.CheckStatus())
// zone.SetStatus(ZONE_ACTIVE)
var/turf/simulated/W = new N( locate(src.x, src.y, src.z) ) var/turf/simulated/W = new N( locate(src.x, src.y, src.z) )
//W.Assimilate_Air() //W.Assimilate_Air()
@@ -258,7 +252,7 @@
universe.OnTurfChange(W) universe.OnTurfChange(W)
if(air_master) if(air_master)
air_master.mark_for_update(src) air_master.mark_for_update(src) //handle the addition of the new turf.
for(var/turf/space/S in range(W,1)) for(var/turf/space/S in range(W,1))
S.update_starlight() S.update_starlight()
@@ -267,10 +261,6 @@
return W return W
else else
//if(zone)
// zone.RemoveTurf(src)
// if(!zone.CheckStatus())
// zone.SetStatus(ZONE_ACTIVE)
var/turf/W = new N( locate(src.x, src.y, src.z) ) var/turf/W = new N( locate(src.x, src.y, src.z) )
W.lighting_lumcount += old_lumcount W.lighting_lumcount += old_lumcount
@@ -348,7 +338,8 @@
/turf/proc/ReplaceWithLattice() /turf/proc/ReplaceWithLattice()
src.ChangeTurf(/turf/space) src.ChangeTurf(/turf/space)
new /obj/structure/lattice( locate(src.x, src.y, src.z) ) spawn()
new /obj/structure/lattice( locate(src.x, src.y, src.z) )
/turf/proc/kill_creatures(mob/U = null)//Will kill people/creatures and damage mechs./N /turf/proc/kill_creatures(mob/U = null)//Will kill people/creatures and damage mechs./N
//Useful to batch-add creatures to the list. //Useful to batch-add creatures to the list.

View File

@@ -85,8 +85,8 @@
return return
if(!holder) if(!holder)
if(!config.ooc_allowed) if(!config.looc_allowed)
src << "<span class='danger'>OOC is globally muted.</span>" src << "<span class='danger'>LOOC is globally muted.</span>"
return return
if(!config.dooc_allowed && (mob.stat == DEAD)) if(!config.dooc_allowed && (mob.stat == DEAD))
usr << "<span class='danger'>OOC for dead mobs has been turned off.</span>" usr << "<span class='danger'>OOC for dead mobs has been turned off.</span>"

View File

@@ -277,6 +277,13 @@ var/global/floorIsLava = 0
var/dat = "<html><head><title>Info on [key]</title></head>" var/dat = "<html><head><title>Info on [key]</title></head>"
dat += "<body>" dat += "<body>"
var/p_age = "unknown"
for(var/client/C in clients)
if(C.ckey == key)
p_age = C.player_age
break
dat +="<span style='color:#000000; font-weight: bold'>Player age: [p_age]</span><br>"
var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav")
var/list/infos var/list/infos
info >> infos info >> infos
@@ -747,20 +754,43 @@ var/global/floorIsLava = 0
set category = "Server" set category = "Server"
set desc="Globally Toggles OOC" set desc="Globally Toggles OOC"
set name="Toggle OOC" set name="Toggle OOC"
if(!check_rights(R_ADMIN))
return
config.ooc_allowed = !(config.ooc_allowed) config.ooc_allowed = !(config.ooc_allowed)
if (config.ooc_allowed) if (config.ooc_allowed)
world << "<B>The OOC channel has been globally enabled!</B>" world << "<B>The OOC channel has been globally enabled!</B>"
else else
world << "<B>The OOC channel has been globally disabled!</B>" world << "<B>The OOC channel has been globally disabled!</B>"
log_admin("[key_name(usr)] toggled OOC.") log_and_message_admins("toggled OOC.")
message_admins("[key_name_admin(usr)] toggled OOC.", 1)
feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/togglelooc()
set category = "Server"
set desc="Globally Toggles LOOC"
set name="Toggle LOOC"
if(!check_rights(R_ADMIN))
return
config.looc_allowed = !(config.looc_allowed)
if (config.looc_allowed)
world << "<B>The LOOC channel has been globally enabled!</B>"
else
world << "<B>The LOOC channel has been globally disabled!</B>"
log_and_message_admins("toggled LOOC.")
feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggledsay() /datum/admins/proc/toggledsay()
set category = "Server" set category = "Server"
set desc="Globally Toggles DSAY" set desc="Globally Toggles DSAY"
set name="Toggle DSAY" set name="Toggle DSAY"
if(!check_rights(R_ADMIN))
return
config.dsay_allowed = !(config.dsay_allowed) config.dsay_allowed = !(config.dsay_allowed)
if (config.dsay_allowed) if (config.dsay_allowed)
world << "<B>Deadchat has been globally enabled!</B>" world << "<B>Deadchat has been globally enabled!</B>"
@@ -774,6 +804,10 @@ var/global/floorIsLava = 0
set category = "Server" set category = "Server"
set desc="Toggle Dead OOC." set desc="Toggle Dead OOC."
set name="Toggle Dead OOC" set name="Toggle Dead OOC"
if(!check_rights(R_ADMIN))
return
config.dooc_allowed = !( config.dooc_allowed ) config.dooc_allowed = !( config.dooc_allowed )
log_admin("[key_name(usr)] toggled Dead OOC.") log_admin("[key_name(usr)] toggled Dead OOC.")
message_admins("[key_name_admin(usr)] toggled Dead OOC.", 1) message_admins("[key_name_admin(usr)] toggled Dead OOC.", 1)

View File

@@ -58,6 +58,7 @@ var/list/admin_verbs_admin = list(
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets, /client/proc/secrets,
/datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/
/datum/admins/proc/togglelooc, /*toggles looc on/off for everyone*/
/datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/ /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/
/datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/ /datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/
/client/proc/game_panel, /*game panel, allows to change game-mode etc*/ /client/proc/game_panel, /*game panel, allows to change game-mode etc*/
@@ -109,7 +110,8 @@ var/list/admin_verbs_fun = list(
/client/proc/cmd_admin_add_random_ai_law, /client/proc/cmd_admin_add_random_ai_law,
/client/proc/make_sound, /client/proc/make_sound,
/client/proc/toggle_random_events, /client/proc/toggle_random_events,
/client/proc/editappear /client/proc/editappear,
/client/proc/roll_dices
) )
var/list/admin_verbs_spawn = list( var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_fruit, /datum/admins/proc/spawn_fruit,
@@ -254,6 +256,7 @@ var/list/admin_verbs_hideable = list(
/client/proc/cmd_debug_tog_aliens, /client/proc/cmd_debug_tog_aliens,
/client/proc/air_report, /client/proc/air_report,
/client/proc/enable_debug_verbs, /client/proc/enable_debug_verbs,
/client/proc/roll_dices,
/proc/possess, /proc/possess,
/proc/release /proc/release
) )

View File

@@ -1369,8 +1369,8 @@
var/data = "" var/data = ""
var/obj/item/weapon/paper_bundle/B = fax var/obj/item/weapon/paper_bundle/B = fax
for (var/page = 1, page <= B.amount, page++) for (var/page = 1, page <= B.pages.len, page++)
var/obj/pageobj = B.contents[page] var/obj/pageobj = B.pages[page]
data += "<A href='?src=\ref[src];AdminFaxViewPage=[page];paper_bundle=\ref[B]'>Page [page] - [pageobj.name]</A><BR>" data += "<A href='?src=\ref[src];AdminFaxViewPage=[page];paper_bundle=\ref[B]'>Page [page] - [pageobj.name]</A><BR>"
usr << browse(data, "window=[B.name]") usr << browse(data, "window=[B.name]")
@@ -1383,11 +1383,11 @@
if (!bundle) return if (!bundle) return
if (istype(bundle.contents[page], /obj/item/weapon/paper)) if (istype(bundle.pages[page], /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = bundle.contents[page] var/obj/item/weapon/paper/P = bundle.pages[page]
P.show_content(src.owner, 1) P.show_content(src.owner, 1)
else if (istype(bundle.contents[page], /obj/item/weapon/photo)) else if (istype(bundle.pages[page], /obj/item/weapon/photo))
var/obj/item/weapon/photo/H = bundle.contents[page] var/obj/item/weapon/photo/H = bundle.pages[page]
H.show(src.owner) H.show(src.owner)
return return
@@ -2216,7 +2216,6 @@
for(var/obj/item/clothing/under/W in world) for(var/obj/item/clothing/under/W in world)
W.icon_state = "schoolgirl" W.icon_state = "schoolgirl"
W.item_state = "w_suit" W.item_state = "w_suit"
W.item_color = "schoolgirl"
message_admins("[key_name_admin(usr)] activated Japanese Animes mode") message_admins("[key_name_admin(usr)] activated Japanese Animes mode")
world << sound('sound/AI/animes.ogg') world << sound('sound/AI/animes.ogg')
if("paintball") if("paintball")

View File

@@ -13,7 +13,7 @@
display_name = holder.fakekey display_name = holder.fakekey
for(var/mob/M in mob_list) for(var/mob/M in mob_list)
if((M.mind && M.mind.special_role && M.client) || (M.client && M.client.holder)) if((M.mind && M.mind.special_role && M.client) || check_rights(R_ADMIN, 0, M))
M << "<font color='#960018'><span class='ooc'>" + create_text_tag("aooc", "Antag-OOC:", M.client) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>" M << "<font color='#960018'><span class='ooc'>" + create_text_tag("aooc", "Antag-OOC:", M.client) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
log_ooc("(ANTAG) [key] : [msg]") log_ooc("(ANTAG) [key] : [msg]")

View File

@@ -1,12 +1,17 @@
/client/proc/cinematic(var/cinematic as anything in list("explosion",null)) /client/proc/cinematic(var/cinematic as anything in list("explosion",null))
set name = "cinematic" set name = "Cinematic"
set category = "Fun" set category = "Fun"
set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted.
set hidden = 1
if(!check_rights(R_FUN))
return
if(alert("Are you sure you want to run [cinematic]?","Confirmation","Yes","No")=="No") return if(alert("Are you sure you want to run [cinematic]?","Confirmation","Yes","No")=="No") return
if(!ticker) return if(!ticker) return
switch(cinematic) switch(cinematic)
if("explosion") if("explosion")
if(alert("The game will be over. Are you really sure?", "Confirmation" ,"Continue", "Cancel") == "Cancel")
return
var/parameter = input(src,"station_missed = ?","Enter Parameter",0) as num var/parameter = input(src,"station_missed = ?","Enter Parameter",0) as num
var/override var/override
switch(parameter) switch(parameter)
@@ -15,4 +20,8 @@
if(0) if(0)
override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","mercenary","AI malfunction","no override") override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","mercenary","AI malfunction","no override")
ticker.station_explosion_cinematic(parameter,override) ticker.station_explosion_cinematic(parameter,override)
log_admin("[key_name(src)] launched cinematic \"[cinematic]\"")
message_admins("[key_name_admin(src)] launched cinematic \"[cinematic]\"", 1)
return return

View File

@@ -525,6 +525,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
//log_admin("[key_name(src)] has alienized [M.key].") //log_admin("[key_name(src)] has alienized [M.key].")
var/list/dresspacks = list( var/list/dresspacks = list(
"strip", "strip",
"job",
"standard space gear", "standard space gear",
"tournament standard red", "tournament standard red",
"tournament standard green", "tournament standard green",
@@ -555,10 +556,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
for (var/obj/item/I in M) for (var/obj/item/I in M)
if (istype(I, /obj/item/weapon/implant)) if (istype(I, /obj/item/weapon/implant))
continue continue
qdel(I) M.drop_from_inventory(I)
if(I.loc != M)
qdel(I)
switch(dresscode) switch(dresscode)
if ("strip") if ("strip")
//do nothing //do nothing
if ("job")
var/selected_job = input("Select job", "Robust quick dress shop") as null|anything in joblist
if (isnull(selected_job))
return
var/datum/job/job = job_master.GetJob(selected_job)
if(!job)
return
job.equip(M)
job.apply_fingerprints(M)
job_master.spawnId(M, selected_job)
if ("standard space gear") if ("standard space gear")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)

View File

@@ -0,0 +1,24 @@
/client/proc/roll_dices()
set category = "Fun"
set name = "Roll Dice"
if(!check_rights(R_FUN))
return
var/sum = input("How many times should we throw?") as num
var/side = input("Select the number of sides.") as num
if(!side)
side = 6
if(!sum)
sum = 2
var/dice = num2text(sum) + "d" + num2text(side)
if(alert("Do you want to inform the world about your game?",,"Yes", "No") == "Yes")
world << "<h2 style=\"color:#A50400\">The dice have been rolled by Gods!</h2>"
var/result = roll(dice)
if(alert("Do you want to inform the world about the result?",,"Yes", "No") == "Yes")
world << "<h2 style=\"color:#A50400\">Gods rolled [dice], result is [result]</h2>"
message_admins("[key_name_admin(src)] rolled dice [dice], result is [result]", 1)

View File

@@ -1447,7 +1447,7 @@ datum/preferences
rlimb_data[limb] = choice rlimb_data[limb] = choice
organ_data[limb] = "cyborg" organ_data[limb] = "cyborg"
if(second_limb) if(second_limb)
organ_data[second_limb] = choice rlimb_data[second_limb] = choice
organ_data[second_limb] = "cyborg" organ_data[second_limb] = "cyborg"
if(third_limb && organ_data[third_limb] == "amputated") if(third_limb && organ_data[third_limb] == "amputated")
organ_data[third_limb] = null organ_data[third_limb] = null

View File

@@ -163,6 +163,12 @@ var/global/list/gear_datums = list()
cost = 1 cost = 1
slot = slot_head slot = slot_head
/datum/gear/wcap
display_name = "cap, white"
path = /obj/item/clothing/head/soft/mime
cost = 1
slot = slot_head
/datum/gear/hairflower /datum/gear/hairflower
display_name = "hair flower pin" display_name = "hair flower pin"
path = /obj/item/clothing/head/hairflower path = /obj/item/clothing/head/hairflower
@@ -181,6 +187,12 @@ var/global/list/gear_datums = list()
cost = 2 cost = 2
slot = slot_head slot = slot_head
/datum/gear/rhardhat
display_name = "hardhat, red"
path = /obj/item/clothing/head/hardhat/red
cost = 2
slot = slot_head
/datum/gear/yhardhat /datum/gear/yhardhat
display_name = "hardhat, yellow" display_name = "hardhat, yellow"
path = /obj/item/clothing/head/hardhat path = /obj/item/clothing/head/hardhat
@@ -205,6 +217,12 @@ var/global/list/gear_datums = list()
cost = 1 cost = 1
slot = slot_head slot = slot_head
/datum/gear/tophat
display_name = "hat, tophat"
path = /obj/item/clothing/head/that
cost = 1
slot = slot_head
// Wig by Earthcrusher, blame him. // Wig by Earthcrusher, blame him.
/datum/gear/philosopher_wig /datum/gear/philosopher_wig
display_name = "natural philosopher's wig" display_name = "natural philosopher's wig"
@@ -239,12 +257,37 @@ var/global/list/gear_datums = list()
display_name = "Glasses, green" display_name = "Glasses, green"
path = /obj/item/clothing/glasses/gglasses path = /obj/item/clothing/glasses/gglasses
cost = 1 cost = 1
slot = slot_glasses
/datum/gear/prescriptionhipster
display_name = "Glasses, hipster"
path = /obj/item/clothing/glasses/regular/hipster
cost = 1
slot = slot_glasses
/datum/gear/prescription
display_name = "Glasses, prescription"
path = /obj/item/clothing/glasses/regular
cost = 1
slot = slot_glasses
/datum/gear/monocle
display_name = "Monocle"
path = /obj/item/clothing/glasses/monocle
cost = 1
slot = slot_glasses
/datum/gear/scanning_goggles /datum/gear/scanning_goggles
display_name = "scanning goggles" display_name = "scanning goggles"
path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1
cost = 1 cost = 1
// allowed_roles = list("Roboticist", "Scientist", "Research Director") slot = slot_glasses
/datum/gear/sciencegoggles
display_name = "Science Goggles"
path = /obj/item/clothing/glasses/science
cost = 1
slot = slot_glasses
/datum/gear/security /datum/gear/security
display_name = "Security HUD" display_name = "Security HUD"
@@ -260,7 +303,7 @@ var/global/list/gear_datums = list()
slot = slot_glasses slot = slot_glasses
allowed_roles = list("Security Officer","Head of Security","Warden") allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/prescription /datum/gear/prescriptionsun
display_name = "sunglasses, presciption" display_name = "sunglasses, presciption"
path = /obj/item/clothing/glasses/sunglasses/prescription path = /obj/item/clothing/glasses/sunglasses/prescription
cost = 2 cost = 2
@@ -276,18 +319,18 @@ var/global/list/gear_datums = list()
// Uniform slot // Uniform slot
/datum/gear/exec_suit
display_name = "executive suit"
path = /obj/item/clothing/under/suit_jacket/really_black
slot = slot_w_uniform
cost = 1
/datum/gear/blazer_blue /datum/gear/blazer_blue
display_name = "blazer, blue" display_name = "blazer, blue"
path = /obj/item/clothing/under/blazer path = /obj/item/clothing/under/blazer
slot = slot_w_uniform slot = slot_w_uniform
cost = 1 cost = 1
/datum/gear/cheongsam
display_name = "cheongsam, white"
path = /obj/item/clothing/under/cheongsam
slot = slot_w_uniform
cost = 1
/datum/gear/kilt /datum/gear/kilt
display_name = "kilt" display_name = "kilt"
path = /obj/item/clothing/under/kilt path = /obj/item/clothing/under/kilt
@@ -300,6 +343,17 @@ var/global/list/gear_datums = list()
slot = slot_w_uniform slot = slot_w_uniform
cost = 1 cost = 1
/datum/gear/blackfjumpsuit
display_name = "jumpsuit, female-black"
path = /obj/item/clothing/under/color/blackf
slot = slot_w_uniform
cost = 1
/datum/gear/blackfjumpsuit
display_name = "jumpsuit, rainbow"
path = /obj/item/clothing/under/rainbow
slot = slot_w_uniform
cost = 1
/datum/gear/skirt_blue /datum/gear/skirt_blue
display_name = "plaid skirt, blue" display_name = "plaid skirt, blue"
path = /obj/item/clothing/under/dress/plaid_blue path = /obj/item/clothing/under/dress/plaid_blue
@@ -324,6 +378,114 @@ var/global/list/gear_datums = list()
slot = slot_w_uniform slot = slot_w_uniform
cost = 1 cost = 1
/datum/gear/amishsuit
display_name = "suit, amish"
path = /obj/item/clothing/under/sl_suit
slot = slot_w_uniform
cost = 1
/datum/gear/blacksuit
display_name = "suit, black"
path = /obj/item/clothing/under/suit_jacket
slot = slot_w_uniform
cost = 1
/datum/gear/shinyblacksuit
display_name = "suit, shiny-black"
path = /obj/item/clothing/under/lawyer/black
slot = slot_w_uniform
cost = 1
/datum/gear/bluesuit
display_name = "suit, blue"
path = /obj/item/clothing/under/lawyer/blue
slot = slot_w_uniform
cost = 1
/datum/gear/burgundysuit
display_name = "suit, burgundy"
path = /obj/item/clothing/under/suit_jacket/burgundy
slot = slot_w_uniform
cost = 1
/datum/gear/checkeredsuit
display_name = "suit, checkered"
path = /obj/item/clothing/under/suit_jacket/checkered
slot = slot_w_uniform
cost = 1
/datum/gear/charcoalsuit
display_name = "suit, charcoal"
path = /obj/item/clothing/under/suit_jacket/charcoal
slot = slot_w_uniform
cost = 1
/datum/gear/execsuit
display_name = "suit, executive"
path = /obj/item/clothing/under/suit_jacket/really_black
slot = slot_w_uniform
cost = 1
/datum/gear/femaleexecsuit
display_name = "suit, female-executive"
path = /obj/item/clothing/under/suit_jacket/female
slot = slot_w_uniform
cost = 1
/datum/gear/gentlesuit
display_name = "suit, gentlemen"
path = /obj/item/clothing/under/gentlesuit
slot = slot_w_uniform
cost = 1
/datum/gear/navysuit
display_name = "suit, navy"
path = /obj/item/clothing/under/suit_jacket/navy
slot = slot_w_uniform
cost = 1
/datum/gear/redsuit
display_name = "suit, red"
path = /obj/item/clothing/under/suit_jacket/red
slot = slot_w_uniform
cost = 1
/datum/gear/redlawyer
display_name = "suit, lawyer-red"
path = /obj/item/clothing/under/lawyer/red
slot = slot_w_uniform
cost = 1
/datum/gear/oldmansuit
display_name = "suit, old-man"
path = /obj/item/clothing/under/lawyer/oldman
slot = slot_w_uniform
cost = 1
/datum/gear/purplesuit
display_name = "suit, purple"
path = /obj/item/clothing/under/lawyer/purpsuit
slot = slot_w_uniform
cost = 1
/datum/gear/tansuit
display_name = "suit, tan"
path = /obj/item/clothing/under/suit_jacket/tan
slot = slot_w_uniform
cost = 1
/datum/gear/whitesuit
display_name = "suit, white"
path = /obj/item/clothing/under/scratch
slot = slot_w_uniform
cost = 1
/datum/gear/whitebluesuit
display_name = "suit, white-blue"
path = /obj/item/clothing/under/lawyer/bluesuit
slot = slot_w_uniform
cost = 1
/datum/gear/sundress /datum/gear/sundress
display_name = "sundress" display_name = "sundress"
path = /obj/item/clothing/under/sundress path = /obj/item/clothing/under/sundress
@@ -336,12 +498,6 @@ var/global/list/gear_datums = list()
slot = slot_w_uniform slot = slot_w_uniform
cost = 1 cost = 1
/datum/gear/cheongsam
display_name = "cheongsam, white"
path = /obj/item/clothing/under/cheongsam
slot = slot_w_uniform
cost = 1
/datum/gear/uniform_captain /datum/gear/uniform_captain
display_name = "uniform, captain's dress" display_name = "uniform, captain's dress"
path = /obj/item/clothing/under/dress/dress_cap path = /obj/item/clothing/under/dress/dress_cap
@@ -518,9 +674,9 @@ var/global/list/gear_datums = list()
cost = 2 cost = 2
slot = slot_wear_suit slot = slot_wear_suit
/datum/gear/blue_lawyer_jacket /datum/gear/hazard_vest
display_name = "suit jacket, blue" display_name = "hazard vest"
path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket path = /obj/item/clothing/suit/storage/hazardvest
cost = 2 cost = 2
slot = slot_wear_suit slot = slot_wear_suit
@@ -548,6 +704,36 @@ var/global/list/gear_datums = list()
cost = 2 cost = 2
slot = slot_wear_suit slot = slot_wear_suit
/datum/gear/bluelabcoat
display_name = "labcoat, blue"
path = /obj/item/clothing/suit/storage/toggle/labcoat/blue
cost = 2
slot = slot_wear_suit
/datum/gear/greenlabcoat
display_name = "labcoat, green"
path = /obj/item/clothing/suit/storage/toggle/labcoat/green
cost = 2
slot = slot_wear_suit
/datum/gear/orangelabcoat
display_name = "labcoat, orange"
path = /obj/item/clothing/suit/storage/toggle/labcoat/orange
cost = 2
slot = slot_wear_suit
/datum/gear/purplelabcoat
display_name = "labcoat, purple"
path = /obj/item/clothing/suit/storage/toggle/labcoat/purple
cost = 2
slot = slot_wear_suit
/datum/gear/redlabcoat
display_name = "labcoat, red"
path = /obj/item/clothing/suit/storage/toggle/labcoat/red
cost = 2
slot = slot_wear_suit
/datum/gear/overalls /datum/gear/overalls
display_name = "overalls" display_name = "overalls"
path = /obj/item/clothing/suit/apron/overalls path = /obj/item/clothing/suit/apron/overalls
@@ -591,6 +777,18 @@ var/global/list/gear_datums = list()
slot = slot_wear_suit slot = slot_wear_suit
// whitelisted = "Unathi" // You don't have a monopoly on a robe! // whitelisted = "Unathi" // You don't have a monopoly on a robe!
/datum/gear/blue_lawyer_jacket
display_name = "suit jacket, blue"
path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket
cost = 2
slot = slot_wear_suit
/datum/gear/purple_lawyer_jacket
display_name = "suit jacket, purple"
path = /obj/item/clothing/suit/storage/lawyer/purpjacket
cost = 2
slot = slot_wear_suit
/datum/gear/suspenders /datum/gear/suspenders
display_name = "suspenders" display_name = "suspenders"
path = /obj/item/clothing/suit/suspenders path = /obj/item/clothing/suit/suspenders
@@ -630,18 +828,49 @@ var/global/list/gear_datums = list()
cost = 2 cost = 2
slot = slot_gloves slot = slot_gloves
/datum/gear/light_brown_gloves
display_name = "gloves, light-brown"
path = /obj/item/clothing/gloves/light_brown
cost = 2
slot = slot_gloves
/datum/gear/green_gloves /datum/gear/green_gloves
display_name = "gloves, green" display_name = "gloves, green"
path = /obj/item/clothing/gloves/green path = /obj/item/clothing/gloves/green
cost = 2 cost = 2
slot = slot_gloves slot = slot_gloves
/datum/gear/grey_gloves
display_name = "gloves, grey"
path = /obj/item/clothing/gloves/grey
cost = 2
slot = slot_gloves
/datum/gear/latex_gloves
display_name = "gloves, latex"
path = /obj/item/clothing/gloves/latex
cost = 2
slot = slot_gloves
/datum/gear/orange_gloves /datum/gear/orange_gloves
display_name = "gloves, orange" display_name = "gloves, orange"
path = /obj/item/clothing/gloves/orange path = /obj/item/clothing/gloves/orange
cost = 2 cost = 2
slot = slot_gloves slot = slot_gloves
/datum/gear/purple_gloves
display_name = "gloves, purple"
path = /obj/item/clothing/gloves/purple
cost = 2
slot = slot_gloves
/datum/gear/rainbow_gloves
display_name = "gloves, rainbow"
path = /obj/item/clothing/gloves/rainbow
cost = 2
slot = slot_gloves
/datum/gear/red_gloves /datum/gear/red_gloves
display_name = "gloves, red" display_name = "gloves, red"
path = /obj/item/clothing/gloves/red path = /obj/item/clothing/gloves/red
@@ -728,6 +957,12 @@ var/global/list/gear_datums = list()
cost = 1 cost = 1
slot = slot_shoes slot = slot_shoes
/datum/gear/rainbow_shoes
display_name = "shoes, rainbow"
path = /obj/item/clothing/shoes/rainbow
cost = 1
slot = slot_shoes
/datum/gear/red_shoes /datum/gear/red_shoes
display_name = "shoes, red" display_name = "shoes, red"
path = /obj/item/clothing/shoes/red path = /obj/item/clothing/shoes/red
@@ -822,6 +1057,17 @@ var/global/list/gear_datums = list()
sort_category = "misc" sort_category = "misc"
cost = 1 cost = 1
/datum/gear/flask
display_name = "flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask
sort_category = "misc"
cost = 1
/datum/gear/vacflask
display_name = "vacuum-flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask
sort_category = "misc"
cost = 1
/datum/gear/blipstick /datum/gear/blipstick
display_name = "lipstick, black" display_name = "lipstick, black"
path = /obj/item/weapon/lipstick/black path = /obj/item/weapon/lipstick/black
@@ -846,6 +1092,18 @@ var/global/list/gear_datums = list()
sort_category = "misc" sort_category = "misc"
cost = 1 cost = 1
/datum/gear/smokingpipe
display_name = "pipe, smoking"
path = /obj/item/clothing/mask/smokable/pipe
sort_category = "misc"
cost = 1
/datum/gear/cornpipe
display_name = "pipe, corn"
path = /obj/item/clothing/mask/smokable/pipe/cobpipe
sort_category = "misc"
cost = 1
/datum/gear/matchbook /datum/gear/matchbook
display_name = "matchbook" display_name = "matchbook"
path = /obj/item/weapon/storage/box/matches path = /obj/item/weapon/storage/box/matches
@@ -858,6 +1116,12 @@ var/global/list/gear_datums = list()
sort_category = "misc" sort_category = "misc"
cost = 1 cost = 1
/datum/gear/zippo
display_name = "zippo"
path = /obj/item/weapon/flame/lighter/zippo
sort_category = "misc"
cost = 1
/*/datum/gear/combitool /*/datum/gear/combitool
display_name = "combi-tool" display_name = "combi-tool"
path = /obj/item/weapon/combitool path = /obj/item/weapon/combitool
@@ -865,6 +1129,12 @@ var/global/list/gear_datums = list()
// Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use // Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use
// the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset. // the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset.
/datum/gear/earmuffs
display_name = "earmuffs"
path = /obj/item/clothing/ears/earmuffs
cost = 1
sort_category = "ears"
/datum/gear/skrell_chain /datum/gear/skrell_chain
display_name = "skrell headtail-wear, female, chain" display_name = "skrell headtail-wear, female, chain"
path = /obj/item/clothing/ears/skrell/chain path = /obj/item/clothing/ears/skrell/chain

View File

@@ -191,7 +191,7 @@ BLIND // can't see anything
gender = PLURAL //Carn: for grammarically correct text-parsing gender = PLURAL //Carn: for grammarically correct text-parsing
w_class = 2.0 w_class = 2.0
icon = 'icons/obj/clothing/gloves.dmi' icon = 'icons/obj/clothing/gloves.dmi'
siemens_coefficient = 0.50 siemens_coefficient = 0.75
var/wired = 0 var/wired = 0
var/obj/item/weapon/cell/cell = 0 var/obj/item/weapon/cell/cell = 0
var/clipped = 0 var/clipped = 0
@@ -391,13 +391,17 @@ BLIND // can't see anything
//Under clothing //Under clothing
/obj/item/clothing/under /obj/item/clothing/under
icon = 'icons/obj/clothing/uniforms.dmi' icon = 'icons/obj/clothing/uniforms.dmi'
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi',
)
name = "under" name = "under"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
permeability_coefficient = 0.90 permeability_coefficient = 0.90
slot_flags = SLOT_ICLOTHING slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
w_class = 3 w_class = 3
var/has_sensor = 1//For the crew computer 2 = unable to change mode var/has_sensor = 1 //For the crew computer 2 = unable to change mode
var/sensor_mode = 0 var/sensor_mode = 0
/* /*
1 = Report living/dead 1 = Report living/dead
@@ -406,7 +410,25 @@ BLIND // can't see anything
*/ */
var/list/accessories = list() var/list/accessories = list()
var/displays_id = 1 var/displays_id = 1
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
sprite_sheets = list("Vox" = 'icons/mob/species/vox/uniform.dmi') sprite_sheets = list("Vox" = 'icons/mob/species/vox/uniform.dmi')
//convenience var for defining the icon state for the overlay used when the clothing is worn.
//Also used by rolling/unrolling.
var/worn_state = null
/obj/item/clothing/under/New()
if(worn_state)
if(!item_state_slots)
item_state_slots = list()
item_state_slots[slot_w_uniform_str] = worn_state
else
worn_state = icon_state
//autodetect rollability
if(rolled_down < 0)
if((worn_state + "_d_s") in icon_states('icons/mob/uniform.dmi'))
rolled_down = 0
/obj/item/clothing/under/update_clothing_icon() /obj/item/clothing/under/update_clothing_icon()
if (ismob(src.loc)) if (ismob(src.loc))
@@ -549,17 +571,18 @@ BLIND // can't see anything
if(!istype(usr, /mob/living)) return if(!istype(usr, /mob/living)) return
if(usr.stat) return if(usr.stat) return
if(initial(item_color) + "_d_s" in icon_states('icons/mob/uniform.dmi')) if(rolled_down < 0)
if (item_color == initial(item_color)) usr << "<span class='notice'>You cannot roll down [src]!</span>"
body_parts_covered &= LOWER_TORSO|LEGS|FEET return
item_color = "[initial(item_color)]_d"
else rolled_down = !rolled_down
body_parts_covered = initial(body_parts_covered) if(rolled_down)
item_color = initial(item_color) body_parts_covered &= LOWER_TORSO|LEGS|FEET
item_state_slots[slot_w_uniform_str] = "[worn_state]_d"
update_clothing_icon()
else else
usr << "<span class='notice'>You cannot roll down the uniform!</span>" body_parts_covered = initial(body_parts_covered)
item_state_slots[slot_w_uniform_str] = "[worn_state]"
update_clothing_icon()
/obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) /obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
if(!(A in accessories)) if(!(A in accessories))

View File

@@ -27,7 +27,3 @@
desc = "These look pretty fancy." desc = "These look pretty fancy."
icon_state = "latex" icon_state = "latex"
item_state = "lgloves" item_state = "lgloves"
item_color="mime"
redcoat
item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.

View File

@@ -5,7 +5,6 @@
item_state = "ygloves" item_state = "ygloves"
siemens_coefficient = 0 siemens_coefficient = 0
permeability_coefficient = 0.05 permeability_coefficient = 0.05
item_color="yellow"
/obj/item/clothing/gloves/fyellow //Cheap Chinese Crap /obj/item/clothing/gloves/fyellow //Cheap Chinese Crap
desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly." desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly."
@@ -15,101 +14,73 @@
siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() siemens_coefficient = 1 //Set to a default of 1, gets overridden in New()
permeability_coefficient = 0.05 permeability_coefficient = 0.05
item_color="yellow"
New() New()
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5) //average of 0.5, somewhat better than regular gloves' 0.75
siemens_coefficient = pick(0,0.1,0.3,0.5,0.5,0.75,1.35)
/obj/item/clothing/gloves/black /obj/item/clothing/gloves/black
desc = "These gloves are fire-resistant." desc = "These work gloves are thick and fire-resistant."
name = "black gloves" name = "black gloves"
icon_state = "black" icon_state = "black"
item_state = "bgloves" item_state = "bgloves"
item_color="brown" siemens_coefficient = 0.50
permeability_coefficient = 0.05
cold_protection = HANDS cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
hos
item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way.
ce
item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way.
/obj/item/clothing/gloves/orange /obj/item/clothing/gloves/orange
name = "orange gloves" name = "orange gloves"
desc = "A pair of gloves, they don't look special in any way." desc = "A pair of gloves, they don't look special in any way."
icon_state = "orange" icon_state = "orange"
item_state = "orangegloves" item_state = "orangegloves"
item_color="orange"
/obj/item/clothing/gloves/red /obj/item/clothing/gloves/red
name = "red gloves" name = "red gloves"
desc = "A pair of gloves, they don't look special in any way." desc = "A pair of gloves, they don't look special in any way."
icon_state = "red" icon_state = "red"
item_state = "redgloves" item_state = "redgloves"
item_color = "red"
/obj/item/clothing/gloves/rainbow /obj/item/clothing/gloves/rainbow
name = "rainbow gloves" name = "rainbow gloves"
desc = "A pair of gloves, they don't look special in any way." desc = "A pair of gloves, they don't look special in any way."
icon_state = "rainbow" icon_state = "rainbow"
item_state = "rainbowgloves" item_state = "rainbowgloves"
item_color = "rainbow"
clown
item_color = "clown"
/obj/item/clothing/gloves/blue /obj/item/clothing/gloves/blue
name = "blue gloves" name = "blue gloves"
desc = "A pair of gloves, they don't look special in any way." desc = "A pair of gloves, they don't look special in any way."
icon_state = "blue" icon_state = "blue"
item_state = "bluegloves" item_state = "bluegloves"
item_color="blue"
/obj/item/clothing/gloves/purple /obj/item/clothing/gloves/purple
name = "purple gloves" name = "purple gloves"
desc = "A pair of gloves, they don't look special in any way." desc = "A pair of gloves, they don't look special in any way."
icon_state = "purple" icon_state = "purple"
item_state = "purplegloves" item_state = "purplegloves"
item_color="purple"
/obj/item/clothing/gloves/green /obj/item/clothing/gloves/green
name = "green gloves" name = "green gloves"
desc = "A pair of gloves, they don't look special in any way." desc = "A pair of gloves, they don't look special in any way."
icon_state = "green" icon_state = "green"
item_state = "greengloves" item_state = "greengloves"
item_color="green"
/obj/item/clothing/gloves/grey /obj/item/clothing/gloves/grey
name = "grey gloves" name = "grey gloves"
desc = "A pair of gloves, they don't look special in any way." desc = "A pair of gloves, they don't look special in any way."
icon_state = "gray" icon_state = "gray"
item_state = "graygloves" item_state = "graygloves"
item_color="grey"
rd
item_color = "director" //Exists for washing machines. Is not different from gray gloves in any way.
hop
item_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way.
/obj/item/clothing/gloves/light_brown /obj/item/clothing/gloves/light_brown
name = "light brown gloves" name = "light brown gloves"
desc = "A pair of gloves, they don't look special in any way." desc = "A pair of gloves, they don't look special in any way."
icon_state = "lightbrown" icon_state = "lightbrown"
item_state = "lightbrowngloves" item_state = "lightbrowngloves"
item_color="light brown"
/obj/item/clothing/gloves/brown /obj/item/clothing/gloves/brown
name = "brown gloves" name = "brown gloves"
desc = "A pair of gloves, they don't look special in any way." desc = "A pair of gloves, they don't look special in any way."
icon_state = "brown" icon_state = "brown"
item_state = "browngloves" item_state = "browngloves"
item_color="brown"
cargo
item_color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way.

View File

@@ -3,11 +3,6 @@
name = "captain's gloves" name = "captain's gloves"
icon_state = "captain" icon_state = "captain"
item_state = "egloves" item_state = "egloves"
item_color = "captain"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/gloves/cyborg /obj/item/clothing/gloves/cyborg
desc = "beep boop borp" desc = "beep boop borp"
@@ -21,7 +16,7 @@
name = "\improper SWAT Gloves" name = "\improper SWAT Gloves"
icon_state = "black" icon_state = "black"
item_state = "swat_gl" item_state = "swat_gl"
siemens_coefficient = 0.6 siemens_coefficient = 0.50
permeability_coefficient = 0.05 permeability_coefficient = 0.05
cold_protection = HANDS cold_protection = HANDS
@@ -46,17 +41,13 @@
desc = "Sterile latex gloves." desc = "Sterile latex gloves."
icon_state = "latex" icon_state = "latex"
item_state = "lgloves" item_state = "lgloves"
siemens_coefficient = 0.30 siemens_coefficient = 1.0 //thin latex gloves, much more conductive than fabric gloves (basically a capacitor for AC)
permeability_coefficient = 0.01 permeability_coefficient = 0.01
item_color="white"
cmo
item_color = "medical" //Exists for washing machines. Is not different from latex gloves in any way.
/obj/item/clothing/gloves/botanic_leather /obj/item/clothing/gloves/botanic_leather
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin." desc = "These leather work gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin."
name = "botanist's leather gloves" name = "botanist's leather gloves"
icon_state = "leather" icon_state = "leather"
item_state = "ggloves" item_state = "ggloves"
permeability_coefficient = 0.9 permeability_coefficient = 0.05
siemens_coefficient = 0.9 siemens_coefficient = 0.50 //thick work gloves

View File

@@ -5,7 +5,6 @@
item_state = "hardhat0_yellow" item_state = "hardhat0_yellow"
brightness_on = 4 //luminosity when on brightness_on = 4 //luminosity when on
light_overlay = "hardhat_light" light_overlay = "hardhat_light"
item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite)
armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20) armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0 flags_inv = 0
siemens_coefficient = 0.9 siemens_coefficient = 0.9
@@ -13,12 +12,10 @@
/obj/item/clothing/head/hardhat/orange /obj/item/clothing/head/hardhat/orange
icon_state = "hardhat0_orange" icon_state = "hardhat0_orange"
item_state = "hardhat0_orange" item_state = "hardhat0_orange"
item_color = "orange"
/obj/item/clothing/head/hardhat/red /obj/item/clothing/head/hardhat/red
icon_state = "hardhat0_red" icon_state = "hardhat0_red"
item_state = "hardhat0_red" item_state = "hardhat0_red"
item_color = "red"
name = "firefighter helmet" name = "firefighter helmet"
flags = STOPPRESSUREDAMAGE flags = STOPPRESSUREDAMAGE
heat_protection = HEAD heat_protection = HEAD
@@ -27,7 +24,6 @@
/obj/item/clothing/head/hardhat/white /obj/item/clothing/head/hardhat/white
icon_state = "hardhat0_white" icon_state = "hardhat0_white"
item_state = "hardhat0_white" item_state = "hardhat0_white"
item_color = "white"
flags = STOPPRESSUREDAMAGE flags = STOPPRESSUREDAMAGE
heat_protection = HEAD heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
@@ -35,4 +31,3 @@
/obj/item/clothing/head/hardhat/dblue /obj/item/clothing/head/hardhat/dblue
icon_state = "hardhat0_dblue" icon_state = "hardhat0_dblue"
item_state = "hardhat0_dblue" item_state = "hardhat0_dblue"
item_color = "dblue"

View File

@@ -122,7 +122,6 @@
desc = "A jack o' lantern! Believed to ward off evil spirits." desc = "A jack o' lantern! Believed to ward off evil spirits."
icon_state = "hardhat0_pumpkin"//Could stand to be renamed icon_state = "hardhat0_pumpkin"//Could stand to be renamed
item_state = "hardhat0_pumpkin" item_state = "hardhat0_pumpkin"
item_color = "pumpkin"
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
body_parts_covered = HEAD|EYES body_parts_covered = HEAD|EYES

View File

@@ -1,16 +1,15 @@
/obj/item/clothing/head/soft /obj/item/clothing/head/soft
name = "cargo cap" name = "cargo cap"
desc = "It's a baseball hat in a tasteless yellow color." desc = "It's a peaked cap in a tasteless yellow color."
icon_state = "cargosoft" icon_state = "cargosoft"
flags = HEADCOVERSEYES flags = HEADCOVERSEYES
item_state = "helmet" item_state = "helmet"
item_color = "cargo"
var/flipped = 0 var/flipped = 0
siemens_coefficient = 0.9 siemens_coefficient = 0.9
body_parts_covered = 0 body_parts_covered = 0
dropped() dropped()
src.icon_state = "[item_color]soft" src.icon_state = initial(icon_state)
src.flipped=0 src.flipped=0
..() ..()
@@ -21,10 +20,10 @@
if(usr.canmove && !usr.stat && !usr.restrained()) if(usr.canmove && !usr.stat && !usr.restrained())
src.flipped = !src.flipped src.flipped = !src.flipped
if(src.flipped) if(src.flipped)
icon_state = "[item_color]soft_flipped" icon_state = "[icon_state]_flipped"
usr << "You flip the hat backwards." usr << "You flip the hat backwards."
else else
icon_state = "[item_color]soft" src.icon_state = initial(icon_state)
usr << "You flip the hat back in normal position." usr << "You flip the hat back in normal position."
update_clothing_icon() //so our mob-overlays update update_clothing_icon() //so our mob-overlays update
@@ -32,64 +31,53 @@
name = "red cap" name = "red cap"
desc = "It's a baseball hat in a tasteless red color." desc = "It's a baseball hat in a tasteless red color."
icon_state = "redsoft" icon_state = "redsoft"
item_color = "red"
/obj/item/clothing/head/soft/blue /obj/item/clothing/head/soft/blue
name = "blue cap" name = "blue cap"
desc = "It's a baseball hat in a tasteless blue color." desc = "It's a peaked cap in a tasteless blue color."
icon_state = "bluesoft" icon_state = "bluesoft"
item_color = "blue"
/obj/item/clothing/head/soft/green /obj/item/clothing/head/soft/green
name = "green cap" name = "green cap"
desc = "It's a baseball hat in a tasteless green color." desc = "It's a peaked cap in a tasteless green color."
icon_state = "greensoft" icon_state = "greensoft"
item_color = "green"
/obj/item/clothing/head/soft/yellow /obj/item/clothing/head/soft/yellow
name = "yellow cap" name = "yellow cap"
desc = "It's a baseball hat in a tasteless yellow color." desc = "It's a peaked cap in a tasteless yellow color."
icon_state = "yellowsoft" icon_state = "yellowsoft"
item_color = "yellow"
/obj/item/clothing/head/soft/grey /obj/item/clothing/head/soft/grey
name = "grey cap" name = "grey cap"
desc = "It's a baseball hat in a tasteful grey color." desc = "It's a peaked cap in a tasteful grey color."
icon_state = "greysoft" icon_state = "greysoft"
item_color = "grey"
/obj/item/clothing/head/soft/orange /obj/item/clothing/head/soft/orange
name = "orange cap" name = "orange cap"
desc = "It's a baseball hat in a tasteless orange color." desc = "It's a peaked cap in a tasteless orange color."
icon_state = "orangesoft" icon_state = "orangesoft"
item_color = "orange"
/obj/item/clothing/head/soft/mime /obj/item/clothing/head/soft/mime
name = "white cap" name = "white cap"
desc = "It's a baseball hat in a tasteless white color." desc = "It's a peaked cap in a tasteless white color."
icon_state = "mimesoft" icon_state = "mimesoft"
item_color = "mime"
/obj/item/clothing/head/soft/purple /obj/item/clothing/head/soft/purple
name = "purple cap" name = "purple cap"
desc = "It's a baseball hat in a tasteless purple color." desc = "It's a peaked cap in a tasteless purple color."
icon_state = "purplesoft" icon_state = "purplesoft"
item_color = "purple"
/obj/item/clothing/head/soft/rainbow /obj/item/clothing/head/soft/rainbow
name = "rainbow cap" name = "rainbow cap"
desc = "It's a baseball hat in a bright rainbow of colors." desc = "It's a peaked cap in a bright rainbow of colors."
icon_state = "rainbowsoft" icon_state = "rainbowsoft"
item_color = "rainbow"
/obj/item/clothing/head/soft/sec /obj/item/clothing/head/soft/sec
name = "security cap" name = "security cap"
desc = "It's baseball hat in tasteful red color." desc = "It's a field cap in tasteful red color."
icon_state = "secsoft" icon_state = "secsoft"
item_color = "sec"
/obj/item/clothing/head/soft/sec/corp /obj/item/clothing/head/soft/sec/corp
name = "corporate security cap" name = "corporate security cap"
desc = "It's baseball hat in corporate colors." desc = "It's field cap in corporate colors."
icon_state = "corpsoft" icon_state = "corpsoft"
item_color = "corp"

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