Merge branch 'master' of https://github.com/tgstation/-tg-station into scavengers

This commit is contained in:
Cheridan
2016-04-29 17:06:53 -05:00
511 changed files with 72449 additions and 10911 deletions
-3
View File
@@ -1386,7 +1386,6 @@
M.unEquip(I)
if(I)
I.loc = M.loc
I.layer = initial(I.layer)
I.dropped(M)
M.Paralyse(5)
@@ -1416,7 +1415,6 @@
M.unEquip(I)
if(I)
I.loc = M.loc
I.layer = initial(I.layer)
I.dropped(M)
M.Paralyse(5)
@@ -1469,7 +1467,6 @@
M.unEquip(I)
if(I)
I.loc = M.loc
I.layer = initial(I.layer)
I.dropped(M)
if(istype(M, /mob/living/carbon/human))
+2 -2
View File
@@ -675,12 +675,12 @@ var/global/list/g_fancy_list_of_types = null
for(var/obj/machinery/power/rad_collector/Rad in machines)
if(Rad.anchored)
if(!Rad.P)
if(!Rad.loaded_tank)
var/obj/item/weapon/tank/internals/plasma/Plasma = new/obj/item/weapon/tank/internals/plasma(Rad)
Plasma.air_contents.assert_gas("plasma")
Plasma.air_contents.gases["plasma"][MOLES] = 70
Rad.drainratio = 0
Rad.P = Plasma
Rad.loaded_tank = Plasma
Plasma.loc = Rad
if(!Rad.active)
@@ -357,7 +357,7 @@
if(neighbor.archived_cycle < SSair.times_fired)
neighbor.archive()
neighbor.neighbor_conduct_with_src()
neighbor.neighbor_conduct_with_src(src)
neighbor.consider_superconductivity()
@@ -491,7 +491,8 @@ var/list/gaslist_cache = null
/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
//transfer of thermal energy (via conduction) between self and sharer
sharer_temperature = sharer_temperature || sharer.temperature_archived
if(sharer)
sharer_temperature = sharer.temperature_archived
var/temperature_delta = temperature_archived - sharer_temperature
if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/self_heat_capacity = heat_capacity_archived()
@@ -502,7 +503,7 @@ var/list/gaslist_cache = null
(self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity))
temperature = max(temperature - heat/self_heat_capacity, TCMB)
sharer_temperature = max(sharer.temperature + heat/sharer_heat_capacity, TCMB)
sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB)
if(sharer)
sharer.temperature = sharer_temperature
return sharer_temperature
@@ -122,40 +122,43 @@ Pipelines + Other Objects -> Pipe network
return
/obj/machinery/atmospherics/attackby(obj/item/weapon/W, mob/user, params)
if(can_unwrench && istype(W, /obj/item/weapon/wrench))
var/turf/T = get_turf(src)
if (level==1 && isturf(T) && T.intact)
user << "<span class='warning'>You must remove the plating first!</span>"
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
add_fingerprint(user)
if(istype(W, /obj/item/weapon/wrench))
if(can_unwrench(user))
var/turf/T = get_turf(src)
if (level==1 && isturf(T) && T.intact)
user << "<span class='warning'>You must remove the plating first!</span>"
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
add_fingerprint(user)
var/unsafe_wrenching = FALSE
var/internal_pressure = int_air.return_pressure()-env_air.return_pressure()
var/unsafe_wrenching = FALSE
var/internal_pressure = int_air.return_pressure()-env_air.return_pressure()
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (internal_pressure > 2*ONE_ATMOSPHERE)
user << "<span class='warning'>As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?</span>"
unsafe_wrenching = TRUE //Oh dear oh dear
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (internal_pressure > 2*ONE_ATMOSPHERE)
user << "<span class='warning'>As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?</span>"
unsafe_wrenching = TRUE //Oh dear oh dear
if (do_after(user, 20/W.toolspeed, target = src) && !qdeleted(src))
user.visible_message( \
"[user] unfastens \the [src].", \
"<span class='notice'>You unfasten \the [src].</span>", \
"<span class='italics'>You hear ratchet.</span>")
investigate_log("was <span class='warning'>REMOVED</span> by [key_name(usr)]", "atmos")
//You unwrenched a pipe full of pressure? Let's splat you into the wall, silly.
if(unsafe_wrenching)
unsafe_pressure_release(user, internal_pressure)
Deconstruct()
if (do_after(user, 20/W.toolspeed, target = src) && !qdeleted(src))
user.visible_message( \
"[user] unfastens \the [src].", \
"<span class='notice'>You unfasten \the [src].</span>", \
"<span class='italics'>You hear ratchet.</span>")
investigate_log("was <span class='warning'>REMOVED</span> by [key_name(usr)]", "atmos")
//You unwrenched a pipe full of pressure? Let's splat you into the wall, silly.
if(unsafe_wrenching)
unsafe_pressure_release(user, internal_pressure)
Deconstruct()
else
return ..()
/obj/machinery/atmospherics/proc/can_unwrench(mob/user)
return can_unwrench
// Throws the user when they unwrench a pipe with a major difference between the internal and environmental pressure.
/obj/machinery/atmospherics/proc/unsafe_pressure_release(mob/user, pressures = null)
if(!user)
@@ -166,10 +166,10 @@ Passive gate is similar to the regular pump except:
..()
update_icon()
/obj/machinery/atmospherics/components/binary/passive_gate/attackby(obj/item/weapon/W, mob/user, params)
if(!istype(W, /obj/item/weapon/wrench))
return ..()
if(on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
return 1
return ..()
/obj/machinery/atmospherics/components/binary/passive_gate/can_unwrench(mob/user)
if(..())
if(on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
else
return 1
@@ -173,11 +173,10 @@ Thus, the two variables affect pump operation are set in New():
..()
update_icon()
/obj/machinery/atmospherics/components/binary/pump/attackby(obj/item/weapon/W, mob/user, params)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (!(stat & NOPOWER) && on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
return 1
return ..()
/obj/machinery/atmospherics/components/binary/pump/can_unwrench(mob/user)
if(..())
if(!(stat & NOPOWER) && on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
else
return 1
@@ -169,10 +169,10 @@ Thus, the two variables affect pump operation are set in New():
..()
update_icon()
/obj/machinery/atmospherics/components/binary/volume_pump/attackby(obj/item/weapon/W, mob/user, params)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (!(stat & NOPOWER) && on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
return 1
return ..()
/obj/machinery/atmospherics/components/binary/volume_pump/can_unwrench(mob/user)
if(..())
if(!(stat & NOPOWER) && on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
else
return 1
@@ -164,17 +164,17 @@
/obj/machinery/atmospherics/components/unary/cryo_cell/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/reagent_containers/glass))
if(isrobot(user))
. = 1 //no afterattack
if(!user.drop_item())
return
if(beaker)
user << "<span class='warning'>A beaker is already loaded into [src]!</span>"
return
if(!user.drop_item())
return
beaker = I
I.loc = src
user.visible_message("[user] places [I] in [src].", \
"<span class='notice'>You place [I] in [src].</span>")
return
if(!on && !occupant && !state_open)
if(default_deconstruction_screwdriver(user, "cell-o", "cell-off", I))
return
@@ -186,6 +186,7 @@
return
if(default_deconstruction_crowbar(I))
return
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = notcontained_state)
@@ -27,12 +27,12 @@
connected_device.disconnect()
return ..()
/obj/machinery/atmospherics/components/unary/portables_connector/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
/obj/machinery/atmospherics/components/unary/portables_connector/can_unwrench(mob/user)
if(..())
if(connected_device)
user << "<span class='warning'>You cannot unwrench this [src], dettach [connected_device] first!</span>"
user << "<span class='warning'>You cannot unwrench this [src], detach [connected_device] first!</span>"
else
return 1
return ..()
/obj/machinery/atmospherics/components/unary/portables_connector/portableConnectorReturnAir()
return connected_device.portableConnectorReturnAir()
@@ -85,6 +85,7 @@
return
if(default_deconstruction_crowbar(I))
return
return ..()
/obj/machinery/atmospherics/components/unary/thermomachine/default_change_direction_wrench(mob/user, obj/item/weapon/wrench/W)
if(!..())
@@ -244,9 +244,6 @@
return
/obj/machinery/atmospherics/components/unary/vent_pump/attackby(obj/item/W, mob/user, params)
if (istype(W, /obj/item/weapon/wrench)&& !(stat & NOPOWER) && on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
return 1
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0,user))
@@ -262,11 +259,20 @@
user.visible_message("[user] unwelds the vent.", "<span class='notice'>You unweld the vent.</span>", "<span class='italics'>You hear welding.</span>")
welded = 0
update_icon()
pipe_vision_img = image(src, loc, layer = 20, dir = dir)
var/image/I = image(src, loc, dir = dir)
I.plane = PLANE_UI_OBJECTS
pipe_vision_img = I
return 0
else
return ..()
/obj/machinery/atmospherics/components/unary/vent_pump/can_unwrench(mob/user)
if(..())
if(!(stat & NOPOWER) && on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
else
return 1
/obj/machinery/atmospherics/components/unary/vent_pump/examine(mob/user)
..()
if(welded)
@@ -285,7 +291,9 @@
user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the vent", "You hear loud scraping noises.")
welded = 0
update_icon()
pipe_vision_img = image(src, loc, layer = 20, dir = dir)
var/image/I = image(src, loc, dir = dir)
I.plane = PLANE_UI_OBJECTS
pipe_vision_img = I
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1)
@@ -308,14 +308,19 @@
user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.")
welded = 0
update_icon()
pipe_vision_img = image(src, loc, layer = 20, dir = dir)
var/image/I = image(src, loc, dir = dir)
I.plane = PLANE_UI_OBJECTS
pipe_vision_img = I
return 0
if (!istype(W, /obj/item/weapon/wrench))
else
return ..()
if (!(stat & NOPOWER) && on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
return 1
return ..()
/obj/machinery/atmospherics/components/unary/vent_scrubber/can_unwrench(mob/user)
if(..())
if (!(stat & NOPOWER) && on)
user << "<span class='warning'>You cannot unwrench this [src], turn it off first!</span>"
else
return 1
/obj/machinery/atmospherics/components/unary/vent_scrubber/can_crawl_through()
return !welded
@@ -326,7 +331,9 @@
user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the scrubber.", "You hear loud scraping noises.")
welded = 0
update_icon()
pipe_vision_img = image(src, loc, layer = 20, dir = dir)
var/image/I = image(src, loc, dir = dir)
I.plane = PLANE_UI_OBJECTS
pipe_vision_img = I
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1)
@@ -104,7 +104,7 @@
new /obj/item/pipe_meter(src.loc)
qdel(src)
else
..()
return ..()
/obj/machinery/meter/attack_ai(mob/user)
return src.attack_hand(user)
@@ -65,12 +65,8 @@
/obj/machinery/atmospherics/pipe/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/device/analyzer))
atmosanalyzer_scan(parent.air, user)
return
if(istype(W,/obj/item/device/pipe_painter) || istype(W,/obj/item/weapon/pipe_dispenser))
return
return ..()
else
return ..()
/obj/machinery/atmospherics/pipe/returnPipenet()
return parent
@@ -149,14 +149,25 @@
/obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > temperature_resistance)
health -= 5
healthcheck()
take_damage(5, BRUTE, 0)
/obj/machinery/portable_atmospherics/canister/proc/healthcheck()
/obj/machinery/portable_atmospherics/canister/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
switch(damage_type)
if(BRUTE)
if(sound_effect)
if(damage)
playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
else
playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
if(sound_effect)
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
else
return
if(stat & BROKEN)
return
if(health <= 10)
health = max( health - damage, 0)
if(!health)
disconnect()
var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles())
var/turf/T = get_turf(src)
@@ -192,43 +203,34 @@
air_update_turf() // Update the environment if needed.
update_icon()
/obj/machinery/portable_atmospherics/canister/blob_act()
health = 0
healthcheck()
/obj/machinery/portable_atmospherics/canister/blob_act(obj/effect/blob/B)
take_damage(100, BRUTE, 0)
/obj/machinery/portable_atmospherics/canister/bullet_act(obj/item/projectile/P)
if((P.damage_type == BRUTE || P.damage_type == BURN))
if(P.damage)
health -= round(P.damage / 2)
healthcheck()
..()
. = ..()
take_damage(P.damage / 2, P.damage_type, 0)
/obj/machinery/portable_atmospherics/canister/ex_act(severity, target)
switch(severity)
if(1)
if((stat & BROKEN) || prob(30))
qdel(src)
return
else
health = 0
take_damage(100, BRUTE, 0)
if(2)
if(stat & BROKEN)
qdel(src)
return
else
health -= rand(40, 100)
take_damage(rand(40, 110), BRUTE, 0)
if(3)
health -= rand(15, 40)
healthcheck()
take_damage(rand(15, 40), BRUTE, 0)
/obj/machinery/portable_atmospherics/canister/attackby(obj/item/weapon/W, mob/user, params)
if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda))
investigate_log("was smacked with \a [W] by [key_name(user)].", "atmos")
health -= W.force
add_fingerprint(user)
healthcheck()
playsound(loc, 'sound/weapons/smash.ogg', 60, 1)
..()
/obj/machinery/portable_atmospherics/canister/attacked_by(obj/item/I, mob/user)
if(I.force)
user.visible_message("<span class='danger'>[user] has hit [src] with [I]!</span>", "<span class='danger'>You hit [src] with [I]!</span>")
investigate_log("was smacked with \a [I] by [key_name(user)].", "atmos")
add_fingerprint(user)
take_damage(I.force, I.damtype, 1)
/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = physical_state)
@@ -69,38 +69,40 @@
return air_contents
/obj/machinery/portable_atmospherics/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/tank) && !(stat & BROKEN))
var/obj/item/weapon/tank/T = W
if(holding || !user.drop_item())
return
T.loc = src
holding = T
update_icon()
else if(istype(W, /obj/item/weapon/wrench) && !(stat & BROKEN))
if(connected_port)
disconnect()
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message( \
"[user] disconnects [src].", \
"<span class='notice'>You unfasten [src] from the port.</span>", \
"<span class='italics'>You hear a ratchet.</span>")
update_icon()
return
else
var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/components/unary/portables_connector) in loc
if(!possible_port)
user << "<span class='notice'>Nothing happens.</span>"
if(istype(W, /obj/item/weapon/tank))
if(!(stat & BROKEN))
var/obj/item/weapon/tank/T = W
if(holding || !user.drop_item())
return
if(!connect(possible_port))
user << "<span class='notice'>[name] failed to connect to the port.</span>"
return
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message( \
"[user] connects [src].", \
"<span class='notice'>You fasten [src] to the port.</span>", \
"<span class='italics'>You hear a ratchet.</span>")
T.loc = src
holding = T
update_icon()
else if((istype(W, /obj/item/device/analyzer)) && Adjacent(user))
else if(istype(W, /obj/item/weapon/wrench))
if(!(stat & BROKEN))
if(connected_port)
disconnect()
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message( \
"[user] disconnects [src].", \
"<span class='notice'>You unfasten [src] from the port.</span>", \
"<span class='italics'>You hear a ratchet.</span>")
update_icon()
return
else
var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/components/unary/portables_connector) in loc
if(!possible_port)
user << "<span class='notice'>Nothing happens.</span>"
return
if(!connect(possible_port))
user << "<span class='notice'>[name] failed to connect to the port.</span>"
return
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message( \
"[user] connects [src].", \
"<span class='notice'>You fasten [src] to the port.</span>", \
"<span class='italics'>You hear a ratchet.</span>")
update_icon()
else if(istype(W, /obj/item/device/analyzer) && Adjacent(user))
atmosanalyzer_scan(air_contents, user)
else
..()
return ..()
@@ -132,4 +132,4 @@
if(!movable)
on = FALSE
else
..()
return ..()
@@ -134,6 +134,10 @@ var/global/dmm_suite/preloader/_preloader = new
if(bounds[1] == 1.#INF) // Shouldn't need to check every item
return null
else
for(var/t in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
var/turf/T = t
//we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs
T.AfterChange(TRUE)
return bounds
/**
@@ -267,7 +271,7 @@ var/global/dmm_suite/preloader/_preloader = new
var/turf/T = locate(x,y,z)
if(T)
if(ispath(path, /turf))
T.ChangeTurf(path)
T.ChangeTurf(path, TRUE)
instance = T
else
instance = new path (T)//first preloader pass
@@ -394,4 +398,4 @@ var/global/dmm_suite/preloader/_preloader = new
name = "Area Passthrough"
/turf/template_noop
name = "Turf Passthrough"
name = "Turf Passthrough"
@@ -248,7 +248,7 @@
if(rand(0,1))
new /obj/item/stack/spacecash/c1000(T)
else
var/obj/item/weapon/moneybag/M = new(T)
var/obj/item/weapon/storage/bag/money/M = new(T)
for(var/i in 1 to rand(5,50))
new /obj/item/weapon/coin/gold(M)
if(14)
@@ -48,7 +48,7 @@
active = 1
toggleFireplace()
else
..()
return ..()
else
W.fire_act()
+2 -2
View File
@@ -11,7 +11,7 @@
/obj/item/device/export_scanner/examine(user)
..()
if(!cargo_console)
user << "<span class='notice'>You had to link it to supply console for it to work.</span>"
user << "<span class='notice'>The [src] is currently not linked to a cargo console.</span>"
/obj/item/device/export_scanner/afterattack(obj/O, mob/user, proximity)
if(!istype(O) || !proximity)
@@ -44,4 +44,4 @@
exported = TRUE
break
if(!exported)
user << "<span class='notice'>The object is unexportable.</span>"
user << "<span class='notice'>The object is unexportable.</span>"
+6
View File
@@ -7,6 +7,7 @@
message = "of enemy intelligence"
var/global/originals_recieved = list()
var/global/copies_recieved = list()
var/copy_path = null
export_types = list(/obj/item/documents/syndicate)
/datum/export/intel/applies_to(obj/O, contr = 0, emag = 0)
@@ -23,6 +24,9 @@
return FALSE
if((C.copy_type in originals_recieved) || (C.copy_type in copies_recieved))
return FALSE
if(copy_path && !ispath(C.copy_type, copy_path))
return FALSE
else if(O.type in originals_recieved)
return FALSE
@@ -45,6 +49,7 @@
cost = 15000 // Allows double agents to earn some cargo points without failing their objectives.
unit_name = "photocopied article"
export_types = list(/obj/item/documents/photocopy)
copy_path = /obj/item/documents/syndicate
@@ -58,6 +63,7 @@
cost = 15000
unit_name = "photocopied article"
export_types = list(/obj/item/documents/photocopy)
copy_path = /obj/item/documents/nanotrasen
// Selling Syndicate docs to Syndicate, why not?
/datum/export/intel/syndie/recovered
+2 -2
View File
@@ -32,10 +32,10 @@
export_types = list(/obj/item/stack/sheet/animalhide/human)
// Goliath hide. Expensive.
/datum/export/goliath_hide
/datum/export/stack/skin/goliath_hide
cost = 2500
unit_name = "goliath hide"
export_types = list(/obj/item/asteroid/goliath_hide)
export_types = list(/obj/item/stack/sheet/animalhide/goliath_hide)
// Cat hide. Just in case Runtime is catsploding again.
/datum/export/stack/skin/cat
+79 -15
View File
@@ -3,7 +3,7 @@
var/group = ""
var/hidden = FALSE
var/contraband = FALSE
var/cost = 7 // Minimum cost, or infinite points are possible.
var/cost = 700 // Minimum cost, or infinite points are possible.
var/access = FALSE
var/list/contains = null
var/crate_name = "crate"
@@ -53,6 +53,12 @@
contains = list(/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath,
/obj/item/weapon/tank/internals/emergency_oxygen,
/obj/item/weapon/tank/internals/emergency_oxygen,
/obj/item/weapon/tank/internals/emergency_oxygen,
/obj/item/weapon/tank/internals/air,
/obj/item/weapon/tank/internals/air,
/obj/item/weapon/tank/internals/air)
@@ -105,6 +111,12 @@
crate_name = "weed control crate"
crate_type = /obj/structure/closet/crate/secure/hydroponics
/datum/supply_pack/emergency/metalfoam
name = "Metal Foam Grenade Crate"
cost = 1000
contains = list(/obj/item/weapon/storage/box/metalfoam)
crate_name = "metal foam grenade crate"
/datum/supply_pack/emergency/specialops
name = "Special Ops Supplies"
hidden = TRUE
@@ -115,16 +127,16 @@
/obj/item/weapon/grenade/smokebomb,
/obj/item/weapon/pen/sleepy,
/obj/item/weapon/grenade/chem_grenade/incendiary)
crate_name = "special ops crate"
crate_type = /obj/structure/closet/crate
crate_name = "emergency crate"
crate_type = /obj/structure/closet/crate/internals
/datum/supply_pack/emergency/syndicate
name = "NULL_ENTRY"
hidden = TRUE
cost = 14000
contains = list(/obj/item/weapon/storage/box/syndicate)
crate_name = "crate"
crate_type = /obj/structure/closet/crate
crate_name = "emergency crate"
crate_type = /obj/structure/closet/crate/internals
dangerous = TRUE
//////////////////////////////////////////////////////////////////////////////
@@ -393,7 +405,7 @@
contraband = TRUE
contains = list(/obj/item/clothing/head/helmet/justice,
/obj/item/clothing/mask/gas/sechailer)
crate_name = "justice enforcer crate"
crate_name = "security clothing crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Engineering /////////////////////////////////////
@@ -440,7 +452,7 @@
/datum/supply_pack/engineering/engiequipment
name = "Engineering Gear Crate"
cost = 1000
cost = 1300
contains = list(/obj/item/weapon/storage/belt/utility,
/obj/item/weapon/storage/belt/utility,
/obj/item/weapon/storage/belt/utility,
@@ -452,7 +464,9 @@
/obj/item/clothing/head/welding,
/obj/item/clothing/head/hardhat,
/obj/item/clothing/head/hardhat,
/obj/item/clothing/head/hardhat)
/obj/item/clothing/head/hardhat,
/obj/item/clothing/glasses/meson/engine,
/obj/item/clothing/glasses/meson/engine)
crate_name = "engineering gear crate"
/datum/supply_pack/engineering/engine/spacesuit
@@ -464,10 +478,34 @@
/obj/item/clothing/head/helmet/space,
/obj/item/clothing/head/helmet/space,
/obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath,)
/obj/item/clothing/mask/breath)
crate_name = "space suit crate"
crate_type = /obj/structure/closet/crate/secure
/datum/supply_pack/engineering/shieldgen
name = "Anti-breach Shield Projector Crate"
cost = 2500
contains = list(/obj/machinery/shieldgen,
/obj/machinery/shieldgen)
crate_name = "anti-breach shield projector crate"
/datum/supply_pack/engineering/grounding_rods
name = "Grounding Rod Crate"
cost = 1700
contains = list(/obj/machinery/power/grounding_rod,
/obj/machinery/power/grounding_rod,
/obj/machinery/power/grounding_rod,
/obj/machinery/power/grounding_rod)
crate_name = "grounding rod crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
/datum/supply_pack/engineering/pacman
name = "P.A.C.M.A.N Generator Crate"
cost = 2500
contains = list(/obj/machinery/power/port_gen/pacman)
crate_name = "PACMAN generator crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
/datum/supply_pack/engineering/solar
name = "Solar Panel Crate"
cost = 2000
@@ -668,6 +706,13 @@
contains = list(/obj/machinery/iv_drip)
crate_name = "iv drip crate"
/datum/supply_pack/medical/defibs
name = "Defibrillator Crate"
cost = 2500
contains = list(/obj/item/weapon/defibrillator/loaded,
/obj/item/weapon/defibrillator/loaded)
crate_name = "defibrillator crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Science /////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -874,7 +919,7 @@
contraband = TRUE
cost = 5000
contains = list(/mob/living/simple_animal/butterfly)
crate_name = "butterflies crate"
crate_name = "entomology samples crate"
/datum/supply_pack/organic/critter/butterfly/generate()
. = ..()
@@ -938,7 +983,7 @@
crate_name = "exotic seeds crate"
/datum/supply_pack/organic/hydroponics/beekeeping_fullkit
name = "Beekeeping Starter Kit"
name = "Beekeeping Starter Crate"
cost = 1500
contains = list(/obj/structure/beebox,
/obj/item/honey_frame,
@@ -947,10 +992,10 @@
/obj/item/queen_bee/bought,
/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit)
crate_name = "beekeeping starter kit"
crate_name = "beekeeping starter crate"
/datum/supply_pack/organic/hydroponics/beekeeping_suits
name = "2 Beekeeper suits"
name = "Beekeeper Suit Crate"
cost = 1000
contains = list(/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit,
@@ -1092,9 +1137,28 @@
/obj/item/clothing/suit/bluetag,
/obj/item/clothing/suit/bluetag,
/obj/item/clothing/head/helmet/redtaghelm,
/obj/item/clothing/head/helmet/redtaghelm,
/obj/item/clothing/head/helmet/redtaghelm,
/obj/item/clothing/head/helmet/bluetaghelm,
/obj/item/clothing/head/helmet/bluetaghelm,
/obj/item/clothing/head/helmet/bluetaghelm)
crate_name = "laser tag crate"
/datum/supply_pack/misc/lasertag/pins
name = "Laser Tag Firing Pins Crate"
cost = 2000
contraband = TRUE
contains = list(/obj/item/weapon/storage/box/lasertagpins)
crate_name = "laser tag crate"
/datum/supply_pack/misc/clownpin
name = "Hilarious Firing Pin Crate"
cost = 5000
contraband = TRUE
contains = list(/obj/item/device/firing_pin/clown)
// It's /technically/ a toy. For the clown, at least.
crate_name = "toy crate"
/datum/supply_pack/misc/religious_supplies
name = "Religious Supplies Crate"
cost = 4000 // it costs so much because the Space Church is ran by Space Jews
@@ -1114,7 +1178,7 @@
/obj/item/weapon/poster/legit,
/obj/item/weapon/poster/legit,
/obj/item/weapon/poster/legit)
crate_name = "Corporate Posters Crate"
crate_name = "corporate posters crate"
/datum/supply_pack/misc/paper
name = "Bureaucracy Crate"
@@ -1353,4 +1417,4 @@
/obj/item/weapon/gun/projectile/automatic/toy/pistol,
/obj/item/ammo_box/magazine/toy/pistol,
/obj/item/ammo_box/magazine/toy/pistol)
crate_name = "foam force pistols crate"
crate_name = "foam force crate"
+19 -4
View File
@@ -2,8 +2,7 @@
//SECURITY//
////////////
#define UPLOAD_LIMIT 1048576 //Restricts client uploads to the server to 1MB //Could probably do with being lower.
#define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing.
//I would just like the code ready should it ever need to be used.
/*
When somebody clicks a link in game, this Topic is called first.
It does the stuff in this proc and then is redirected to the Topic() proc for the src=[0xWhatever]
@@ -103,8 +102,6 @@ var/next_external_rsc = 0
if(connection != "seeker" && connection != "web")//Invalid connection type.
return null
if(byond_version < MIN_CLIENT_VERSION) //Out of date client.
return null
#if (PRELOAD_RSC == 0)
if(external_rsc_urls && external_rsc_urls.len)
@@ -143,6 +140,24 @@ var/next_external_rsc = 0
. = ..() //calls mob.Login()
if (byond_version < config.client_error_version) //Out of date client.
src << "<span class='danger'><b>Your version of byond is too old:</b></span>"
src << config.client_error_message
src << "Your version: [byond_version]"
src << "Required version: [config.client_error_version] or later"
src << "Visit http://www.byond.com/download/ to get the latest version of byond."
if (holder)
src << "Because you are an admin, you are being allowed to walk past this limitation, But it is still STRONGLY suggested you upgrade"
else
del(src)
return 0
else if (byond_version < config.client_warn_version) //We have words for this client.
src << "<span class='danger'><b>Your version of byond may be getting out of date:</b></span>"
src << config.client_warn_message
src << "Your version: [byond_version]"
src << "Required version to remove this message: [config.client_warn_version] or later"
src << "Visit http://www.byond.com/download/ to get the latest version of byond."
if (connection == "web")
if (!config.allowwebclient)
src << "Web client is disabled"
+3 -4
View File
@@ -154,9 +154,7 @@ BLIND // can't see anything
if(adjusted_flags)
slot_flags = adjusted_flags
user.wear_mask_update(src, toggle_off = mask_adjusted)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
user.update_action_buttons_icon() //when mask is adjusted out, we update all buttons icon so the user's potential internal tank correctly shows as off.
@@ -357,8 +355,10 @@ BLIND // can't see anything
I.transform *= 0.5 //halve the size so it doesn't overpower the under
I.pixel_x += 8
I.pixel_y -= 8
var/oldlayer = I.layer
I.layer = FLOAT_LAYER
overlays += I
I.layer = oldlayer
if(istype(loc, /mob/living/carbon/human))
@@ -492,7 +492,6 @@ BLIND // can't see anything
hastie.transform *= 2
hastie.pixel_x -= 8
hastie.pixel_y += 8
hastie.layer = initial(hastie.layer)
overlays = null
usr.put_in_hands(hastie)
hastie = null
+18 -1
View File
@@ -35,4 +35,21 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
burn_state = FIRE_PROOF
burn_state = FIRE_PROOF
/obj/item/clothing/gloves/bracer
name = "bone bracers"
desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms."
icon_state = "bracers"
item_state = "bracers"
item_color = null //So they don't wash.
transfer_prints = TRUE
strip_delay = 40
put_on_delay = 20
body_parts_covered = ARMS
cold_protection = ARMS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
burn_state = FIRE_PROOF
armor = list(melee = 15, bullet = 35, laser = 35, energy = 20, bomb = 35, bio = 35, rad = 35) //Not like anything ever hits the arms anyways.
+10
View File
@@ -203,6 +203,16 @@
icon_state = "knight_templar"
item_state = "knight_templar"
/obj/item/clothing/head/helmet/skull
name = "skull helmet"
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
flags_inv = HIDEEARS|HIDEHAIR
flags_cover = HEADCOVERSEYES
armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 10, bio = 5, rad = 20)
icon_state = "skull"
item_state = "skull"
strip_delay = 100
//LightToggle
/obj/item/clothing/head/helmet/update_icon()
+9 -3
View File
@@ -62,7 +62,6 @@
flags_cover = MASKCOVERSEYES
burn_state = FLAMMABLE
actions_types = list(/datum/action/item_action/adjust)
dog_fashion = /datum/dog_fashion/head/clown
/obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
@@ -80,8 +79,12 @@
var/choice = input(user,"To what form do you wish to Morph this mask?","Morph Mask") in options
if(src && choice && !user.stat && in_range(user,src))
if(src && choice && !user.incapacitated() && in_range(user,src))
icon_state = options[choice]
user.update_inv_wear_mask()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
user << "<span class='notice'>Your Clown Mask has now morphed into [choice], all praise the Honkmother!</span>"
return 1
@@ -105,7 +108,7 @@
actions_types = list(/datum/action/item_action/adjust)
/obj/item/clothing/mask/gas/mime/attack_self(mob/user)
cycle_mask(usr)
cycle_mask(user)
/obj/item/clothing/mask/gas/mime/proc/cycle_mask(mob/user)
switch(icon_state)
@@ -118,6 +121,9 @@
if("sexymime")
icon_state = "mime"
user.update_inv_wear_mask()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
user << "<span class='notice'>You adjust your mask to portray a different emotion.</span>"
return 1
+5 -5
View File
@@ -195,7 +195,7 @@
//Syndicate hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/syndi
name = "blood-red hardsuit helmet"
desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
desc = "A dual-mode advanced helmet designed for work in special operations. It is in EVA mode. Property of Gorlex Marauders."
alt_desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
@@ -221,7 +221,7 @@
return
on = !on
if(on || force)
user << "<span class='notice'>You switch your hardsuit to travel mode.</span>"
user << "<span class='notice'>You switch your hardsuit to EVA mode, sacrificing speed for space protection.</span>"
name = initial(name)
desc = initial(desc)
user.AddLuminosity(brightness_on)
@@ -230,7 +230,7 @@
flags_inv |= visor_flags_inv
cold_protection |= HEAD
else
user << "<span class='notice'>You switch your hardsuit to combat mode.</span>"
user << "<span class='notice'>You switch your hardsuit to combat mode and can now run at full speed.</span>"
name += " (combat)"
desc = alt_desc
user.AddLuminosity(-brightness_on)
@@ -272,7 +272,7 @@
/obj/item/clothing/suit/space/hardsuit/syndi
name = "blood-red hardsuit"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in EVA mode. Property of Gorlex Marauders."
alt_desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
@@ -290,7 +290,7 @@
//Elite Syndie suit
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit helmet"
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders."
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in EVA mode. Property of Gorlex Marauders."
alt_desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
@@ -312,3 +312,16 @@ Contains:
name = "inquisitor's helmet"
icon_state = "hardsuit0-inq"
item_state = "hardsuit0-inq"
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker
name = "champion's hardsuit"
desc = "Voices echo from the hardsuit, driving the user insane."
icon_state = "hardsuit-beserker"
item_state = "hardsuit-beserker"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker
name = "champion's helmet"
desc = "Peering into the eyes of the helmet is enough to seal damnation."
icon_state = "hardsuit0-beserker"
item_state = "hardsuit0-beserker"
+17 -10
View File
@@ -172,14 +172,6 @@
time = 10
category = CAT_WEAPON
/datum/table_recipe/sandbags
name = "Sandbags"
result = /obj/item/stack/sheet/mineral/sandbags
reqs = list(/obj/item/weapon/ore/glass = 5,
/obj/item/weapon/emptysandbag = 1)
time = 10
category = CAT_WEAPON
/datum/table_recipe/meteorshot
name = "Meteorshot Shell"
result = /obj/item/ammo_casing/shotgun/meteorshot
@@ -357,7 +349,7 @@
result = /obj/item/clothing/suit/armor/bone
time = 30
reqs = list(/obj/item/stack/sheet/bone = 6)
category = CAT_MISC
category = CAT_PRIMAL
/datum/table_recipe/bonetalisman
name = "Bone Talisman"
@@ -365,4 +357,19 @@
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_MISC
category = CAT_PRIMAL
/datum/table_recipe/bracers
name = "Bone Bracers"
result = /obj/item/clothing/gloves/bracer
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/table_recipe/skullhelm
name = "Skull Helmet"
result = /obj/item/clothing/head/helmet/skull
time = 30
reqs = list(/obj/item/stack/sheet/bone = 4)
category = CAT_PRIMAL
+1 -1
View File
@@ -3,7 +3,7 @@
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/list/table_contents = list()
var/viewing_category = 1 //typical powergamer starting on the Weapons tab
var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC)
var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC,CAT_PRIMAL)
/obj/structure/table/MouseDrop(mob/living/user)
+1 -2
View File
@@ -36,8 +36,7 @@
if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up.
if(istype(I.loc,/obj/item/weapon/storage)) //in a container.
var/obj/item/weapon/storage/U = I.loc
user.client.screen -= I
U.contents.Remove(I)
U.remove_from_storage(I, src)
else if(user.l_hand == I) //in a hand
user.drop_l_hand()
else if(user.r_hand == I) //in a hand
@@ -14,6 +14,7 @@
w_class = 1
icon = 'icons/obj/toy.dmi'
icon_state = "rag"
flags = OPENCONTAINER | NOBLUDGEON
amount_per_transfer_from_this = 5
possible_transfer_amounts = list()
volume = 5
+1 -1
View File
@@ -65,7 +65,7 @@
blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH"
blueeffect.icon = 'icons/effects/effects.dmi'
blueeffect.icon_state = "shieldsparkles"
blueeffect.layer = 17
blueeffect.plane = PLANE_EFFECTS_UNLIT
blueeffect.mouse_opacity = 0
M.client.screen += blueeffect
sleep(20)
@@ -14,10 +14,8 @@
"Ionospheri:%£ MCayj^j<.3-BZZZZZZT", \
"#4nd%;f4y6,>£%-BZZZZZZZT")
for(var/mob/living/silicon/ai/A in player_list) //AIs are always aware of communication blackouts.
A << "<br>"
A << "<span class='warning'><b>[alert]</b></span>"
A << "<br>"
for(var/mob/living/silicon/ai/A in ai_list) //AIs are always aware of communication blackouts.
A << "<br><span class='warning'><b>[alert]</b></span><br>"
if(prob(30)) //most of the time, we don't want an announcement, so as to allow AIs to fake blackouts.
priority_announce(alert)
@@ -25,4 +23,4 @@
/datum/round_event/communications_blackout/start()
for(var/obj/machinery/telecomms/T in telecomms_list)
T.emp_act(1)
T.emp_act(1)
+40
View File
@@ -0,0 +1,40 @@
/datum/round_event_control/processor_overload
name = "Processor Overload"
typepath = /datum/round_event/processor_overload
weight = 15
min_players = 20
/datum/round_event/processor_overload
announceWhen = 1
/datum/round_event/processor_overload/announce()
var/alert = pick( "Exospheric bubble inbound. Processor overload is likely. Please contact you*%xp25)`6cq-BZZT", \
"Exospheric bubble inbound. Processor overload is likel*1eta;c5;'1v¬-BZZZT", \
"Exospheric bubble inbound. Processor ov#MCi46:5.;@63-BZZZZT", \
"Exospheric bubble inbo'Fz\\k55_@-BZZZZZT", \
"Exospheri:%£ QCbyj^j</.3-BZZZZZZT", \
"!!hy%;f3l7e,<$^-BZZZZZZZT")
for(var/mob/living/silicon/ai/A in ai_list)
//AIs are always aware of processor overload
A << "<br><span class='warning'><b>[alert]</b></span><br>"
// Announce most of the time, but leave a little gap so people don't know
// whether it's, say, a tesla zapping tcomms, or some selective
// modification of the tcomms bus
if(prob(80))
priority_announce(alert)
/datum/round_event/processor_overload/start()
for(var/obj/machinery/telecomms/T in telecomms_list)
if(istype(T, /obj/machinery/telecomms/processor))
var/obj/machinery/telecomms/processor/P = T
if(prob(10))
// Damage the surrounding area to indicate that it popped
explosion(get_turf(P), 0, 0, 2)
// Only a level 1 explosion actually damages the machine
// at all
P.ex_act(1)
else
P.emp_act(1)
+1 -1
View File
@@ -635,7 +635,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
if(!H.r_store) slots_free += ui_storage2
if(slots_free.len)
halitem.screen_loc = pick(slots_free)
halitem.layer = 50
halitem.plane = PLANE_UI_OBJECTS
switch(rand(1,6))
if(1) //revolver
halitem.icon = 'icons/obj/guns/projectile.dmi'
@@ -649,7 +649,6 @@
..()
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/attack(obj/target, mob/user)
if(user.a_intent == "harm" && ismob(target) && target.reagents && reagents.total_volume)
target.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [target]!</span>", \
"<span class='userdanger'>[user] splashes the contents of [src] onto [target]!</span>")
@@ -660,7 +659,8 @@
..()
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/afterattack(obj/target, mob/user, proximity)
if((!proximity) || !check_allowed_items(target,target_self=1)) return
if((!proximity) || !check_allowed_items(target,target_self=1))
return
else if(reagents.total_volume && user.a_intent == "harm")
user.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [target]!</span>", \
-6
View File
@@ -9,7 +9,6 @@
var/slice_path // for sliceable food. path of the item resulting from the slicing
var/slices_num
var/eatverb
var/wrapped = 0
var/dried_type = null
var/dry = 0
var/cooked_type = null //for microwave cooking. path of the resulting item after microwaving
@@ -65,9 +64,6 @@
M << "<span class='notice'>You don't feel like eating any more junk food at the moment.</span>"
return 0
if(wrapped)
M << "<span class='warning'>You can't eat wrapped food!</span>"
return 0
else if(fullness <= 50)
M << "<span class='notice'>You hungrily [eatverb] some of \the [src] and gobble it down!</span>"
else if(fullness > 50 && fullness < 150)
@@ -81,8 +77,6 @@
return 0
else
if(!isbrain(M)) //If you're feeding it to someone else.
if(wrapped)
return 0
if(fullness <= (600 * (1 + M.overeatduration / 1000)))
M.visible_message("<span class='danger'>[user] attempts to feed [M] [src].</span>", \
"<span class='userdanger'>[user] attempts to feed [M] [src].</span>")
@@ -129,30 +129,14 @@
desc = "Just add water!"
icon_state = "monkeycube"
bitesize = 12
wrapped = 0
list_reagents = list("nutriment" = 2)
filling_color = "#CD853F"
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user)
if(wrapped)
Unwrap(user)
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand()
visible_message("<span class='notice'>[src] expands!</span>")
new /mob/living/carbon/monkey(get_turf(src))
qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user)
icon_state = "monkeycube"
desc = "Just add water!"
user << "<span class='notice'>You unwrap the cube.</span>"
wrapped = 0
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped
desc = "Still wrapped in some paper."
icon_state = "monkeycubewrap"
wrapped = 1
/obj/item/weapon/reagent_containers/food/snacks/enchiladas
name = "enchiladas"
desc = "Viva La Mexico!"
+1 -20
View File
@@ -33,29 +33,10 @@
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
name = "chocolate bar"
desc = "Such, sweet, fattening food."
icon_state = "chocolatebarunwrapped"
wrapped = 0
icon_state = "chocolatebar"
list_reagents = list("nutriment" = 2, "sugar" = 2, "cocoa" = 2)
filling_color = "#A0522D"
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/attack_self(mob/user)
if(wrapped)
Unwrap(user)
else
..()
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/proc/Unwrap(mob/user)
icon_state = "chocolatebarunwrapped"
desc = "It won't make you all sticky."
user << "<span class='notice'>You remove the foil.</span>"
wrapped = 0
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/wrapped
desc = "It's wrapped in some foil."
icon_state = "chocolatebar"
wrapped = 1
/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice
name = "huge mushroom slice"
desc = "A slice from a huge mushroom."
@@ -101,7 +101,7 @@
else if(O.is_open_container())
return
else
..()
. = ..()
updateDialog()
/obj/machinery/food_cart/Topic(href, href_list)
@@ -94,7 +94,7 @@
src.startgibbing(user)
/obj/machinery/gibber/attackby(obj/item/P, mob/user, params)
if (istype(P, /obj/item/weapon/grab))
if(istype(P, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = P
if(!iscarbon(G.affecting))
user << "<span class='danger'>This item is not suitable for the gibber!</span>"
@@ -117,19 +117,22 @@
qdel(G)
update_icon()
if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P))
else if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P))
return
if(exchange_parts(user, P))
else if(exchange_parts(user, P))
return
if(default_pry_open(P))
else if(default_pry_open(P))
return
if(default_unfasten_wrench(user, P))
else if(default_unfasten_wrench(user, P))
return
default_deconstruction_crowbar(P)
else if(default_deconstruction_crowbar(P))
return
else
return ..()
@@ -110,7 +110,7 @@
else if(O.is_open_container())
return
else
..()
return ..()
/obj/machinery/icecream_vat/proc/make(mob/user, make_type, amount)
for(var/R in get_ingredient_list(make_type))
@@ -47,11 +47,12 @@
power_change()
return
default_deconstruction_crowbar(O)
if (src.stat != 0) //NOPOWER etc
if(default_deconstruction_crowbar(O))
return
if (istype(O, /obj/item/weapon/grab))
if(stat) //NOPOWER etc
return
if(istype(O, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
if(!user.Adjacent(G.affecting))
return
@@ -63,7 +64,8 @@
return
else
user << "<span class='danger'>The machine only accepts monkeys!</span>"
return
else
return ..()
/obj/machinery/monkey_recycler/MouseDrop_T(mob/living/target, mob/living/user)
if(!istype(target))
@@ -100,7 +102,7 @@
playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1)
grinded -= required_grind
for(var/i = 0, i < cube_production, i++)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src.loc)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc)
user << "<span class='notice'>The machine's display flashes that it has [grinded] monkeys worth of material left.</span>"
else
user << "<span class='danger'>The machine needs at least [required_grind] monkey(s) worth of material to produce a monkey cube. It only has [grinded].</span>"
@@ -174,7 +174,8 @@
if(default_unfasten_wrench(user, O))
return
default_deconstruction_crowbar(O)
if(default_deconstruction_crowbar(O))
return
var/atom/movable/what = O
if(istype(O, /obj/item/weapon/grab))
@@ -187,15 +188,18 @@
what = G.affecting
var/datum/food_processor_process/P = select_recipe(what)
if (!P)
user << "<span class='warning'>That probably won't blend!</span>"
if(P)
user.visible_message("[user] put [what] into [src].", \
"You put the [what] into [src].")
user.drop_item()
what.loc = src
return 1
user.visible_message("[user] put [what] into [src].", \
"You put the [what] into [src].")
user.drop_item()
what.loc = src
return
else
if(user.a_intent != "harm")
user << "<span class='warning'>That probably won't blend!</span>"
return 1
else
return ..()
/obj/machinery/processor/attack_hand(mob/user)
if (src.stat != 0) //NOPOWER etc
@@ -66,7 +66,9 @@
power_change()
return
default_deconstruction_crowbar(O)
if(default_deconstruction_crowbar(O))
updateUsrDialog()
return
if(stat)
return 0
@@ -81,38 +83,36 @@
updateUsrDialog()
return 1
var/loaded = 0
if(istype(O, /obj/item/weapon/storage/bag))
var/obj/item/weapon/storage/P = O
var/loaded = 0
for(var/obj/G in P.contents)
if(contents.len >= max_n_of_items)
break
if(accept_check(G))
load(G)
loaded++
else
updateUsrDialog()
if(loaded)
if(contents.len >= max_n_of_items)
user.visible_message("[user] loads \the [src] with \the [O].", \
"<span class='notice'>You fill \the [src] with \the [O].</span>")
else
user.visible_message("[user] loads \the [src] with \the [O].", \
"<span class='notice'>You load \the [src] with \the [O].</span>")
if(O.contents.len > 0)
user << "<span class='warning'>Some items are refused.</span>"
else
user << "<span class='warning'>There is nothing in [O] to put in [src]!</span>"
return 0
else if(user.a_intent != "harm")
user << "<span class='warning'>\The [src] smartly refuses [O].</span>"
updateUsrDialog()
return 0
// this is a little backwards but it avoids duplication.
// this code follows storage items and trays only.
if(loaded)
if(contents.len >= max_n_of_items)
user.visible_message("[user] loads \the [src] with \the [O].", \
"<span class='notice'>You fill \the [src] with \the [O].</span>")
else
user.visible_message("[user] loads \the [src] with \the [O].", \
"<span class='notice'>You load \the [src] with \the [O].</span>")
if(O.contents.len > 0)
user << "<span class='warning'>Some items are refused.</span>"
else
user << "<span class='warning'>There is nothing in [O] to put in [src]!</span>"
return 0
updateUsrDialog()
return 1
return ..()
+1
View File
@@ -12,6 +12,7 @@
icon = 'playing_cards.dmi'
icon_state = "deck"
w_class = 2
flags = NOBLUDGEON
var/list/cards = list()
+1 -1
View File
@@ -204,6 +204,6 @@
emergency_shutdown()
..()
/obj/machinery/computer/holodeck/blob_act()
/obj/machinery/computer/holodeck/blob_act(obj/effect/blob/B)
emergency_shutdown()
..()
-4
View File
@@ -155,10 +155,6 @@
user << "<span class='warning'>You are too primitive to use this device!</span>"
return
/obj/machinery/readybutton/New()
..()
/obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
user << "The device is a solid button, there's nothing you can do with it!"
+45 -31
View File
@@ -54,40 +54,63 @@
return
/obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/reagent_containers/glass) && !panel_open)
if(beaker)
user << "<span class='warning'>A container is already loaded into the machine.</span>"
else
user.unEquip(O)
O.loc = src
beaker = O
user << "<span class='notice'>You add the container to the machine.</span>"
updateUsrDialog()
else if(processing)
if(processing)
user << "<span class='warning'>The biogenerator is currently processing.</span>"
return
if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O))
if(beaker)
var/obj/item/weapon/reagent_containers/glass/B = beaker
B.loc = loc
beaker = null
update_icon()
return
if(exchange_parts(user, O))
return
if(default_deconstruction_crowbar(O))
return
if(istype(O, /obj/item/weapon/reagent_containers/glass))
. = 1 //no afterattack
if(!panel_open)
if(beaker)
user << "<span class='warning'>A container is already loaded into the machine.</span>"
else
if(!user.drop_item())
return
O.loc = src
beaker = O
user << "<span class='notice'>You add the container to the machine.</span>"
update_icon()
updateUsrDialog()
else
user << "<span class='warning'>Close the maintenance panel first.</span>"
return
else if(istype(O, /obj/item/weapon/storage/bag/plants))
var/obj/item/weapon/storage/bag/plants/PB = O
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
if(i >= max_items)
user << "<span class='warning'>The biogenerator is already full! Activate it.</span>"
else
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents)
if(i >= max_items)
break
G.loc = src
PB.remove_from_storage(G, src)
i++
if(i<max_items)
user << "<span class='info'>You empty the plant bag into the biogenerator.</span>"
else if(O.contents.len == 0)
else if(PB.contents.len == 0)
user << "<span class='info'>You empty the plant bag into the biogenerator, filling it to its capacity.</span>"
else
user << "<span class='info'>You fill the biogenerator to its capacity.</span>"
return 1 //no afterattack
else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
user << "<span class='warning'>You cannot put this in [src.name]!</span>"
else
else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
@@ -97,21 +120,12 @@
user.unEquip(O)
O.loc = src
user << "<span class='info'>You put [O.name] in [src.name]</span>"
return 1 //no afterattack
if(!processing)
if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O))
if(beaker)
var/obj/item/weapon/reagent_containers/glass/B = beaker
B.loc = loc
beaker = null
if(exchange_parts(user, O))
return
default_deconstruction_crowbar(O)
update_icon()
return
else if(user.a_intent != "harm")
user << "<span class='warning'>You cannot put this in [src.name]!</span>"
else
return ..()
/obj/machinery/biogenerator/interact(mob/user)
if(stat & BROKEN || panel_open)
+28 -6
View File
@@ -15,7 +15,11 @@
var/datum/plant_gene/target
var/operation = ""
var/rating = 0 // TODO: add failures, make it useful
var/rating = 0
var/max_extract_pot = 50
// The cap on potency gene extraction.
// This number is for T1, each upgraded part adds 5% for a tech level above T1.
// At T4, it reaches 95%.
/obj/machinery/plantgenes/New()
..()
@@ -24,7 +28,6 @@
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
RefreshParts()
@@ -32,6 +35,7 @@
rating = 0
for(var/obj/item/weapon/stock_parts/S in component_parts)
rating += S.rating-1
max_extract_pot = initial(max_extract_pot) + rating*5
/obj/machinery/plantgenes/update_icon()
..()
@@ -90,7 +94,7 @@
if(!user)
return
var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600) // Set up the popup browser window
var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600)
if(!( in_range(src, user) || istype(user, /mob/living/silicon) ))
popup.close()
return
@@ -114,16 +118,18 @@
switch(operation)
if("remove")
dat += "<span class='highlight'>[target.get_name()]</span> gene from \the <span class='highlight'>[seed]</span>?<br>"
// dat += "<span class='bad'>Failure may damage or destroy the sample!</span>" // No failures yet. TODO: add failures
if("extract")
dat += "<span class='highlight'>[target.get_name()]</span> gene from \the <span class='highlight'>[seed]</span>?<br>"
dat += "<span class='bad'>The sample will be destroyed in process!</span>"
if(istype(target, /datum/plant_gene/core/potency))
var/datum/plant_gene/core/gene = target
if(gene.value > max_extract_pot)
dat += "<br><br>This device's extraction capabilities are currently limited to [max_extract_pot] potency. "
dat += "Target gene will be degraded to [max_extract_pot] potency on extraction."
if("replace")
dat += "<span class='highlight'>[target.get_name()]</span> gene with <span class='highlight'>[disk.gene.get_name()]</span>?<br>"
// dat += "<span class='bad'>Failure may damage or destroy the sample!</span>" // No failures yet. TODO: add failures
if("insert")
dat += "<span class='highlight'>[disk.gene.get_name()]</span> gene into \the <span class='highlight'>[seed]</span>?<br>"
// dat += "<span class='bad'>Failure may damage or destroy the sample!</span>" // No failures yet. TODO: add failures
dat += "</div><div class='line'><a href='?src=\ref[src];gene=\ref[target];op=[operation]'>Confirm</a> "
dat += "<a href='?src=\ref[src];abort=1'>Abort</a></div>"
popup.set_content(dat)
@@ -274,6 +280,9 @@
if("extract")
if(disk && !disk.read_only)
disk.gene = G
if(istype(G, /datum/plant_gene/core/potency))
var/datum/plant_gene/core/gene = G
gene.value = min(gene.value, max_extract_pot)
disk.update_name()
qdel(seed)
seed = null
@@ -339,6 +348,19 @@
seed.icon_state = "seed-x"
// Gene modder for seed vault ship, built with high-end alien (?) parts.
/obj/machinery/plantgenes/seedvault/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/plantgenes(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module/triphasic(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser/quadultra(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator/femto(src)
RefreshParts()
/*
* Plant DNA disk
*/
+2 -9
View File
@@ -129,15 +129,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(atom/movable/AM)
if(seed)
var/datum/plant_gene/trait/slip/S = seed.get_gene(/datum/plant_gene/trait/slip)
if(S && !ispath(trash, /obj/item/weapon/grown) && iscarbon(AM))
var/mob/living/carbon/M = AM
var/stun = max(seed.potency * S.rate * 2, 1)
var/weaken = max(seed.potency * S.rate, 0.5)
if(M.slip(stun, weaken, src))
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_slip(src, M)
return 1
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_cross(src, AM)
..()
+2 -9
View File
@@ -50,15 +50,8 @@
/obj/item/weapon/grown/Crossed(atom/movable/AM)
if(seed)
var/datum/plant_gene/trait/slip/S = seed.get_gene(/datum/plant_gene/trait/slip)
if(S && iscarbon(AM))
var/mob/living/carbon/M = AM
var/stun = max(seed.potency * S.rate * 2, 1)
var/weaken = max(seed.potency * S.rate, 0.5)
if(M.slip(stun, weaken, src))
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_slip(src, M)
return 1
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_cross(src, AM)
..()
+8 -6
View File
@@ -75,9 +75,10 @@
if(istype(I, /obj/item/weapon/crowbar))
if(anchored==2)
user << "Unscrew the hoses first!"
else if(default_deconstruction_crowbar(I, 1))
return
default_deconstruction_crowbar(I, 1)
..()
else
return ..()
/obj/machinery/hydroponics/proc/FindConnected()
var/list/connected = list()
@@ -801,8 +802,8 @@
for(var/obj/machinery/hydroponics/h in range(1,src))
h.update_icon()
return
else
return ..()
/obj/machinery/hydroponics/attack_hand(mob/user)
if(istype(user, /mob/living/silicon)) //How does AI know what plant is?
@@ -879,7 +880,8 @@
return // Has no lights
/obj/machinery/hydroponics/soil/attackby(obj/item/O, mob/user, params)
..()
if(istype(O, /obj/item/weapon/shovel))
user << "<span class='notice'>You clear up [src]!</span>"
qdel(src)
qdel(src)
else
return ..()
+23 -4
View File
@@ -156,6 +156,8 @@
/datum/plant_gene/trait/proc/on_consume(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
return
/datum/plant_gene/trait/proc/on_cross(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
return
/datum/plant_gene/trait/proc/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
return
/datum/plant_gene/trait/proc/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
@@ -177,11 +179,28 @@
/datum/plant_gene/trait/slip
// Makes plant slippery, unless it has a grown-type trash. Then the trash gets slippery.
// Applies other trait effects (teleporting, etc) to the target by on_slip.
// For code, see grown.dm
name = "Slippery Skin"
rate = 0.1
examine_line = "<span class='info'>It has a very slippery skin.</span>"
/datum/plant_gene/trait/slip/on_cross(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
if(iscarbon(target))
var/obj/item/seeds/seed = G.seed
var/mob/living/carbon/M = target
var/stun_len = seed.potency * rate
if(istype(G) && ispath(G.trash, /obj/item/weapon/grown))
return
if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube")))
stun_len /= 3
var/stun = max(stun_len * 2, 1)
var/weaken = max(stun_len, 0.5)
if(M.slip(stun, weaken, G))
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_slip(src, M)
/datum/plant_gene/trait/cell_charge
// Cell recharging trait. Charges all mob's power cells to (potency*rate)% mark when eaten.
@@ -189,18 +208,18 @@
// Small (potency*rate*5) chance to shock squish or slip target for (potency*rate*5) damage.
// Multiplies max charge by (rate*1000) when used in potato power cells.
name = "Electrical Activity"
rate = 0.01
rate = 0.2
origin_tech = list("powerstorage" = 4)
/datum/plant_gene/trait/cell_charge/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
var/power = G.seed.potency*rate*5
var/power = G.seed.potency*rate
if(prob(power))
C.electrocute_act(round(power), G, 1, 1)
/datum/plant_gene/trait/cell_charge/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
if(iscarbon(target))
var/mob/living/carbon/C = target
var/power = G.seed.potency*rate*5
var/power = G.seed.potency*rate
if(prob(power))
C.electrocute_act(round(power), G, 1, 1)
+25 -32
View File
@@ -1,4 +1,4 @@
/proc/seedify(obj/item/O, t_max, obj/machinery/seed_extractor/extractor)
/proc/seedify(obj/item/O, t_max, obj/machinery/seed_extractor/extractor, mob/living/user)
var/t_amount = 0
if(t_max == -1)
if(extractor)
@@ -6,12 +6,18 @@
else
t_max = rand(1,4)
var/seedloc = O.loc
if(extractor)
seedloc = extractor.loc
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
if(F.seed)
if(user && !user.drop_item()) //couldn't drop the item
return
while(t_amount < t_max)
var/obj/item/seeds/t_prod = F.seed.Copy()
t_prod.loc = O.loc
t_prod.loc = seedloc
t_amount++
qdel(O)
return 1
@@ -19,21 +25,16 @@
else if(istype(O, /obj/item/weapon/grown))
var/obj/item/weapon/grown/F = O
if(F.seed)
if(user && !user.drop_item())
return
while(t_amount < t_max)
var/obj/item/seeds/t_prod = F.seed.Copy()
t_prod.loc = O.loc
t_prod.loc = seedloc
t_amount++
qdel(O)
return 1
/*else if(istype(O, /obj/item/stack/tile/grass))
var/obj/item/stack/tile/grass/S = O
new /obj/item/seeds/grassseed(O.loc)
S.use(1)
return 1*/
else
return 0
return 0
/obj/machinery/seed_extractor
@@ -75,9 +76,7 @@
if(default_unfasten_wrench(user, O))
return
default_deconstruction_crowbar(O)
if(isrobot(user))
if(default_deconstruction_crowbar(O))
return
if (istype(O,/obj/item/weapon/storage/bag/plants))
@@ -87,30 +86,25 @@
if(contents.len >= max_seeds)
break
++loaded
add(G)
add_seed(G)
if (loaded)
user << "<span class='notice'>You put the seeds from \the [O.name] into [src].</span>"
else
user << "<span class='notice'>There are no seeds in \the [O.name].</span>"
return
if(!user.drop_item()) //couldn't drop the item
user << "<span class='warning'>\The [O] is stuck to your hand, you cannot put it in the seed extractor!</span>"
return
if(O && O.loc)
O.loc = src.loc
if(seedify(O,-1))
else if(seedify(O,-1, src, user))
user << "<span class='notice'>You extract some seeds.</span>"
return
else if (istype(O,/obj/item/seeds))
add(O)
user << "<span class='notice'>You add [O] to [src.name].</span>"
updateUsrDialog()
if(add_seed(O))
user << "<span class='notice'>You add [O] to [src.name].</span>"
updateUsrDialog()
return
else
else if(user.a_intent != "harm")
user << "<span class='warning'>You can't extract any seeds from \the [O.name]!</span>"
else
return ..()
/datum/seed_pile
var/name = ""
@@ -187,22 +181,21 @@
src.updateUsrDialog()
return
/obj/machinery/seed_extractor/proc/add(obj/item/seeds/O)
/obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/O)
if(contents.len >= 999)
usr << "<span class='notice'>\The [src] is full.</span>"
return 0
if(istype(O.loc,/mob))
var/mob/M = O.loc
if(!M.unEquip(O))
usr << "<span class='warning'>\the [O] is stuck to your hand, you cannot put it in \the [src]!</span>"
return
if(!M.drop_item())
return 0
else if(istype(O.loc,/obj/item/weapon/storage))
var/obj/item/weapon/storage/S = O.loc
S.remove_from_storage(O,src)
O.loc = src
. = 1
for (var/datum/seed_pile/N in piles)
if (O.plantname == N.name && O.lifespan == N.lifespan && O.endurance == N.endurance && O.maturation == N.maturation && O.production == N.production && O.yield == N.yield && O.potency == N.potency)
++N.amount
+5 -5
View File
@@ -5,7 +5,7 @@
/obj/item/seeds
icon = 'icons/obj/hydroponics/seeds.dmi'
icon_state = "seed" // Unknown plant seed - these shouldn't exist in-game.
w_class = 1 // Pocketable.
w_class = 1
burn_state = FLAMMABLE
var/plantname = "Plants" // Name of plant when planted.
var/product // A type path. The thing that is created when the plant is harvested.
@@ -15,10 +15,10 @@
var/icon_dead // Used to override dead icon (default is "[species]-dead"). You can use one dead icon for multiple closely related plants with it.
var/icon_harvest // Used to override harvest icon (default is "[species]-harvest"). If null, plant will use [icon_grow][growthstages].
var/lifespan = 25 // How long before the plant begins to take damage from age.
var/endurance = 15 // Amount of health the plant has.
var/maturation = 6 // Used to determine which sprite to switch to when growing.
var/production = 6 // Changes the amount of time needed for a plant to become harvestable.
var/lifespan = 25 // How long before the plant begins to take damage from age.
var/endurance = 15 // Amount of health the plant has.
var/maturation = 6 // Used to determine which sprite to switch to when growing.
var/production = 6 // Changes the amount of time needed for a plant to become harvestable.
var/yield = 3 // Amount of growns created per harvest. If is -1, the plant/shroom/weed is never meant to be harvested.
var/oneharvest = 0 // If a plant is cleared from the tray after harvesting, e.g. a carrot.
var/potency = 10 // The 'power' of a plant. Generally effects the amount of reagent in a plant, also used in other ways.
+2 -2
View File
@@ -77,7 +77,7 @@
user << "<span class='notice'>You empty \the [I] into \the [src].</span>"
update_icon()
else if(istype(I, /obj/item/weapon/pen))
var/newname = stripped_input(usr, "What would you like to title this bookshelf?")
var/newname = stripped_input(user, "What would you like to title this bookshelf?")
if(!newname)
return
else
@@ -92,7 +92,7 @@
state = 1
icon_state = "bookempty"
else
..()
return ..()
/obj/structure/bookcase/attack_hand(mob/user)
+4 -2
View File
@@ -305,7 +305,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
user << "[scanner]'s associated machine has been set to [src]."
audible_message("[src] lets out a low, short blip.")
else
..()
return ..()
/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user)
if(density && !emagged)
@@ -457,6 +457,8 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
if(!user.drop_item())
return
O.loc = src
else
return ..()
/obj/machinery/libraryscanner/attack_hand(mob/user)
usr.set_machine(src)
@@ -528,4 +530,4 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
b.icon_state = "book[rand(1,7)]"
qdel(O)
else
..()
return ..()
+1 -3
View File
@@ -27,7 +27,6 @@
*/
#define LIGHTING_CIRCULAR 1 //Comment this out to use old square lighting effects.
#define LIGHTING_LAYER 15 //Drawing layer for lighting
#define LIGHTING_CAP 10 //The lumcount level at which alpha is 0 and we're fully lit.
#define LIGHTING_CAP_FRAC (255/LIGHTING_CAP) //A precal'd variable we'll use in turf/redraw_lighting()
#define LIGHTING_ICON 'icons/effects/alphacolors.dmi'
@@ -236,7 +235,7 @@
/atom/movable/light
icon = LIGHTING_ICON
icon_state = LIGHTING_ICON_STATE
layer = LIGHTING_LAYER
plane = PLANE_LIGHTING
mouse_opacity = 0
blend_mode = BLEND_OVERLAY
invisibility = INVISIBILITY_LIGHTING
@@ -362,7 +361,6 @@
T.init_lighting()
T.update_lumcount(0)
#undef LIGHTING_LAYER
#undef LIGHTING_CIRCULAR
#undef LIGHTING_ICON
#undef LIGHTING_ICON_STATE
+4 -3
View File
@@ -178,7 +178,8 @@
if(locked)
if(istype(W, /obj/item/weapon/card/emag))
boom(user)
if(istype(W, /obj/item/device/multitool))
return
else if(istype(W, /obj/item/device/multitool))
user << "<span class='notice'>DECA-CODE LOCK REPORT:</span>"
if(attempts == 1)
user << "<span class='warning'>* Anti-Tamper Bomb will activate on next failed access attempt.</span>"
@@ -199,8 +200,8 @@
else if(a)
++cows
user << "<span class='notice'>Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>"
else ..()
else ..()
return
return ..()
/obj/structure/closet/crate/secure/loot/togglelock(mob/user)
if(locked)
+20 -20
View File
@@ -93,7 +93,7 @@
if (!powered())
return
if(istype(W,/obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = usr.get_active_hand()
var/obj/item/weapon/card/id/I = user.get_active_hand()
if(istype(I) && !istype(inserted_id))
if(!user.drop_item())
return
@@ -112,12 +112,13 @@
if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
updateUsrDialog()
return
if(panel_open)
if(istype(W, /obj/item/weapon/crowbar))
empty_content()
default_deconstruction_crowbar(W)
return 1
..()
if(default_deconstruction_crowbar(W))
return
return ..()
/obj/machinery/mineral/ore_redemption/deconstruction()
empty_content()
/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(obj/item/weapon/ore/O)
if(O.refined_type)
@@ -252,7 +253,6 @@
new s.type(loc,s.max_amount)
s.use(s.max_amount)
s.loc = loc
s.layer = initial(s.layer)
/obj/machinery/mineral/ore_redemption/power_change()
..()
@@ -289,6 +289,7 @@
new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/weapon/hivelordstabilizer , 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule , 400),
new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer Belt", /obj/item/weapon/storage/belt/mining, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 600),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750),
@@ -407,19 +408,17 @@
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
updateUsrDialog()
return
if(panel_open)
if(istype(I, /obj/item/weapon/crowbar))
default_deconstruction_crowbar(I)
return 1
..()
if(default_deconstruction_crowbar(I))
return
return ..()
/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/weapon/mining_voucher/voucher, mob/redeemer)
var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Two Survival Capsules", "Resonator", "Mining Drone", "Advanced Scanner")
var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Survival Capsule and Explorer Belt", "Resonator", "Mining Drone", "Advanced Scanner")
if(!selection || !Adjacent(redeemer) || qdeleted(voucher) || voucher.loc != redeemer)
return
switch(selection)
if("Two Survival Capsules")
new /obj/item/weapon/survivalcapsule(src.loc)
if("Survival Capsule and Explorer Belt")
new /obj/item/weapon/storage/belt/mining(src.loc)
new /obj/item/weapon/survivalcapsule(src.loc)
if("Resonator")
new /obj/item/weapon/resonator(src.loc)
@@ -799,8 +798,8 @@
icon_state = "door_electronics"
icon = 'icons/obj/module.dmi'
/obj/item/device/mine_bot_ugprade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
if(!istype(M))
/obj/item/device/mine_bot_ugprade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity)
if(!istype(M) || !proximity)
return
upgrade_bot(M, user)
@@ -994,7 +993,8 @@
var/client/C = user.client
for(var/turf/closed/mineral/M in minerals)
var/turf/F = get_turf(M)
var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = 18)
var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state)
I.plane = PLANE_EFFECTS_UNLIT
C.images += I
spawn(30)
if(C)
@@ -1012,7 +1012,7 @@
C.icon_state = M.scan_state
/obj/effect/overlay/temp/mining_overlay
layer = 20
plane = PLANE_EFFECTS_UNLIT
icon = 'icons/turf/smoothrocks.dmi'
anchored = 1
mouse_opacity = 0
@@ -61,7 +61,8 @@
/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card/id))
return attack_hand(user)
..()
else
return ..()
/obj/machinery/mineral/labor_claim_console/emag_act(mob/user)
if(!emagged)
@@ -169,5 +170,5 @@
user << "<span class='notice'>Collect points by bringing smelted minerals to the Labor Shuttle stacking machine. Reach your quota to earn your release.</span>"
else
user << "<span class='warning'>Error: Invalid ID</span>"
return
..()
else
return ..()
@@ -38,7 +38,7 @@
if(11)
new /obj/vehicle/lavaboat/dragon(src)
if(12)
new /obj/item/upgradescroll(src)
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker(src)
if(13)
new /obj/item/weapon/sord(src)
if(14)
@@ -68,6 +68,7 @@
new /obj/item/weapon/spellbook/oneuse/smoke(src)
//Spooky special loot
/obj/item/device/wisp_lantern
@@ -368,14 +369,14 @@
result = /obj/item/weapon/oar
reqs = list(/obj/item/stack/sheet/bone = 2)
time = 15
category = CAT_MISC
category = CAT_PRIMAL
/datum/table_recipe/boat
name = "goliath hide boat"
result = /obj/vehicle/lavaboat
reqs = list(/obj/item/asteroid/goliath_hide = 3)
reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3)
time = 50
category = CAT_MISC
category = CAT_PRIMAL
//Dragon Boat
+115 -49
View File
@@ -36,6 +36,8 @@
/obj/structure/closet/secure_closet/miner/New()
..()
new /obj/item/stack/sheet/mineral/sandbags(src, 5)
new /obj/item/weapon/storage/box/emptysandbags(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/device/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/weapon/storage/bag/ore(src)
@@ -161,6 +163,24 @@
throwforce = 7
w_class = 2
/obj/item/weapon/emptysandbag
name = "empty sandbag"
desc = "A bag to be filled with sand."
icon = 'icons/obj/items.dmi'
icon_state = "sandbag"
w_class = 1
/obj/item/weapon/emptysandbag/attackby(obj/item/W, mob/user, params)
if(istype(W,/obj/item/weapon/ore/glass))
user << "<span class='notice'>You fill the sandbag.</span>"
var/obj/item/stack/sheet/mineral/sandbags/I = new /obj/item/stack/sheet/mineral/sandbags
user.unEquip(src)
user.put_in_hands(I)
qdel(W)
qdel(src)
return
else
return ..()
/**********************Mining car (Crate like thing, not the rail car)**************************/
@@ -219,7 +239,7 @@
var/turf/cur_turf
var/x_size = 5
var/y_size = 5
var/list/walltypes = list(/turf/closed/wall/shuttle/survival_pod)
var/list/walltypes = list(/turf/closed/wall/shuttle/survival/pod)
var/floor_type = /turf/open/floor/pod
var/room
@@ -312,11 +332,75 @@
//Pod turfs and objects
//Floor
//Floors
/turf/open/floor/pod
name = "pod floor"
icon_state = "podfloor"
icon_regular_floor = "podfloor"
floor_tile = /obj/item/stack/tile/pod
/turf/open/floor/pod/light
icon_state = "podfloor_light"
icon_regular_floor = "podfloor_light"
floor_tile = /obj/item/stack/tile/pod/light
/turf/open/floor/pod/dark
icon_state = "podfloor_dark"
icon_regular_floor = "podfloor_dark"
floor_tile = /obj/item/stack/tile/pod/dark
//Walls
/turf/closed/wall/shuttle/survival
name = "pod wall"
desc = "An easily-compressable wall used for temporary shelter."
icon = 'icons/turf/walls/survival_pod_walls.dmi'
icon_state = "smooth"
walltype = "shuttle"
smooth = SMOOTH_MORE|SMOOTH_DIAGONAL
canSmoothWith = list(/turf/closed/wall/shuttle/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod, /obj/structure/shuttle/engine)
/turf/closed/wall/shuttle/survival/nodiagonal
smooth = SMOOTH_MORE
/turf/closed/wall/shuttle/survival/pod
canSmoothWith = list(/turf/closed/wall/shuttle/survival, /obj/machinery/door/airlock, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/shuttle, /obj/structure/shuttle/engine)
//Window
/obj/structure/window/shuttle/survival_pod
name = "pod window"
icon = 'icons/obj/smooth_structures/pod_window.dmi'
icon_state = "smooth"
smooth = SMOOTH_MORE
canSmoothWith = list(/turf/closed/wall/shuttle/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
//Door
/obj/machinery/door/airlock/survival_pod
name = "airlock"
icon = 'icons/obj/doors/airlocks/survival/horizontal/survival.dmi'
overlays_file = 'icons/obj/doors/airlocks/survival/horizontal/survival_overlays.dmi'
doortype = /obj/structure/door_assembly/door_assembly_pod
opacity = 0
glass = 1
/obj/machinery/door/airlock/survival_pod/vertical
icon = 'icons/obj/doors/airlocks/survival/vertical/survival.dmi'
overlays_file = 'icons/obj/doors/airlocks/survival/vertical/survival_overlays.dmi'
doortype = /obj/structure/door_assembly/door_assembly_pod/vertical
/obj/structure/door_assembly/door_assembly_pod
name = "pod airlock assembly"
icon = 'icons/obj/doors/airlocks/survival/horizontal/survival.dmi'
overlays_file = 'icons/obj/doors/airlocks/survival/horizontal/survival_overlays.dmi'
airlock_type = /obj/machinery/door/airlock/survival_pod
anchored = 1
state = 1
mineral = "glass"
material = "glass"
/obj/structure/door_assembly/door_assembly_pod/vertical
icon = 'icons/obj/doors/airlocks/survival/vertical/survival.dmi'
overlays_file = 'icons/obj/doors/airlocks/survival/vertical/survival_overlays.dmi'
airlock_type = /obj/machinery/door/airlock/survival_pod/vertical
//Table
/obj/structure/table/survival_pod
@@ -324,34 +408,6 @@
icon_state = "table"
smooth = SMOOTH_FALSE
/obj/structure/fans
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "fans"
name = "environmental regulation system"
desc = "A large machine releasing a constant gust of air."
anchored = 1
density = 1
var/arbitraryatmosblockingvar = TRUE
/obj/structure/fans/tiny
name = "tiny fan"
desc = "A tiny fan, releasing a thin gust of air."
layer = TURF_LAYER + 0.8
density = 0
icon_state = "fan_tiny"
/obj/structure/fans/New(loc)
..()
air_update_turf(1)
/obj/structure/fans/Destroy()
arbitraryatmosblockingvar = FALSE
air_update_turf(1)
return ..()
/obj/structure/fans/CanAtmosPass(turf/T)
return !arbitraryatmosblockingvar
//Sleeper
/obj/machinery/sleeper/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
@@ -409,19 +465,36 @@
var/obj/item/device/instrument/guitar/G = new(src)
load(G)
//Walls
//Fans
/obj/structure/fans
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "fans"
name = "environmental regulation system"
desc = "A large machine releasing a constant gust of air."
anchored = 1
density = 1
var/arbitraryatmosblockingvar = TRUE
/turf/closed/wall/shuttle/survival_pod
name = "wall"
desc = "An easily-compressable wall used for temporary shelter."
icon = 'icons/turf/walls/survival_pod_walls.dmi'
icon_state = "smooth"
walltype = "shuttle"
smooth = SMOOTH_MORE|SMOOTH_DIAGONAL
canSmoothWith = list(/turf/closed/wall/shuttle/survival_pod, /obj/machinery/door/airlock, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/shuttle)
/obj/structure/fans/tiny
name = "tiny fan"
desc = "A tiny fan, releasing a thin gust of air."
layer = TURF_LAYER + 0.8
density = 0
icon_state = "fan_tiny"
/obj/structure/fans/New(loc)
..()
air_update_turf(1)
/obj/structure/fans/Destroy()
arbitraryatmosblockingvar = FALSE
air_update_turf(1)
return ..()
/obj/structure/fans/CanAtmosPass(turf/T)
return !arbitraryatmosblockingvar
//Signs
/obj/structure/sign/mining
name = "nanotrasen mining corps sign"
desc = "A sign of relief for weary miners, and a warning for would be competitors to Nanotrasen's mining claims."
@@ -434,15 +507,7 @@
icon = 'icons/turf/walls/survival_pod_walls.dmi'
icon_state = "survival"
//Door
/obj/machinery/door/airlock/survival_pod
name = "airlock"
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
opacity = 0
glass = 1
//Fluff
/obj/structure/tubes
icon_state = "tubes"
icon = 'icons/obj/lavaland/survival_pod.dmi'
@@ -450,3 +515,4 @@
anchored = 1
layer = MOB_LAYER - 0.2
density = 0
+2 -2
View File
@@ -212,8 +212,8 @@
var/turf/T = get_step(src,output_dir)
if(T)
var/obj/item/O = new P(src)
var/obj/item/weapon/moneybag/M = locate(/obj/item/weapon/moneybag, T)
var/obj/item/weapon/storage/bag/money/M = locate(/obj/item/weapon/storage/bag/money, T)
if(!M)
M = new /obj/item/weapon/moneybag(src)
M = new /obj/item/weapon/storage/bag/money(src)
unload_mineral(M)
O.loc = M
+8 -100
View File
@@ -1,112 +1,20 @@
/*****************************Money bag********************************/
/obj/item/weapon/moneybag
icon = 'icons/obj/storage.dmi'
name = "Money bag"
/obj/item/weapon/storage/bag/money
name = "money bag"
icon_state = "moneybag"
flags = CONDUCT
force = 10
throwforce = 0
w_class = 4
burn_state = FLAMMABLE
burntime = 20
/obj/item/weapon/moneybag/attack_hand(mob/user)
var/amt_gold = 0
var/amt_silver = 0
var/amt_diamond = 0
var/amt_iron = 0
var/amt_plasma = 0
var/amt_uranium = 0
var/amt_clown = 0
var/amt_adamantine = 0
for (var/obj/item/weapon/coin/C in contents)
if (istype(C,/obj/item/weapon/coin/diamond))
amt_diamond++;
if (istype(C,/obj/item/weapon/coin/plasma))
amt_plasma++;
if (istype(C,/obj/item/weapon/coin/iron))
amt_iron++;
if (istype(C,/obj/item/weapon/coin/silver))
amt_silver++;
if (istype(C,/obj/item/weapon/coin/gold))
amt_gold++;
if (istype(C,/obj/item/weapon/coin/uranium))
amt_uranium++;
if (istype(C,/obj/item/weapon/coin/clown))
amt_clown++;
if (istype(C,/obj/item/weapon/coin/adamantine))
amt_adamantine++;
var/dat = text("<b>The contents of the moneybag reveal...</b><br>")
if (amt_gold)
dat += text("Gold coins: [amt_gold] <A href='?src=\ref[src];remove=gold'>Remove one</A><br>")
if (amt_silver)
dat += text("Silver coins: [amt_silver] <A href='?src=\ref[src];remove=silver'>Remove one</A><br>")
if (amt_iron)
dat += text("Metal coins: [amt_iron] <A href='?src=\ref[src];remove=iron'>Remove one</A><br>")
if (amt_diamond)
dat += text("Diamond coins: [amt_diamond] <A href='?src=\ref[src];remove=diamond'>Remove one</A><br>")
if (amt_plasma)
dat += text("Plasma coins: [amt_plasma] <A href='?src=\ref[src];remove=plasma'>Remove one</A><br>")
if (amt_uranium)
dat += text("Uranium coins: [amt_uranium] <A href='?src=\ref[src];remove=uranium'>Remove one</A><br>")
if (amt_clown)
dat += text("Bananium coins: [amt_clown] <A href='?src=\ref[src];remove=clown'>Remove one</A><br>")
if (amt_adamantine)
dat += text("Adamantine coins: [amt_adamantine] <A href='?src=\ref[src];remove=adamantine'>Remove one</A><br>")
user << browse("[dat]", "window=moneybag")
/obj/item/weapon/moneybag/attackby(obj/item/weapon/W, mob/user, params)
..()
if (istype(W, /obj/item/weapon/coin))
var/obj/item/weapon/coin/C = W
if(!user.drop_item())
return
user << "<span class='notice'>You add the [C.name] into the bag.</span>"
contents += C
if (istype(W, /obj/item/weapon/moneybag))
var/obj/item/weapon/moneybag/C = W
for (var/obj/O in C.contents)
contents += O;
user << "<span class='notice'>You empty the [C.name] into the bag.</span>"
return
/obj/item/weapon/moneybag/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["remove"])
var/obj/item/weapon/coin/COIN
switch(href_list["remove"])
if("gold")
COIN = locate(/obj/item/weapon/coin/gold,src.contents)
if("silver")
COIN = locate(/obj/item/weapon/coin/silver,src.contents)
if("iron")
COIN = locate(/obj/item/weapon/coin/iron,src.contents)
if("diamond")
COIN = locate(/obj/item/weapon/coin/diamond,src.contents)
if("plasma")
COIN = locate(/obj/item/weapon/coin/plasma,src.contents)
if("uranium")
COIN = locate(/obj/item/weapon/coin/uranium,src.contents)
if("clown")
COIN = locate(/obj/item/weapon/coin/clown,src.contents)
if("adamantine")
COIN = locate(/obj/item/weapon/coin/adamantine,src.contents)
if(!COIN)
return
COIN.loc = src.loc
return
w_class = 4
max_w_class = 3
storage_slots = 80
max_combined_w_class = 40
can_hold = list(/obj/item/weapon/coin, /obj/item/stack/spacecash)
/obj/item/weapon/moneybag/vault
/obj/item/weapon/moneybag/vault/New()
/obj/item/weapon/storage/bag/money/vault/New()
..()
new /obj/item/weapon/coin/silver(src)
new /obj/item/weapon/coin/silver(src)
+5 -4
View File
@@ -9,17 +9,17 @@
density = 1
pressure_resistance = 5*ONE_ATMOSPHERE
/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
/obj/structure/ore_box/attackby(obj/item/weapon/W, mob/user, params)
if (istype(W, /obj/item/weapon/ore))
if(!user.drop_item())
return
W.loc = src
if (istype(W, /obj/item/weapon/storage))
else if (istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
for(var/obj/item/weapon/ore/O in S.contents)
S.remove_from_storage(O, src) //This will move the item to this item's contents
user << "<span class='notice'>You empty the ore in [S] into \the [src].</span>"
if(istype(W, /obj/item/weapon/crowbar))
else if(istype(W, /obj/item/weapon/crowbar))
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
var/obj/item/weapon/crowbar/C = W
var/time = 50
@@ -30,7 +30,8 @@
var/obj/item/stack/sheet/mineral/wood/wo = new (loc, 4)
wo.add_fingerprint(user)
deconstruct()
return
else
return ..()
/obj/structure/ore_box/attack_hand(mob/user)
if(Adjacent(user))
+2 -2
View File
@@ -577,7 +577,7 @@
if(istype(D,/obj/machinery/door/airlock))
var/obj/machinery/door/airlock/AL = D
if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through
AL.p_open = 1
AL.panel_open = 1
AL.update_icon()
AL.shock(src,(100 - smartness)/2)
sleep(5)
@@ -589,7 +589,7 @@
if(!AL.wires.is_cut(WIRE_POWER2))
AL.wires.cut(WIRE_POWER2)
sleep(5)
AL.p_open = 0
AL.panel_open = 0
AL.update_icon()
D.open()
-5
View File
@@ -29,7 +29,6 @@
if(!l_hand)
W.loc = src //TODO: move to equipped?
l_hand = W
W.layer = 20 //TODO: move to equipped?
W.equipped(src,slot_l_hand)
if(pulling == W)
stop_pulling()
@@ -47,7 +46,6 @@
if(!r_hand)
W.loc = src
r_hand = W
W.layer = 20
W.equipped(src,slot_r_hand)
if(pulling == W)
stop_pulling()
@@ -92,7 +90,6 @@
return 1
else
W.loc = get_turf(src)
W.layer = initial(W.layer)
W.dropped(src)
return 0
@@ -154,8 +151,6 @@
client.screen -= I
I.loc = loc
I.dropped(src)
if(I)
I.layer = initial(I.layer)
return 1
@@ -137,14 +137,6 @@
if(statpanel("Status"))
stat(null, "Intent: [a_intent]")
/mob/living/carbon/alien/Stun(amount)
if(status_flags & CANSTUN)
stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
else
// add some movement delay
move_delay_add = min(move_delay_add + round(amount / 2), 10) // a maximum delay of 10
return
/mob/living/carbon/alien/getTrail()
if(getBruteLoss() < 200)
return pick (list("xltrails_1", "xltrails2"))
@@ -0,0 +1,14 @@
//Here are the procs used to modify status effects of a mob.
//The effects include: stunned, weakened, paralysis, sleeping, resting, jitteriness, dizziness, ear damage,
// eye damage, eye_blind, eye_blurry, druggy, BLIND disability, and NEARSIGHT disability.
/////////////////////////////////// STUNNED ////////////////////////////////////
/mob/living/carbon/alien/Stun(amount, updating = 1, ignore_canstun = 0)
if(status_flags & CANSTUN || ignore_canstun)
stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
if(updating)
update_canmove()
else
// add some movement delay
move_delay_add = min(move_delay_add + round(amount / 2), 10) // a maximum delay of 10
@@ -38,7 +38,7 @@
/mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
return
/mob/living/carbon/brain/blob_act()
/mob/living/carbon/brain/blob_act(obj/effect/blob/B)
return
/mob/living/carbon/brain/UnarmedAttack(atom/A)//Stops runtimes due to attack_animal being the default
@@ -54,33 +54,6 @@
/mob/living/carbon/brain/handle_disabilities()
return
/mob/living/carbon/brain/setEarDamage() // no ears to damage or heal
return
/mob/living/carbon/brain/adjustEarDamage()
return
/mob/living/carbon/brain/blind_eyes() // no eyes to damage or heal
return
/mob/living/carbon/brain/blur_eyes()
return
/mob/living/carbon/brain/adjust_blindness()
return
/mob/living/carbon/brain/adjust_blurriness()
return
/mob/living/carbon/brain/set_blindness()
return
/mob/living/carbon/brain/set_blurriness()
return
/mob/living/carbon/brain/become_blind()
return
/mob/living/carbon/brain/handle_changeling()
return
@@ -0,0 +1,38 @@
//Here are the procs used to modify status effects of a mob.
//The effects include: stunned, weakened, paralysis, sleeping, resting, jitteriness, dizziness, ear damage,
// eye damage, eye_blind, eye_blurry, druggy, BLIND disability, and NEARSIGHT disability.
/////////////////////////////////// EAR DAMAGE ////////////////////////////////////
/mob/living/carbon/brain/adjustEarDamage()
return
/mob/living/carbon/brain/setEarDamage() // no ears to damage or heal
return
/////////////////////////////////// EYE_BLIND ////////////////////////////////////
/mob/living/carbon/brain/blind_eyes() // no eyes to damage or heal
return
/mob/living/carbon/brain/adjust_blindness()
return
/mob/living/carbon/brain/set_blindness()
return
/////////////////////////////////// EYE_BLURRY ////////////////////////////////////
/mob/living/carbon/brain/blur_eyes()
return
/mob/living/carbon/brain/adjust_blurriness()
return
/mob/living/carbon/brain/set_blurriness()
return
/////////////////////////////////// BLIND DISABILITY ////////////////////////////////////
/mob/living/carbon/brain/become_blind()
return
+1 -1
View File
@@ -341,7 +341,7 @@
/mob/living/carbon/is_muzzled()
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
/mob/living/carbon/blob_act()
/mob/living/carbon/blob_act(obj/effect/blob/B)
if (stat == DEAD)
return
else
@@ -24,7 +24,7 @@
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return 1
..()
return ..()
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
@@ -3,10 +3,6 @@
if(legcuffed)
. += legcuffed.slowdown
var/obj/item/organ/internal/cyberimp/chest/thrusters/J = getorganslot("thrusters")
if(istype(J) && J.on)
. -= 2
var/const/NO_SLIP_WHEN_WALKING = 1
var/const/SLIDE = 2
@@ -153,7 +153,7 @@
..()
/mob/living/carbon/human/blob_act()
/mob/living/carbon/human/blob_act(obj/effect/blob/B)
if(stat == DEAD)
return
show_message("<span class='userdanger'>The blob attacks you!</span>")
@@ -12,6 +12,3 @@
if(..()) //to allow surgery to return properly.
return
dna.species.spec_attack_hand(M, src)
/mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params)
return
@@ -106,7 +106,7 @@
feedback_add_details("zone_targeted","[target_area]")
// the attacked_by code varies among species
return dna.species.spec_attacked_by(I,user,def_zone,affecting,hit_area,src.a_intent,target_limb,target_area,src)
return dna.species.spec_attacked_by(I, user, def_zone, affecting, hit_area, a_intent, target_limb, target_area, src)
/mob/living/carbon/human/emp_act(severity)
var/informed = 0
@@ -315,6 +315,7 @@
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == "harm")
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
var/obj/item/organ/limb/temp = get_organ(pick("chest", "chest", "chest", "head"))
@@ -71,7 +71,7 @@
var/safe_co2_min = 0
var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
var/safe_toxins_min = 0
var/safe_toxins_max = 0.005
var/safe_toxins_max = 0.05
var/SA_para_min = 1 //Sleeping agent
var/SA_sleep_min = 5 //Sleeping agent
@@ -795,6 +795,11 @@
if(istype(J) && J.allow_thrust(0.01, H))
. -= 2
else
var/obj/item/organ/internal/cyberimp/chest/thrusters/T = H.getorganslot("thrusters")
if(istype(T) && T.allow_thrust(0.01, H))
. -= 2
else
var/health_deficiency = (100 - H.health + H.staminaloss)
if(health_deficiency >= 40)
@@ -953,14 +958,10 @@
if(H.check_shields(I.force, "the [I.name]", I, MELEE_ATTACK, I.armour_penetration))
return 0
if(I.attack_verb && I.attack_verb.len)
H.visible_message("<span class='danger'>[user] has [pick(I.attack_verb)] [H] in the [hit_area] with [I]!</span>", \
"<span class='userdanger'>[user] has [pick(I.attack_verb)] [H] in the [hit_area] with [I]!</span>")
else if(I.force)
H.visible_message("<span class='danger'>[user] has attacked [H] in the [hit_area] with [I]!</span>", \
"<span class='userdanger'>[user] has attacked [H] in the [hit_area] with [I]!</span>")
else
return 0
H.send_item_attack_message(I, user, hit_area)
if(!I.force)
return 0 //item force is zero
var/armor_block = H.run_armor_check(affecting, "melee", "<span class='notice'>Your armor has protected your [hit_area].</span>", "<span class='notice'>Your armor has softened a hit to your [hit_area].</span>",I.armour_penetration)
armor_block = min(90,armor_block) //cap damage reduction at 90%
@@ -32,7 +32,6 @@
I.screen_loc = null // will get moved if inventory is visible
I.loc = src
I.equipped(src, slot)
I.layer = 20
switch(slot)
if(slot_back)
@@ -0,0 +1,79 @@
//Here are the procs used to modify status effects of a mob.
//The effects include: stunned, weakened, paralysis, sleeping, resting, jitteriness, dizziness, ear damage,
// eye damage, eye_blind, eye_blurry, druggy, BLIND disability, and NEARSIGHT disability.
/mob/living/carbon/damage_eyes(amount)
if(amount>0)
eye_damage = amount
if(eye_damage > 20)
if(eye_damage > 30)
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2)
else
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
/mob/living/carbon/set_eye_damage(amount)
eye_damage = max(amount,0)
if(eye_damage > 20)
if(eye_damage > 30)
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2)
else
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
else
clear_fullscreen("eye_damage")
/mob/living/carbon/adjust_eye_damage(amount)
eye_damage = max(eye_damage+amount, 0)
if(eye_damage > 20)
if(eye_damage > 30)
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2)
else
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
else
clear_fullscreen("eye_damage")
/mob/living/carbon/adjust_drugginess(amount)
var/old_druggy = druggy
if(amount>0)
druggy += amount
if(!old_druggy)
overlay_fullscreen("high", /obj/screen/fullscreen/high)
throw_alert("high", /obj/screen/alert/high)
else if(old_druggy)
druggy = max(druggy+amount, 0)
if(!druggy)
clear_fullscreen("high")
clear_alert("high")
/mob/living/carbon/set_drugginess(amount)
var/old_druggy = druggy
druggy = amount
if(amount>0)
if(!old_druggy)
overlay_fullscreen("high", /obj/screen/fullscreen/high)
throw_alert("high", /obj/screen/alert/high)
else if(old_druggy)
clear_fullscreen("high")
clear_alert("high")
/mob/living/carbon/cure_blind()
if(disabilities & BLIND)
disabilities &= ~BLIND
adjust_blindness(-1)
return 1
/mob/living/carbon/become_blind()
if(!(disabilities & BLIND))
disabilities |= BLIND
blind_eyes(1)
return 1
/mob/living/carbon/cure_nearsighted()
if(disabilities & NEARSIGHT)
disabilities &= ~NEARSIGHT
clear_fullscreen("nearsighted")
return 1
/mob/living/carbon/become_nearsighted()
if(!(disabilities & NEARSIGHT))
disabilities |= NEARSIGHT
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
return 1
+2 -1
View File
@@ -49,7 +49,8 @@
paralysis = 0
stunned = 0
weakened = 0
sleeping = 0
set_drugginess(0)
SetSleeping(0, 0)
blind_eyes(1)
reset_perspective(null)
hide_fullscreens()
+2 -2
View File
@@ -86,9 +86,9 @@
if(paralysis)
AdjustParalysis(-1)
if(stunned)
AdjustStunned(-1)
AdjustStunned(-1, 1, 1)
if(weakened)
AdjustWeakened(-1, ignore_canweaken=1)
AdjustWeakened(-1, 1, 1)
/mob/living/proc/handle_disabilities()
//Eyes
+1 -183
View File
@@ -429,18 +429,6 @@ Sorry Giacom. Please don't be mad :(
var/obj/item/organ/limb/def_zone = ran_zone(t)
return def_zone
//damage/heal the mob ears and adjust the deaf amount
/mob/living/adjustEarDamage(damage, deaf)
ear_damage = max(0, ear_damage + damage)
ear_deaf = max(0, ear_deaf + deaf)
//pass a negative argument to skip one of the variable
/mob/living/setEarDamage(damage, deaf)
if(damage >= 0)
ear_damage = damage
if(deaf >= 0)
ear_deaf = deaf
// heal ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/heal_organ_damage(brute, burn, updating_health=1)
adjustBruteLoss(-brute, updating_health)
@@ -845,6 +833,7 @@ Sorry Giacom. Please don't be mad :(
I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 1)
else // Attacked with a fist?
return
I.plane = PLANE_EFFECTS_UNLIT
// Who can see the attack?
var/list/viewing = list()
@@ -998,174 +987,3 @@ Sorry Giacom. Please don't be mad :(
/mob/proc/update_sight()
return
/mob/proc/blind_eyes(amount)
if(amount>0)
var/old_eye_blind = eye_blind
eye_blind = max(eye_blind, amount)
if(!old_eye_blind)
throw_alert("blind", /obj/screen/alert/blind)
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
/mob/proc/adjust_blindness(amount)
if(amount>0)
var/old_eye_blind = eye_blind
eye_blind += amount
if(!old_eye_blind)
throw_alert("blind", /obj/screen/alert/blind)
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
else if(eye_blind)
var/blind_minimum = 0
if(stat != CONSCIOUS || (disabilities & BLIND))
blind_minimum = 1
eye_blind = max(eye_blind+amount, blind_minimum)
if(!eye_blind)
clear_alert("blind")
clear_fullscreen("blind")
/mob/proc/set_blindness(amount)
if(amount>0)
var/old_eye_blind = eye_blind
eye_blind = amount
if(client && !old_eye_blind)
throw_alert("blind", /obj/screen/alert/blind)
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
else if(eye_blind)
var/blind_minimum = 0
if(stat != CONSCIOUS || (disabilities & BLIND))
blind_minimum = 1
eye_blind = blind_minimum
if(!eye_blind)
clear_alert("blind")
clear_fullscreen("blind")
/mob/proc/blur_eyes(amount)
if(amount>0)
var/old_eye_blurry = eye_blurry
eye_blurry = max(amount, eye_blurry)
if(!old_eye_blurry)
overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry)
/mob/proc/adjust_blurriness(amount)
var/old_eye_blurry = eye_blurry
eye_blurry = max(eye_blurry+amount, 0)
if(amount>0)
if(!old_eye_blurry)
overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry)
else if(old_eye_blurry && !eye_blurry)
clear_fullscreen("blurry")
/mob/proc/set_blurriness(amount)
var/old_eye_blurry = eye_blurry
eye_blurry = max(amount, 0)
if(amount>0)
if(!old_eye_blurry)
overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry)
else if(old_eye_blurry)
clear_fullscreen("blurry")
/mob/proc/damage_eyes(amount)
return
/mob/living/carbon/damage_eyes(amount)
if(amount>0)
eye_damage = amount
if(eye_damage > 20)
if(eye_damage > 30)
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2)
else
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
/mob/proc/set_eye_damage(amount)
return
/mob/living/carbon/set_eye_damage(amount)
eye_damage = max(amount,0)
if(eye_damage > 20)
if(eye_damage > 30)
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2)
else
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
else
clear_fullscreen("eye_damage")
/mob/proc/adjust_eye_damage(amount)
return
/mob/living/carbon/adjust_eye_damage(amount)
eye_damage = max(eye_damage+amount, 0)
if(eye_damage > 20)
if(eye_damage > 30)
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2)
else
overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1)
else
clear_fullscreen("eye_damage")
/mob/proc/adjust_drugginess(amount)
return
/mob/living/carbon/adjust_drugginess(amount)
var/old_druggy = druggy
if(amount>0)
druggy += amount
if(!old_druggy)
overlay_fullscreen("high", /obj/screen/fullscreen/high)
throw_alert("high", /obj/screen/alert/high)
else if(old_druggy)
druggy = max(druggy+amount, 0)
if(!druggy)
clear_fullscreen("high")
clear_alert("high")
/mob/proc/set_drugginess(amount)
return
/mob/living/carbon/set_drugginess(amount)
var/old_druggy = druggy
druggy = amount
if(amount>0)
if(!old_druggy)
overlay_fullscreen("high", /obj/screen/fullscreen/high)
throw_alert("high", /obj/screen/alert/high)
else if(old_druggy)
clear_fullscreen("high")
clear_alert("high")
/mob/proc/cure_blind() //when we want to cure the BLIND disability only.
return
/mob/living/carbon/cure_blind()
if(disabilities & BLIND)
disabilities &= ~BLIND
adjust_blindness(-1)
return 1
/mob/proc/cure_nearsighted()
return
/mob/living/carbon/cure_nearsighted()
if(disabilities & NEARSIGHT)
disabilities &= ~NEARSIGHT
clear_fullscreen("nearsighted")
return 1
/mob/proc/become_nearsighted()
return
/mob/living/carbon/become_nearsighted()
if(!(disabilities & NEARSIGHT))
disabilities |= NEARSIGHT
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
return 1
/mob/proc/become_blind()
return
/mob/living/carbon/become_blind()
if(!(disabilities & BLIND))
disabilities |= BLIND
blind_eyes(1)
return 1
+1 -2
View File
@@ -78,6 +78,7 @@
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == "harm")
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
switch(M.damtype)
@@ -101,8 +102,6 @@
add_logs(M.occupant, src, "pushed", M)
visible_message("<span class='warning'>[M] pushes [src] out of the way.</span>")
return
//Mobs on Fire
/mob/living/proc/IgniteMob()
+1 -1
View File
@@ -350,7 +350,7 @@ var/list/ai_list = list()
SSshuttle.cancelEvac(src)
return
/mob/living/silicon/ai/blob_act()
/mob/living/silicon/ai/blob_act(obj/effect/blob/B)
if (stat != DEAD)
adjustBruteLoss(60)
updatehealth()
+1 -1
View File
@@ -92,7 +92,7 @@
else
stat(null, text("Systems nonfunctional"))
/mob/living/silicon/pai/blob_act()
/mob/living/silicon/pai/blob_act(obj/effect/blob/B)
return 0
/mob/living/silicon/pai/restrained()
@@ -48,7 +48,7 @@
if(!module_state_1)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_1 = O
O.layer = 20
O.plane = PLANE_UI_OBJECTS
O.screen_loc = inv1.screen_loc
contents += O
if(istype(module_state_1,/obj/item/borg/sight))
@@ -58,7 +58,7 @@
else if(!module_state_2)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_2 = O
O.layer = 20
O.plane = PLANE_UI_OBJECTS
O.screen_loc = inv2.screen_loc
contents += O
if(istype(module_state_2,/obj/item/borg/sight))
@@ -68,7 +68,7 @@
else if(!module_state_3)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_3 = O
O.layer = 20
O.plane = PLANE_UI_OBJECTS
O.screen_loc = inv3.screen_loc
contents += O
if(istype(module_state_3,/obj/item/borg/sight))
@@ -198,25 +198,25 @@
//cycle_modules() - Cycles through the list of selected modules.
/mob/living/silicon/robot/proc/cycle_modules()
var/slot_start = get_selected_module()
if(slot_start) deselect_module(slot_start) //Only deselect if we have a selected slot.
if(slot_start)
deselect_module(slot_start) //Only deselect if we have a selected slot.
var/slot_num
if(slot_start == 0)
slot_num = 1
slot_start = 2
slot_start = 4
else
slot_num = slot_start + 1
while(slot_start != slot_num) //If we wrap around without finding any free slots, just give up.
while(slot_num != slot_start) //If we wrap around without finding any free slots, just give up.
if(module_active(slot_num))
select_module(slot_num)
return
slot_num++
if(slot_num > 3) slot_num = 1 //Wrap around.
if(slot_num > 4) // not >3 otherwise cycling with just one item on module 3 wouldn't work
slot_num = 1 //Wrap around.
return
/mob/living/silicon/robot/swap_hand()
cycle_modules()
return
@@ -84,7 +84,6 @@
robot_modules_background = new()
robot_modules_background.icon_state = "block"
robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it.
ident = rand(1, 999)
update_icons()
@@ -353,7 +352,7 @@
if(thruster_button)
thruster_button.icon_state = "ionpulse[ionpulse_on]"
/mob/living/silicon/robot/blob_act()
/mob/living/silicon/robot/blob_act(obj/effect/blob/B)
if (stat != 2)
adjustBruteLoss(60)
updatehealth()
@@ -446,9 +445,6 @@
return !cleared
/mob/living/silicon/robot/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
if(istype(W, /obj/item/weapon/weldingtool) && (user.a_intent != "harm" || user == src))
user.changeNext_move(CLICK_CD_MELEE)
var/obj/item/weapon/weldingtool/WT = W
@@ -471,6 +467,7 @@
return
else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed)
user.changeNext_move(CLICK_CD_MELEE)
var/obj/item/stack/cable_coil/coil = W
if (getFireLoss() > 0)
if(src == user)
@@ -605,12 +602,15 @@
toner = tonermax
qdel(W)
user << "<span class='notice'>You fill the toner level of [src] to its max capacity.</span>"
else
if(W.force && W.damtype != STAMINA && src.stat != DEAD) //only sparks if real damage is dealt.
spark_system.start()
return ..()
/mob/living/silicon/robot/attacked_by(obj/item/I, mob/living/user, def_zone)
if(I.force && I.damtype != STAMINA && stat != DEAD) //only sparks if real damage is dealt.
spark_system.start()
..()
/mob/living/silicon/robot/emag_act(mob/user)
if(user != src)//To prevent syndieborgs from emagging themselves
if(!opened)//Cover is closed
@@ -457,12 +457,6 @@
"<span class='warning'>[M] punches [src], but doesn't leave a dent.</span>")
return 0
/mob/living/silicon/adjustEarDamage()
return
/mob/living/silicon/setEarDamage()
return
/mob/living/silicon/proc/GetPhoto()
if (aicamera)
return aicamera.selectpicture(aicamera)
@@ -489,33 +483,3 @@
animate(src, transform = ntransform, time = 2,easing = EASE_IN|EASE_OUT)
return ..()
/mob/living/silicon/Stun(amount)
if(status_flags & CANSTUN)
stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
update_stat()
/mob/living/silicon/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
if(status_flags & CANSTUN)
stunned = max(amount,0)
update_stat()
/mob/living/silicon/AdjustStunned(amount)
if(status_flags & CANSTUN)
stunned = max(stunned + amount,0)
update_stat()
/mob/living/silicon/Weaken(amount, ignore_canweaken = 0)
if(status_flags & CANWEAKEN || ignore_canweaken)
weakened = max(max(weakened,amount),0)
update_stat()
/mob/living/silicon/SetWeakened(amount)
if(status_flags & CANWEAKEN)
weakened = max(amount,0)
update_stat()
/mob/living/silicon/AdjustWeakened(amount, ignore_canweaken = 0)
if(status_flags & CANWEAKEN || ignore_canweaken)
weakened = max(weakened + amount,0)
update_stat()
@@ -0,0 +1,52 @@
//Here are the procs used to modify status effects of a mob.
//The effects include: stunned, weakened, paralysis, sleeping, resting, jitteriness, dizziness, ear damage,
// eye damage, eye_blind, eye_blurry, druggy, BLIND disability, and NEARSIGHT disability.
/////////////////////////////////// STUNNED ////////////////////////////////////
/mob/living/silicon/Stun(amount, updating = 1, ignore_canstun = 0)
if(status_flags & CANSTUN || ignore_canstun)
stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
if(updating)
update_stat()
/mob/living/silicon/AdjustStunned(amount, updating = 1, ignore_canstun = 0)
if(status_flags & CANSTUN || ignore_canstun)
stunned = max(stunned + amount,0)
if(updating)
update_stat()
/mob/living/silicon/SetStunned(amount, updating = 1, ignore_canstun = 0) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
if(status_flags & CANSTUN || ignore_canstun)
stunned = max(amount,0)
if(updating)
update_stat()
/////////////////////////////////// WEAKENED ////////////////////////////////////
/mob/living/silicon/Weaken(amount, updating = 1, ignore_canweaken = 0)
if(status_flags & CANWEAKEN || ignore_canweaken)
weakened = max(max(weakened,amount),0)
if(updating)
update_stat()
/mob/living/silicon/AdjustWeakened(amount, updating = 1, ignore_canweaken = 0)
if(status_flags & CANWEAKEN || ignore_canweaken)
weakened = max(weakened + amount,0)
if(updating)
update_stat()
/mob/living/silicon/SetWeakened(amount, updating = 1, ignore_canweaken = 0)
if(status_flags & CANWEAKEN || ignore_canweaken)
weakened = max(amount,0)
if(updating)
update_stat()
/////////////////////////////////// EAR DAMAGE ////////////////////////////////////
/mob/living/silicon/adjustEarDamage()
return
/mob/living/silicon/setEarDamage()
return
@@ -202,6 +202,7 @@
/mob/living/simple_animal/bot/medbot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/reagent_containers/glass))
. = 1 //no afterattack
if(locked)
user << "<span class='warning'>You cannot insert a beaker because the panel is locked!</span>"
return
@@ -215,7 +216,6 @@
reagent_glass = W
user << "<span class='notice'>You insert [W].</span>"
show_controls(user)
return
else
var/current_health = health
@@ -115,7 +115,7 @@
var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
family = list()
for(var/mob/living/simple_animal/pet/cat/C in mob_list)
if(istype(C,type) || C.stat || !C.butcher_results) //That last one is a work around for hologram cats
if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats
continue
if(C.type in family)
family[C.type] += 1
@@ -125,11 +125,11 @@
memory_saved = 1
/mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats()
cats_deployed = 1
for(var/cat_type in family)
if(family[cat_type] > 0)
for(var/i in 1 to min(family[cat_type],100)) //Limits to about 500 cats, you wouldn't think this would be needed (BUT IT IS)
new cat_type(loc)
cats_deployed = 1
/mob/living/simple_animal/pet/cat/Proc
name = "Proc"

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