diff --git a/baystation12.dme b/baystation12.dme
index 4a5685547d2..bdf792e43f7 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -206,6 +206,7 @@
#define FILE_DIR "icons/vending_icons"
#define FILE_DIR "interface"
#define FILE_DIR "maps"
+#define FILE_DIR "maps/backup"
#define FILE_DIR "maps/RandomZLevels"
#define FILE_DIR "sound"
#define FILE_DIR "sound/AI"
@@ -1166,7 +1167,11 @@
#include "code\WorkInProgress\AI_Visibility\minimap.dm"
#include "code\WorkInProgress\AI_Visibility\util.dm"
#include "code\WorkInProgress\animusstation\atm.dm"
+#include "code\WorkInProgress\Cael_Aislinn\energy_field.dm"
+#include "code\WorkInProgress\Cael_Aislinn\external_shield_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\power_monitor.dm"
+#include "code\WorkInProgress\Cael_Aislinn\shield_capacitor.dm"
+#include "code\WorkInProgress\Cael_Aislinn\shield_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_field.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_monitor.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/energy_field.dm b/code/WorkInProgress/Cael_Aislinn/energy_field.dm
new file mode 100644
index 00000000000..363b1ada26b
--- /dev/null
+++ b/code/WorkInProgress/Cael_Aislinn/energy_field.dm
@@ -0,0 +1,41 @@
+
+//---------- actual energy field
+
+/obj/effect/energy_field
+ name = "energy field"
+ desc = "Impenetrable field of energy, capable of blocking anything as long as it's active."
+ icon = 'shielding.dmi'
+ icon_state = "shieldsparkles"
+ anchored = 1
+ layer = 2.1
+ density = 0
+ invisibility = 2
+ var/strength = 0
+ var/obj/machinery/shield_gen/parent
+ var/stress = 0
+
+/obj/effect/energy_field/ex_act(var/severity)
+ Stress(2)
+ //nothing
+
+/obj/effect/energy_field/meteorhit(obj/effect/meteor/M as obj)
+ if(M)
+ walk(M,0)
+
+/obj/effect/energy_field/proc/Stress(var/severity)
+ strength -= severity
+ stress += severity
+
+ //if we take too much damage, drop out - the generator will bring us back up if we have enough power
+ if(strength < 1)
+ invisibility = 2
+ density = 0
+
+/obj/effect/energy_field/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
+ //Purpose: Determines if the object (or airflow) can pass this atom.
+ //Called by: Movement, airflow.
+ //Inputs: The moving atom (optional), target turf, "height" and air group
+ //Outputs: Boolean if can pass.
+
+ //return (!density || !height || air_group)
+ return 0
diff --git a/code/WorkInProgress/Cael_Aislinn/external_shield_gen.dm b/code/WorkInProgress/Cael_Aislinn/external_shield_gen.dm
new file mode 100644
index 00000000000..c4524ad94e0
--- /dev/null
+++ b/code/WorkInProgress/Cael_Aislinn/external_shield_gen.dm
@@ -0,0 +1,64 @@
+
+//---------- external shield generator
+//generates an energy field that loops around any built up area in space (is useless inside) halts movement and airflow, is blocked by walls, windows, airlocks etc
+
+/obj/machinery/shield_gen/external/New()
+ ..()
+
+/obj/machinery/shield_gen/external/get_shielded_turfs()
+ var
+ list
+ open = list(get_turf(src))
+ closed = list()
+
+ while(open.len)
+ for(var/turf/T in open)
+ for(var/turf/O in orange(1, T))
+ if(get_dist(O,src) > field_radius)
+ continue
+ var/add_this_turf = 0
+ if(istype(O,/turf/space))
+ for(var/turf/simulated/G in orange(1, O))
+ add_this_turf = 1
+ break
+ for(var/obj/structure/S in orange(1, O))
+ add_this_turf = 1
+ break
+ for(var/obj/structure/S in O)
+ add_this_turf = 0
+ break
+
+ if(add_this_turf && !(O in open) && !(O in closed))
+ open += O
+ open -= T
+ closed += T
+
+ return closed
+
+/obj/machinery/shield_gen/external/process()
+ /*if(stat & (NOPOWER|BROKEN))
+ return*/
+ if(!active)
+ return
+ /*spawn(100)
+ power()*/
+ /*if(src.active >= 1)
+ if(src.power == 0)
+ src.visible_message("\red The [src.name] shuts down due to lack of power!", \
+ "You hear heavy droning fade out")
+ icon_state = "generator0"
+ src.active = 0*/
+ ..()
+
+/obj/item/weapon/circuitboard/shield_gen/external
+ name = "Circuit Board (External Shield Generator)"
+ build_path = "/obj/machinery/shield_gen/external"
+ board_type = "machine"
+ origin_tech = "electromagnetic=3;engineering=2;power=1"
+ frame_desc = "Requires, 2 Cable Coil, 2 Nano Manipulator, 1 Advanced Matter Bin, 1 Console Screen and 1 High-Power Micro-Laser. "
+ req_components = list(
+ "/obj/item/weapon/cable_coil" = 2,
+ "/obj/item/weapon/stock_parts/manipulator/nano" = 2,
+ "/obj/item/weapon/stock_parts/matter_bin/adv" = 1,
+ "/obj/item/weapon/stock_parts/console_screen" = 1,
+ "/obj/item/weapon/stock_parts/micro_laser/high" = 1)
diff --git a/code/WorkInProgress/Cael_Aislinn/shield_capacitor.dm b/code/WorkInProgress/Cael_Aislinn/shield_capacitor.dm
new file mode 100644
index 00000000000..50896434d7f
--- /dev/null
+++ b/code/WorkInProgress/Cael_Aislinn/shield_capacitor.dm
@@ -0,0 +1,156 @@
+
+//---------- shield capacitor
+//pulls energy out of a power net and charges an adjacent generator
+
+/obj/machinery/shield_capacitor
+ name = "shield capacitor"
+ desc = "Machine that charges a shield generator."
+ icon = 'shielding.dmi'
+ icon_state = "capacitor"
+ var/active = 1
+ density = 1
+ anchored = 1
+ var/obj/machinery/shield_gen/target_generator
+ var/stored_charge = 0
+ var/time_since_fail = 100
+ var/max_charge = 1000000
+ var/max_charge_rate = 100000
+ var/min_charge_rate = 0
+ var/locked = 0
+ //
+ use_power = 1 //0 use nothing
+ //1 use idle power
+ //2 use active power
+ idle_power_usage = 10
+ active_power_usage = 100
+ var/charge_rate = 100
+
+/obj/machinery/shield_capacitor/New()
+ ..()
+ target_generator = locate() in get_step(src,dir)
+ if(target_generator && !target_generator.owned_capacitor)
+ target_generator.owned_capacitor = src
+ /*spawn(10)
+ check_powered()*/
+
+/obj/machinery/shield_capacitor/power_change()
+ if(stat & BROKEN)
+ icon_state = "broke"
+ else
+ if( powered() )
+ if (src.active)
+ icon_state = "capacitor"
+ else
+ icon_state = "capacitor"
+ stat &= ~NOPOWER
+ else
+ spawn(rand(0, 15))
+ src.icon_state = "capacitor"
+ stat |= NOPOWER
+
+/obj/machinery/shield_capacitor/process()
+ //
+ if(active)
+ use_power = 2
+ if(stored_charge + charge_rate > max_charge)
+ active_power_usage = max_charge - stored_charge
+ else
+ active_power_usage = charge_rate
+ stored_charge += active_power_usage
+ else
+ use_power = 1
+
+ time_since_fail++
+ if(stored_charge < active_power_usage * 1.5)
+ time_since_fail = 0
+ //
+ updateDialog()
+
+/obj/machinery/shield_capacitor/attackby(obj/item/W, mob/user)
+ /*if(istype(W, /obj/item/weapon/wrench))
+ if(active)
+ user << "Turn off the field generator first."
+ return
+
+ else if(state == 0)
+ state = 1
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user << "You secure the external reinforcing bolts to the floor."
+ src.anchored = 1
+ return
+
+ else if(state == 1)
+ state = 0
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user << "You undo the external reinforcing bolts."
+ src.anchored = 0
+ return*/
+
+ if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
+ if (src.allowed(user))
+ src.locked = !src.locked
+ user << "Controls are now [src.locked ? "locked." : "unlocked."]"
+ else
+ user << "\red Access denied."
+
+ else
+ src.add_fingerprint(user)
+ user << "\red You hit the [src.name] with your [W.name]!"
+ for(var/mob/M in viewers(src))
+ if(M == user) continue
+ M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!")
+
+/obj/machinery/shield_capacitor/attack_hand(mob/user as mob)
+ interact(user)
+ src.add_fingerprint(user)
+
+/obj/machinery/shield_capacitor/Topic(href, href_list[])
+ ..()
+ if( href_list["close"] )
+ usr << browse(null, "window=shield_capacitor")
+ usr.machine = null
+ return
+ if( href_list["toggle"] )
+ active = !active
+ if(active)
+ use_power = 2
+ else
+ use_power = 1
+ if( href_list["charge_rate"] )
+ charge_rate += text2num(href_list["charge_rate"])
+ if(charge_rate > max_charge_rate)
+ charge_rate = max_charge_rate
+ else if(charge_rate < min_charge_rate)
+ charge_rate = min_charge_rate
+ //
+ updateDialog()
+
+/obj/machinery/shield_capacitor/proc/interact(mob/user)
+ if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
+ if (!istype(user, /mob/living/silicon))
+ user.machine = null
+ user << browse(null, "window=shield_capacitor")
+ return
+ var/t = "Shield Capacitor Control Console
"
+ t += "[target_generator ? "Shield generator connected." : "Unable to locate shield generator!"]
"
+ t += "This capacitor is: [active ? "Online" : "Offline" ] [active ? "\[Deactivate\]" : "\[Activate\]"]
"
+ t += "[time_since_fail > 2 ? "Charging stable." : "Warning, low charge!"]
"
+ t += "Capacitor charge: [stored_charge] Watts ([100 * stored_charge/max_charge]%)
"
+ t += "Capacitor charge rate (approx): \[min\] \[--\] \[-\][charge_rate] Watts/sec \[+\] \[++\] \[max\]
"
+ t += "
"
+ t += "Close
"
+ user << browse(t, "window=shield_capacitor;size=500x800")
+ user.machine = src
+
+/obj/item/weapon/circuitboard/shield_capacitor
+ name = "Circuit Board (Shield Capacitor)"
+ build_path = "/obj/machinery/shield_capacitor"
+ board_type = "machine"
+ origin_tech = "electromagnetic=3;engineering=2;power=1"
+ frame_desc = "Requires, 2 Cable Coil, 2 Nano Manipulator, 1 Advanced Matter Bin, 1 Console Screen and 1 High-Power Micro-Laser. "
+ req_components = list(
+ "/obj/item/weapon/cable_coil" = 2,
+ "/obj/item/weapon/stock_parts/manipulator/nano" = 2,
+ "/obj/item/weapon/stock_parts/matter_bin/adv" = 1,
+ "/obj/item/weapon/stock_parts/console_screen" = 1,
+ "/obj/item/weapon/stock_parts/micro_laser/high" = 1)
diff --git a/code/ZAS/Creation.dm b/code/ZAS/Creation.dm
index 225fc02eff7..b283cd56d43 100644
--- a/code/ZAS/Creation.dm
+++ b/code/ZAS/Creation.dm
@@ -67,10 +67,10 @@ proc/FloodFill(turf/start)
return closed
-turf/proc/ZCanPass(turf/T)
+turf/proc/ZCanPass(turf/T, var/include_space = 0)
//Fairly standard pass checks for turfs, objects and directional windows. Also stops at the edge of space.
- if(istype(T,/turf/space)) return 0
+ if(istype(T,/turf/space) && !include_space) return 0
else
if(T.blocks_air||blocks_air)
return 0
diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm
index 7e39e7e50fb..98d4c78d4e0 100755
--- a/code/defines/obj/supplypacks.dm
+++ b/code/defines/obj/supplypacks.dm
@@ -804,7 +804,8 @@
/datum/supply_packs/randomised/contraband
num_contained = 5
- contains = list("/obj/item/weapon/contraband/poster","/obj/item/weapon/cigpacket/dromedaryco") //We randomly pick 5 items from this list through the constructor, look below
+ //We randomly pick 5 items from this list through the constructor, look below
+ contains = list("/obj/item/weapon/contraband/poster","/obj/item/weapon/cigpacket/dromedaryco","/obj/item/clothing/mask/cigarette/cigar/havana", "/obj/item/seeds/plumphelmet", "/obj/item/seeds/libertycap", "/obj/item/seeds/bloodtomato", "/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe", "/obj/item/weapon/reagent_containers/food/drinks/bottle/deadrum" )
name = "Contraband crate"
cost = 30
containertype = "/obj/structure/closet/crate"
diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm
index 5b5b1bc8845..51b4adfee44 100644
--- a/code/defines/procs/gamehelpers.dm
+++ b/code/defines/procs/gamehelpers.dm
@@ -295,3 +295,124 @@ proc/is_carrying(var/M as mob, var/O as obj)
return 1
O = O:loc
return 0
+
+//hackcopy from a ZAS function, first created for use with intertial_damper/new shielding
+proc/CircleFloodFill(turf/start, var/radius = 3)
+ if(!istype(start))
+ return list()
+ var
+ list
+ open = list(start)
+ closed = list()
+ possibles = circlerange(start,radius)
+
+ while(open.len)
+ for(var/turf/T in open)
+ //Stop if there's a door, even if it's open. These are handled by indirect connection.
+ if(!T.HasDoor())
+
+ for(var/d in cardinal)
+ var/turf/O = get_step(T,d)
+ //Simple pass check.
+ if(O.ZCanPass(T, 1) && !(O in open) && !(O in closed) && O in possibles)
+ open += O
+
+ open -= T
+ closed += T
+
+ return closed
+
+//floods in a square area, flowing around any shielding but including all other turf types
+//created initially for explosion / shield interaction
+proc/ExplosionFloodFill(turf/start, var/radius = 3)
+ if(!istype(start))
+ return list()
+ var
+ list
+ open = list(start)
+ closed = list()
+ possibles = range(start,radius)
+
+ while(open.len)
+ for(var/turf/T in open)
+ for(var/turf/O in range(T,1))
+ if( !(O in possibles) || O in open || O in closed )
+ continue
+ var/shield_here = 0
+ for(var/obj/effect/energy_field/E in O)
+ if(E.density)
+ shield_here = 1
+ break
+ if(!shield_here)
+ open += O
+
+ open -= T
+ closed += T
+
+ return closed
+
+/*
+
+/obj/machinery/shield_gen/external/get_shielded_turfs()
+ var
+ list
+ open = list(get_turf(src))
+ closed = list()
+
+ while(open.len)
+ for(var/turf/T in open)
+ for(var/turf/O in orange(1, T))
+ if(get_dist(O,src) > field_radius)
+ continue
+ var/add_this_turf = 0
+ if(istype(O,/turf/space))
+ for(var/turf/simulated/G in orange(1, O))
+ add_this_turf = 1
+ break
+ for(var/obj/structure/S in orange(1, O))
+ add_this_turf = 1
+ break
+ for(var/obj/structure/S in O)
+ add_this_turf = 0
+ break
+
+ if(add_this_turf && !(O in open) && !(O in closed))
+ open += O
+ open -= T
+ closed += T
+
+ return closed
+*/
+
+//floods in a circular area, flowing around any shielding but including all other turf types
+//created initially for explosion / shield interaction
+proc/ExplosionCircleFloodFill(turf/start, var/radius = 3)
+ if(!istype(start))
+ return list()
+ var
+ list
+ open = list(start)
+ closed = list()
+ possibles = circlerange(start,radius)
+
+ while(open.len)
+ for(var/turf/T in open)
+ for(var/turf/O in range(T,1))
+ if(get_dist(O,start) > radius)
+ continue
+
+ if( !(O in possibles) || O in open || O in closed )
+ continue
+ var/shield_here = 0
+ for(var/obj/effect/energy_field/E in O)
+ if(E.density)
+ shield_here = 1
+ break
+ if(!shield_here && (O in possibles) && !(O in open) && !(O in closed))
+ open += O
+
+ open -= T
+ closed += T
+
+ return closed
+
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index cf5fc859d66..658d1a26c4c 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -30,22 +30,91 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
E.set_up(epicenter)
E.start()
- var/list/dTurfs = list() //Holds the turfs in devestation range.
- var/list/hTurfs = list() //Holds the turfs in heavy impact range, minus turfs in devestation range.
- var/list/lTurfs = list() //Holds the turfs in light impact range, minus turfs in devestation range and heavy impact range.
- var/list/fTurfs = list() //Holds turfs to loop through for mobs to flash. (Hehehe, dirty)
+ var/list/dTurfs = list() //Holds the turfs in devestation range.
+ var/list/hTurfs = list() //Holds the turfs in heavy impact range, minus turfs in devestation range.
+ var/list/lTurfs = list() //Holds the turfs in light impact range, minus turfs in devestation range and heavy impact range.
+ var/list/fTurfs = list() //Holds turfs to loop through for mobs to flash. (Hehehe, dirty)
+
+ //cael - replaced range() and circlerange() with FloodFill() to prevent explosions getting through shielding (ultrarealism mode)
+ //also lag is pre'y bad
+ /*
+ if(roundExplosions)
+ if(/obj/effect/energy_field in range(src, max(devastation_range, heavy_impact_range, light_impact_range)))
+ fTurfs = ExplosionCircleFloodFill(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
+ dTurfs = ExplosionCircleFloodFill(epicenter,devastation_range)
+ hTurfs = ExplosionCircleFloodFill(epicenter,heavy_impact_range) - dTurfs
+ lTurfs = ExplosionCircleFloodFill(epicenter,light_impact_range) - dTurfs - hTurfs
+ else
+ fTurfs = circlerange(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
+ dTurfs = circlerange(epicenter,devastation_range)
+ hTurfs = circlerange(epicenter,heavy_impact_range) - dTurfs
+ lTurfs = circlerange(epicenter,light_impact_range) - dTurfs - hTurfs
+
+ //add some stress to nearby shields
+ for(var/obj/effect/energy_field/E in circlerange(epicenter, devastation_range))
+ E.Stress(3)
+ for(var/obj/effect/energy_field/E in circlerange(epicenter, heavy_impact_range))
+ E.Stress(2)
+ for(var/obj/effect/energy_field/E in circlerange(epicenter, light_impact_range))
+ E.Stress(1)
+ else
+ if(/obj/effect/energy_field in range(src, max(devastation_range, heavy_impact_range, light_impact_range)))
+ fTurfs = ExplosionFloodFill(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
+ dTurfs = ExplosionFloodFill(epicenter,devastation_range)
+ hTurfs = ExplosionFloodFill(epicenter,heavy_impact_range) - dTurfs
+ lTurfs = ExplosionFloodFill(epicenter,light_impact_range) - dTurfs - hTurfs
+ else
+ fTurfs = range(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
+ dTurfs = range(epicenter,devastation_range)
+ hTurfs = range(epicenter,heavy_impact_range) - dTurfs
+ lTurfs = range(epicenter,light_impact_range) - dTurfs - hTurfs
+
+ //add some stress to nearby shields
+ for(var/obj/effect/energy_field/E in range(epicenter, devastation_range))
+ E.Stress(3)
+ for(var/obj/effect/energy_field/E in range(epicenter, heavy_impact_range))
+ E.Stress(2)
+ for(var/obj/effect/energy_field/E in range(epicenter, light_impact_range))
+ E.Stress(1)*/
if(roundExplosions)
- fTurfs = circlerange(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
- dTurfs = circlerange(epicenter,devastation_range)
- hTurfs = circlerange(epicenter,heavy_impact_range) - dTurfs
- lTurfs = circlerange(epicenter,light_impact_range) - dTurfs - hTurfs
- else
- fTurfs = range(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
- dTurfs = range(epicenter,devastation_range)
- hTurfs = range(epicenter,heavy_impact_range) - dTurfs
- lTurfs = range(epicenter,light_impact_range) - dTurfs - hTurfs
+ if(/obj/effect/energy_field in range(src, max(devastation_range, heavy_impact_range, light_impact_range)))
+ fTurfs = circlerange(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
+ dTurfs = circlerange(epicenter,devastation_range)
+ hTurfs = circlerange(epicenter,heavy_impact_range) - dTurfs
+ lTurfs = circlerange(epicenter,light_impact_range) - dTurfs - hTurfs
+ else
+ fTurfs = circlerange(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
+ dTurfs = circlerange(epicenter,devastation_range)
+ hTurfs = circlerange(epicenter,heavy_impact_range) - dTurfs
+ lTurfs = circlerange(epicenter,light_impact_range) - dTurfs - hTurfs
+ //add some stress to nearby shields
+ for(var/obj/effect/energy_field/E in circlerange(epicenter, devastation_range))
+ E.Stress(3)
+ for(var/obj/effect/energy_field/E in circlerange(epicenter, heavy_impact_range))
+ E.Stress(2)
+ for(var/obj/effect/energy_field/E in circlerange(epicenter, light_impact_range))
+ E.Stress(1)
+ else
+ if(/obj/effect/energy_field in range(src, max(devastation_range, heavy_impact_range, light_impact_range)))
+ fTurfs = range(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
+ dTurfs = range(epicenter,devastation_range)
+ hTurfs = range(epicenter,heavy_impact_range) - dTurfs
+ lTurfs = range(epicenter,light_impact_range) - dTurfs - hTurfs
+ else
+ fTurfs = range(epicenter,max(devastation_range, heavy_impact_range, light_impact_range, flash_range))
+ dTurfs = range(epicenter,devastation_range)
+ hTurfs = range(epicenter,heavy_impact_range) - dTurfs
+ lTurfs = range(epicenter,light_impact_range) - dTurfs - hTurfs
+
+ //add some stress to nearby shields
+ for(var/obj/effect/energy_field/E in range(epicenter, devastation_range))
+ E.Stress(3)
+ for(var/obj/effect/energy_field/E in range(epicenter, heavy_impact_range))
+ E.Stress(2)
+ for(var/obj/effect/energy_field/E in range(epicenter, light_impact_range))
+ E.Stress(1)
for(var/turf/T in dTurfs) //Loop through the turfs in devestation range.
spawn() //Try to pop each turf into it's own thread, speed things along.
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index f033f30f5d1..21aeb9a5c0a 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -2749,12 +2749,47 @@ datum
color = "#664300" // rgb: 102, 67, 0
dizzy_adj = 3
+ absinthe
+ name = "Absinthe"
+ id = "absinthe"
+ description = "Watch out that the Green Fairy doesn't come for you!"
+ color = "#33EE00" // rgb: lots, ??, ??
+ dizzy_adj = 5
+ slur_start = 25
+ confused_start = 100
+
+ //copy paste from LSD... shoot me
+ on_mob_life(var/mob/M)
+ if(!M) M = holder.my_atom
+ if(!data) data = 1
+ data++
+ M:hallucination += 5
+ if(volume > REAGENTS_OVERDOSE)
+ M:adjustToxLoss(1)
+ // if(data >= 100)
+ // M:adjustToxLoss(0.1)
+ ..()
+ return
+
rum
name = "Rum"
id = "rum"
description = "Yohoho and all that."
color = "#664300" // rgb: 102, 67, 0
+ deadrum
+ name = "Deadrum"
+ id = "rum"
+ description = "Popular with the sailors. Not very popular with everyone else."
+ color = "#664300" // rgb: 102, 67, 0
+
+ on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.dizziness +=5
+ if(volume > REAGENTS_OVERDOSE)
+ M:adjustToxLoss(1)
+ return
+
vodka
name = "Vodka"
id = "vodka"
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 26bb307ea34..29e992315b5 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -3009,6 +3009,14 @@
..()
reagents.add_reagent("rum", 100)
+/obj/item/weapon/reagent_containers/food/drinks/bottle/deadrum
+ name = "Deadrum Bumbo"
+ desc = "Tastes a lot sweeter than ordinary rum (that's to help disguise the kick)."
+ icon_state = "deadrumbottle"
+ New()
+ ..()
+ reagents.add_reagent("deadrum", 100)
+
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater
name = "Flask of Holy Water"
desc = "A flask of the chaplain's holy water."
@@ -3057,6 +3065,14 @@
..()
reagents.add_reagent("wine", 100)
+/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe
+ name = "Jailbreaker Verte"
+ desc = "Twenty-fourth century Green Fairy, one sip of this and you just know you're gonna have a good time."
+ icon_state = "absinthebottle"
+ New()
+ ..()
+ reagents.add_reagent("absinthe", 100)
+
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 337890429b4..93cc7164968 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -4,6 +4,7 @@
see_invisible = 15
see_in_dark = 100
verbs += /mob/dead/observer/proc/dead_tele
+ taj_talk_understand = 1
if(body)
var/turf/location = get_turf(body)//Where is the mob located?
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index c2136c8cdc7..9f59340ee07 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -123,7 +123,7 @@
//if it's a crate, move the item into the crate
var/turf/T = get_step(A,movedir)
for(var/obj/structure/closet/crate/C in T)
- if(C && C.opened)
+ if(C && C.opened && !istype(A, /obj/structure/closet/crate))
A.loc = C.loc
break
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 730ebee281d..37974b4b7db 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ