From 0698fb759a23e7e1b62f01cd3faf8b5fd2224139 Mon Sep 17 00:00:00 2001
From: CIB
Date: Thu, 31 May 2012 20:59:51 +0300
Subject: [PATCH 01/53] Reduce health loss in crit. (For Erthilo)
---
code/modules/mob/living/carbon/human/life.dm | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index e16ea5fe50..bb1dfe2287 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -468,7 +468,12 @@
if(!breath || (breath.total_moles == 0))
if(reagents.has_reagent("inaprovaline"))
return
- adjustOxyLoss(HUMAN_MAX_OXYLOSS)
+ if(health < config.health_threshold_crit)
+ // in crit, we pretend your metabolism has become slower, which
+ // will reduce the rate at which you lose health
+ adjustOxyLoss(round(HUMAN_MAX_OXYLOSS / 2))
+ else
+ adjustOxyLoss(HUMAN_MAX_OXYLOSS)
oxygen_alert = max(oxygen_alert, 1)
From bcf1b8a0b9b2cad8191d1e699ff2b7b9e5b7de7a Mon Sep 17 00:00:00 2001
From: caelaislinn
Date: Mon, 11 Jun 2012 15:41:13 +1000
Subject: [PATCH 02/53] ghosts can understand tajaran
Signed-off-by: caelaislinn
---
code/modules/mob/dead/observer/observer.dm | 1 +
1 file changed, 1 insertion(+)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 337890429b..93cc716496 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?
From d4393c482daea7ff9416b0d869216bc677404d2b Mon Sep 17 00:00:00 2001
From: SkyMarshal
Date: Sun, 3 Jun 2012 15:57:28 -0700
Subject: [PATCH 03/53] Removed a duplicate proc. Pimped out the Blueprints.
---
baystation12.dme | 1 -
code/defines/procs/helpers.dm | 7 -
code/game/area/areas.dm | 27 ++
code/game/gamemodes/blob/theblob.dm | 2 +-
code/game/machinery/computer/prisoner.dm | 2 +-
code/game/master_controller.dm | 2 +-
code/game/objects/items/apc_frame.dm | 2 +-
code/game/objects/items/blueprints.dm | 383 +++++++++++++-----
code/game/objects/items/food.dm | 2 +-
.../game/objects/items/weapons/papers_bins.dm | 2 +-
code/game/objects/shooting_range.dm | 4 +-
code/modules/admin/player_panel.dm | 2 +-
code/modules/admin/verbs/playsound.dm | 2 +-
code/modules/chemical/Chemistry-Recipes.dm | 16 +-
.../carbon/alien/humanoid/alien_powers.dm | 2 +-
.../mob/living/carbon/alien/larva/powers.dm | 2 +-
.../mob/living/carbon/metroid/powers.dm | 2 +-
.../mob/living/carbon/monkey/powers.dm | 2 +-
code/modules/power/apc.dm | 2 +-
19 files changed, 337 insertions(+), 127 deletions(-)
diff --git a/baystation12.dme b/baystation12.dme
index d972490d4b..4a5685547d 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -896,7 +896,6 @@
#include "code\modules\food\meat.dm"
#include "code\modules\food\recipes_microwave.dm"
#include "code\modules\maps\dmm_suite.dm"
-#include "code\modules\maps\randomZlevel.dm"
#include "code\modules\maps\reader.dm"
#include "code\modules\maps\SwapMaps.dm"
#include "code\modules\maps\writer.dm"
diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm
index 5ba1051916..8bfb13504d 100644
--- a/code/defines/procs/helpers.dm
+++ b/code/defines/procs/helpers.dm
@@ -1024,13 +1024,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
output += A
return output
-/proc/get_turf_loc(var/atom/movable/M) //gets the location of the turf that the atom is on, or what the atom is in is on, etc
- //in case they're in a closet or sleeper or something
- var/atom/loc = M.loc
- while(!istype(loc, /turf/))
- loc = loc.loc
- return loc
-
// returns the turf located at the map edge in the specified direction relative to A
// used for mass driver
/proc/get_edge_target_turf(var/atom/A, var/direction)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 24cdd18501..18967989a5 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -392,3 +392,30 @@
mob << "Gravity!"
+/area/proc/absorb(var/area/A)
+ if(!istype(A))
+ return
+ var/list/total_contents = list()
+ for(var/area/RA in A.related)
+ total_contents |= RA.contents
+ RA.contents = list()
+ src += total_contents
+ spawn(5)
+ power_change()
+ set_area_machinery_title()
+
+
+/area/proc/set_area_machinery_title(var/oldtitle)
+ if(!oldtitle)
+ return
+ for(var/area/RA in related)
+ for(var/obj/machinery/alarm/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,name)
+ for(var/obj/machinery/power/apc/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,name)
+ for(var/obj/machinery/atmospherics/unary/vent_scrubber/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,name)
+ for(var/obj/machinery/atmospherics/unary/vent_pump/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,name)
+ for(var/obj/machinery/door/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,name)
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index d2b1c1923e..5036d737e0 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -55,7 +55,7 @@
//might need an else for the ..()
DblClick()
if((usr.hand && istype(usr.l_hand, /obj/item/weapon/flamethrower)) || (!usr.hand && istype(usr.r_hand, /obj/item/weapon/flamethrower)))
- var/turf/location = get_turf_loc(src)
+ var/turf/location = get_turf(src)
location.DblClick()
return ..()
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index f478d8656e..21dcb39a36 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -50,7 +50,7 @@
var/loc_display = "Unknown"
var/mob/living/carbon/M = T.imp_in
if(M.z == 1 && !istype(M.loc, /turf/space))
- var/turf/mob_loc = get_turf_loc(M)
+ var/turf/mob_loc = get_turf(M)
loc_display = mob_loc.loc
dat += "ID: [T.id] | Location: [loc_display]
"
dat += "(Message Holder) |
"
diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm
index 33dffbcb83..f77e9f4a77 100644
--- a/code/game/master_controller.dm
+++ b/code/game/master_controller.dm
@@ -47,7 +47,7 @@ datum/controller/game_controller
world.tick_lag = config.Ticklag
- createRandomZlevel()
+// createRandomZlevel()
// Sleep for about 5 seconds to allow background initialization procs to finish
sleep(50)
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 10791618fb..ba1a2597c1 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -12,7 +12,7 @@
var/ndir = get_dir(usr,on_wall)
if (!(ndir in cardinal))
return
- var/turf/loc = get_turf_loc(usr)
+ var/turf/loc = get_turf(usr)
var/area/A = loc.loc
if (!istype(loc, /turf/simulated/floor))
usr << "\red APC cannot be placed on this spot."
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 325a6cbdc7..11ea167058 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -1,4 +1,11 @@
/obj/item/blueprints
+ name = "station blueprints"
+ desc = "Blueprints of the station. There's stamp \"Classified\" and several coffee stains on it. Looks like you can edit the station's layout with these."
+ icon = 'items.dmi'
+ icon_state = "blueprints"
+
+ var/list/image/helper_images = list()
+
var/const/AREA_ERRNONE = 0
var/const/AREA_STATION = 1
var/const/AREA_SPACE = 2
@@ -9,6 +16,7 @@
var/const/BORDER_BETWEEN = 2
var/const/BORDER_2NDTILE = 3
var/const/BORDER_SPACE = 4
+ var/const/BORDER_AREA = 5
var/const/ROOM_ERR_LOLWAT = 0
var/const/ROOM_ERR_SPACE = -1
@@ -16,7 +24,7 @@
/obj/item/blueprints/attack_self(mob/M as mob)
if (!istype(M,/mob/living/carbon/human))
- M << "This is stack of useless pieces of harsh paper." //monkeys cannot into projecting
+ M << "This is stack of useless pieces of heavy paper." //monkeys cannot into projecting
return
interact()
return
@@ -32,12 +40,24 @@
if (get_area_type()!=AREA_SPACE)
interact()
return
- create_area()
+ spawn()
+ create_area(usr.client)
+ if(usr && usr.client)
+ for(var/image/to_remove in helper_images)
+ if(to_remove in usr.client.images)
+ usr.client.images.Remove(to_remove)
+ del(to_remove)
if ("edit_area")
if (get_area_type()!=AREA_STATION)
interact()
return
- edit_area()
+ spawn()
+ edit_area(usr.client)
+ if(usr && usr.client)
+ for(var/image/to_remove in helper_images)
+ if(to_remove in usr.client.images)
+ usr.client.images.Remove(to_remove)
+ del(to_remove)
/obj/item/blueprints/proc/interact()
var/area/A = get_area()
@@ -48,18 +68,18 @@
switch (get_area_type())
if (AREA_SPACE)
text += {"
-According this blueprints you are in open space now.
-Mark this place as new area.
+According \the [src] you are in open space now.
+Mark this place as a new area.
"}
if (AREA_STATION)
text += {"
-According this blueprints you are in [A.name] now.
+According \the [src] you are in \The [A] now.
You may
-move an amendment to the drawing.
+move an amendment to the designs.
"}
if (AREA_SPECIAL)
text += {"
-This place doesn't noted on this blueprints.
+This place isn't noted on \the [src].
"}
else
return
@@ -67,14 +87,10 @@ move an amendment to the drawing.
usr << browse(text, "window=blueprints")
onclose(usr, "blueprints")
-
-/obj/item/blueprints/proc/get_area()
- var/turf/T = get_turf_loc(usr)
- var/area/A = T.loc
- A = A.master
- return A
-
-/obj/item/blueprints/proc/get_area_type(var/area/A = get_area())
+/obj/item/blueprints/proc/get_area_type(var/turf/T = get_turf(src))
+ if(!T)
+ return AREA_SPECIAL
+ var/area/A = get_area(T)
if (A.name == "Space")
return AREA_SPACE
var/list/SPECIALS = list(
@@ -87,99 +103,235 @@ move an amendment to the drawing.
/area/syndicate_station,
/area/wizard_station,
/area/prison
- // /area/derelict //commented out, all hail derelict-rebuilders!
)
for (var/type in SPECIALS)
if ( istype(A,type) )
return AREA_SPECIAL
return AREA_STATION
-/obj/item/blueprints/proc/create_area()
+/obj/item/blueprints/proc/create_area(var/client/user)
//world << "DEBUG: create_area"
- var/res = detect_room(get_turf_loc(usr))
- if(!istype(res,/list))
- switch(res)
+ var/list/turf/turfs = detect_room(get_turf(user.mob),user)
+ if(!istype(turfs))
+ switch(turfs)
if(ROOM_ERR_SPACE)
- usr << "\red New area must be complete airtight!"
+ usr << "\red The new area must be completly airtight!"
return
if(ROOM_ERR_TOOLARGE)
- usr << "\red New area too large!"
+ usr << "\red The new area is too large!"
return
else
usr << "\red Error! Please notify administration!"
return
- var/list/turf/turfs = res
- var/str = sanitize(trim(input(usr,"New area title","Blueprints editing")))
- if(!str || !length(str)) //cancel
- return
- if(length(str) > 50)
- usr << "\red Text too long."
- return
- var/area/A = new
- A.name = str
- A.tag="[A.type]_[md5(str)]" // without this dynamic light system ruin everithing
- //var/ma
- //ma = A.master ? "[A.master]" : "(null)"
- //world << "DEBUG: create_area:
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]"
- A.power_equip = 0
- A.power_light = 0
- A.power_environ = 0
- move_turfs_to_area(turfs, A)
+ var/choice = alert("Would you like to add this to an adjacent area, or make a brand new one?","Creating new area.","New Area", "Add to Area", "Cancel")
+ switch(choice)
+
+ if("New Area")
+ var/list/turf/new_turfs = list()
+ for(var/reference in turfs)
+ if(turfs[reference] == "Space")
+ var/turf/simulated/T = locate(reference) in world
+ if(istype(T))
+ new_turfs |= T
+ if(!new_turfs.len)
+ usr << "No aporpriate tiles found."
+ return
+ if(new_turfs.len > 500)
+ usr << "\red Too big of an area!"
+ return
+
+ var/str = sanitize(trim(input(usr,"New area title","Blueprints editing") as null|text))
+ if(!str || !length(str)) //cancel
+ return
+ if(length(str) > 50)
+ usr << "\red Text too long."
+ return
+ var/area/A = new
+ A.name = str
+ A.tag="[A.type]_[md5(str)]" // without this dynamic light system ruin everithing
+ A.power_equip = 0
+ A.power_light = 0
+ A.power_environ = 0
+ A.contents |= new_turfs
+
+
+ if("Add to Area")
+ var/list/adjacent_areas = list()
+ for(var/reference in turfs)
+ adjacent_areas |= turfs[reference]
+
+
+//POSSIBLE FUTURE CHANGE
+ adjacent_areas.Remove("Space") //It's not something you want... or is it? We can try this out later.
+
+
+ var/decision = input("Which adjacent area do you want to combine with?","Blueprints Interface") as null|anything in adjacent_areas
+ if(decision && decision in adjacent_areas)
+ var/area/merge_target
+ for(var/reference in turfs)
+ if(turfs[reference] == decision)
+ var/turf/simulated/T = locate(reference)
+ if(istype(T))
+ merge_target = get_area(T)
+ break
+ if(!merge_target)
+ usr << "Something's gone badly wrong. Sorry!"
+ return
+
+ var/list/turf/new_turfs = list()
+ for(var/reference in turfs)
+ if(turfs[reference] == "Space")
+ var/turf/simulated/T = locate(reference) in world
+ if(istype(T))
+ new_turfs |= T
+ merge_target.contents |= new_turfs
+ spawn(2)
+ merge_target.power_change()
+
+ else
+ return
+
+ if("Cancel")
+ return
+
spawn(5)
- //ma = A.master ? "[A.master]" : "(null)"
- //world << "DEBUG: create_area(5):
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]"
interact()
return
-/obj/item/blueprints/proc/move_turfs_to_area(var/list/turf/turfs, var/area/A)
- A.contents.Add(turfs)
- //oldarea.contents.Remove(usr.loc) // not needed
- //T.loc = A //error: cannot change constant value
-
-
-/obj/item/blueprints/proc/edit_area()
- var/area/A = get_area()
+/obj/item/blueprints/proc/edit_area(var/client/user)
+ var/area/A = get_area(src)
//world << "DEBUG: edit_area"
- var/prevname = A.name
- var/str = sanitize(trim(input(usr,"New area title","Blueprints editing",prevname)))
- if(!str || !length(str) || str==prevname) //cancel
- return
- if(length(str) > 50)
- usr << "\red Text too long."
- return
- set_area_machinery_title(A,str,prevname)
- for(var/area/RA in A.related)
- RA.name = str
- usr << "\blue You set the area '[prevname]' title to '[str]'."
- interact()
+ var/choice = alert("Would you like to rename the area, or merge it with an adjacent one?", "Blueprint Interface", "Rename", "Merge", "Cancel")
+ switch(choice)
+ if("Rename")
+ var/str = sanitize(trim(input(usr,"New area title","Blueprints editing",A.name) as null|text))
+ if(!str || !length(str) || str==A.name) //cancel
+ return
+ if(length(str) > 50)
+ usr << "\red Text too long."
+ return
+ var/old_name = A.name
+ for(var/area/RA in A.related)
+ RA.name = str
+ A.name = str
+ A.set_area_machinery_title(old_name)
+ usr << "\blue You retitle the area '[A.name]' to '[str]'."
+
+
+ if("Merge")
+ var/list/turf/search_remaining_turfs = A.contents.Copy()
+ var/list/turfs = list()
+ for(var/turf/simulated/T in search_remaining_turfs)
+ if(T.density || locate(/obj/machinery/door) in T || locate(/obj/machinery/door) in T)
+ search_remaining_turfs.Remove(T)
+
+ var/limiter = 50
+
+ var/iteration = 0
+ while(search_remaining_turfs.len > (A.contents.len)/10 )
+ iteration++
+ if(iteration > limiter)
+ break
+ var/turf/simulated/test_turf = pick(search_remaining_turfs)
+ if(!istype(test_turf))
+ continue
+ var/list/turf/temp_turf_list = detect_room(test_turf,user)
+ if(!istype(temp_turf_list))
+ switch(temp_turf_list)
+ if(ROOM_ERR_SPACE)
+ usr << "\red \The [A] is not completly airtight!"
+ return
+ if(ROOM_ERR_TOOLARGE)
+ usr << "\red \The [A] is too large to expand!"
+ return
+ else
+ usr << "\red Error! Please notify administration!"
+ return
+ for(var/reference in temp_turf_list)
+ var/turf/simulated/T = locate(reference)
+ if(T)
+ search_remaining_turfs.Remove(T)
+ turfs |= temp_turf_list
+
+ var/list/adjacent_areas = list()
+ for(var/reference in turfs)
+ adjacent_areas |= turfs[reference]
+ adjacent_areas.Remove("[A]")
+
+ var/decision = input("Which adjacent area do you want to merge with?","Blueprints Interface") as null|anything in adjacent_areas
+ if(decision && decision in adjacent_areas)
+ var/area/merge_target
+ for(var/reference in turfs)
+ if(turfs[reference] == decision)
+ var/turf/simulated/T = locate(reference)
+ if(istype(T))
+ merge_target = get_area(T)
+ break
+
+ if(!merge_target)
+ usr << "Something's gone badly wrong. Sorry!"
+ return
+
+ search_remaining_turfs = merge_target.contents.Copy()
+ for(var/turf/simulated/T in search_remaining_turfs)
+ if(T.density || locate(/obj/machinery/door) in T || locate(/obj/machinery/door) in T)
+ search_remaining_turfs.Remove(T)
+
+ var/turf/simulated/T
+ iteration = 0
+ while(search_remaining_turfs.len > (merge_target.contents.len)/10 )
+ T = pick(search_remaining_turfs)
+ if(istype(T))
+ var/list/turf_references = detect_room(T,user)
+ if(!istype(turf_references))
+ switch(turf_references)
+ if(ROOM_ERR_SPACE)
+ usr << "\red \The [merge_target] is not completly airtight!"
+ return
+ if(ROOM_ERR_TOOLARGE)
+ usr << "\red \The [merge_target] is too large to expand!"
+ return
+ else
+ usr << "\red Error! Please notify administration!"
+ return
+ for(var/reference in turf_references)
+ T = locate(reference)
+ if(T)
+ search_remaining_turfs.Remove(T)
+ iteration++
+ if(iteration >= limiter)
+ break
+
+ var/area_master = alert("If this is approximately the right shape for the combined area, which should the new area be?", "Blueprint Interface", "\The [A]", "\The [merge_target]", "Looks Wrong/Cancel")
+ if(area_master == "\The [A]")
+
+ A.absorb(merge_target)
+
+ else if(area_master == "\The [merge_target]")
+
+ merge_target.absorb(A)
+
+ else if(area_master == "Looks Wrong/Cancel")
+ return
+
+ else
+ return
+
+ if("Cancel")
+ return
+
+ spawn(5)
+ interact()
return
-/obj/item/blueprints/proc/set_area_machinery_title(var/area/A,var/title,var/oldtitle)
- if (!oldtitle) // or dd_replacetext goes to infinite loop
- return
- for(var/area/RA in A.related)
- for(var/obj/machinery/alarm/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- for(var/obj/machinery/power/apc/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- for(var/obj/machinery/atmospherics/unary/vent_scrubber/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- for(var/obj/machinery/atmospherics/unary/vent_pump/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- for(var/obj/machinery/door/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- //TODO: much much more. Unnamed airlocks, cameras, etc.
-
/obj/item/blueprints/proc/check_tile_is_border(var/turf/T2,var/dir)
if (istype(T2, /turf/space))
return BORDER_SPACE //omg hull breach we all going to die here
if (istype(T2, /turf/simulated/shuttle))
return BORDER_SPACE
- if (get_area_type(T2.loc)!=AREA_SPACE)
- return BORDER_BETWEEN
if (istype(T2, /turf/simulated/wall))
return BORDER_2NDTILE
if (!istype(T2, /turf/simulated))
@@ -200,41 +352,80 @@ move an amendment to the drawing.
if (locate(/obj/structure/falserwall) in T2)
return BORDER_2NDTILE
+
+ if(get_area_type(T2) == AREA_SPECIAL)
+ return BORDER_BETWEEN
+
return BORDER_NONE
-/obj/item/blueprints/proc/detect_room(var/turf/first)
- var/list/turf/found = new
- var/list/turf/pending = list(first)
- while(pending.len)
- if (found.len+pending.len > 300)
+/obj/item/blueprints/proc/detect_room(var/turf/first, var/client/user)
+ var/list/found = list()
+ var/list/pending = list(first)
+ var/area/B = get_area(first)
+ var/list/areas = list(B.name)
+ do
+ if (found.len+pending.len > 800)
return ROOM_ERR_TOOLARGE
- var/turf/T = pending[1] //why byond havent list::pop()?
- pending -= T
+ var/turf/T = pending[1]
+ pending.Remove(T)
+ B = get_area(T)
for (var/dir in cardinal)
var/skip = 0
for (var/obj/structure/window/W in T)
if(dir == W.dir || (W.dir in list(NORTHEAST,SOUTHEAST,NORTHWEST,SOUTHWEST)))
- skip = 1; break
- if (skip) continue
+ skip = 1
+ break
+ if (skip)
+ continue
for(var/obj/machinery/door/window/D in T)
if(dir == D.dir)
- skip = 1; break
- if (skip) continue
+ skip = 1
+ break
+ if (skip)
+ continue
var/turf/NT = get_step(T,dir)
- if (!isturf(NT) || (NT in found) || (NT in pending))
+
+ if (!istype(NT))
+ continue
+ if("\ref[NT]" in found)
+ continue
+ if("\ref[NT]" in pending)
continue
switch(check_tile_is_border(NT,dir))
if(BORDER_NONE)
- pending+=NT
+ var/area/A = get_area(NT)
+ if( ( A.name in areas || A.name == "Space" || B.name == "Space" ) &&\
+ !( "\ref[NT]" in pending || "\ref[NT]" in found) )
+ //If it is another area, and neither of them are space AND it is not in the list of adjacent areas, then do not add it.
+ pending |= NT
+ areas |= A.name
if(BORDER_BETWEEN)
- //do nothing, may be later i'll add 'rejected' list as optimization
+ found["\ref[NT]"] = "[get_area(NT)]"
+ if(user && !locate(/image) in NT)
+ var/image/Z = image('ULIcons.dmi',NT,"7-0-0",19)
+ helper_images |= Z
+ user.images += Z
+
if(BORDER_2NDTILE)
- found+=NT //tile included to new area, but we dont seek more
+ found["\ref[NT]"] = "[get_area(NT)]" //tile included to new area, but we dont seek more
+ if(user && !locate(/image) in NT)
+ var/image/Z = image('ULIcons.dmi',NT,"7-0-0",19)
+ helper_images |= Z
+ user.images += Z
if(BORDER_SPACE)
return ROOM_ERR_SPACE
- found+=T
+ found["\ref[T]"] = "[get_area(T)]"
+ if(user)
+ for(var/image/I in user.images)
+ if(I.loc == T)
+ user.images.Remove(I)
+ del(I)
+ var/image/Z = image('ULIcons.dmi',T,"0-0-7",19)
+ helper_images |= Z
+ user.images += Z
+ while(pending.len)
return found
/*
diff --git a/code/game/objects/items/food.dm b/code/game/objects/items/food.dm
index cce942fa72..d42a66757b 100644
--- a/code/game/objects/items/food.dm
+++ b/code/game/objects/items/food.dm
@@ -82,7 +82,7 @@ MONKEY CUBE BOX
usr.put_in_hand(D)
usr << "You take a donut out of the box."
else
- D.loc = get_turf_loc(src)
+ D.loc = get_turf(src)
usr << "You take a donut out of the box."
src.update()
diff --git a/code/game/objects/items/weapons/papers_bins.dm b/code/game/objects/items/weapons/papers_bins.dm
index e284daf9ca..c3b8a87196 100644
--- a/code/game/objects/items/weapons/papers_bins.dm
+++ b/code/game/objects/items/weapons/papers_bins.dm
@@ -360,7 +360,7 @@ NOTEBOOK
usr.put_in_hand(P)
usr << "You take a paper out of the bin."
else
- P.loc = get_turf_loc(src)
+ P.loc = get_turf(src)
usr << "You take a paper out of the bin."
src.update()
diff --git a/code/game/objects/shooting_range.dm b/code/game/objects/shooting_range.dm
index 6731b3e9e2..8bb6edd4ab 100644
--- a/code/game/objects/shooting_range.dm
+++ b/code/game/objects/shooting_range.dm
@@ -52,7 +52,7 @@
user.put_in_hand(pinned_target)
user << "You take the target out of the stake."
else
- pinned_target.loc = get_turf_loc(user)
+ pinned_target.loc = get_turf(user)
user << "You take the target out of the stake."
pinned_target = null
@@ -122,7 +122,7 @@
user.put_in_hand(src)
user << "You take the target out of the stake."
else
- src.loc = get_turf_loc(user)
+ src.loc = get_turf(user)
user << "You take the target out of the stake."
stake.pinned_target = null
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 408815774e..4fcb919ef5 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -341,7 +341,7 @@
if(M)
dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
dat += "PM | "
- var/turf/mob_loc = get_turf_loc(M)
+ var/turf/mob_loc = get_turf(M)
dat += "[mob_loc.loc] |
"
else
dat += "| Head not found! |
"
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 4ca0125f63..9b4fe6ac58 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -45,7 +45,7 @@
if(src.holder.rank == "Game Master" || src.holder.rank == "Game Admin")
log_admin("[key_name(src)] played a local sound [S]")
message_admins("[key_name_admin(src)] played a local sound [S]", 1)
- playsound(get_turf_loc(src.mob), S, 50, 0, 0)
+ playsound(get_turf(src.mob), S, 50, 0, 0)
return
//feedback_add_details("admin_verb","PLS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm
index 098f1ccb9e..43052a475f 100644
--- a/code/modules/chemical/Chemistry-Recipes.dm
+++ b/code/modules/chemical/Chemistry-Recipes.dm
@@ -684,8 +684,8 @@ datum
if(chosen)
// Calculate previous position for transition
- var/turf/FROM = get_turf_loc(holder.my_atom) // the turf of origin we're travelling FROM
- var/turf/TO = get_turf_loc(chosen) // the turf of origin we're travelling TO
+ var/turf/FROM = get_turf(holder.my_atom) // the turf of origin we're travelling FROM
+ var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO
playsound(TO, 'phasein.ogg', 100, 1)
@@ -733,16 +733,16 @@ datum
var/list/critters = typesof(/obj/effect/critter) - /obj/effect/critter // list of possible critters
- playsound(get_turf_loc(holder.my_atom), 'phasein.ogg', 100, 1)
+ playsound(get_turf(holder.my_atom), 'phasein.ogg', 100, 1)
- for(var/mob/living/carbon/human/M in viewers(get_turf_loc(holder.my_atom), null))
+ for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
if(M:eyecheck() <= 0)
flick("e_flash", M.flash)
for(var/i = 1, i <= created_volume, i++)
var/chosen = pick(critters)
var/obj/effect/critter/C = new chosen
- C.loc = get_turf_loc(holder.my_atom)
+ C.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
@@ -759,9 +759,9 @@ datum
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks
// BORK BORK BORK
- playsound(get_turf_loc(holder.my_atom), 'phasein.ogg', 100, 1)
+ playsound(get_turf(holder.my_atom), 'phasein.ogg', 100, 1)
- for(var/mob/living/carbon/human/M in viewers(get_turf_loc(holder.my_atom), null))
+ for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
if(M:eyecheck() <= 0)
flick("e_flash", M.flash)
@@ -769,7 +769,7 @@ datum
var/chosen = pick(borks)
var/obj/B = new chosen
if(B)
- B.loc = get_turf_loc(holder.my_atom)
+ B.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(B, pick(NORTH,SOUTH,EAST,WEST))
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index 840a5cbb82..61ca2c72c4 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -149,7 +149,7 @@ I kind of like the right click only--the window version can get a little confusi
vents.Add(temp_vent)
- var/atom/a = get_turf_loc(temp_vent)
+ var/atom/a = get_turf(temp_vent)
ventAreas.Add(a.loc)
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
index 0f632a380b..17c2ee70f4 100644
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ b/code/modules/mob/living/carbon/alien/larva/powers.dm
@@ -23,7 +23,7 @@
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
if(vent.loc.z != loc.z)
continue
- var/atom/a = get_turf_loc(vent)
+ var/atom/a = get_turf(vent)
choices.Add(a.loc)
var/turf/startloc = loc
var/obj/selection = input("Select a destination.", "Duct System") in choices
diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm
index 63169dedad..fb1fd24104 100644
--- a/code/modules/mob/living/carbon/metroid/powers.dm
+++ b/code/modules/mob/living/carbon/metroid/powers.dm
@@ -258,7 +258,7 @@
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
if(vent.loc.z != loc.z)
continue
- var/atom/a = get_turf_loc(vent)
+ var/atom/a = get_turf(vent)
choices.Add(a.loc)
var/turf/startloc = loc
var/obj/selection = input("Select a destination.", "Duct System") in choices
diff --git a/code/modules/mob/living/carbon/monkey/powers.dm b/code/modules/mob/living/carbon/monkey/powers.dm
index 9a8f95283e..3f170b6a4d 100644
--- a/code/modules/mob/living/carbon/monkey/powers.dm
+++ b/code/modules/mob/living/carbon/monkey/powers.dm
@@ -22,7 +22,7 @@
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
if(vent.loc.z != loc.z)
continue
- var/atom/a = get_turf_loc(vent)
+ var/atom/a = get_turf(vent)
choices.Add(a.loc)
var/turf/startloc = loc
var/obj/selection = input("Select a destination.", "Duct System") in choices
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 05b1c48a28..31b0c8870a 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -354,7 +354,7 @@
user << "You start adding cables to the APC frame..."
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
if(do_after(user, 20) && C.amount >= 10)
- var/turf/T = get_turf_loc(src)
+ var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
if (prob(50) && electrocute_mob(usr, N, N))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
From 5765aac899371109a863d31ace0ed4eeedd83e31 Mon Sep 17 00:00:00 2001
From: SkyMarshal
Date: Wed, 13 Jun 2012 17:28:03 -0700
Subject: [PATCH 04/53] Fuck it, good enough for now.
---
code/game/area/areas.dm | 21 +++++++++++++++++----
code/game/objects/items/blueprints.dm | 4 +++-
2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 18967989a5..629e420d52 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -395,14 +395,27 @@
/area/proc/absorb(var/area/A)
if(!istype(A))
return
+ var/oldname = A.name
+ var/list/other_related = A.related
+ var/area/other_master = A.master
+ other_related -= other_master
var/list/total_contents = list()
- for(var/area/RA in A.related)
+ for(var/area/RA in other_related)
+ RA.sd_lighting = 0
total_contents |= RA.contents
- RA.contents = list()
+ del RA.contents
+ del RA.related
+ RA.master = null
+ other_master.master = null
+ del other_master.related
+ total_contents |= other_master.contents
+ del other_master.contents
+ for(var/area/RA in other_related)
+ del(RA)
src += total_contents
spawn(5)
power_change()
- set_area_machinery_title()
+ set_area_machinery_title(oldname)
/area/proc/set_area_machinery_title(var/oldtitle)
@@ -418,4 +431,4 @@
for(var/obj/machinery/atmospherics/unary/vent_pump/M in RA)
M.name = dd_replacetext(M.name,oldtitle,name)
for(var/obj/machinery/door/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,name)
+ M.name = dd_replacetext(M.name,oldtitle,name)
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 11ea167058..575c49d81c 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -220,6 +220,8 @@ move an amendment to the designs.
if("Merge")
+ usr << "We appologize, but this function is not availible"
+ /*
var/list/turf/search_remaining_turfs = A.contents.Copy()
var/list/turfs = list()
for(var/turf/simulated/T in search_remaining_turfs)
@@ -316,7 +318,7 @@ move an amendment to the designs.
return
else
- return
+ return*/
if("Cancel")
return
From 3f19d356d6cdd1739f489e1592a1175ef29b4efd Mon Sep 17 00:00:00 2001
From: caelaislinn
Date: Thu, 14 Jun 2012 22:52:23 +1000
Subject: [PATCH 05/53] wip explosions modifications
Signed-off-by: caelaislinn
---
code/ZAS/Creation.dm | 4 +-
code/defines/procs/gamehelpers.dm | 121 ++++++++++++++++++++++++++++++
code/game/objects/explosion.dm | 55 ++++++++++----
3 files changed, 165 insertions(+), 15 deletions(-)
diff --git a/code/ZAS/Creation.dm b/code/ZAS/Creation.dm
index 225fc02eff..b283cd56d4 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/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm
index 5b5b1bc884..51b4adfee4 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 3210d70d6e..47c9e3f245 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -28,22 +28,51 @@ 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)
+ //if testing indicates this is adding too much lag, roll back all shield handling
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 = 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)
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.
From abb12d1366d26f767f5e00005ba3ef145bd00b19 Mon Sep 17 00:00:00 2001
From: caelaislinn
Date: Thu, 14 Jun 2012 23:54:14 +1000
Subject: [PATCH 06/53] added some new contraband items - absinthe, a strong
alcohol with an LSD-like effect - deadrum, a poisonously sweet form of rum -
cigars - blood tomato seeds - liberty cap seeds - plump helmet seeds
* Cigars are also [still] obtainable from cigarette vending machines, if you have a coin
Signed-off-by: caelaislinn
---
code/defines/obj/supplypacks.dm | 3 +-
code/modules/chemical/Chemistry-Reagents.dm | 35 +++++++++++++++++++++
code/modules/chemical/Chemistry-Tools.dm | 16 ++++++++++
3 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm
index 7e39e7e50f..a3cc02acca 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" )
name = "Contraband crate"
cost = 30
containertype = "/obj/structure/closet/crate"
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index f033f30f5d..21aeb9a5c0 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 26bb307ea3..29e992315b 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
From 37bee15787e6e9155e915cf36b9a73e7a5ba9e55 Mon Sep 17 00:00:00 2001
From: caelaislinn
Date: Fri, 15 Jun 2012 00:06:06 +1000
Subject: [PATCH 07/53] missed some contraband additions (deadrum, sprites)
Signed-off-by: caelaislinn
---
code/defines/obj/supplypacks.dm | 2 +-
icons/obj/drinks.dmi | Bin 58562 -> 59664 bytes
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm
index a3cc02acca..98d4c78d4e 100755
--- a/code/defines/obj/supplypacks.dm
+++ b/code/defines/obj/supplypacks.dm
@@ -805,7 +805,7 @@
/datum/supply_packs/randomised/contraband
num_contained = 5
//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" )
+ 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/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 730ebee281dfdd076ea767e54d079c7555c696a0..37974b4b7dbbf5e06bc66224c5a25859c233b6f1 100644
GIT binary patch
literal 59664
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