diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index f7098594a93..abf71c4ea0d 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -93,14 +93,11 @@ Pipelines + Other Objects -> Pipe network
return ..()
/obj/machinery/atmospherics/Deconstruct()
- var/turf/T = loc
- stored.loc = T
- transfer_fingerprints_to(stored)
- if(istype(src, /obj/machinery/atmospherics/pipe))
- for(var/obj/machinery/meter/meter in T)
- if(meter.target == src)
- new /obj/item/pipe_meter(T)
- qdel(meter)
+ if(can_unwrench)
+ var/turf/T = loc
+ stored.loc = T
+ transfer_fingerprints_to(stored)
+
qdel(src)
/obj/machinery/atmospherics/proc/nullifyPipenet(datum/pipeline/P)
@@ -127,7 +124,7 @@ Pipelines + Other Objects -> Pipe network
return img
-/obj/machinery/atmospherics/proc/construction(D, P)
+/obj/machinery/atmospherics/construction(D, P)
dir = D
initialize_directions = P
var/turf/T = loc
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index 7884a5ad12c..a3bb5355947 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -40,4 +40,13 @@
return ..()
/obj/machinery/atmospherics/pipe/setPipenet(datum/pipeline/P)
- parent = P
\ No newline at end of file
+ parent = P
+
+/obj/machinery/atmospherics/pipe/Destroy()
+ var/turf/T = loc
+ for(var/obj/machinery/meter/meter in T)
+ if(meter.target == src)
+ var/obj/item/pipe_meter/PM = new (T)
+ meter.transfer_fingerprints_to(PM)
+ qdel(meter)
+ ..()
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm
index 29f16311b63..434a4b3c9e7 100644
--- a/code/ATMOSPHERICS/pipes/manifold.dm
+++ b/code/ATMOSPHERICS/pipes/manifold.dm
@@ -25,6 +25,8 @@
/obj/machinery/atmospherics/pipe/manifold/New()
color = pipe_color
+ ..()
+
switch(dir)
if(NORTH)
initialize_directions = EAST|SOUTH|WEST
@@ -34,7 +36,6 @@
initialize_directions = SOUTH|WEST|NORTH
if(WEST)
initialize_directions = NORTH|EAST|SOUTH
- ..()
/obj/machinery/atmospherics/pipe/manifold/initialize()
for(var/D in cardinal)
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index 1af635b5d18..c9754a87c48 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -176,7 +176,7 @@ var/datum/controller/vote/vote = new()
if(mode == "custom")
text += "\n[question]"
log_vote(text)
- world << "\n[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote."
+ world << "\n[text]\nType vote or click here to place your votes.\nYou have [config.vote_period/10] seconds to vote."
time_remaining = round(config.vote_period/10)
return 1
return 0
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index e98fec043ed..368a3e69c93 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -79,6 +79,105 @@
if(foundrecord)
foundrecord.fields["rank"] = assignment
+/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
+ var/list/heads = list()
+ var/list/sec = list()
+ var/list/eng = list()
+ var/list/med = list()
+ var/list/sci = list()
+ var/list/civ = list()
+ var/list/bot = list()
+ var/list/misc = list()
+ var/dat = {"
+
+
+ | Name | Rank |
+ "}
+ var/even = 0
+ // sort mobs
+ for(var/datum/data/record/t in data_core.general)
+ var/name = t.fields["name"]
+ var/rank = t.fields["rank"]
+ var/department = 0
+ if(rank in command_positions)
+ heads[name] = rank
+ department = 1
+ if(rank in security_positions)
+ sec[name] = rank
+ department = 1
+ if(rank in engineering_positions)
+ eng[name] = rank
+ department = 1
+ if(rank in medical_positions)
+ med[name] = rank
+ department = 1
+ if(rank in science_positions)
+ sci[name] = rank
+ department = 1
+ if(rank in civilian_positions)
+ civ[name] = rank
+ department = 1
+ if(rank in nonhuman_positions)
+ bot[name] = rank
+ department = 1
+ if(!department && !(name in heads))
+ misc[name] = rank
+ if(heads.len > 0)
+ dat += "| Heads |
"
+ for(name in heads)
+ dat += "| [name] | [heads[name]] |
"
+ even = !even
+ if(sec.len > 0)
+ dat += "| Security |
"
+ for(name in sec)
+ dat += "| [name] | [sec[name]] |
"
+ even = !even
+ if(eng.len > 0)
+ dat += "| Engineering |
"
+ for(name in eng)
+ dat += "| [name] | [eng[name]] |
"
+ even = !even
+ if(med.len > 0)
+ dat += "| Medical |
"
+ for(name in med)
+ dat += "| [name] | [med[name]] |
"
+ even = !even
+ if(sci.len > 0)
+ dat += "| Science |
"
+ for(name in sci)
+ dat += "| [name] | [sci[name]] |
"
+ even = !even
+ if(civ.len > 0)
+ dat += "| Civilian |
"
+ for(name in civ)
+ dat += "| [name] | [civ[name]] |
"
+ even = !even
+ // in case somebody is insane and added them to the manifest, why not
+ if(bot.len > 0)
+ dat += "| Silicon |
"
+ for(name in bot)
+ dat += "| [name] | [bot[name]] |
"
+ even = !even
+ // misc guys
+ if(misc.len > 0)
+ dat += "| Miscellaneous |
"
+ for(name in misc)
+ dat += "| [name] | [misc[name]] |
"
+ even = !even
+
+ dat += "
"
+ dat = replacetext(dat, "\n", "")
+ dat = replacetext(dat, "\t", "")
+ return dat
+
+
var/record_id_num = 1001
/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
if(H.mind && (H.mind.assigned_role != "MODE"))
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index b1ae4c99fd7..f0443ee1683 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -395,4 +395,7 @@ var/list/blood_splatter_icons = list()
return
/atom/proc/emag_act()
- return
+ return
+
+/atom/proc/narsie_act()
+ return
\ No newline at end of file
diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm
index f8974fd36c8..78a56a386f0 100644
--- a/code/game/machinery/Freezer.dm
+++ b/code/game/machinery/Freezer.dm
@@ -21,6 +21,9 @@
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
+/obj/machinery/atmospherics/unary/cold_sink/freezer/construction()
+ ..(dir,dir)
+
/obj/machinery/atmospherics/unary/cold_sink/freezer/RefreshParts()
var/H
var/T
@@ -141,6 +144,9 @@
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
+/obj/machinery/atmospherics/unary/heat_reservoir/heater/construction()
+ ..(dir,dir)
+
/obj/machinery/atmospherics/unary/heat_reservoir/heater/RefreshParts()
var/H
var/T
@@ -204,7 +210,7 @@
//user << browse(dat, "window=freezer;size=400x500")
//onclose(user, "freezer")
- var/datum/browser/popup = new(user, "freezer", "Cryo Gas Cooling System", 400, 240) // Set up the popup browser window
+ var/datum/browser/popup = new(user, "freezer", "Cryo Gas Heating System", 400, 240) // Set up the popup browser window
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.set_content(dat)
popup.open()
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index d7bde33688d..8441647f791 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -130,6 +130,7 @@
if(component_check)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc)
+ new_machine.construction()
for(var/obj/O in new_machine.component_parts)
qdel(O)
new_machine.component_parts = list()
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index eb5faffcafd..24312770103 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -18,7 +18,6 @@
/obj/machinery/atmospherics/unary/cryo_cell/New()
..()
initialize_directions = dir
- initialize()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/cryo_tube(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
@@ -29,6 +28,9 @@
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
+/obj/machinery/atmospherics/unary/cryo_cell/construction()
+ ..(dir,dir)
+
/obj/machinery/atmospherics/unary/cryo_cell/RefreshParts()
var/C
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index c6828169bd7..3f799cc41a8 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -335,8 +335,8 @@ Class Procs:
/obj/machinery/proc/default_change_direction_wrench(var/mob/user, var/obj/item/weapon/wrench/W)
if(panel_open && istype(W))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- dir = pick(WEST,EAST,SOUTH,NORTH)
- user << "You clumsily rotate [src]."
+ dir = turn(dir,-90)
+ user << "You rotate [src]."
return 1
return 0
@@ -382,3 +382,7 @@ Class Procs:
W.play_rped_sound()
return 1
return 0
+
+//called on machinery construction (i.e from frame to machinery) but not on initialization
+/obj/machinery/proc/construction()
+ return
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index eee59dd82b2..30e11d25386 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -354,12 +354,16 @@
var/atom/cur_target = null
var/scan_range = 9 //You will never see them coming
var/health = 200 //Because it lacks a cover, and is mostly to keep people from touching the syndie shuttle.
+ var/base_icon_state = "syndieturret"
+ var/projectile_type = /obj/item/projectile/bullet
+ var/fire_sound = 'sound/weapons/Gunshot.ogg'
icon = 'icons/obj/turrets.dmi'
icon_state = "syndieturret0"
/obj/machinery/gun_turret/New()
..()
take_damage(0) //check your health
+ icon_state = "[base_icon_state]" + "0"
/obj/machinery/gun_turret/ex_act(severity, target)
switch(severity)
@@ -377,7 +381,7 @@
/obj/machinery/gun_turret/update_icon()
if(state > 2 || state < 0) //someone fucked up the vars so fix them
take_damage(0)
- icon_state = "syndieturret" + "[state]"
+ icon_state = "[base_icon_state]" + "[state]"
return
@@ -479,8 +483,8 @@
return
if (targloc == curloc)
return
- playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1)
- var/obj/item/projectile/A = new /obj/item/projectile/bullet(curloc)
+ playsound(src, fire_sound, 50, 1)
+ var/obj/item/projectile/A = new projectile_type(curloc)
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 754e97444fd..c19882fb69a 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -976,7 +976,7 @@
/obj/item/clothing/tie/scarf/lightblue=1,/obj/item/clothing/tie/scarf/white=1,/obj/item/clothing/tie/scarf/black=1,
/obj/item/clothing/tie/scarf/zebra=1,/obj/item/clothing/tie/scarf/christmas=1,/obj/item/clothing/tie/stripedredscarf=1,
/obj/item/clothing/tie/stripedbluescarf=1,/obj/item/clothing/tie/stripedgreenscarf=1,/obj/item/clothing/tie/waistcoat=1,
- /obj/item/clothing/under/sundress=2,/obj/item/clothing/under/blacktango=1,/obj/item/clothing/suit/jacket=3,
+ /obj/item/clothing/under/sundress=2,/obj/item/clothing/under/stripeddress = 1, /obj/item/clothing/under/sailordress = 1, /obj/item/clothing/under/redeveninggown = 1, /obj/item/clothing/under/blacktango=1,/obj/item/clothing/suit/jacket=3,
/obj/item/clothing/glasses/regular=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1,
/obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/sneakers/black=4,
/obj/item/clothing/shoes/sandal=1)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 3b7ab8924b7..7111ef392aa 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -184,12 +184,11 @@
..()
if(severity == 3)
if(prob(25))
- density = 0
+ table_destroy(1)
/obj/structure/table/blob_act()
if(prob(75))
table_destroy(1)
- qdel(src)
return
/obj/structure/table/attack_alien(mob/living/user)
@@ -231,8 +230,11 @@
else
return 0
-
-/obj/structure/table/MouseDrop_T(obj/O, mob/user)
+/obj/structure/table/MouseDrop_T(atom/movable/O, mob/user)
+ if(ismob(O) && user == O && ishuman(user))
+ if(user.canmove)
+ climb_table(user)
+ return
if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
return
if(isrobot(user))
@@ -358,10 +360,6 @@
* TABLE CLIMBING
*/
-/obj/structure/table/MouseDrop_T(mob/target, mob/living/carbon/human/user)
- if(istype(target) && user == target && istype(user))
- if(user.canmove)
- climb_table(user)
/obj/structure/table/proc/climb_table(mob/user)
src.add_fingerprint(user)
@@ -494,21 +492,20 @@
if(1.0)
qdel(src)
if(2.0)
- qdel(src)
if(prob(50))
- new /obj/item/weapon/rack_parts(src.loc)
+ rack_destroy()
+ else
+ qdel(src)
if(3.0)
if(prob(25))
- qdel(src)
- new /obj/item/weapon/rack_parts(src.loc)
+ rack_destroy()
/obj/structure/rack/blob_act()
if(prob(75))
qdel(src)
return
else if(prob(50))
- new /obj/item/weapon/rack_parts(src.loc)
- qdel(src)
+ rack_destroy()
return
/obj/structure/rack/CanPass(atom/movable/mover, turf/target, height=0)
@@ -534,9 +531,8 @@
/obj/structure/rack/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/weapon/rack_parts( src.loc )
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- qdel(src)
+ rack_destroy()
return
if(isrobot(user))
@@ -559,38 +555,42 @@
"You kick [src].")
if(HULK in user.mutations)
- health -= 5
+ rack_destroy()
else
health -= rand(1,2)
- healthcheck()
+ healthcheck()
/obj/structure/rack/attack_alien(mob/living/user)
user.do_attack_animation(src)
visible_message("[user] slices [src] apart!")
- new /obj/item/weapon/rack_parts(loc)
- density = 0
- qdel(src)
+ rack_destroy()
/obj/structure/rack/attack_animal(mob/living/simple_animal/user)
if(user.environment_smash)
user.do_attack_animation(src)
visible_message("[user] smashes [src] apart!")
- new /obj/item/weapon/rack_parts(loc)
- density = 0
- qdel(src)
+ rack_destroy()
/obj/structure/rack/attack_tk() // no telehulk sorry
return
/obj/structure/rack/proc/healthcheck()
if(health <= 0)
- density = 0
- var/obj/item/weapon/rack_parts/newparts = new(loc)
- transfer_fingerprints_to(newparts)
- qdel(src)
+ rack_destroy()
return
+/*
+ * Rack destruction
+ */
+
+/obj/structure/rack/proc/rack_destroy()
+ density = 0
+ var/obj/item/weapon/rack_parts/newparts = new(loc)
+ transfer_fingerprints_to(newparts)
+ qdel(src)
+
+
/*
* Rack Parts
*/
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 9e641352434..0be1070747c 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -158,3 +158,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
make_plating()
else if(prob(50))
ReplaceWithLattice()
+
+/turf/simulated/floor/narsie_act()
+ if(prob(20))
+ ChangeTurf(/turf/simulated/floor/engine/cult)
\ No newline at end of file
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index f1033633551..51f52b5de4c 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -8,7 +8,7 @@
luminosity = 5
icon_state = "light_on"
floor_tile = /obj/item/stack/tile/light
- broken_states = list("light-broken")
+ broken_states = list("light_broken")
var/on = 1
var/state //0 = fine, 1 = flickering, 2 = breaking, 3 = broken
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index fd6b3e5e452..bd74639bd6d 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -110,6 +110,9 @@
name = "engraved floor"
icon_state = "cult"
+/turf/simulated/floor/engine/cult/narsie_act()
+ return
+
/turf/simulated/floor/engine/n20/New()
..()
var/datum/gas_mixture/adding = new
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index fed36f77b71..d30300fd82e 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -286,4 +286,8 @@
return
if(current_size == STAGE_FOUR)
if(prob(30))
- dismantle_wall()
\ No newline at end of file
+ dismantle_wall()
+
+/turf/simulated/wall/narsie_act()
+ if(prob(20))
+ ChangeTurf(/turf/simulated/wall/cult)
\ No newline at end of file
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 2f773d52b04..9c6b1529172 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -13,6 +13,9 @@
new /obj/effect/decal/cleanable/blood(src)
new /obj/effect/decal/remains/human(src)
+/turf/simulated/wall/cult/narsie_act()
+ return
+
/turf/simulated/wall/vault
icon_state = "rockvault"
diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm
index 7ef70f87ae2..381b167fb6e 100644
--- a/code/modules/awaymissions/maploader/reader.dm
+++ b/code/modules/awaymissions/maploader/reader.dm
@@ -2,6 +2,9 @@
//SS13 Optimized Map loader
//////////////////////////////////////////////////////////////
+//global datum that will preload variables on atoms instanciation
+var/global/dmm_suite/preloader/_preloader = null
+
/**
* Construct the model map and control the loading process
@@ -163,7 +166,7 @@
//first instance the /area and remove it from the members list
index = members.len
var/atom/instance
- var/dmm_suite/preloader/_preloader = new(members_attributes[index])//preloader for assigning set variables on atom creation
+ _preloader = new(members_attributes[index])//preloader for assigning set variables on atom creation
instance = locate(members[index])
instance.contents.Add(locate(xcrd,ycrd,zcrd))
@@ -191,34 +194,6 @@
T = UT
index++
-
- //Replace the previous part of the code with this if it's unsafe to assume tiles have ALWAYS an /area AND a /turf
- /*while(members.len > 0)
- var/length = members.len
- var/member = members[length]
-
- if(ispath(member,/area))
- var/atom/instance
- var/dmm_suite/preloader/_preloader = new(members_attributes[length])
-
- instance = locate(member)
- instance.contents.Add(locate(xcrd,ycrd,zcrd))
-
- if(_preloader && instance)
- _preloader.load(instance)
-
- members.Remove(member)
- continue
-
- else if(ispath(member,/turf))
- instance_atom(member,members_attributes[length],xcrd,ycrd,zcrd)
- members.Remove(member)
- continue
-
- else
- break
- */
-
//finally instance all remainings objects/mobs
for(index=1,index < first_turf_index,index++)
instance_atom(members[index],members_attributes[index],xcrd,ycrd,zcrd)
@@ -230,11 +205,11 @@
//Instance an atom at (x,y,z) and gives it the variables in attributes
/dmm_suite/proc/instance_atom(var/path,var/list/attributes, var/x, var/y, var/z)
var/atom/instance
- var/dmm_suite/preloader/_preloader = new(attributes)
+ _preloader = new(attributes, path)
- instance = new path (locate(x,y,z), _preloader)//first preloader pass
+ instance = new path (locate(x,y,z))//first preloader pass
- if(_preloader && instance)//second preloader pass, as some variables may have been reset/changed by New()
+ if(_preloader && instance)//second preloader pass, for those atoms that don't ..() in New()
_preloader.load(instance)
return instance
@@ -242,9 +217,9 @@
//text trimming (both directions) helper proc
//optionally removes quotes before and after the text (for variable name)
/dmm_suite/proc/trim_text(var/what as text,var/trim_quotes=0)
- while(length(what) && (findtext(what," ",1,2)))// || findtext(what,quote,1,2)))
+ while(length(what) && (findtext(what," ",1,2)))
what=copytext(what,2,0)
- while(length(what) && (findtext(what," ",length(what),0)))// || findtext(what,quote,length(what),0)))
+ while(length(what) && (findtext(what," ",length(what),0)))
what=copytext(what,1,length(what))
if(trim_quotes)
while(length(what) && (findtext(what,quote,1,2)))
@@ -298,14 +273,18 @@
else if(isnum(text2num(trim_right)))
trim_right = text2num(trim_right)
- //Check for file
- else if(copytext(trim_right,1,2) == "'")
- trim_right = file(copytext(trim_right,2,length(trim_right)))
+ //Check for null
+ else if(trim_right == "null")
+ trim_right = null
//Check for list
else if(copytext(trim_right,1,5) == "list")
trim_right = text2list(copytext(trim_right,6,length(trim_right)))
+ //Check for file
+ else if(copytext(trim_right,1,2) == "'")
+ trim_right = file(copytext(trim_right,2,length(trim_right)))
+
to_return[trim_left] = trim_right
else//simple var
@@ -323,10 +302,11 @@
placed.opacity = 1
placed.underlays += turfs_underlays
-//atom creation method that preloads variables before creation
-/atom/New(atom/loc, dmm_suite/preloader/_dmm_preloader)
- if(istype(_dmm_preloader, /dmm_suite/preloader))
- _dmm_preloader.load(src)
+//atom creation method that preloads variables at creation
+/atom/New()
+ if(_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New()
+ _preloader.load(src)
+
. = ..()
//////////////////
@@ -336,12 +316,15 @@
/dmm_suite/preloader
parent_type = /datum
var/list/attributes
+ var/target_path
-/dmm_suite/preloader/New(list/the_attributes)
+/dmm_suite/preloader/New(var/list/the_attributes, var/path)
.=..()
if(!the_attributes.len)
Del()
+ return
attributes = the_attributes
+ target_path = path
/dmm_suite/preloader/proc/load(atom/what)
for(var/attribute in attributes)
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index a97d1f13f30..b8cfb519a50 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -163,7 +163,7 @@ var/sc_safecode5 = "[rand(0,9)]"
desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible."
move_self = 0 //Contianed narsie does not move!
grav_pull = 0 //Contained narsie does not pull stuff in!
-
+ var/uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/construct)
//Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment
/obj/singularity/narsie/sc_Narsie/admin_investigate_setup()
return
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index e6147a9de4d..88cc52f77bd 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -376,6 +376,33 @@
fitted = 0
can_adjust = 0
+/obj/item/clothing/under/stripeddress
+ name = "striped dress"
+ desc = "Fashion in space."
+ icon_state = "striped_dress"
+ item_state = "stripeddress"
+ item_color = "striped_dress"
+ fitted = 0
+ can_adjust = 0
+
+/obj/item/clothing/under/sailordress
+ name = "sailor dress"
+ desc = "Formal wear for a leading lady."
+ icon_state = "sailor_dress"
+ item_state = "sailordress"
+ item_color = "sailor_dress"
+ fitted = 0
+ can_adjust = 0
+
+/obj/item/clothing/under/redeveninggown
+ name = "red evening gown"
+ desc = "Fancy dress for space bar singers."
+ icon_state = "red_evening_gown"
+ item_state = "redeveninggown"
+ item_color = "red_evening_gown"
+ fitted = 0
+ can_adjust = 0
+
/obj/item/clothing/under/maid
name = "maid costume"
desc = "Maid in China."
diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food&drinks/food/snacks_pastry.dm
index 319b1db0562..af97eab4323 100644
--- a/code/modules/food&drinks/food/snacks_pastry.dm
+++ b/code/modules/food&drinks/food/snacks_pastry.dm
@@ -211,21 +211,10 @@
name = "\improper Donk-pocket"
desc = "The food of choice for the seasoned traitor."
icon_state = "donkpocket"
- var/warm = 0
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/New()
..()
reagents.add_reagent("nutriment", 4)
- reagents.add_reagent("sugar", 5)
-
-/obj/item/weapon/reagent_containers/food/snacks/donkpocket/proc/cooltime() //Not working, derp?
- if(warm)
- spawn(4200) //ew
- warm = 0
- reagents.del_reagent("tricordrazine")
- reagents.add_reagent("sugar", 5)
- name = initial(name)
- return
/obj/item/weapon/reagent_containers/food/snacks/fortunecookie
name = "fortune cookie"
diff --git a/code/modules/food&drinks/recipes/microwave/recipes_pastry.dm b/code/modules/food&drinks/recipes/microwave/recipes_pastry.dm
index 8320a99f771..b7621899467 100644
--- a/code/modules/food&drinks/recipes/microwave/recipes_pastry.dm
+++ b/code/modules/food&drinks/recipes/microwave/recipes_pastry.dm
@@ -71,34 +71,10 @@
/datum/recipe/donkpocket
reagents = list("flour" = 5)
items = list(
- /obj/item/weapon/reagent_containers/food/snacks/faggot,
+ /obj/item/weapon/reagent_containers/food/snacks/faggot
)
- result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL
+ result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket
-/datum/recipe/donkpocket/proc/warm_up(var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked)
- being_cooked.warm = 1
- being_cooked.reagents.add_reagent("tricordrazine", 5)
- being_cooked.reagents.del_reagent("sugar")
- being_cooked.bitesize = 6
- being_cooked.name = "Warm " + being_cooked.name
- being_cooked.cooltime()
-
-/datum/recipe/donkpocket/make_food(var/obj/container as obj)
- var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked = ..(container)
- warm_up(being_cooked)
- return being_cooked
-
-/datum/recipe/donkpocket/warm
- reagents = list() //This is necessary since this is a child object of the above recipe and we don't want donk pockets to need flour
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/donkpocket
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL
- make_food(var/obj/container as obj)
- var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked = locate() in container
- if(being_cooked && !being_cooked.warm)
- warm_up(being_cooked)
- return being_cooked
////////////////////////////////////////////////MUFFINS////////////////////////////////////////////////
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index f7da665c052..703d4b577e0 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -301,3 +301,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 0
usr.visible_message("[src] points to [A]")
return 1
+
+/mob/dead/observer/verb/view_manfiest()
+ set name = "View Crew Manifest"
+ set category = "Ghost"
+
+ var/dat
+ dat += "Crew Manifest
"
+ dat += data_core.get_manifest()
+
+ src << browse(dat, "window=manifest;size=370x420;can_close=1")
\ No newline at end of file
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index a6c371d15fe..b4d6f44b902 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -762,6 +762,13 @@
/mob/living/singularity_pull(S)
step_towards(src,S)
+/mob/living/narsie_act()
+ if(client)
+ makeNewConstruct(/mob/living/simple_animal/construct/harvester, src, null, 1)
+ spawn_dust()
+ gib()
+ return
+
/mob/living/proc/do_attack_animation(atom/A)
var/pixel_x_diff = 0
var/pixel_y_diff = 0
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index fda757d8aed..31b691a9071 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -261,6 +261,8 @@ var/list/department_radio_keys = list(
if(stuttering)
message = stutter(message)
+ message = capitalize(message)
+
return message
/mob/living/proc/radio(message, message_mode, steps)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index f52831f11af..2f515596d37 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -70,7 +70,8 @@
Proj.on_hit(src, 0)
return 0
-
+/mob/living/simple_animal/construct/narsie_act()
+ return
/////////////////Juggernaut///////////////
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index fd087516a33..72c56c7f554 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -25,10 +25,13 @@
var/output = "Setup Character
"
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
- if(!ready) output += "Declare Ready
"
- else output += "You are ready Cancel
"
+ if(ready)
+ output += "\[ Ready | Not Ready \]
"
+ else
+ output += "\[ Ready | Not Ready \]
"
else
+ output += "View the Crew Manifest
"
output += "Join Game!
"
output += "Observe
"
@@ -98,7 +101,10 @@
return 1
if(href_list["ready"])
- ready = text2num(href_list["ready"])
+ if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) // Make sure we don't ready up after the round has started
+ ready = !ready
+ else
+ ready = 0
if(href_list["refresh"])
src << browse(null, "window=playersetup") //closes the player setup window
@@ -136,6 +142,9 @@
return
LateChoices()
+ if(href_list["manifest"])
+ ViewManifest()
+
if(href_list["SelectedJob"])
if(!enter_allowed)
@@ -364,6 +373,12 @@
return new_character
+/mob/new_player/proc/ViewManifest()
+ var/dat = ""
+ dat += "Crew Manifest
"
+ dat += data_core.get_manifest(OOC = 1)
+
+ src << browse(dat, "window=manifest;size=370x420;can_close=1")
/mob/new_player/Move()
return 0
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index c33bc19bff7..1ed275131b6 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -10,7 +10,6 @@
move_self = 1 //Do we move on our own?
grav_pull = 5 //How many tiles out do we pull?
consume_range = 6 //How many tiles out do we eat
- var/uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/construct)
/obj/singularity/narsie/large
name = "Nar-Sie"
@@ -84,25 +83,7 @@
/obj/singularity/narsie/consume(var/atom/A)
- if(is_type_in_list(A, uneatable))
- return 0
-
- if(istype(A,/mob/living/))
- var/mob/living/C = A
- if(C.client)
- makeNewConstruct(/mob/living/simple_animal/construct/harvester, C, null, 1)
- C.spawn_dust()
- C.gib()
- return
-
- if(isturf(A))
- var/turf/T = A
- if(istype(T, /turf/simulated/floor) && !istype(T, /turf/simulated/floor/engine/cult))
- if(prob(20)) T.ChangeTurf(/turf/simulated/floor/engine/cult)
-
- else if(istype(T,/turf/simulated/wall) && !istype(T, /turf/simulated/wall/cult))
- if(prob(20)) T.ChangeTurf(/turf/simulated/wall/cult)
- return
+ A.narsie_act()
/obj/singularity/narsie/ex_act() //No throwing bombs at it either. --NEO
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index f902ae5917d..240b2378209 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -83,23 +83,28 @@
M.drop_item()
return
+ if(isliving(user))
+ var/mob/living/L = user
+ if(!can_trigger_gun(L))
+ return
+
+ process_fire(target,user,flag,params)
+
+/obj/item/weapon/gun/proc/can_trigger_gun(mob/living/user)
if (!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
- return
+ return 0
if(trigger_guard)
- if(istype(user, /mob/living))
- var/mob/living/M = user
- if (HULK in M.mutations)
- M << "Your meaty finger is much too large for the trigger guard!"
- return
+ if (HULK in user.mutations)
+ user << "Your meaty finger is much too large for the trigger guard!"
+ return 0
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.dna && NOGUNS in H.dna.species.specflags)
user << "Your fingers don't fit in the trigger guard!"
- return
-
- process_fire(target,user,flag,params)
+ return 0
+ return 1
/obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, var/message = 1, params)
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 49727229591..c829cff0c4a 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -175,7 +175,7 @@
return
/obj/item/weapon/gun/projectile/revolver/russian/attack_self(mob/user as mob)
- if(!spun && get_ammo(0,0))
+ if(!spun && can_shoot())
user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.")
Spin()
else
@@ -193,34 +193,35 @@
user << "[src] is empty."
/obj/item/weapon/gun/projectile/revolver/russian/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params)
- if(!spun && get_ammo(0,0))
- user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.")
- Spin()
- ..()
- spun = 0
-
-/obj/item/weapon/gun/projectile/revolver/russian/attack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj)
- if(!spun && get_ammo(0,0))
- user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.")
- Spin()
+ if(user.a_intent == "harm") // Flogging action
+ return
+ if(isliving(user))
+ if(!can_trigger_gun(user))
+ return
+ if(target != user)
+ user << "A mechanism prevents you from shooting anyone but yourself."
return
-
- if(target == user)
- if(!chambered)
- user.visible_message("*click*", "*click*")
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(!spun)
+ user << "You need to spin the revolver's chamber first."
return
- if(isliving(target) && isliving(user))
- var/obj/item/organ/limb/affecting = user.zone_sel.selecting
- if(affecting == "head")
- var/obj/item/ammo_casing/AC = chambered
- if(AC.fire(user, user))
+ spun = 0
+
+ if(chambered)
+ var/obj/item/ammo_casing/AC = chambered
+ if(AC.fire(user, user))
+ playsound(user, fire_sound, 50, 1)
+ var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
+ var/limb_name = affecting.getDisplayName()
+ if(affecting == "head" || affecting == "eyes" || affecting == "mouth")
user.apply_damage(300, BRUTE, affecting)
- playsound(user, fire_sound, 50, 1)
- user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a [istype(AC.BB, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!")
- return
+ user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a gunshot!")
else
- user.visible_message("*click*", "*click*")
- return
- ..()
+ user.visible_message("[user.name] cowardly fires [src] at \his [limb_name]!", "You cowardly fire [src] at your [limb_name]!", "You hear a gunshot!")
+ return
+
+ user.visible_message("*click*")
+ playsound(user, 'sound/weapons/empty.ogg', 100, 1)
diff --git a/config/admins.txt b/config/admins.txt
index 9cf93d215e0..cec937826ec 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -72,3 +72,4 @@ tkdrg = Game Master
Cuboos = Game Master
thunder12345 = Game Master
wjohnston = Game Master
+mandurrh = Game Master
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 3adb98612ea..30334b16415 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index c293586dc20..9cee4e8a3bb 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ