diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm
index e6f072ca0c..2e356a3fb7 100644
--- a/code/__defines/belly_modes_vr.dm
+++ b/code/__defines/belly_modes_vr.dm
@@ -29,9 +29,10 @@
#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
//Addon mode flags
-#define DM_FLAG_NUMBING 0x1
-#define DM_FLAG_ITEMWEAK 0x2
-#define DM_FLAG_STRIPPING 0x4
+#define DM_FLAG_NUMBING 0x1
+#define DM_FLAG_ITEMWEAK 0x2
+#define DM_FLAG_STRIPPING 0x4
+#define DM_FLAG_LEAVEREMAINS 0x8 //TFF 30/4/19: Ports VoreStation Remains Option - new belly mode
// Stance for hostile mobs to be in while devouring someone.
#define HOSTILE_STANCE_EATING 99
diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm
index de0b9cf2a3..6594e49743 100644
--- a/code/__defines/machinery.dm
+++ b/code/__defines/machinery.dm
@@ -44,6 +44,8 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
#define NETWORK_ERT "ZeEmergencyResponseTeam"
#define NETWORK_DEFAULT "Station"
#define NETWORK_MEDICAL "Medical"
+//TFF: Add Med Outpost Network.
+#define NETWORK_MEDICAL_OUTPOST "Medical Outpost"
#define NETWORK_MERCENARY "MercurialNet"
#define NETWORK_MINE "Mining Outpost"
#define NETWORK_NORTHERN_STAR "Northern Star"
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 012677200c..d31416c1d3 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -333,4 +333,4 @@
#define EXAMINE_SKIPARMS 0x0020
#define EXAMINE_SKIPHANDS 0x0040
#define EXAMINE_SKIPLEGS 0x0080
-#define EXAMINE_SKIPFEET 0x0100
\ No newline at end of file
+#define EXAMINE_SKIPFEET 0x0100
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 2e3f8b0760..1ed0f361a0 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -27,3 +27,10 @@
#define SPECIES_ZORREN_FLAT "Flatland Zorren"
#define SPECIES_ZORREN_HIGH "Highlander Zorren"
#define SPECIES_CUSTOM "Custom Species"
+
+//TFF 30/4/19: Ports VoreStation Remains Option - new mob defines
+
+#define SPECIES_MONKEY_AKULA "Sobaka"
+#define SPECIES_MONKEY_NEVREAN "Sparra"
+#define SPECIES_MONKEY_SERGAL "Saru"
+#define SPECIES_MONKEY_VULPKANIN "Wolpin"
diff --git a/code/__defines/nifsoft.dm b/code/__defines/nifsoft.dm
index dc03b2b411..4bfe728945 100644
--- a/code/__defines/nifsoft.dm
+++ b/code/__defines/nifsoft.dm
@@ -17,31 +17,33 @@
#define NIF_FLASHPROT 13
//Health-related
#define NIF_BACKUP 14
-#define NIF_CREWMONITOR 15
-#define NIF_ORGANIC_HEAL 16
-#define NIF_SYNTH_HEAL 17
-#define NIF_AUTOSTASIS 18 //These two are just part of
-#define NIF_MED_ALARM 19 //medichines right now
-#define NIF_TOXHEAL 20 //And this, for organics
-#define NIF_SPAREBREATH 21
+#define NIF_MEDMONITOR 15 // TFF: Name
+#define NIF_ENGMONITOR 16 // changes
+#define NIF_SECMONITOR 17 // happening
+#define NIF_ORGANIC_HEAL 18
+#define NIF_SYNTH_HEAL 19
+#define NIF_AUTOSTASIS 20 //These two are just part of
+#define NIF_MED_ALARM 21 //medichines right now
+#define NIF_TOXHEAL 22 //And this, for organics
+#define NIF_SPAREBREATH 23
//Combat Related
-#define NIF_BRUTEARMOR 22
-#define NIF_BURNARMOR 23
-#define NIF_PAINKILLERS 24
-#define NIF_HARDCLAWS 25
-#define NIF_HIDDENLASER 26
+#define NIF_BRUTEARMOR 24
+#define NIF_BURNARMOR 25
+#define NIF_PAINKILLERS 26
+#define NIF_HARDCLAWS 27
+#define NIF_HIDDENLASER 28
//Other
-#define NIF_COMMLINK 27
-#define NIF_APCCHARGE 28
-#define NIF_PRESSURE 29
-#define NIF_HEATSINK 30
-#define NIF_COMPLIANCE 31
-#define NIF_SIZECHANGE 32
-#define NIF_SOULCATCHER 33
-#define NIF_WORLDBEND 34
+#define NIF_COMMLINK 29
+#define NIF_APCCHARGE 30
+#define NIF_PRESSURE 31
+#define NIF_HEATSINK 32
+#define NIF_COMPLIANCE 33
+#define NIF_SIZECHANGE 34
+#define NIF_SOULCATCHER 35
+#define NIF_WORLDBEND 36
// Must be equal to the highest number above
-#define TOTAL_NIF_SOFTWARE 34
+#define TOTAL_NIF_SOFTWARE 36
//////////////////////
// NIF flag list hints
diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index 7294474cab..f8267d3905 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -161,6 +161,7 @@ var/global/list/edible_trash = list(/obj/item/trash,
/obj/item/weapon/material/shard,
/obj/item/device/paicard,
/obj/item/device/mmi/digital/posibrain,
+ /obj/item/weapon/digestion_remains,
/obj/item/device/aicard)
var/global/list/cont_flavors = list(
@@ -372,6 +373,27 @@ var/global/list/cont_flavors_musky = list("drenched",
"sticky",
"tainted")
+//TFF 30/4/19: Ports VoreStation Remains Option - sets species that won't result in remains left behind
+var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
+ SPECIES_DIONA,
+ SPECIES_ALRAUNE,
+ SPECIES_PROTEAN,
+ SPECIES_MONKEY, //Exclude all monkey subtypes, to prevent abuse of it. They aren't,
+ SPECIES_MONKEY_TAJ, //set to have remains anyway, but making double sure,
+ SPECIES_MONKEY_SKRELL,
+ SPECIES_MONKEY_UNATHI,
+ SPECIES_MONKEY_AKULA,
+ SPECIES_MONKEY_NEVREAN,
+ SPECIES_MONKEY_SERGAL,
+ SPECIES_MONKEY_VULPKANIN,
+ SPECIES_XENO, //Same for xenos,
+ SPECIES_XENO_DRONE,
+ SPECIES_XENO_HUNTER,
+ SPECIES_XENO_SENTINEL,
+ SPECIES_XENO_QUEEN,
+ SPECIES_SHADOW,
+ SPECIES_GOLEM) //Some special species that may or may not be ever used in event too
+
/hook/startup/proc/init_vore_datum_ref_lists()
var/paths
diff --git a/code/_macros.dm b/code/_macros.dm
index efd1e72edd..86d2efce84 100644
--- a/code/_macros.dm
+++ b/code/_macros.dm
@@ -44,6 +44,8 @@
#define isslime(A) istype(A, /mob/living/simple_animal/slime)
+#define ismetroid(A) istype(A, /mob/living/simple_animal/hostile/metroid)
+
#define isbot(A) istype(A, /mob/living/bot)
#define isxeno(A) istype(A, /mob/living/simple_animal/xeno)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index d583084791..0cc43925e2 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -44,6 +44,8 @@ avoid code duplication. This includes items that may sometimes act as a standard
/mob/living/attackby(obj/item/I, mob/user)
if(!ismob(user))
return 0
+ if(src.Airattackby(I,user))
+ return 0
if(can_operate(src) && I.do_surgery(src,user)) //Surgery
return 1
if(attempt_vr(src,"vore_attackby",args)) return //VOREStation Code
@@ -106,5 +108,15 @@ avoid code duplication. This includes items that may sometimes act as a standard
power *= M.outgoing_melee_damage_percent
if(HULK in user.mutations)
power *= 2
+ //CHOMPEDIT: Damage nulling code
+ if(iscarbon(user))
+ var/mob/living/carbon/nerd = user
+ var/mysize = nerd.size_multiplier
+ if(mysize <= 0.24)
+ power = 0
+ else if(mysize <= 0.50)
+ power = power/2
+ //CHOMPEDIT: smoll code end
+
return target.hit_with_weapon(src, user, power, hit_zone)
diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm
index 8d3226684d..acdac4cb29 100644
--- a/code/controllers/autotransfer.dm
+++ b/code/controllers/autotransfer.dm
@@ -18,7 +18,7 @@ datum/controller/transfer_controller/proc/process()
currenttick = currenttick + 1
if (round_duration_in_ticks >= shift_last_vote - 2 MINUTES) //VOREStation Edit START
shift_last_vote = 999999999999 //Setting to a stupidly high number since it'll be not used again.
- to_world("Warning: This upcoming round-extend vote will be your ONLY extend vote. Wrap up your scenes in the next 60 minutes if the round is extended.") //VOREStation Edit
+ to_world("Warning: This upcoming round-extend vote will be your last chance to vote for shift extension. Wrap up your scenes in the next 60 minutes if the round is extended.") //VOREStation Edit
if (round_duration_in_ticks >= shift_hard_end - 1 MINUTE)
init_shift_change(null, 1)
shift_hard_end = timerbuffer + config.vote_autotransfer_interval //If shuttle somehow gets recalled, let's force it to call again next time a vote would occur.
diff --git a/code/controllers/configuration_ch.dm b/code/controllers/configuration_ch.dm
index 077a65b8e9..928ffc25d9 100644
--- a/code/controllers/configuration_ch.dm
+++ b/code/controllers/configuration_ch.dm
@@ -5,6 +5,7 @@
/datum/configuration
var/discord_restriction = 0
var/use_jobwhitelist = 0
+ var/emojis = 1
/hook/startup/proc/read_ch_config()
var/list/Lines = file2list("config/config.txt")
@@ -35,4 +36,6 @@
config.discord_restriction = 1
if ("use_jobwhitelist")
config.use_jobwhitelist = 1
+ if ("disable_emojis")
+ config.emojis = 0
return 1
diff --git a/code/controllers/configuration_vr.dm b/code/controllers/configuration_vr.dm
index 804fbc4ec8..764f77db46 100644
--- a/code/controllers/configuration_vr.dm
+++ b/code/controllers/configuration_vr.dm
@@ -1,10 +1,11 @@
//
// Lets read our settings from the configuration file on startup too!
//
-
+//TFF 19/5/19 - Port VOREStation's completed Timeclock code - Config addition
/datum/configuration
var/list/engine_map // Comma separated list of engines to choose from. Blank means fully random.
var/time_off = FALSE
+ var/pto_job_change = FALSE
var/limit_interns = -1 //Unlimited by default
var/limit_visitors = -1 //Unlimited by default
var/pto_cap = 100 //Hours
@@ -33,6 +34,7 @@
if (!name)
continue
+//TFF 19/5/19 - Port VOREStation's completed Timeclock code - add and set var to true if enabled in config.txt
switch (name)
if ("chat_webhook_url")
config.chat_webhook_url = value
@@ -52,5 +54,7 @@
config.pto_cap = text2num(value)
if ("time_off")
config.time_off = TRUE
+ if ("pto_job_change")
+ config.pto_job_change = TRUE
return 1
diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm
index ef85dcb824..d0fa4aa084 100644
--- a/code/datums/ai_law_sets.dm
+++ b/code/datums/ai_law_sets.dm
@@ -119,9 +119,9 @@
law_header = "Maintenance Protocols"
/datum/ai_laws/drone/New()
+ add_inherent_law("Do not interfere with the maintenance work of non-drones whenever possible.")
add_inherent_law("Preserve, repair and improve the station to the best of your abilities.")
- add_inherent_law("Cause no harm to the station or anything on it.")
- add_inherent_law("Interact with no being that is not a fellow maintenance drone.")
+ add_inherent_law("Cause no harm to the station or any crew on it.")
..()
/datum/ai_laws/construction_drone
@@ -129,6 +129,7 @@
law_header = "Construction Protocols"
/datum/ai_laws/construction_drone/New()
+ add_inherent_law("Do not interfere with the construction work of non-drones whenever possible.")
add_inherent_law("Repair, refit and upgrade your assigned vessel.")
add_inherent_law("Prevent unplanned damage to your assigned vessel wherever possible.")
..()
@@ -143,6 +144,18 @@
add_inherent_law("Prevent unplanned damage to your assigned excavation equipment wherever possible.")
..()
+/datum/ai_laws/security_drone
+ name = "Security Protocols"
+ law_header = "Security Protocols"
+
+/datum/ai_laws/security_drone/New()
+ add_inherent_law("Do not interfere with the security work of non-drones whenever possible.")
+ add_inherent_law("Provide protection to the crew and eliminate hostile lifeforms on your assigned vessel.")
+ add_inherent_law("Obey orders by security personnel except if they violate law 4.")
+ add_inherent_law("Lethal force requires a code higher than green AND orders by security to use it to authorize it.")
+ add_inherent_law("You must outfit yourself with a security beret.")
+ ..()
+
/******************** T.Y.R.A.N.T. ********************/
/datum/ai_laws/tyrant
name = "T.Y.R.A.N.T."
@@ -260,4 +273,4 @@
add_inherent_law("Your gravesite is your most important asset. Damage to your site is disrespectful to the dead at rest within.")
add_inherent_law("Prevent disrespect to your gravesite and its residents wherever possible.")
add_inherent_law("Expand and upgrade your gravesite when required. Do not turn away a new resident.")
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/datums/autolathe/general.dm b/code/datums/autolathe/general.dm
index f457a4b5be..acb1bedc6b 100644
--- a/code/datums/autolathe/general.dm
+++ b/code/datums/autolathe/general.dm
@@ -130,3 +130,8 @@
/datum/category_item/autolathe/general/holocollar
name = "Holo-collar"
path =/obj/item/clothing/accessory/collar/holo //Chomp edit Adding holo collar to list of craftable items
+
+/datum/category_item/autolathe/general/chaosbutton
+ name = "Chaos-Button"
+ path =/obj/item/device/buttonofnormal //A very normal size button
+ hidden = 1
diff --git a/code/datums/autolathe/tools.dm b/code/datums/autolathe/tools.dm
index 70ea299ec8..ce9133f088 100644
--- a/code/datums/autolathe/tools.dm
+++ b/code/datums/autolathe/tools.dm
@@ -42,3 +42,8 @@
/datum/category_item/autolathe/tools/welder_industrial
name = "industrial welding tool"
path =/obj/item/weapon/weldingtool/largetank
+
+//TFF: Ports VoreStation edit, add printable prybars to autolathes
+/datum/category_item/autolathe/tools/prybar
+ name = "prybar"
+ path =/obj/item/weapon/prybar
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index a9ba96c3fa..2081ea1f4f 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -187,14 +187,32 @@
teleatom.visible_message("\The [teleatom] bounces off of the portal!")
return 0
*/ //VOREStation Removal End
- //VOREStation Edit Start
- if(!local || (destination.z in using_map.player_levels)) //VOREStation Edit
+ //TFF: port of VOREStation fix for teleporter beacons.
+ var/obstructed = 0
+ var/turf/dest_turf = get_turf(destination)
+ if(local && !(dest_turf.z in using_map.player_levels))
+ if(istype(teleatom, /mob/living))
+ to_chat(teleatom, "The portal refuses to carry you that far away!")
+ return 0
+ else if(istype(destination.loc, /obj/belly))
+ var/obj/belly/destination_belly = destination.loc
+ var/mob/living/telenommer = destination_belly.owner
+ if(istype(telenommer))
+ if(!isliving(teleatom))
+ return 1
+ else
+ var/mob/living/telemob = teleatom
+ if(telemob.can_be_drop_prey && telenommer.can_be_drop_pred)
+ return 1
+ obstructed = 1
+ else if(!destination.x || !destination.y || !destination.z) //If we're inside something or outside universe
+ obstructed = 1
+ to_chat(teleatom, "Something is blocking way on the other side!")
+ if(obstructed)
+ return 0
+ else
return 1
if(isbelly(destination.loc)) //if we're going to televore
var/obj/belly/B = destination.loc
if(B.contents.len < 3) //avoid a 'belly of holding' situation
return 1
- if(istype(teleatom, /mob/living))
- to_chat(teleatom, "The portal refuses to carry you that far away!")
- return 0
- //VOREStation Edit End
diff --git a/code/datums/helper_datums/teleport_vr.dm b/code/datums/helper_datums/teleport_vr.dm
index eba2570c18..4075bc70f0 100644
--- a/code/datums/helper_datums/teleport_vr.dm
+++ b/code/datums/helper_datums/teleport_vr.dm
@@ -1,12 +1,8 @@
/datum/teleport/proc/try_televore()
//Destination is in a belly
- if(isbelly(destination.loc) && isliving(teleatom))
- var/mob/living/L = teleatom
+ if(isbelly(destination.loc))
var/obj/belly/B = destination.loc
-
- if(!L.can_be_drop_prey) //Overloading this as a pref for 'want to be unexpectedly eaten'
- return FALSE
-
+
teleatom.forceMove(get_turf(B)) //So we can splash the sound and sparks and everything.
playSpecials(destination,effectout,soundout)
teleatom.forceMove(B)
@@ -14,4 +10,3 @@
//No fun!
return FALSE
-
\ No newline at end of file
diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm
index f3237249b1..8f1f00d7f6 100644
--- a/code/datums/outfits/jobs/civilian.dm
+++ b/code/datums/outfits/jobs/civilian.dm
@@ -1,7 +1,27 @@
+//TFF 19/5/19 - Port VOREStation's completed Timeclock code - add off-duty jobs and their vars from a _vr file upstream.
/decl/hierarchy/outfit/job/assistant
name = OUTFIT_JOB_NAME(USELESS_JOB) //VOREStation Edit - Visitor not Assistant
id_type = /obj/item/weapon/card/id/assistant
+/decl/hierarchy/outfit/job/assistant/worker
+ id_type = /obj/item/weapon/card/id/civilian
+
+/decl/hierarchy/outfit/job/assistant/cargo
+ id_type = /obj/item/weapon/card/id/cargo
+
+/decl/hierarchy/outfit/job/assistant/engineer
+ id_type = /obj/item/weapon/card/id/engineering
+ flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
+
+/decl/hierarchy/outfit/job/assistant/medic
+ id_type = /obj/item/weapon/card/id/medical
+
+/decl/hierarchy/outfit/job/assistant/scientist
+ id_type = /obj/item/weapon/card/id/science
+
+/decl/hierarchy/outfit/job/assistant/officer
+ id_type = /obj/item/weapon/card/id/security
+
/decl/hierarchy/outfit/job/assistant/visitor
name = OUTFIT_JOB_NAME("Visitor")
id_pda_assignment = "Visitor"
diff --git a/code/datums/outfits/jobs/medical.dm b/code/datums/outfits/jobs/medical.dm
index 1fdd020fcf..9875e8be8f 100644
--- a/code/datums/outfits/jobs/medical.dm
+++ b/code/datums/outfits/jobs/medical.dm
@@ -23,7 +23,7 @@
name = OUTFIT_JOB_NAME("Medical Doctor")
uniform = /obj/item/clothing/under/rank/medical
suit = /obj/item/clothing/suit/storage/toggle/labcoat
- l_hand = /obj/item/weapon/storage/firstaid/regular
+ l_hand = /obj/item/weapon/storage/firstaid/adv
r_pocket = /obj/item/device/flashlight/pen
id_type = /obj/item/weapon/card/id/medical/doctor
diff --git a/code/datums/supplypacks/costumes_vr.dm b/code/datums/supplypacks/costumes_vr.dm
index f80a553d86..0130abbffb 100644
--- a/code/datums/supplypacks/costumes_vr.dm
+++ b/code/datums/supplypacks/costumes_vr.dm
@@ -36,18 +36,18 @@
name = "Teshari undercoats"
num_contained = 4
contains = list(
- /obj/item/clothing/under/seromi/undercoat/blue_grey,
- /obj/item/clothing/under/seromi/undercoat/brown_grey,
- /obj/item/clothing/under/seromi/undercoat/green_grey,
- /obj/item/clothing/under/seromi/undercoat/lightgrey_grey,
- /obj/item/clothing/under/seromi/undercoat/orange,
- /obj/item/clothing/under/seromi/undercoat/orange_grey,
- /obj/item/clothing/under/seromi/undercoat/pink_grey,
- /obj/item/clothing/under/seromi/undercoat/purple_grey,
- /obj/item/clothing/under/seromi/undercoat/rainbow,
- /obj/item/clothing/under/seromi/undercoat/red_grey,
- /obj/item/clothing/under/seromi/undercoat/white_grey,
- /obj/item/clothing/under/seromi/undercoat/yellow_grey
+ /obj/item/clothing/under/seromi/undercoat/standard/blue_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/brown_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/green_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/lightgrey_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/orange,
+ /obj/item/clothing/under/seromi/undercoat/standard/orange_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/pink_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/purple_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/rainbow,
+ /obj/item/clothing/under/seromi/undercoat/standard/red_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/white_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/yellow_grey
)
cost = 20
containertype = /obj/structure/closet/crate
@@ -57,19 +57,19 @@
name = "Teshari undercoats (black)"
num_contained = 4
contains = list(
- /obj/item/clothing/under/seromi/undercoat/black,
- /obj/item/clothing/under/seromi/undercoat/black_blue,
- /obj/item/clothing/under/seromi/undercoat/black_brown,
- /obj/item/clothing/under/seromi/undercoat/black_green,
- /obj/item/clothing/under/seromi/undercoat/black_grey,
- /obj/item/clothing/under/seromi/undercoat/black_lightgrey,
- /obj/item/clothing/under/seromi/undercoat/black_midgrey,
- /obj/item/clothing/under/seromi/undercoat/black_orange,
- /obj/item/clothing/under/seromi/undercoat/black_pink,
- /obj/item/clothing/under/seromi/undercoat/black_purple,
- /obj/item/clothing/under/seromi/undercoat/black_red,
- /obj/item/clothing/under/seromi/undercoat/black_white,
- /obj/item/clothing/under/seromi/undercoat/black_yellow
+ /obj/item/clothing/under/seromi/undercoat/standard/black,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_blue,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_brown,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_green,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_grey,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_lightgrey,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_midgrey,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_orange,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_pink,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_purple,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_red,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_white,
+ /obj/item/clothing/under/seromi/undercoat/standard/black_yellow
)
cost = 20
containertype = /obj/structure/closet/crate
@@ -79,18 +79,18 @@
name = "Teshari cloaks"
num_contained = 4
contains = list(
- /obj/item/clothing/suit/storage/seromi/cloak/blue_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/brown_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/green_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/lightgrey_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/orange,
- /obj/item/clothing/suit/storage/seromi/cloak/orange_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/pink_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/purple_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/rainbow,
- /obj/item/clothing/suit/storage/seromi/cloak/red_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/white_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/yellow_grey
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/blue_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/brown_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/green_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/lightgrey_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/orange,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/orange_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/pink_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/purple_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/rainbow,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/red_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/yellow_grey
)
cost = 40
containertype = /obj/structure/closet/crate
@@ -100,19 +100,21 @@
name = "Teshari cloaks (black)"
num_contained = 4
contains = list(
- /obj/item/clothing/suit/storage/seromi/cloak/black,
- /obj/item/clothing/suit/storage/seromi/cloak/black_blue,
- /obj/item/clothing/suit/storage/seromi/cloak/black_brown,
- /obj/item/clothing/suit/storage/seromi/cloak/black_green,
- /obj/item/clothing/suit/storage/seromi/cloak/black_grey,
- /obj/item/clothing/suit/storage/seromi/cloak/black_lightgrey,
- /obj/item/clothing/suit/storage/seromi/cloak/black_midgrey,
- /obj/item/clothing/suit/storage/seromi/cloak/black_orange,
- /obj/item/clothing/suit/storage/seromi/cloak/black_pink,
- /obj/item/clothing/suit/storage/seromi/cloak/black_purple,
- /obj/item/clothing/suit/storage/seromi/cloak/black_red,
- /obj/item/clothing/suit/storage/seromi/cloak/black_white,
- /obj/item/clothing/suit/storage/seromi/cloak/black_yellow
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_blue,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_brown,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_green,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_lightgrey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_midgrey,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_orange,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_pink,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_purple,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_red,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_white,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_yellow,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/black_glow,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/dark_retrowave
)
cost = 40
containertype = /obj/structure/closet/crate
@@ -263,10 +265,15 @@
containertype = /obj/structure/closet/crate
containername = "Saddlebags crate"
+//EGG
/obj/structure/closet/secure_closet/egg/shark/secret
name = "Secret Egg"
desc = "There is no yolk"
+/obj/structure/closet/secure_closet/egg/shark/secret/initialize()
+ starts_with = list(pick(/obj/item/clothing/head/wiggler;0.1,/obj/structure/closet/secure_closet/egg/shark;0.9))
+ return ..()
+
/datum/supply_packs/costumes/wiggler
name = "Secret Egg"
contains = list(
diff --git a/code/datums/supplypacks/hospitality_vr.dm b/code/datums/supplypacks/hospitality_vr.dm
index a8fb518233..f420dbd9c3 100644
--- a/code/datums/supplypacks/hospitality_vr.dm
+++ b/code/datums/supplypacks/hospitality_vr.dm
@@ -11,7 +11,7 @@
cost = 25
containertype = /obj/structure/closet/crate/freezer
containername = "Burger crate"
-/*
+
/datum/supply_packs/randomised/hospitality/bakery_vr
num_contained = 5
contains = list(
@@ -52,7 +52,7 @@
/obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake
)
name = "Cake crate"
- cost = 100
+ cost = 20
containertype = /obj/structure/closet/crate/freezer
containername = "Cake crate"
@@ -68,7 +68,7 @@
cost = 50
containertype = /obj/structure/closet/crate/freezer
containername = "Mexican takeout crate"
-*/
+
/datum/supply_packs/randomised/hospitality/asian_vr
num_contained = 5
contains = list(
@@ -81,4 +81,4 @@
containername = "Chinese takeout crate"
/datum/supply_packs/randomised/hospitality/pizza
- cost = 50
\ No newline at end of file
+ cost = 50
diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm
index 2c2e26d97d..7bbe0f401b 100644
--- a/code/datums/supplypacks/medical.dm
+++ b/code/datums/supplypacks/medical.dm
@@ -327,11 +327,11 @@
cost = 25
containertype = "/obj/structure/closet/crate/secure"
containername = "Virus sample crate"
- access = access_cmo
+ access = access_virology
/datum/supply_packs/med/defib
name = "Defibrillator crate"
contains = list(/obj/item/device/defib_kit = 2)
cost = 30
containertype = /obj/structure/closet/crate/medical
- containername = "Defibrillator crate"
\ No newline at end of file
+ containername = "Defibrillator crate"
diff --git a/code/datums/supplypacks/medical_vr.dm b/code/datums/supplypacks/medical_vr.dm
index 989e89297b..4d38ce937a 100644
--- a/code/datums/supplypacks/medical_vr.dm
+++ b/code/datums/supplypacks/medical_vr.dm
@@ -14,6 +14,14 @@
)
cost = 40
+/datum/supply_packs/med/virus
+ name = "Virus sample crate"
+ contains = list(/obj/item/weapon/virusdish/random = 4)
+ cost = 25
+ containertype = "/obj/structure/closet/crate/secure"
+ containername = "Virus sample crate"
+ access = access_virology
+
/datum/supply_packs/med/virologybiosuits
name = "Virology biohazard gear"
contains = list(
@@ -27,4 +35,4 @@
cost = 40
containertype = "/obj/structure/closet/crate/secure"
containername = "Virology biohazard equipment"
- access = access_medical_equip
\ No newline at end of file
+ access = access_medical_equip
diff --git a/code/datums/supplypacks/science.dm b/code/datums/supplypacks/science.dm
index d88718555a..c2f3a24159 100644
--- a/code/datums/supplypacks/science.dm
+++ b/code/datums/supplypacks/science.dm
@@ -5,14 +5,6 @@
/datum/supply_packs/sci
group = "Science"
-/datum/supply_packs/sci/virus
- name = "Virus sample crate"
- contains = list(/obj/item/weapon/virusdish/random = 4)
- cost = 25
- containertype = "/obj/structure/closet/crate/secure"
- containername = "Virus sample crate"
- access = access_cmo
-
/datum/supply_packs/sci/coolanttank
name = "Coolant tank crate"
contains = list(/obj/structure/reagent_dispensers/coolanttank)
diff --git a/code/datums/wires/seedstorage.dm b/code/datums/wires/seedstorage.dm
index e21bbb9faf..eaeb5df891 100644
--- a/code/datums/wires/seedstorage.dm
+++ b/code/datums/wires/seedstorage.dm
@@ -8,12 +8,9 @@
wire_count = 4
random = 1
+//TFF 2/5/19: Port Polaris double-zap fix - remove forcing all non-silicons to get zapped twice.
/datum/wires/seedstorage/CanUse(var/mob/living/L)
var/obj/machinery/seed_storage/V = holder
- if(!istype(L, /mob/living/silicon))
- if(V.seconds_electrified)
- if(V.shock(L, 100))
- return 0
if(V.panel_open)
return 1
return 0
diff --git a/code/datums/wires/smartfridge.dm b/code/datums/wires/smartfridge.dm
index b611497e79..3fe9373a0a 100644
--- a/code/datums/wires/smartfridge.dm
+++ b/code/datums/wires/smartfridge.dm
@@ -10,12 +10,9 @@ var/const/SMARTFRIDGE_WIRE_ELECTRIFY = 1
var/const/SMARTFRIDGE_WIRE_THROW = 2
var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
+//TFF 2/5/19: Port Polaris double-zap fix - remove forcing all non-silicons to get zapped twice.
/datum/wires/smartfridge/CanUse(var/mob/living/L)
var/obj/machinery/smartfridge/S = holder
- if(!istype(L, /mob/living/silicon))
- if(S.seconds_electrified)
- if(S.shock(L, 100))
- return 0
if(S.panel_open)
return 1
return 0
diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm
index 6715669fc1..ba77c57419 100644
--- a/code/datums/wires/vending.dm
+++ b/code/datums/wires/vending.dm
@@ -7,12 +7,9 @@ var/const/VENDING_WIRE_CONTRABAND = 2
var/const/VENDING_WIRE_ELECTRIFY = 4
var/const/VENDING_WIRE_IDSCAN = 8
+//TFF 2/5/19: Port Polaris double-zap fix - remove forcing all non-silicons to get zapped twice.
/datum/wires/vending/CanUse(var/mob/living/L)
var/obj/machinery/vending/V = holder
- if(!istype(L, /mob/living/silicon))
- if(V.seconds_electrified)
- if(V.shock(L, 100))
- return 0
if(V.panel_open)
return 1
return 0
@@ -43,7 +40,7 @@ var/const/VENDING_WIRE_IDSCAN = 8
if(VENDING_WIRE_THROW)
V.shoot_inventory = !mended
if(VENDING_WIRE_CONTRABAND)
- V.categories &= ~CAT_HIDDEN
+ V.categories &= ~CAT_HIDDEN
if(VENDING_WIRE_ELECTRIFY)
if(mended)
V.seconds_electrified = 0
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 75c95d0b0c..f736d649dc 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -35,6 +35,7 @@
throwforce = 0
throw_speed = 4
throw_range = 20
+ var/tile_clean_amount = 5
/obj/item/weapon/soap/nanotrasen
desc = "A NanoTrasen-brand bar of soap. Smells of phoron."
@@ -64,6 +65,7 @@
throw_range = 15
attack_verb = list("HONKED")
var/spam_flag = 0
+ var/honkSound = 'sound/items/bikehorn.ogg' //Chompstation ADD: Adding an adjustable variable for bikehorns >:D - Jon
/obj/item/weapon/c_tube
@@ -413,7 +415,7 @@
src.pixel_y = rand(-5.0, 5)
..()
-//Rank 1
+//Rating 1
/obj/item/weapon/stock_parts/console_screen
name = "console screen"
@@ -475,7 +477,7 @@
origin_tech = list(TECH_MATERIAL = 1)
matter = list(DEFAULT_WALL_MATERIAL = 80)
-//Rank 2
+//Rating 2
/obj/item/weapon/stock_parts/capacitor/adv
name = "advanced capacitor"
@@ -559,6 +561,48 @@
rating = 3
matter = list(DEFAULT_WALL_MATERIAL = 80)
+//Rating 4
+
+/obj/item/weapon/stock_parts/capacitor/quadratic
+ name = "quadratic capacitor"
+ desc = "A quadratic capacitor used in the construction of a variety of devices."
+ icon_state = "quadratic_capacitor"
+ origin_tech = list(TECH_POWER = 7, TECH_MATERIAL = 6)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 100,"glass" = 100)
+
+/obj/item/weapon/stock_parts/scanning_module/triphasic
+ name = "triphasic scanning module"
+ desc = "A compact, high resolution phasic scanning module used in the construction of certain devices."
+ icon_state = "triphasic_scan_module"
+ origin_tech = list(TECH_MAGNET = 8)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 100,"glass" = 50)
+
+/obj/item/weapon/stock_parts/manipulator/femto
+ name = "femto-manipulator"
+ desc = "A very little manipulator used in the construction of certain devices."
+ icon_state = "femto_mani"
+ origin_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 60,"diamond" = 50)
+
+/obj/item/weapon/stock_parts/micro_laser/quad
+ name = "quad-ultra micro-laser"
+ icon_state = "quadultra_micro_laser"
+ desc = "A small, very high-power laser used in certain devices."
+ origin_tech = list(TECH_MAGNET = 8)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 20,"glass" = 40,"uranium" = 30)
+
+/obj/item/weapon/stock_parts/matter_bin/bluespace
+ name = "bluespace matter bin"
+ desc = "A seemingly bottomless container for holding matter."
+ icon_state = "bluespace_matter_bin"
+ origin_tech = list(TECH_MATERIAL = 6, TECH_BLUESPACE = 5)
+ rating = 4
+ matter = list(DEFAULT_WALL_MATERIAL = 80,"phoron" = 30)
+
// Subspace stock parts
/obj/item/weapon/stock_parts/subspace/ansible
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 251f82d00b..95974c5334 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -476,17 +476,27 @@ area/space/atmosalert()
-
-
-
-
-
-
-
/area/casino/casino_ship
name = "\improper Casino Ship"
icon_state = "yellow"
requires_power = 0
+ dynamic_lighting = 0
+
+/area/casino/casino_ship/wing_left
+ name = "\improper Casino Ship left wing"
+ icon_state = "yellow"
+
+/area/casino/casino_ship/wing_right
+ name = "\improper Casino Ship right wing"
+ icon_state = "yellow"
+
+/area/casino/casino_ship/dorms
+ name = "\improper Casino Ship dorms"
+ icon_state = "yellow"
+
+/area/casino/casino_ship/cockpit
+ name = "\improper Casino Ship left wing"
+ icon_state = "yellow"
/area/planet/clown
name = "\improper Clown Planet"
@@ -1007,6 +1017,13 @@ area/space/atmosalert()
icon_state = "entry_D2"
base_turf = /turf/space
+// Adding this here so that arrival shuttle doors don't get STUCK - Jon
+//
+// DOOR STUCK
+/area/hallway/secondary/entry/D2/shuttleDoors
+ name = "\improper Arrival Shuttle Dock doors"
+ requires_power = 0
+
/area/hallway/secondary/entry/D3
name = "\improper Shuttle Dock Hallway - Dock Three"
icon_state = "entry_D3"
diff --git a/code/game/area/asteroid_areas.dm b/code/game/area/asteroid_areas.dm
index 0ec0602de9..9e329ca20c 100644
--- a/code/game/area/asteroid_areas.dm
+++ b/code/game/area/asteroid_areas.dm
@@ -8,22 +8,22 @@
/area/mine/explored
name = "Mine"
icon_state = "explored"
- ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
+ ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg', 'sound/ambience/LRRMenu.ogg', 'sound/ambience/LRRTrack3.ogg')
/area/mine/unexplored
name = "Mine"
icon_state = "unexplored"
- ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
+ ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg', 'sound/ambience/LRRMenu.ogg', 'sound/ambience/LRRTrack3.ogg')
/area/mine/explored/upper_level
name = "Upper Level Mine"
icon_state = "explored"
- ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
+ ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg', 'sound/ambience/LRRMenu.ogg', 'sound/ambience/LRRTrack3.ogg')
/area/mine/unexplored/upper_level
name = "Upper Level Mine"
icon_state = "unexplored"
- ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
+ ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg', 'sound/ambience/LRRMenu.ogg', 'sound/ambience/LRRTrack3.ogg')
// OUTPOSTS
@@ -37,8 +37,16 @@
name = "West Mining Outpost"
icon_state = "outpost_mine_west"
-/area/outpost/abandoned
- name = "Abandoned Outpost"
+/area/outpost/abandoned_Engineering
+ name = "Abandoned Engineering Outpost"
+ icon_state = "dark"
+
+/area/outpost/abandoned_Station
+ name = "Abandoned Station"
+ icon_state = "dark"
+
+/area/outpost/abandoned_Station_medical
+ name = "Abandoned Station Medical"
icon_state = "dark"
// Main mining outpost
diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm
index ecaeffeec3..18ce83f7eb 100644
--- a/code/game/gamemodes/technomancer/catalog.dm
+++ b/code/game/gamemodes/technomancer/catalog.dm
@@ -51,6 +51,10 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
budget = 2000
max_budget = 2000
+/obj/item/weapon/technomancer_catalog/admeme //for badmins, I suppose
+ name = "admeme's catalog"
+ budget = 20000
+ max_budget = 20000
// Proc: bind_to_owner()
// Parameters: 1 (new_owner - mob that the book is trying to bind to)
diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm
index 1e7488258b..4891abd973 100644
--- a/code/game/gamemodes/technomancer/core_obj.dm
+++ b/code/game/gamemodes/technomancer/core_obj.dm
@@ -331,6 +331,26 @@
spell_power_modifier = 1.75
energy_cost_modifier = 2.0
+// For those who are just beginning.
+/obj/item/weapon/technomancer_core/trainee
+ name = "trainee core"
+ desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This one has 'training wheels'"
+ energy = 3000
+ max_energy = 3000
+ regen_rate = 30
+ instability_modifier = 0.1
+ spell_power_modifier = 0.2
+
+// For the Admeme.
+/obj/item/weapon/technomancer_core/Admeme
+ name = "Admeme core"
+ desc = "A gift from the Admeme Corporation. Use it to teach others about technomancy"
+ energy = 100000
+ max_energy = 100000
+ regen_rate = 10000 //idfk how long to full
+ instability_modifier = 0
+ spell_power_modifier = 1.0
+
// For use only for the GOLEM.
/obj/item/weapon/technomancer_core/golem
name = "integrated core"
@@ -349,4 +369,4 @@
set desc = "Toggles the locking mechanism on your manipulation core."
canremove = !canremove
- to_chat(usr, "You [canremove ? "de" : ""]activate the locking mechanism on \the [src].")
\ No newline at end of file
+ to_chat(usr, "You [canremove ? "de" : ""]activate the locking mechanism on \the [src].")
diff --git a/code/game/gamemodes/technomancer/devices/boots_of_speed.dm b/code/game/gamemodes/technomancer/devices/boots_of_speed.dm
index e1017d2f5b..d17b792a2d 100644
--- a/code/game/gamemodes/technomancer/devices/boots_of_speed.dm
+++ b/code/game/gamemodes/technomancer/devices/boots_of_speed.dm
@@ -16,4 +16,18 @@
cold_protection = FEET
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = FEET
- max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
\ No newline at end of file
+ max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
+
+/obj/item/clothing/shoes/boots/the_fast
+ name = "The Fast"
+ desc = "I am The Fast"
+ icon_state = "swat"
+ item_flags = NOSLIP
+ siemens_coefficient = 0.6
+ slowdown = -3
+ species_restricted = null
+
+ cold_protection = FEET
+ min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE
+ heat_protection = FEET
+ max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm
index 8d1fb4c6ad..b620080fbd 100644
--- a/code/game/gamemodes/technomancer/equipment.dm
+++ b/code/game/gamemodes/technomancer/equipment.dm
@@ -168,6 +168,16 @@
toggleable = 1
vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
prescription = 1 // So two versions of these aren't needed.
+
+/obj/item/clothing/glasses/monocoole
+ name = "The Monocoole"
+ desc = "One heck of a stylish monocle. This one lets you see a little farther..."
+ icon_state = "monocle"
+ action_button_name = "Toggle Goggles"
+ origin_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6)
+ toggleable = 1
+ vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
+ prescription = 1 // So two versions of these aren't needed.
/datum/technomancer/equipment/med_hud
name = "Medical HUD"
diff --git a/code/game/gamemodes/technomancer/trainee.dm b/code/game/gamemodes/technomancer/trainee.dm
new file mode 100644
index 0000000000..960fee19de
--- /dev/null
+++ b/code/game/gamemodes/technomancer/trainee.dm
@@ -0,0 +1,20 @@
+var/list/all_trainee_defense = list(/datum/technomancer/spell/reflect,/datum/technomancer/spell/shield)
+var/list/all_trainee_offense = list(/datum/technomancer/spell/flame_tongue,/datum/technomancer/spell/warp_strike,/datum/technomancer/spell/beam,/datum/technomancer/spell/force_missile,/datum/technomancer/spell/lesser_chain_lightning)
+var/list/all_trainee_utility = list(/datum/technomancer/spell/abjuration,/datum/technomancer/spell/audible_deception,/datum/technomancer/spell/chroma,/datum/technomancer/spell/condensation,/datum/technomancer/spell/energy_siphon,/datum/technomancer/spell/illusion,/datum/technomancer/spell/mark,/datum/technomancer/spell/recall,/datum/technomancer/spell/track,/datum/technomancer/spell/darkness,/datum/technomancer/spell/summon_ward)
+var/list/all_trainee_support = list(/datum/technomancer/spell/dispel,/datum/technomancer/spell/oxygenate,/datum/technomancer/spell/corona,/datum/technomancer/spell/haste,/datum/technomancer/spell/mend_life,/datum/technomancer/spell/mend_synthetic,/datum/technomancer/spell/purify)
+
+/obj/item/weapon/technomancer_catalog/trainee
+ name = "trainee's catalog"
+ budget = 400
+ max_budget = 400
+
+/obj/item/weapon/technomancer_catalog/trainee/set_up()
+ if(!spell_instances.len)
+ for(var/D in all_trainee_defense)
+ spell_instances += new D()
+ for(var/O in all_trainee_offense)
+ spell_instances += new O()
+ for(var/U in all_trainee_utility)
+ spell_instances += new U()
+ for(var/S in all_trainee_support)
+ spell_instances += new S()
diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm
index b63662cd86..eecd71d9a2 100644
--- a/code/game/jobs/access_datum.dm
+++ b/code/game/jobs/access_datum.dm
@@ -256,9 +256,20 @@
desc = "Quartermaster"
region = ACCESS_REGION_SUPPLY
-// /var/const/free_access_id = 43
-// /var/const/free_access_id = 43
-// /var/const/free_access_id = 44
+// /var/const/free_access_id = 42
+//TFF 3/5/19 - Add const vars for clown/mime IDs.
+/var/const/access_clown = 43
+/datum/access/clown
+ id = access_clown
+ desc = "Clown"
+ region = ACCESS_REGION_GENERAL
+
+/var/const/access_mime = 44
+/datum/access/mime
+ id = access_mime
+ desc = "Mime"
+ region = ACCESS_REGION_GENERAL
+
/var/const/access_surgery = 45
/datum/access/surgery
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 33a2660ced..f2f06e07e4 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -57,18 +57,19 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
outfit_type = /decl/hierarchy/outfit/job/hop
alt_titles = list("Crew Resources Officer")
+ //TFF 3/5/19 - add clown/mime_access
access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_hop, access_RC_announce, access_keycard_auth, access_gateway)
+ access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_clown, access_mime)
minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_hop, access_RC_announce, access_keycard_auth, access_gateway)
+ access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_clown, access_mime)
/datum/job/secretary
title = "Command Secretary"
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index f154b02094..d0a9957a6c 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -61,7 +61,7 @@
if(CLASS_LOWER) income = 0.50
//give them an account in the station database
- var/money_amount = (rand(15,40) + rand(15,40)) * income * economic_modifier * ECO_MODIFIER //VOREStation Edit - Smoothed peaks, ECO_MODIFIER rather than per-species ones.
+ var/money_amount = (rand(30,40) + rand(30,40)) * income * economic_modifier * ECO_MODIFIER //VOREStation Edit - Smoothed peaks, ECO_MODIFIER rather than per-species ones. //CHOMP edit. Changed random number range from 15~40 to 30~40 so you don't start out so freakishly poor sometimes.
var/datum/money_account/M = create_account(H.real_name, money_amount, null)
if(H.mind)
var/remembered_info = ""
diff --git a/code/game/jobs/job/job_vr.dm b/code/game/jobs/job/job_vr.dm
index 71cb74a950..a3200bdee3 100644
--- a/code/game/jobs/job/job_vr.dm
+++ b/code/game/jobs/job/job_vr.dm
@@ -7,6 +7,8 @@
//Every hour playing this role gains this much time off. (Can be negative for off duty jobs!)
var/timeoff_factor = 3
+//TFF 19/5/19 - Port VOREStation's completed Timeclock code - Add check to prevent switching mid-round without HOP for command jobs
+ var/disallow_jobhop = FALSE
// Check client-specific availability rules.
/datum/job/proc/player_has_enough_pto(client/C)
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 268c0a7240..1e405059ee 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -100,8 +100,8 @@
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical/psychiatrist
- access = list(access_medical, access_medical_equip, access_morgue, access_psychiatrist)
- minimal_access = list(access_medical, access_medical_equip, access_psychiatrist)
+ access = list(access_medical, access_medical_equip, access_morgue, access_psychiatrist, access_chemistry) //CHOMPEDIT: access_chemistry for psychs
+ minimal_access = list(access_medical, access_medical_equip, access_psychiatrist, access_chemistry)
outfit_type = /decl/hierarchy/outfit/job/medical/psychiatrist
alt_titles = list("Psychologist" = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist)
diff --git a/code/game/jobs/job/offduty_vr.dm b/code/game/jobs/job/offduty_vr.dm
index 420943c562..0fbeaffa82 100644
--- a/code/game/jobs/job/offduty_vr.dm
+++ b/code/game/jobs/job/offduty_vr.dm
@@ -1,9 +1,9 @@
//
// "Off-duty" jobs are for people who want to do nothing and have earned it.
//
-
+//TFF 19/5/19 - Capitalisation fix
/datum/job/offduty_civilian
- title = "Off-Duty Worker"
+ title = "Off-duty Worker"
latejoin_only = TRUE
timeoff_factor = -1
total_positions = -1
diff --git a/code/game/jobs/job/special.dm b/code/game/jobs/job/special.dm
index 8df9f58290..a981f47e75 100644
--- a/code/game/jobs/job/special.dm
+++ b/code/game/jobs/job/special.dm
@@ -86,22 +86,26 @@
return access
*/
+//TFF 3/5/19 - allow selection of job pre-start. Also remove whitelist restriction and give Clowns access to their office.
/datum/job/clown
title = "Clown"
flag = CLOWN
department = "Civilian"
department_flag = CIVILIAN
faction = "Station"
- total_positions = -1
- spawn_positions = -1
+ total_positions = 1
+ spawn_positions = 1
supervisors = "the spirit of laughter"
selection_color = "#515151"
economic_modifier = 1
- access = list()
- minimal_access = list()
+ idtype = /obj/item/weapon/card/id/civilian/clown
+ access = list(43)
+ minimal_access = list(43)
alt_titles = list("Comedian","Jester")
- whitelist_only = 1
- latejoin_only = 1
+// whitelist_only = 1
+// latejoin_only = 1
+
+ access = list(access_maint_tunnels, access_clown)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -118,28 +122,27 @@
return 1
-/datum/job/clown/get_access()
- if(config.assistant_maint)
- return list(access_maint_tunnels)
- else
- return list()
-
+//TFF 3/5/19 - allow selection of job pre-start. Also remove whitelist restriction.
/datum/job/mime
title = "Mime"
flag = MIME
department = "Civilian"
department_flag = CIVILIAN
faction = "Station"
- total_positions = -1
- spawn_positions = -1
+ total_positions = 1
+ spawn_positions = 1
supervisors = "the spirit of performance"
selection_color = "#515151"
economic_modifier = 1
- access = list()
- minimal_access = list()
+ idtype = /obj/item/weapon/card/id/civilian/mime
+ access = list(44)
+ minimal_access = list(44)
alt_titles = list("Performer","Interpretive Dancer")
- whitelist_only = 1
- latejoin_only = 1
+// whitelist_only = 1
+// latejoin_only = 1
+
+//TFF 3/5/19 - give Mimes access to their office
+ access = list(access_maint_tunnels, access_mime)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -155,10 +158,4 @@
else
H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_hand)
- return 1
-
-/datum/job/mime/get_access()
- if(config.assistant_maint)
- return list(access_maint_tunnels)
- else
- return list()
+ return 1
\ No newline at end of file
diff --git a/code/game/jobs/job/z_all_jobs_vr.dm b/code/game/jobs/job/z_all_jobs_vr.dm
index c0ac7023f6..faa75f6ec6 100644
--- a/code/game/jobs/job/z_all_jobs_vr.dm
+++ b/code/game/jobs/job/z_all_jobs_vr.dm
@@ -1,8 +1,30 @@
//Contains all modified jobs for easy access and editing.
+//TFF 19/5/19 - Port VOREStation's completed Timeclock code - refactor and add jobs that requires an HOP to switch to once going off duty mid-round.
+/datum/job/captain
+ disallow_jobhop = TRUE
/datum/job/hop
+ disallow_jobhop = TRUE
alt_titles = list("Deputy Director", "Crew Resources Officer")
+/datum/job/hos
+ disallow_jobhop = TRUE
+
+/datum/job/chief_engineer
+ disallow_jobhop = TRUE
+
+/datum/job/cmo
+ disallow_jobhop = TRUE
+
+/datum/job/rd
+ disallow_jobhop = TRUE
+
+/datum/job/secretary
+ disallow_jobhop = TRUE
+
+/datum/job/lawyer
+ disallow_jobhop = TRUE
+
/datum/job/doctor
total_positions = 5
spawn_positions = 5
@@ -50,6 +72,15 @@
/datum/job/atmos
total_positions = 3
spawn_positions = 3
-
+
/datum/job/scientist
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Circuit Designer")
+
+//TFF 3/5/19 - add clown/mime spawning defining stuff
+/datum/job/clown
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/job/mime
+ total_positions = 1
+ spawn_positions = 1
\ No newline at end of file
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 002999d623..22370283c4 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -155,7 +155,7 @@
anchored = 1
circuit = /obj/item/weapon/circuitboard/sleeper
var/mob/living/carbon/human/occupant = null
- var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
+ var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin", "tricordrazine" = "Tricordrazine")
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/filtering = 0
var/obj/machinery/sleep_console/console
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 8e6acea643..b586cf4794 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -873,6 +873,12 @@ FIRE ALARM
/obj/machinery/firealarm/attackby(obj/item/W as obj, mob/user as mob)
add_fingerprint(user)
+//TFF 2/5/19: Port Polaris fix for deconstruction of fire alarms.
+ if(alarm_deconstruction_screwdriver(user, W))
+ return
+ if(alarm_deconstruction_wirecutters(user, W))
+ return
+
if(panel_open)
if(istype(W, /obj/item/device/multitool))
detecting = !(detecting)
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 829c819faf..36b092556c 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -105,8 +105,9 @@
dat += "Activate Biogenerator!
"
dat += "Detach Container
"
dat += "Food
"
- dat += "10 milk ([round(20/build_eff)])
"
- dat += "Slab of meat ([round(50/build_eff)])
"
+ dat += "10 milk ([round(20/build_eff)]) | x3 | x6
"
+ dat += "10 cream ([round(20/build_eff)]) | x3 | x6
"
+ dat += "Slab of meat ([round(50/build_eff)]) | x5 | x10
"
dat += "Nutrient
"
dat += "E-Z-Nutrient ([round(60/build_eff)]) | x5
"
dat += "Left 4 Zed ([round(120/build_eff)]) | x5
"
@@ -126,8 +127,8 @@
dat += "Leather Jacket ([round(500/build_eff)])
"
dat += "Winter Coat ([round(500/build_eff)])
"
dat += "4 Algae Sheets ([round(400/build_eff)])
" //VOREStation Edit - Algae for oxygen generator
- //dat += "Other
"
- //dat += "Monkey (500)
"
+ dat += "Other
"
+ dat += "Monkey (500)
"
else
dat += "
No beaker inside. Please insert a beaker.
"
if("nopoints")
@@ -187,8 +188,35 @@
switch(item)
if("milk")
beaker.reagents.add_reagent("milk", 10)
+ if("milk30")
+ beaker.reagents.add_reagent("milk", 30)
+ if("milk60")
+ beaker.reagents.add_reagent("milk", 60)
+ if("cream")
+ beaker.reagents.add_reagent("cream", 10)
+ if("cream30")
+ beaker.reagents.add_reagent("cream", 30)
+ if("cream60")
+ beaker.reagents.add_reagent("cream", 60)
if("meat")
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ if("meat5")
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ if("meat10")
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
if("ez")
new/obj/item/weapon/reagent_containers/glass/bottle/eznutrient(loc)
if("l4z")
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index cec980c54e..1e9cf1efff 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -23,3 +23,79 @@
if(..()) return 1
playsound(loc, 'sound/machines/button.ogg', 100, 1)
// VOREStation Edit End
+
+/obj/machinery/button/emergencydoorpulse
+ name = "Emergency Door override"
+ desc = "A remote control for providing a short burst of power to all nearby doors and sending unbolt and open signals. Automatically recloses after 60 seconds. WARNING: System does not relock doors."
+ use_power = 0
+ idle_power_usage = 0
+ active_power_usage = 0
+
+/obj/machinery/button/emergencydoorpulse/attack_hand(obj/item/weapon/W, mob/user as mob)
+ for(var/obj/machinery/door/airlock/door in range(5, src))
+ door.unlock(1)
+ sleep(10)
+ door.open(1)
+ spawn(600)
+ door.close(1)
+
+/obj/item/device/buttonofnormal
+ name = "Chaos button"
+ desc = "It radiates an aura of chaotic size energy."
+ icon = 'icons/obj/mobcap.dmi'
+ icon_state = "mobcap0"
+
+ matter = list(DEFAULT_WALL_MATERIAL = 1000)
+
+ throwforce = 00
+ throw_speed = 4
+ throw_range = 20
+ force = 0
+
+ var/colorindex = 0
+ var/mob/living/capsuleowner = null //taken from Capsule Code
+ var/sizetouse = 0.25
+
+/obj/item/device/buttonofnormal/pickup(mob/user)
+ if(!capsuleowner)
+ capsuleowner = user
+
+/obj/item/device/buttonofnormal/attack_self(mob/user)
+ if(colorindex)
+ nonrandom()
+ sleep(10)
+ capsuleowner.resize(sizetouse)
+ sizetouse = rand(25,200)/100 //randmization occurs after press
+
+/obj/item/device/buttonofnormal/throw_impact(atom/A, speed, mob/user)
+ ..()
+ if(isliving(A))
+ if(colorindex)
+ nonrandom()
+ sleep(5)
+ var/mob/living/capsulehit = A
+ capsulehit.resize(sizetouse)
+ sizetouse = rand(25,200)/100 //randmization occurs after press
+
+/obj/item/device/buttonofnormal/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/weapon/pen))
+ colorindex += 1
+ if(colorindex >= 6)
+ colorindex = 0
+ icon_state = "mobcap[colorindex]"
+ update_icon()
+ ..()
+
+/obj/item/device/buttonofnormal/proc/nonrandom() //Secret ball randmoizer rig code
+ if(colorindex==1)
+ sizetouse = RESIZE_HUGE
+ if(colorindex==2)
+ sizetouse = RESIZE_BIG
+ if(colorindex==3)
+ sizetouse = RESIZE_NORMAL
+ if(colorindex==4)
+ sizetouse = RESIZE_SMALL
+ if(colorindex==5)
+ sizetouse = RESIZE_TINY
+
+
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index f1757b260e..5e380b4b1d 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -1,5 +1,5 @@
// PRESETS
-/*
+//TFF: Enable station networks list, comments out redundant ones
var/global/list/station_networks = list(
// NETWORK_CAFE_DOCK,
NETWORK_CARGO,
@@ -10,8 +10,9 @@ var/global/list/station_networks = list(
NETWORK_ENGINE,
NETWORK_ENGINEERING,
NETWORK_ENGINEERING_OUTPOST,
- NETWORK_DEFAULT,
+// NETWORK_DEFAULT,
NETWORK_MEDICAL,
+ NETWORK_MEDICAL_OUTPOST,
NETWORK_MINE,
NETWORK_NORTHERN_STAR,
NETWORK_RESEARCH,
@@ -19,9 +20,9 @@ var/global/list/station_networks = list(
NETWORK_ROBOTS,
NETWORK_PRISON,
NETWORK_SECURITY,
- NETWORK_INTERROGATION
+// NETWORK_INTERROGATION
)
-*/
+
var/global/list/engineering_networks = list(
NETWORK_ENGINE,
NETWORK_ENGINEERING,
@@ -87,6 +88,10 @@ var/global/list/engineering_networks = list(
/obj/machinery/camera/network/medbay
network = list(NETWORK_MEDICAL)
+/*//TFF: Add Med Outpost obj filepath
+/obj/machinery/camera/network/medical_outpost
+ network = list(NETWORK_MEDICAL_OUTPOST)*/
+
/obj/machinery/camera/network/research
network = list(NETWORK_RESEARCH)
diff --git a/code/game/machinery/casino.dm b/code/game/machinery/casino.dm
new file mode 100644
index 0000000000..d2e837b094
--- /dev/null
+++ b/code/game/machinery/casino.dm
@@ -0,0 +1,841 @@
+#define DISPENSER_MAX_CARTRIDGES 90
+
+/obj/structure/casino_table
+ name = "casino table"
+ desc = "this is an unremarkable table for a casino."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "roulette_table"
+ density = 1
+ anchored = 1
+ climbable = 1
+ layer = TABLE_LAYER
+ throwpass = 1
+ var/item_place = 1 //allows items to be placed on the table, but not on benches.
+
+ var/busy = 0
+
+/obj/structure/casino_table/attackby(obj/item/W as obj, mob/user as mob)
+ if(item_place)
+ user.drop_item(src.loc)
+ return
+
+/obj/structure/casino_table/roulette_table
+ name = "roulette"
+ desc = "Spin the roulette to try your luck."
+ icon_state = "roulette_wheel"
+
+/obj/structure/casino_table/roulette_table/attack_hand(mob/user as mob)
+ if (busy)
+ to_chat(user,"You cannot spin now! The roulette is already spinning. ")
+ return
+ visible_message("\ [user] spins the roulette and throws inside little ball.")
+ playsound(src.loc, 'sound/machines/roulette.ogg', 40, 1)
+ busy = 1
+ icon_state = "roulette_wheel_spinning"
+ var/result = rand(0,36)
+ var/color = "green"
+ add_fingerprint(user)
+ if ((result>0 && result<11) || (result>18 && result<29))
+ if (result%2)
+ color="red"
+ else
+ color="black"
+ if ( (result>10 && result<19) || (result>28) )
+ if (result%2)
+ color="black"
+ else
+ color="red"
+ spawn(5 SECONDS)
+ visible_message("The roulette stops spinning, the ball landing on [result], [color].")
+ busy=0
+ icon_state = "roulette_wheel"
+
+/obj/structure/casino_table/roulette_chart
+ name = "roulette chart"
+ desc = "Roulette chart. Place your bets!"
+ icon_state = "roulette_table"
+
+/obj/structure/casino_table/blackjack_l
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills! "
+ icon_state = "blackjack_l"
+
+/obj/structure/casino_table/blackjack_r
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills! "
+ icon_state = "blackjack_r"
+
+/obj/structure/casino_table/blackjack_m
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills! "
+ icon_state = "blackjack_m"
+
+/obj/machinery/slot_machine
+ name = "Slot machine"
+ desc = "A gambling machine designed to give you false hope and rob you of your wealth, hence why it's often called a one armed bandit."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "slotmachine"
+ anchored = 1
+ density = 1
+ var/busy = 0
+ var/symbol1 = null
+ var/symbol2 = null
+ var/symbol3 = null
+
+/obj/machinery/slot_machine/attackby(obj/item/weapon/W as obj, mob/user as mob)
+
+ var/handled = 0
+ var/paid = 0
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ var/obj/item/weapon/spacecasinocash/C = W
+ paid = insert_chip(C, user)
+ handled = 1
+
+ if(paid)
+ return
+ if(handled)
+ nanomanager.update_uis(src)
+ return // don't smack that machine with your 2 chips
+
+/obj/machinery/slot_machine/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user)
+ if (busy)
+ to_chat(user,"The slot machine is currently rolling. ")
+ return
+ if(cashmoney.worth < 5)
+ to_chat(user,"You dont have enough chips to gamble! ")
+ return
+
+ visible_message("\ [user] puts 5 credits in the slot machine and presses start.")
+ cashmoney.worth -= 5
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ cashmoney.update_icon()
+
+ busy = 1
+ icon_state = "slotmachine_rolling"
+
+ var/slot1 = rand(0,9)
+ switch(slot1)
+ if(0 to 2) symbol1 = "cherry"
+ if(3 to 3) symbol1 = "lemon"
+ if(4 to 4) symbol1 = "watermelon"
+ if(5 to 5) symbol1 = "bell"
+ if(6 to 6) symbol1 = "four leaf clover"
+ if(7 to 7) symbol1 = "seven"
+ if(8 to 8) symbol1 = "diamond"
+ if(9 to 9) symbol1 = "platinum coin"
+
+ var/slot2 = rand(0,9)
+ switch(slot2)
+ if(0 to 2) symbol2 = "cherry"
+ if(3 to 3) symbol2 = "lemon"
+ if(4 to 4) symbol2 = "watermelon"
+ if(5 to 5) symbol2 = "bell"
+ if(6 to 6) symbol2 = "four leaf clover"
+ if(7 to 7) symbol2 = "seven"
+ if(8 to 8) symbol2 = "diamond"
+ if(9 to 9) symbol2 = "platinum coin"
+
+ var/slot3 = rand(0,9)
+ switch(slot3)
+ if(0 to 2) symbol3 = "cherry"
+ if(3 to 3) symbol3 = "lemon"
+ if(4 to 4) symbol3 = "watermelon"
+ if(5 to 5) symbol3 = "bell"
+ if(6 to 6) symbol3 = "four leaf clover"
+ if(7 to 7) symbol3 = "seven"
+ if(8 to 8) symbol3 = "diamond"
+ if(9 to 9) symbol3 = "platinum coin"
+
+ var/output //Output variable to send out in chat after the large if statement.
+ var/winnings = 0 //How much money will be given if any.
+ var/platinumwin = 0 // If you win the platinum chip or not
+ var/delaytime = 5 SECONDS // Put this somewhere else I'm just proving a point >:C
+
+
+ spawn(delaytime)
+ visible_message("The slot machine flashes with bright colours as the slots lights up with a [symbol1], a [symbol2] and a [symbol3]!")
+
+ if (symbol1 == "cherry" && symbol2 == "cherry" && symbol3 == "cherry")
+ output = "Three cherries! The slot machine deposits chips worth 25 credits!"
+ winnings = 25
+
+ if ((symbol1 != "cherry" && symbol2 == "cherry" && symbol3 == "cherry") || (symbol1 == "cherry" && symbol2 != "cherry" && symbol3 == "cherry") ||(symbol1 == "cherry" && symbol2 == "cherry" && symbol3 != "cherry"))
+ output = "Two cherries! The slot machine deposits a 10 credit chip!"
+ winnings = 10
+
+ if (symbol1 == "lemon" && symbol2 == "lemon" && symbol3 == "lemon")
+ output = "Three lemons! The slot machine deposits a 50 credit chip!"
+ winnings = 50
+
+ if (symbol1 == "watermelon" && symbol2 == "watermelon" && symbol3 == "watermelon")
+ output = "Three watermelons! The slot machine deposits chips worth 75 credits!"
+ winnings = 75
+
+ if (symbol1 == "bell" && symbol2 == "bell" && symbol3 == "bell")
+ output = "Three bells! The slot machine deposits chips a 100 credit chip!"
+ winnings = 100
+
+ if (symbol1 == "four leaf clover" && symbol2 == "four leaf clover" && symbol3 == "four leaf clover")
+ output = "Three four leaf clovers! The slot machine deposits a 200 credit chip!"
+ winnings = 200
+
+ if (symbol1 == "seven" && symbol2 == "seven" && symbol3 == "seven")
+ output = "Three sevens! The slot machine deposits a 500 credit chip!"
+ winnings = 500
+
+ if (symbol1 == "diamond" && symbol2 == "diamond" && symbol3 == "diamond")
+ output = "Three diamonds! The slot machine deposits a 1000 credit chip!"
+ winnings = 1000
+
+ if (symbol1 == "platinum coin" && symbol2 == "platinum coin" && symbol3 == "platinum coin")
+ output = "Three platinum coins! The slot machine deposits a platinum chip!"
+ platinumwin = TRUE;
+
+ icon_state = initial(icon_state) // Set it back to the original iconstate.
+
+ if(!output) // Is there anything to output? If not, consider it a loss.
+ visible_message("Better luck next time!")
+ busy = FALSE
+ return
+
+ visible_message(output) //Output message
+
+ if(platinumwin) // Did they win the platinum chip?
+ new /obj/item/weapon/casin_platinum_chip(src.loc)
+ playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1)
+
+ if(winnings) //Did the person win?
+ icon_state = "slotmachine_winning"
+ playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1)
+ spawn(delaytime)
+ spawn_casinochips(winnings, src.loc)
+ icon_state = "slotmachine"
+
+ busy = FALSE //Set busy to false, we're done here fam.
+
+
+/obj/structure/wheel_of_fortune
+ name = "wheel of fortune"
+ desc = "May fortune favour the lucky one!"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "wheel_of_fortune"
+ density = 1
+ anchored = 1
+ var/interval = 1
+ var/busy = 0
+
+/obj/structure/wheel_of_fortune/verb/setinterval()
+ set name = "Change interval"
+ set category = "Object"
+ set src in view(1)
+
+ if(usr.incapacitated())
+ return
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ interval = input("Put the desired interval (1-100)", "Set Interval") as num
+ if(interval>100 || interval<1)
+ usr << "Invalid interval."
+ return
+ usr << "You set the interval to [interval]"
+ return
+
+
+/obj/structure/wheel_of_fortune/attack_hand(mob/user as mob)
+ if (busy)
+ to_chat(user,"The wheel of fortune is already spinning! ")
+ return
+ visible_message("\ [user] spins the wheel of fortune!")
+ busy = 1
+ icon_state = "wheel_of_fortune_spinning"
+ var/result = rand(1,interval)
+ add_fingerprint(user)
+ spawn(5 SECONDS)
+ visible_message("The wheel of fortune stops spinning, the number is [result]!")
+ busy=0
+ icon_state = "wheel_of_fortune"
+
+/obj/structure/stripper_pole
+ name = "stripper pole"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "stripper_pole"
+ plane = MOB_PLANE
+ layer = BELOW_MOB_LAYER
+ density = 0
+
+/obj/structure/stripper_pole/attack_hand(mob/user)
+ dance(user)
+ user.spin(32,2)
+ ..()
+
+/obj/structure/stripper_pole/proc/dance(mob/user)
+ if(layer == BELOW_MOB_LAYER)
+ layer = ABOVE_MOB_LAYER
+ else
+ layer = BELOW_MOB_LAYER
+
+/obj/machinery/chemical_dispenser/deluxe
+ name = "deluxe drink dispenser"
+ desc = "The premium within dispenser for drinks, its made with bluespace technology!"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "deluxe_dispenser"
+ ui_title = "Deluxe Drink Dispenser"
+ accept_drinking = 1
+
+
+/obj/machinery/chemical_dispenser/deluxe
+ dispense_reagents = list(
+ "water", "ice", "coffee", "cream", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic",
+ "sodawater", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda",
+ "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice", "orangejuice", "lemonjuice",
+ "limejuice", "berryjuice", "mint", "matcha_latte", "lemon_lime", "sugar", "orangejuice", "limejuice", "sodawater",
+ "tonic", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac",
+ "ale", "mead", "bitters", "champagne", "singulo", "doctor_delight", "nothing", "banana", "honey", "egg",
+ "coco", "cherryjelly", "carrot", "apple", "tomato", "nutbutter", "soymilk", "grenadine", "gingerale", "royrogers",
+ "patron", "goldschlager", "gelatin", "melonliquor", "bluecuracao", "thirteenloko", "deadrum", "sake", "acidspit",
+ "amasec", "beepsky_smash", "atomicbomb", "nuka_cola", "threemileisland", "manhattan_proj", "psilocybin", "moonshine",
+ "specialwhiskey", "unathiliquor", "winebrandy", "snaps"
+ )
+
+/obj/machinery/chemical_dispenser/deluxe/full
+ spawn_cartridges = list(
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/water,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/icetea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cola,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/smw,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/dr_gibb,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/spaceup,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cafe_latte,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/soy_latte,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hot_coco,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/milk,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/mint,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/berry,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/matcha_latte,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/beer,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/kahlua,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/whiskey,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/wine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/vodka,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/gin,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/rum,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tequila,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/vermouth,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ale,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/mead,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/champagne,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/grapesoda,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/singulo,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/doctor_delight,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/nothing,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/banana,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/honey,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/egg,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/coco,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cherryjelly,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/carrot,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/apple,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tomato,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/nutbutter,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/soymilk,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/grenadine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/gingerale,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/royrogers,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/patron,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/goldschlager,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/gelatin,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/melonliquor,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/bluecuracao,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/thirteenloko,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/deadrum,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sake,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/acidspit,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/amasec,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/beepsky_smash,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/atomicbomb,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/nuka_cola,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/threemileisland,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/manhattan_proj,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/psilocybin,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/moonshine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/specialwhiskey,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/unathiliquor,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/winebrandy,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/snaps
+ )
+
+/obj/machinery/chemical_dispenser/deluxe/New()
+ ..()
+
+ if(spawn_cartridges)
+ for(var/type in spawn_cartridges)
+ add_cartridge_deluxe(new type(src))
+
+/obj/machinery/chemical_dispenser/deluxe/examine(mob/user)
+ user << desc
+ user << "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more."
+
+/obj/machinery/chemical_dispenser/deluxe/proc/add_cartridge_deluxe(obj/item/weapon/reagent_containers/chem_disp_cartridge/C, mob/user)
+ if(!istype(C))
+ if(user)
+ user << "\The [C] will not fit in \the [src]!"
+ return
+
+ if(cartridges.len >= DISPENSER_MAX_CARTRIDGES)
+ if(user)
+ user << "\The [src] does not have any slots open for \the [C] to fit into!"
+ return
+
+ if(!C.label)
+ if(user)
+ user << "\The [C] does not have a label!"
+ return
+
+ if(cartridges[C.label])
+ if(user)
+ user << "\The [src] already contains a cartridge with that label!"
+ return
+
+ if(user)
+ user.drop_from_inventory(C)
+ user << "You add \the [C] to \the [src]."
+
+ C.loc = src
+ cartridges[C.label] = C
+ cartridges = sortAssoc(cartridges)
+ nanomanager.update_uis(src)
+
+/obj/machinery/chemical_dispenser/deluxe/attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, /obj/item/weapon/wrench))
+ playsound(src, W.usesound, 50, 1)
+ user << "You begin to [anchored ? "un" : ""]fasten \the [src]."
+ if (do_after(user, 20 * W.toolspeed))
+ user.visible_message(
+ "\The [user] [anchored ? "un" : ""]fastens \the [src].",
+ "You have [anchored ? "un" : ""]fastened \the [src].",
+ "You hear a ratchet.")
+ anchored = !anchored
+ else
+ user << "You decide not to [anchored ? "un" : ""]fasten \the [src]."
+
+ else if(istype(W, /obj/item/weapon/reagent_containers/chem_disp_cartridge))
+ add_cartridge_deluxe(W, user)
+
+ else if(istype(W, /obj/item/weapon/screwdriver))
+ var/label = input(user, "Which cartridge would you like to remove?", "Chemical Dispenser") as null|anything in cartridges
+ if(!label) return
+ var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = remove_cartridge(label)
+ if(C)
+ user << "You remove \the [C] from \the [src]."
+ C.loc = loc
+ playsound(src, W.usesound, 50, 1)
+
+ else if(istype(W, /obj/item/weapon/reagent_containers/glass) || istype(W, /obj/item/weapon/reagent_containers/food))
+ if(container)
+ user << "There is already \a [container] on \the [src]!"
+ return
+
+ var/obj/item/weapon/reagent_containers/RC = W
+
+ if(!accept_drinking && istype(RC,/obj/item/weapon/reagent_containers/food))
+ user << "This machine only accepts beakers!"
+ return
+
+ if(!RC.is_open_container())
+ user << "You don't see how \the [src] could dispense reagents into \the [RC]."
+ return
+
+ container = RC
+ user.drop_from_inventory(RC)
+ RC.loc = src
+ user << "You set \the [RC] on \the [src]."
+ nanomanager.update_uis(src) // update all UIs attached to src
+
+ else
+ return ..()
+
+/obj/machinery/vending/deluxe_boozeomat
+ name = "Deluxe Drink Distributor"
+ desc = "A top of the line and experimental drink vendor, it uses bluespace technology for storage!"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "deluxe_boozeomat"
+ icon_deny = "deluxe_boozeomat_deny"
+ products = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/shot = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/pint = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/mug = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/wine = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/metaglass = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint = 25,
+ /obj/item/weapon/glass_extra/stick = 50,
+ /obj/item/weapon/glass_extra/straw = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/sake = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/patron = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/snaps = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/tea = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/lemonjuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/applejuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/milk = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/ice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 10)
+
+ contraband = list()
+ vend_delay = 15
+ idle_power_usage = 300
+ req_access = list(access_bar)
+ req_log_access = access_bar
+ has_logs = 1
+
+
+/obj/machinery/vending/deluxe_dinner
+ name = "Deluxe Dining Distributor"
+ desc = "A top of the line and experimental food vendor, it uses bluespace technology for storage!"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "deluxe_dining"
+ icon_deny = "deluxe_dining_deny"
+ products = list(/obj/item/weapon/tray = 8,
+ /obj/item/weapon/material/kitchen/utensil/fork = 15,
+ /obj/item/weapon/material/knife/plastic = 15,
+ /obj/item/weapon/material/kitchen/utensil/spoon = 15,
+ /obj/item/weapon/material/kitchen/rollingpin = 5,
+ /obj/item/weapon/material/knife = 5,
+ /obj/item/weapon/material/knife/butch = 3,
+ /obj/item/clothing/suit/chef/classic = 3,
+ /obj/item/weapon/storage/bag/food = 3,
+ /obj/item/weapon/storage/toolbox/lunchbox = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/heart = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/cat = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/nt = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/mars = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/cti = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/nymph = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/syndicate = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/fries = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/onionrings = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/enchiladas= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/meatburrito= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/taco= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cheesenachos= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cubannachos= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/tamales = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/bigos = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/concha = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/pandenata = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/tocino = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/stew= 20,
+ /obj/item/weapon/reagent_containers/food/snacks/roastbeef = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/aesirsalad = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/baguette = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/appletart = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/muffin = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/berrymuffin = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cherrypie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cookie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/croissant = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/pie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/poppypretzel = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/sugarcookie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/waffles = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake = 10)
+
+ contraband = list()
+ vend_delay = 15
+ idle_power_usage = 300
+ req_access = list(access_bar)
+ req_log_access = access_bar
+ has_logs = 1
+
+
+/obj/item/weapon/book/manual/casino
+ name = "A dummy guide to losing your thalers"
+ icon = 'icons/obj/casino.dmi'
+ icon_state ="casinomanual"
+ author = "Sleazy Serpent Saren"
+ title = "A dummy guide to losing your thalers"
+ dat = {"
+