Merge remote-tracking branch 'upstream/master' into cahse

This commit is contained in:
Cactus
2019-08-03 18:35:14 -04:00
479 changed files with 25551 additions and 15533 deletions
+4 -3
View File
@@ -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
+2
View File
@@ -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"
+1 -1
View File
@@ -333,4 +333,4 @@
#define EXAMINE_SKIPARMS 0x0020
#define EXAMINE_SKIPHANDS 0x0040
#define EXAMINE_SKIPLEGS 0x0080
#define EXAMINE_SKIPFEET 0x0100
#define EXAMINE_SKIPFEET 0x0100
+7
View File
@@ -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"
+23 -21
View File
@@ -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
+22
View File
@@ -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
+2
View File
@@ -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)
+12
View File
@@ -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)
+1 -1
View File
@@ -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("<b>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.</b>") //VOREStation Edit
to_world("<b>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.</b>") //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.
+3
View File
@@ -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
+5 -1
View File
@@ -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
+16 -3
View File
@@ -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.")
..()
..()
+5
View File
@@ -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
+5
View File
@@ -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
+24 -6
View File
@@ -187,14 +187,32 @@
teleatom.visible_message("<span class='danger'>\The [teleatom] bounces off of the portal!</span>")
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, "<span class='warning'>The portal refuses to carry you that far away!</span>")
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, "<span class='warning'>Something is blocking way on the other side!</span>")
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, "<span class='warning'>The portal refuses to carry you that far away!</span>")
return 0
//VOREStation Edit End
+2 -7
View File
@@ -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
+20
View File
@@ -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"
+1 -1
View File
@@ -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
+57 -50
View File
@@ -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(
+4 -4
View File
@@ -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
cost = 50
+2 -2
View File
@@ -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"
containername = "Defibrillator crate"
+9 -1
View File
@@ -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
access = access_medical_equip
-8
View File
@@ -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)
+1 -4
View File
@@ -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
+1 -4
View File
@@ -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
+2 -5
View File
@@ -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
+46 -2
View File
@@ -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
+24 -7
View File
@@ -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"
+14 -6
View File
@@ -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
@@ -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)
+21 -1
View File
@@ -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, "<span class='notice'>You [canremove ? "de" : ""]activate the locking mechanism on \the [src].</span>")
to_chat(usr, "<span class='notice'>You [canremove ? "de" : ""]activate the locking mechanism on \the [src].</span>")
@@ -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
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
@@ -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"
@@ -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()
+14 -3
View File
@@ -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
+3 -2
View File
@@ -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"
+1 -1
View File
@@ -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 = ""
+2
View File
@@ -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)
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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
+22 -25
View File
@@ -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
+32 -1
View File
@@ -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
+1 -1
View File
@@ -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
+6
View File
@@ -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)
+32 -4
View File
@@ -105,8 +105,9 @@
dat += "<A href='?src=\ref[src];action=activate'>Activate Biogenerator!</A><BR>"
dat += "<A href='?src=\ref[src];action=detach'>Detach Container</A><BR><BR>"
dat += "Food<BR>"
dat += "<A href='?src=\ref[src];action=create;item=milk;cost=20'>10 milk</A> <FONT COLOR=blue>([round(20/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=meat;cost=50'>Slab of meat</A> <FONT COLOR=blue>([round(50/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=milk;cost=20'>10 milk</A> <FONT COLOR=blue>([round(20/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=milk30;cost=60'>x3</A> | <A href='?src=\ref[src];action=create;item=milk60;cost=120'>x6</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=cream;cost=20'>10 cream</A> <FONT COLOR=blue>([round(20/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=cream30;cost=60'>x3</A> | <A href='?src=\ref[src];action=create;item=cream60;cost=120'>x6</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=meat;cost=50'>Slab of meat</A> <FONT COLOR=blue>([round(50/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=meat5;cost=250'>x5</A> | <A href='?src=\ref[src];action=create;item=meat10;cost=500'>x10</A><BR>"
dat += "Nutrient<BR>"
dat += "<A href='?src=\ref[src];action=create;item=ez;cost=60'>E-Z-Nutrient</A> <FONT COLOR=blue>([round(60/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=ez5;cost=300'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=l4z;cost=120'>Left 4 Zed</A> <FONT COLOR=blue>([round(120/build_eff)])</FONT> | <A href='?src=\ref[src];action=create;item=l4z5;cost=600'>x5</A><BR>"
@@ -126,8 +127,8 @@
dat += "<A href='?src=\ref[src];action=create;item=leatherjacket;cost=500'>Leather Jacket</A> <FONT COLOR=blue>([round(500/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=wintercoat;cost=500'>Winter Coat</A> <FONT COLOR=blue>([round(500/build_eff)])</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=algae;cost=400'>4 Algae Sheets</A> <FONT COLOR=blue>([round(400/build_eff)])</FONT><BR>" //VOREStation Edit - Algae for oxygen generator
//dat += "Other<BR>"
//dat += "<A href='?src=\ref[src];action=create;item=monkey;cost=500'>Monkey</A> <FONT COLOR=blue>(500)</FONT><BR>"
dat += "Other<BR>"
dat += "<A href='?src=\ref[src];action=create;item=monkey;cost=500'>Monkey</A> <FONT COLOR=blue>(500)</FONT><BR>"
else
dat += "<BR><FONT COLOR=red>No beaker inside. Please insert a beaker.</FONT><BR>"
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")
+76
View File
@@ -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
+9 -4
View File
@@ -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)
+841
View File
@@ -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,"<span class='notice'>You cannot spin now! The roulette is already spinning.</span> ")
return
visible_message("<span class='notice'>\ [user] spins the roulette and throws inside little ball.</span>")
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("<span class='notice'>The roulette stops spinning, the ball landing on [result], [color].</span>")
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,"<span class='notice'>The slot machine is currently rolling.</span> ")
return
if(cashmoney.worth < 5)
to_chat(user,"<span class='notice'>You dont have enough chips to gamble!</span> ")
return
visible_message("<span class='notice'>\ [user] puts 5 credits in the slot machine and presses start.</span>")
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("<span class='notice'>The slot machine flashes with bright colours as the slots lights up with a [symbol1], a [symbol2] and a [symbol3]!</span>")
if (symbol1 == "cherry" && symbol2 == "cherry" && symbol3 == "cherry")
output = "<span class='notice'>Three cherries! The slot machine deposits chips worth 25 credits!</span>"
winnings = 25
if ((symbol1 != "cherry" && symbol2 == "cherry" && symbol3 == "cherry") || (symbol1 == "cherry" && symbol2 != "cherry" && symbol3 == "cherry") ||(symbol1 == "cherry" && symbol2 == "cherry" && symbol3 != "cherry"))
output = "<span class='notice'>Two cherries! The slot machine deposits a 10 credit chip!</span>"
winnings = 10
if (symbol1 == "lemon" && symbol2 == "lemon" && symbol3 == "lemon")
output = "<span class='notice'>Three lemons! The slot machine deposits a 50 credit chip!</span>"
winnings = 50
if (symbol1 == "watermelon" && symbol2 == "watermelon" && symbol3 == "watermelon")
output = "<span class='notice'>Three watermelons! The slot machine deposits chips worth 75 credits!</span>"
winnings = 75
if (symbol1 == "bell" && symbol2 == "bell" && symbol3 == "bell")
output = "<span class='notice'>Three bells! The slot machine deposits chips a 100 credit chip!</span>"
winnings = 100
if (symbol1 == "four leaf clover" && symbol2 == "four leaf clover" && symbol3 == "four leaf clover")
output = "<span class='notice'>Three four leaf clovers! The slot machine deposits a 200 credit chip!</span>"
winnings = 200
if (symbol1 == "seven" && symbol2 == "seven" && symbol3 == "seven")
output = "<span class='notice'>Three sevens! The slot machine deposits a 500 credit chip!</span>"
winnings = 500
if (symbol1 == "diamond" && symbol2 == "diamond" && symbol3 == "diamond")
output = "<span class='notice'>Three diamonds! The slot machine deposits a 1000 credit chip!</span>"
winnings = 1000
if (symbol1 == "platinum coin" && symbol2 == "platinum coin" && symbol3 == "platinum coin")
output = "<span class='notice'>Three platinum coins! The slot machine deposits a platinum chip!</span>"
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 << "<span class='notice'>Invalid interval.</span>"
return
usr << "<span class='notice'>You set the interval to [interval]</span>"
return
/obj/structure/wheel_of_fortune/attack_hand(mob/user as mob)
if (busy)
to_chat(user,"<span class='notice'>The wheel of fortune is already spinning!</span> ")
return
visible_message("<span class='notice'>\ [user] spins the wheel of fortune!</span>")
busy = 1
icon_state = "wheel_of_fortune_spinning"
var/result = rand(1,interval)
add_fingerprint(user)
spawn(5 SECONDS)
visible_message("<span class='notice'>The wheel of fortune stops spinning, the number is [result]!</span>")
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 << "<span class='warning'>\The [C] will not fit in \the [src]!</span>"
return
if(cartridges.len >= DISPENSER_MAX_CARTRIDGES)
if(user)
user << "<span class='warning'>\The [src] does not have any slots open for \the [C] to fit into!</span>"
return
if(!C.label)
if(user)
user << "<span class='warning'>\The [C] does not have a label!</span>"
return
if(cartridges[C.label])
if(user)
user << "<span class='warning'>\The [src] already contains a cartridge with that label!</span>"
return
if(user)
user.drop_from_inventory(C)
user << "<span class='notice'>You add \the [C] to \the [src].</span>"
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 << "<span class='notice'>You begin to [anchored ? "un" : ""]fasten \the [src].</span>"
if (do_after(user, 20 * W.toolspeed))
user.visible_message(
"<span class='notice'>\The [user] [anchored ? "un" : ""]fastens \the [src].</span>",
"<span class='notice'>You have [anchored ? "un" : ""]fastened \the [src].</span>",
"You hear a ratchet.")
anchored = !anchored
else
user << "<span class='notice'>You decide not to [anchored ? "un" : ""]fasten \the [src].</span>"
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 << "<span class='notice'>You remove \the [C] from \the [src].</span>"
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 << "<span class='warning'>There is already \a [container] on \the [src]!</span>"
return
var/obj/item/weapon/reagent_containers/RC = W
if(!accept_drinking && istype(RC,/obj/item/weapon/reagent_containers/food))
user << "<span class='warning'>This machine only accepts beakers!</span>"
return
if(!RC.is_open_container())
user << "<span class='warning'>You don't see how \the [src] could dispense reagents into \the [RC].</span>"
return
container = RC
user.drop_from_inventory(RC)
RC.loc = src
user << "<span class='notice'>You set \the [RC] on \the [src].</span>"
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 = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: Verdana;}
</style>
</head>
<body>
<h1><a name="Contents">Contents</a></h1>
<ol>
<li><a href="#Foreword">Foreword: Welcome to gambling!</a></li>
<li><a href="#Blackjack">Blackjack</a></li>
<li><a href="#Roulette">Roulette</a></li>
<li><a href="#Poker">Poker</a></li>
<li><a href="#Prizes">Prizes</a></li>
<li><a href="#SentientPrizes">Sentient prizes</a></li>
</ol>
<br>
<h1><a name="Foreword">Foreword: Welcome to gambling!</a></h1>
In this book I'll teach you all about how to gamble your money away or at least get lucky and win some! This book also has a handy little overview of the prizes one can earn and the limitations of what can do with the living and breathing ones.<br>
(This book will also contain out of character information to help people be aware of how touchy subjects like sentient prizes are to be handled.)
<h1><a name="Blackjack">Blackjack</a></h1>
First up is the classic sport of blackjack, blackjack is played normally between a gambler and a dealer, the goal is to have the higher number than the opponent but not go above 21 or it will be a bust and one loses automatically. <br>
The values of cards are as follow:
<ul>
<li>Ace - 1 or 11, can be freely decided at any moment</li>
<li>2 - 10 - value coresponding to their number</li>
<li>All face cards including joker - Value of 10</li>
</ul>
A game of blackjack begins with the dealer giving the gambler two cards, in normal blackjack all cards dealt to gambler and dealer are always shown. The two cards dealt have their values put together, the gambler has three choices, stand, hit, or double down.
<ul>
<li>Stand - Gambler or dealer decides not to draw any more cards and it becomes the dealers turn or ends.</li>
<li>Hit - 10 - The dealer draws a new card, adding to the existing hand, if its a bust the game will end and they will lose.</li>
<li>Double down - A risky move the gambler can do, the dealer draws one more card and the bet is doubled, but no more cards can be drawn and it becomes the dealer's turn.</li>
</ul>
When it becomes the dealer's turn they do the same as the gambler, though their only goal is to get a higher or equal value to gambler. The dealer cant double down, and the large majority of casino's has the rule that a dealer cant draw anymore cards once they reach or go above a value. The most common value is 17, and there are two variants to that rule, soft and hard 17.
<ul>
<li>Soft 17 - If the gambler gets 17, they can draw another card.</li>
<li>Hard 17 - They dealer must stop if they get a value of 17.</li>
</ul>
The casino who supplies this version of the manual follows the rule of hard 17. <br>
The game ends when the dealer busts, reaches the threshold of what they are allowed to draw, or if they get a higher value than the gambler. Again, the one who has the highest value that isnt higher than 21 wins, but if both has the same value no one wins and the bet goes back to the gambler. <br>
And thats it! Now go out there and gamble your savings away! This casino allows bets between 5 and 50 with double down ignoring that limit!
<h1><a name="Roulette">Roulette</a></h1>
So this game of roulette is all about chance! what happens is that people bet on different odds and hope for the best as the dealer rolls the ball and makes that roulette thingy make than fun addicting spin! Once it lands on something its either bust or payout! Pretty simple, right? <br>
Everyone starts by putting their bets down, people can bet more than once before the ball goes rolling, the odds and their payoffs are these:
<ul>
<li>Single number - 35/1 payoff - The most unlikely one to get, but if the ball lands on your number, then youre loaded!</li>
<li>Split Number - 17/1 - Choose an interval of 2, not very likely and therefore big reward!</li>
<li>Row - 11/1 - Choose an interval of 3, more likely so not the biggest outcome!</li>
<li>Split - 8/1 - Choose an interval of 4, not gonna win big time.</li>
<li>Split row - 5/1 - Choose an interval of 6, getting to the safer bets.</li>
<li>Column - 2/1 - Choose an interval of 12, boring, but likely.</li>
<li>Red/Black or even/odd numbers - 1/1 - Odd or even numbers explains themselves. Red numbers are from 0 to 11 and 18 to 29 while the rest is black. These are the safest bets there are!</li>
</ul>
Theres not much more to it! Bets made, ball rolls, number announced, people win, people lose! Bets allowed here are from 1 to 25 per bet. Oh, im also being told this casino has the fancy rule that if ball lands on 0, one wins at least one bet no matter what it is! So lets hope you got that big bet on a single number!
<h1><a name="Poker">Poker</a></h1>
Aaah yes, good old poker. This casino runs by the rules of texas hold em, though the might be a little modified to be simpler for the average joe. In a game of poker it can be a single gambler and a dealer against each other, but most often its the dealer making the game proceed while several gamblers fights tooth and nail to steal each others chips, but the dealer can still join in on the free for all if they so wish! <br>
To simply explain the game, people gamble with each other, a game of trying to get the best hand and raise bets or back out depending on what the outcome may be. The game starts with everyone betting a certain amount, it can be 5 or 10 chips depending on dealer, but if one wants to join, there needs to be chips on that table! Once everyone has made their initial bet, everyone gets two cards face down, these are kept hidden, no one not even dealer gets to see players cards until the end, not even folded cards are to be shown unless wanted to, sometimes its better making people unsure if you dropped out with bad cards or if you have other motives, deception is a large part of this game! <br>
With everyone having cards dealt, its time for the dealer to lay three on the table face up, these cards are 3 of 5 cards in the community pool, everyone can use these cards to make sets like pairs and such, this doesnt mean they are taken, multiple people can use the same community card for their own sets! <br>
With the community having three we enter the second betting stage, here people have two options, standing or raising. Standing means you dont want to raise, raising explains itself, though if someone bets, people have three options, commit putting the chips in to risk as much as the raised bet, but if one doesnt have enough, then they can still go all in with their remaining chips, one can also drop out if its too risky, the chips bet will remain on the table, but at least you wont lose more eh? Final one is to raise further, sometimes people can dare each other to raise more, but its not allowed for someone to raise, then raise further if no one else raises after them! <br>
As said earlier, we got like a community pool of 5 cards total, this time another card is revealed and we enter a new betting phase, then the final fifth card is revealed and final bets are made, and then the cards are revealed so it can be determined who has the best hand! If two or more have equally good sets, then the chips are split evenly between them. <br>
But notice, if someone is left because everyone else didnt dare to raise with their bet, they can decide to not reveal their hand, they might have had a winning hand, or maybe its terrible and they just bluffed their way to victory, only they know and can decide if they want to expose their cards to gloat or confuse their opponents. So in summary, the game can be simple, but hard to master! <br><br>
And here is the order of winning hands folks!
<ul>
<li>Royal flush - The big and best one, this is a set of a 10, Ace, Knave/Jack, Queen and King of the same suit.</li>
<li>Straight flush - This one is also definently a winner, though can be easier to get as it just needs to be five cards making a sraight of the same suit, an example being black 3 to 7.</li>
<li>Four of a kind - Nice one, if you get this then you got a good chance to win. The value of the cards determine who wins, so ace is the best followed by king, queen and jack, then the peasant number cards!</li>
<li>Full House - This one is good, but it requires you have three of a kind and a two of a kind, obviously value is part of the house, so the best roof is made of Ace with king making a strong foundation!</li>
<li>Flush - This one requires the gambler to have 5 cards of a suit, not in any order, but the highest value card determines worth, so hope you got an Ace in your combo!</li>
<li>Straight - Its like the royal flush, but can be any suits in combo, Ace can be lowest from Ace to 5 or highest from 10 to Ace!</li>
<li>Three of a kind - Explains itself well enough, get three together and you got something going, lets hope you can build a house!</li>
<li>Two pairs - You almost got yourself a house! But at least at this point its something!</li>
<li>A pair - The worst set you can get, but you might be extremely lucky and have this while others have an inferior pair or the worst possible hand ever which is...</li>
<li>High card - The absolute worst, if you cant get any of those sets, then you got this sad case, if a game mananages to end with no one getting a set, then the one with the highest value cards wins!</li>
</ul>
Wew, what a long lesson, but thats how one does the Texas hold em here at this casino, hope you guys have fun winning and losing your hard earned cash with this one!
<h1><a name="Prizes">Prizes</a></h1>
Hey folks, welcome to the prize section! This part is definently important for you folks operating the prize booth! First off I wanna tell you some great news! Nanotransen has gone along with a nice deal that allows crew to occasionally keep their hard earned rewards on station for a limited time, now you can enjoy your new fancy toolbelt or bluespace beaker for more than just the shift where the casino comes around! <br>
((Be aware, there can be limitations on how many rewards you get to keep after the shift, it might be unfair if some shows up and wins one thing, while they watch as command staff crew with high background income as well as hyperactive miners walks home with 20 prizes they get to enjoy while having almost done no gambling at all.)) <br><br>
Lets get to the prizes and exchange rate before we get started on the stuff specifically for the booth operators, so heres the current prizes one can win and their costs! Be aware there might be new prizes or absent ones from time to time! <br>
EXCHANGE RATE <br>
FROM = TO <br>
10 Thalers = 1 casino chip <br>
1 casino chip = 5 Thalers <br> <br>
The special sentient prize is 100 chips! More about it in section below! <br> <br>
Melee weapons
<ul>
<li>scepter 1000</li>
<li>wolfgirl sword replica 200</li>
<li>chain of command 200</li>
</ul>
Guns and 'guns' ((disclaimer, giving out guns will mean you get a weapons license as well with the shifts you have it, abusing these weapons will quickly get them removed!))
<ul>
<li>sizegun 100</li>
<li>advanced anti particle rifle 500</li>
<li>anti particle cannon 750</li>
<li>temperature gun 250</li>
<li>alien pistol 500</li>
<li>floral somatoray 250</li>
<li>frontier phaser 500</li>
</ul>
Gear
<ul>
<li>alien belt 500</li>
<li>alien enhancement vest 750</li>
<li>cryostasis beaker 200</li>
<li>bluespace beaker 200</li>
<li>Vey-med NIF 250 ((This one isnt taken away at the end of the reward period!))</li>
</ul>
Accessories
<ul>
<li>The monocoole 500</li>
<li>chameleon black tie 300</li>
<li>grand star necklace 50</li>
</ul>
Masks - ALL MASK ARE 50 except chameleon!
<ul>
<li>Shark mask</li>
<li>Pig mask</li>
<li>Luchador mask</li>
<li>Horse mask</li>
<li>Goblin mask</li>
<li>Fake moustache</li>
<li>Dolphin mask</li>
<li>Demon mask</li>
<li>Chameleon gas mask 300</li>
</ul>
Costumes - All costumes are 150!
<ul>
<li>Corgi (corgi suit + corgi hood)</li>
<li>Sexy clown</li>
<li>nyan girl</li>
<li>Wizard</li>
<li>Chicken</li>
<li>Carp (carp suit + carp head)</li>
<li>Sexy mime</li>
<li>Pirate</li>
<li>Commie</li>
<li>Plague doctor</li>
<li>Imperium monk</li>
<li>Cute witch</li>
<li>Gladiator</li>
</ul>
Toys and misc - ALL THESE ARE 50
<ul>
<li>Toy sword</li>
<li>Water flower</li>
<li>Stick horse</li>
<li>Replica katana</li>
<li>Magic conch</li>
<li>Magic 8-ball</li>
<li>Foam sword</li>
<li>Foam crossbow (with 5 bolts)</li>
<li>Bosun's whistle</li>
<li>Golden cup</li>
<li>Havana cigar case</li>
<li>Cute witch</li>
<li>Gladiator</li>
</ul>
Booze - ALL BOOZE IS 50
<ul>
<li>Redeemer brew</li>
<li>Warlock velvet</li>
<li>Wrapp artiste patron</li>
<li>Flask of holy water</li>
<li>College girl goldschlager</li>
<li>Gilthari luxury champagne</li>
<li>Bottle of nothing</li>
<li>Special blend whiskey</li>
<li>Akvavit</li>
</ul>
Thats it for prizes! <br><br>
Now comes the part for the both operators, you got a very important job, it has a lot of responsibility, so it means that you gotta put that first before your own fun, cause unless you do it, a lot of folks are gonna be left sad and dissappointed they cant get any goodies! But the process is simple and can be quick, someone comes to you, they want some chips, or thalers back or a prize, you simply check this nice guide above to determine cost and ask for the amount of thalers or chips needed, if its a prize, then you follow this procedure:
<ol>
<li>First get the thalers or chips for payment.</li>
<li>Before giving the prize you take out your prize winner folder and a piece of paper, this paper will be named after the one getting the reward and will have further prizes noted down into it, so make sure its safe in that folder!</li>
<li>You write at the top of the document the winner's name, then below write in big letters 'PRIZES' and put each new reward on its own line! ((You skip to a new line by writing < br > without the space between the br and the clamps))</li>
<li>Once written down, you just put the paper back in the folder and hand over the prize!</li>
</ol>
((When shift is nearing its end you pray to staff or DM the one responsible for the event, they will get the folder and copy paste all the reward info before shift is over and ensure people get their rewards. This is a very important job and we understand it might not be so fun being restricted during an event, but just like the rest of volunteer staff, you get rewarded with guaranteed prizes to enjoy after the shift for being a big help!)) <br>
((This gets to the sour part, cheating and giving others and yourself free prizes and/or chips is absolutely forbidden, this has OOC consequences and will likely blacklist you from being important roles in future events. Though dont fear getting punished even if you havent done anything wrong, we will rather let cheaters slip than let honest players get wrongfully punished!))
<h1><a name="SentientPrizes">Sentient prizes</a></h1>
Goodness me this is quite the casino huh? Who would have thought one could win other people as a prize? Well you can do just about anything you want with them! Be it just company, some less children friendly company, heck you can even eat them or make them eat you! The options and possibilities are quite frankly limitless! <br>
Now you might ask, how does one get these fancy prizes? Well they can be obtained by checking in at the exchange both and see the list of prizes, there might be none, there might be many, it depends on volunteers and losers! This brings us first to volunteers and then to losers! <br>
Volunteering is simple! Anyone can walk up to the booth and ask to be a sentient prize, what this means is that you get a nice sum of 250 chips for you to do whatever you want, but someone might come at any point and claim you! <br>
Losers are obtained differently, if youre completly busted and have nothing left, you become a prize that the one you lost to can do whatever they want with, this means both gamblers and dealers can end up as a prize, though if for whatever reason you dont become their prize, you get added to the list for someone else to enjoy. Becoming a prize means you also get 100 chips in compensation! <br><br>
((Sour part again, but very important. These sentient prizes can be fun, but one thing always dictates how these things goes down, preferences and ooc wants. If preferences dont line up and people dont agree to do winner/loser scene it becomes sentient prize on list. And someone cant win a prize if the prize ooc doesnt want to do what the winner wants to do. We still wish people to try and reach out and try things with new people and/or new things they are comfortable doing, but never shall anyone be forced into a situation they dont want!))
</body>
</html>
"}
+132 -5
View File
@@ -1,3 +1,4 @@
//TFF 19/5/19 - Port VOREStation's completed Timeclock code
/////////////////////////////////////////////
//Time Clock Terminal////////////////////////
/////////////////////////////////////////////
@@ -17,6 +18,12 @@
circuit = /obj/item/weapon/circuitboard/timeclock
var/obj/item/weapon/card/id/card // Inserted Id card
var/obj/item/device/radio/intercom/announce // Integreated announcer
/obj/machinery/computer/timeclock/New()
announce = new /obj/item/device/radio/intercom(src)
..()
/obj/machinery/computer/timeclock/Destroy()
if(card)
@@ -80,12 +87,12 @@
"department" = job.department,
"selection_color" = job.selection_color,
"economic_modifier" = job.economic_modifier,
"head_position" = job.head_position,
"timeoff_factor" = job.timeoff_factor
)
// TODO - Once job changing is implemented, we will want to list jobs to change into.
// if(job && job.timeoff_factor < 0) // Currently are Off Duty, so gotta lookup what on-duty jobs are open
// data["job_choices"] = getOpenOnDutyJobs(user, job.department)
if(config.time_off && config.pto_job_change)
data["allow_change_job"] = TRUE
if(job && job.timeoff_factor < 0) // Currently are Off Duty, so gotta lookup what on-duty jobs are open
data["job_choices"] = getOpenOnDutyJobs(user, job.department)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
@@ -100,7 +107,7 @@
src.add_fingerprint(usr)
if (href_list["id"])
if (card)
if(card)
usr.put_in_hands(card)
card = null
else
@@ -109,8 +116,128 @@
I.forceMove(src)
card = I
update_icon()
return 1
if(href_list["switch-to-onduty"])
if(card)
if(checkFace())
if(checkCardCooldown())
makeOnDuty(href_list["switch-to-onduty"])
usr.put_in_hands(card)
card = null
update_icon()
return 1
if(href_list["switch-to-offduty"])
if(card)
if(checkFace())
if(checkCardCooldown())
makeOffDuty()
usr.put_in_hands(card)
card = null
update_icon()
return 1
return 1 // Return 1 to update UI
/obj/machinery/computer/timeclock/proc/getOpenOnDutyJobs(var/mob/user, var/department)
var/list/available_jobs = list()
for(var/datum/job/job in job_master.occupations)
if(job && job.is_position_available() && !job.whitelist_only && !jobban_isbanned(user,job.title) && job.player_old_enough(user.client))
if(job.department == department && !job.disallow_jobhop && job.timeoff_factor > 0)
available_jobs += job.title
if(job.alt_titles)
for(var/alt_job in job.alt_titles)
available_jobs += alt_job
return available_jobs
/obj/machinery/computer/timeclock/proc/makeOnDuty(var/newjob)
var/datum/job/foundjob = null
for(var/datum/job/job in job_master.occupations)
if(newjob == job.title)
foundjob = job
break
if(newjob in job.alt_titles)
foundjob = job
break
if(!newjob in getOpenOnDutyJobs(usr, job_master.GetJob(card.rank).department))
return
if(foundjob && card)
card.access = foundjob.get_access()
card.rank = foundjob.title
card.assignment = newjob
card.name = text("[card.registered_name]'s ID Card ([card.assignment])")
data_core.manifest_modify(card.registered_name, card.assignment)
card.last_job_switch = world.time
callHook("reassign_employee", list(card))
foundjob.current_positions++
var/mob/living/carbon/human/H = usr
H.mind.assigned_role = foundjob.title
H.mind.role_alt_title = newjob //TFF 26/7/19 - VOREStation fix port of announcement fix for wrong position
announce.autosay("[card.registered_name] has moved On-Duty as [card.assignment].", "Employee Oversight")
return
/obj/machinery/computer/timeclock/proc/makeOffDuty()
var/datum/job/foundjob = null
for(var/datum/job/job in job_master.occupations)
if(card.rank == job.title)
foundjob = job
break
if(!foundjob)
return
var/real_dept = foundjob.department
if(real_dept && real_dept == "Command")
real_dept = "Civilian"
var/datum/job/ptojob = null
for(var/datum/job/job in job_master.occupations)
if(job.department == real_dept && job.timeoff_factor < 0)
ptojob = job
break
if(ptojob && card)
var/oldtitle = card.assignment
card.access = ptojob.get_access()
card.rank = ptojob.title
card.assignment = ptojob.title
card.name = text("[card.registered_name]'s ID Card ([card.assignment])")
data_core.manifest_modify(card.registered_name, card.assignment)
card.last_job_switch = world.time
callHook("reassign_employee", list(card))
var/mob/living/carbon/human/H = usr
H.mind.assigned_role = ptojob.title
H.mind.role_alt_title = ptojob.title //TFF 26/7/19 - VOREStation fix port of announcement fix for wrong position
foundjob.current_positions--
announce.autosay("[card.registered_name], [oldtitle], has moved Off-Duty.", "Employee Oversight")
return
/obj/machinery/computer/timeclock/proc/checkCardCooldown()
if(!card)
return FALSE
if((world.time - card.last_job_switch) < 15 MINUTES)
to_chat(usr, "You need to wait at least 15 minutes after last duty switch. It has only been [card.last_job_switch] minutes since you have had your job changed.")
return FALSE
return TRUE
/obj/machinery/computer/timeclock/proc/checkFace()
if(!card)
to_chat(usr, "<span class='notice'>No ID is inserted.</span>")
return FALSE
var/mob/living/carbon/human/H = usr
if(!(istype(H)))
to_chat(usr, "<span class='warning'>Invalid user detected. Access denied.</span>")
return FALSE
else if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE))) //Face hiding bad
to_chat(usr, "<span class='warning'>Facial recognition scan failed due to physical obstructions. Access denied.</span>")
return FALSE
else if(H.get_face_name() == "Unknown" || !(H.real_name == card.registered_name))
to_chat(usr, "<span class='warning'>Facial recognition scan failed. Access denied.</span>")
return FALSE
else
return TRUE
/obj/item/weapon/card/id
var/last_job_switch
/obj/item/weapon/card/id/New()
.=..()
last_job_switch = world.time
//
// Frame type for construction
//
+6 -1
View File
@@ -231,7 +231,7 @@
var/obj/machinery/computer/cryopod/control_computer
var/last_no_computer_message = 0
var/applies_stasis = 1
var/applies_stasis = 0 ///TFF 18/4/19: change var from 1 to 0 so that you're able to get back out if you don't want to cryo out in the first place.
/obj/machinery/cryopod/robot
name = "robotic storage unit"
@@ -506,6 +506,11 @@
//visible_message("<span class='notice'>\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.</span>", 3)
visible_message("<span class='notice'>\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].</span>", 3)
//TFF: Port Vorestation fix for people getting kicked while inside a belly. Re-added 1/5/19. Didn't synch my fork before that last one, apparently. >W>
if(to_despawn.client && to_despawn.stat<2)
var/mob/observer/dead/newghost = to_despawn.ghostize()
newghost.timeofdeath = world.time
//This should guarantee that ghosts don't spawn.
to_despawn.ckey = null
+7 -7
View File
@@ -22,7 +22,8 @@
/obj/machinery/computer/cryopod/gateway
name = "teleport oversight console"
desc = "An interface between visitors and the teleport oversight systems tasked with keeping track of all visitors who enter or exit from the teleporters."
/* VOREStation Edit
//TFF 15/5/19 - Corrects spawnpoint type so that persistency saves properly.
/obj/machinery/cryopod/robot/door/dorms
desc = "A small elevator that goes down to the residential district."
on_enter_occupant_message = "The elevator door closes slowly, ready to bring you down to the residential district."
@@ -31,27 +32,26 @@
/obj/machinery/computer/cryopod/dorms
name = "residential oversight console"
desc = "An interface between visitors and the residential oversight systems tasked with keeping track of all visitors in the residential district."
*/
/obj/machinery/cryopod/proc/log_special_item(var/atom/movable/item,var/mob/to_despawn)
ASSERT(item && to_despawn)
var/loaded_from_key
var/char_name = to_despawn.name
var/item_name = item.name
// Best effort key aquisition
if(ishuman(to_despawn))
var/mob/living/carbon/human/H = to_despawn
if(H.original_player)
loaded_from_key = H.original_player
if(!loaded_from_key && to_despawn.mind && to_despawn.mind.loaded_from_ckey)
loaded_from_key = to_despawn.mind.loaded_from_ckey
else
loaded_from_key = "INVALID"
// Log to harrass them later
log_game("CRYO [loaded_from_key]/([to_despawn.name]) cryo'd with [item_name] ([item.type])")
qdel(item)
+3 -2
View File
@@ -43,12 +43,13 @@
else
icon_state = "dbchime-standby"
//TFF 3/6/19 - Port Cit RP fix of infinite frames. ToDo: Make it so that you can completely deconstruct it and reconstruct it.
/obj/machinery/doorbell_chime/attackby(obj/item/W as obj, mob/user as mob)
src.add_fingerprint(user)
if(default_deconstruction_screwdriver(user, W))
return
else if(default_deconstruction_crowbar(user, W))
return
// else if(default_deconstruction_crowbar(user, W)) //NOTICE: NO CIRCUITBOARD
// return
else if(default_part_replacement(user, W))
return
else if(panel_open && istype(W, /obj/item/device/multitool))
+9
View File
@@ -538,6 +538,15 @@
req_one_access = list()
normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside.
hackProof = TRUE //VOREStation Edit - No borgos
/obj/machinery/door/airlock/scp
name = "SCP Access"
icon = 'icons/obj/doors/SCPdoor.dmi'
//req_one_access = list(access_maint_tunnels)
open_sound_powered = 'sound/machines/scp1o.ogg'
close_sound_powered = 'sound/machines/scp1c.ogg'
open_sound_unpowered = 'sound/machines/scp1o.ogg'
close_sound_powered = 'sound/machines/scp1c.ogg'
/*
About the new airlock wires panel:
+36 -31
View File
@@ -1,3 +1,5 @@
//TFF: Port VoreStation fix for door repair/reinforcing for borgs/drones.
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
#define DOOR_REPAIR_AMOUNT 50 //amount of health regained per stack amount used
@@ -26,7 +28,7 @@
var/destroy_hits = 10 //How many strong hits it takes to destroy the door
var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon
var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon
var/obj/item/stack/material/steel/repairing
var/repairing
var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened.
var/close_door_at = 0 //When to automatically close the door, if possible
@@ -205,17 +207,19 @@
/obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob)
src.add_fingerprint(user)
if (attempt_vr(src,"attackby_vr",list(I, user))) return
if(istype(I))
if(attackby_vr(I, user)) //VOREStation begin: Fireproofing
return //VOREStation begin: Fireproofing
if(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name())
if(stat & BROKEN)
user << "<span class='notice'>It looks like \the [src] is pretty busted. It's going to need more than just patching up now.</span>"
to_chat(user,"<span class='notice'>It looks like \the [src] is pretty busted. It's going to need more than just patching up now.</span>")
return
if(health >= maxhealth)
user << "<span class='notice'>Nothing to fix!</span>"
to_chat(user,"<span class='notice'>Nothing to fix!</span>")
return
if(!density)
user << "<span class='warning'>\The [src] must be closed before you can repair it.</span>"
to_chat(user,"<span class='warning'>\The [src] must be closed before you can repair it.</span>")
return
//figure out how much metal we need
@@ -223,44 +227,45 @@
amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc?
var/obj/item/stack/stack = I
var/transfer
if (repairing)
transfer = stack.transfer_to(repairing, amount_needed - repairing.amount)
if (!transfer)
user << "<span class='warning'>You must weld or remove \the [repairing] from \the [src] before you can add anything else.</span>"
var/amount_given = amount_needed - repairing
var/mats_given = stack.get_amount()
if(repairing && amount_given <= 0)
to_chat(user, "<span class='warning'>You must weld or remove \the [get_material_name()] from \the [src] before you can add anything else.</span>")
else
repairing = stack.split(amount_needed)
if (repairing)
repairing.loc = src
transfer = repairing.amount
if (transfer)
user << "<span class='notice'>You fit [transfer] [stack.singular_name]\s to damaged and broken parts on \the [src].</span>"
if(mats_given >= amount_given)
if(stack.use(amount_given))
repairing += amount_given
else
if(stack.use(mats_given))
repairing += mats_given
amount_given = mats_given
if(amount_given)
to_chat(user, "<span class='notice'>You fit [amount_given] [get_material_name()] sheets to damaged and broken parts on \the [src].</span>")
return
if(repairing && istype(I, /obj/item/weapon/weldingtool))
if(!density)
user << "<span class='warning'>\The [src] must be closed before you can repair it.</span>"
to_chat(user,"<span class='warning'>\The [src] must be closed before you can repair it.</span>")
return
var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user))
user << "<span class='notice'>You start to fix dents and weld \the [repairing] into place.</span>"
to_chat(user,"<span class='notice'>You start to fix dents and weld \the [get_material_name()] into place.</span>")
playsound(src, welder.usesound, 50, 1)
if(do_after(user, (5 * repairing.amount) * welder.toolspeed) && welder && welder.isOn())
user << "<span class='notice'>You finish repairing the damage to \the [src].</span>"
health = between(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth)
if(do_after(user, (5 * repairing) * welder.toolspeed) && welder && welder.isOn())
to_chat(user,"<span class='notice'>You finish repairing the damage to \the [src].</span>")
health = between(health, health + repairing*DOOR_REPAIR_AMOUNT, maxhealth)
update_icon()
qdel(repairing)
repairing = null
repairing = 0
return
if(repairing && istype(I, /obj/item/weapon/crowbar))
user << "<span class='notice'>You remove \the [repairing].</span>"
var/obj/item/stack/material/repairing_sheet = get_material().place_sheet(loc)
repairing_sheet.amount += repairing-1
repairing = 0
to_chat(user, "<span class='notice'>You remove \the [repairing_sheet].</span>")
playsound(src, I.usesound, 100, 1)
repairing.loc = user.loc
repairing = null
return
//psa to whoever coded this, there are plenty of objects that need to call attack() on doors without bludgeoning them.
@@ -318,13 +323,13 @@
/obj/machinery/door/examine(mob/user)
. = ..()
if(src.health <= 0)
user << "\The [src] is broken!"
to_chat(user,"\The [src] is broken!")
if(src.health < src.maxhealth / 4)
user << "\The [src] looks like it's about to break!"
to_chat(user,"\The [src] looks like it's about to break!")
else if(src.health < src.maxhealth / 2)
user << "\The [src] looks seriously damaged!"
to_chat(user,"\The [src] looks seriously damaged!")
else if(src.health < src.maxhealth * 3/4)
user << "\The [src] shows signs of damage!"
to_chat(user,"\The [src] shows signs of damage!")
/obj/machinery/door/proc/set_broken()
+52 -95
View File
@@ -1,9 +1,11 @@
//TFF: Port VoreStation fix for door repair/reinforcing for borgs/drones.
/turf/simulated/floor/proc/adjacent_fire_act_vr(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume)
for(var/obj/machinery/door/D in src) //makes doors next to fire affected by fire
D.fire_act(adj_air, adj_temp, adj_volume)
/obj/machinery/door
var/obj/item/stack/material/plasteel/reinforcing //vorestation addition
var/reinforcing //vorestation addition
/obj/machinery/door/firedoor
heat_proof = 1
@@ -33,113 +35,68 @@
return ..()
// Returns true only if one of the actions unique to reinforcing is done, otherwise false and continuing normal attackby
/obj/machinery/door/proc/attackby_vr(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/stack/material) && I.get_material_name() == "plasteel") // Add heat shielding if it isn't already.
if(!heat_proof)
var/obj/item/stack/stack = I
var/transfer
var/amount_needed = 2
if(stat & BROKEN)
user << "<span class='notice'>It looks like \the [src] is pretty busted.</span>"
if (reinforcing)
transfer = stack.transfer_to(reinforcing, amount_needed - reinforcing.amount)
if (!transfer)
user << "<span class='warning'>You must weld or remove \the [reinforcing] from \the [src] before you can add anything else.</span>"
return 1
if(istype(I, /obj/item/stack/material) && I.get_material_name() == "plasteel")
if(heat_proof)
to_chat(user, "<span class='warning'>\The [src] is already reinforced.</span>")
return TRUE
if((stat & BROKEN) || (health < maxhealth))
to_chat(user, "<span class='notice'>It looks like \the [src] broken. Repair it before reinforcing it.</span>")
return TRUE
if(!density)
to_chat(user, "<span class='warning'>\The [src] must be closed before you can reinforce it.</span>")
return TRUE
var/amount_needed = 2
var/obj/item/stack/stack = I
var/amount_given = amount_needed - reinforcing
var/mats_given = stack.get_amount()
if(reinforcing && amount_given <= 0)
to_chat(user, "<span class='warning'>You must weld or remove \the plasteel from \the [src] before you can add anything else.</span>")
else
if(mats_given >= amount_given)
if(stack.use(amount_given))
reinforcing += amount_given
else
reinforcing = stack.split(amount_needed)
if (reinforcing)
reinforcing.loc = src
transfer = reinforcing.amount
if(stack.use(mats_given))
reinforcing += mats_given
amount_given = mats_given
if(amount_given)
to_chat(user, "<span class='notice'>You fit [amount_given] [get_material_name()] sheets on \the [src].</span>")
if (transfer)
user << "<span class='notice'>You fit [transfer] [stack.singular_name]\s to \the [src].</span>"
return 1
if(istype(I, /obj/item/stack/material) && I.get_material_name() == src.get_material_name())
if(stat & BROKEN)
if(health >= maxhealth && destroy_hits >= 10)
user << "<span class='notice'>The [src] is about as shored up as it's going to get.</span>"
return 1
if(!density)
user << "<span class='warning'>\The [src] must be closed before you can repair it.</span>"
return 1
//figure out how much metal we need
var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT
if (destroy_hits < 10)
amount_needed += (20*(10 - destroy_hits) / DOOR_REPAIR_AMOUNT)
amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc?
var/obj/item/stack/stack = I
var/transfer
if (repairing)
transfer = stack.transfer_to(repairing, amount_needed - repairing.amount)
if (!transfer)
user << "<span class='warning'>You must weld or remove \the [repairing] from \the [src] before you can add anything else.</span>"
else
repairing = stack.split(amount_needed)
if (repairing)
repairing.loc = src
transfer = repairing.amount
if (transfer)
user << "<span class='notice'>\The [src] is completely broken inside, but you manage to fit [transfer] [stack.singular_name]\s to shore it up.</span>"
return 1
return 0
return TRUE
if(reinforcing && istype(I, /obj/item/weapon/weldingtool))
var/amount_needed = 2
if(!density)
user << "<span class='warning'>\The [src] must be closed before you can repair it.</span>"
return 1
if (reinforcing.amount < amount_needed)
user << "<span class='notice'>You need [amount_needed] [reinforcing.singular_name]\s to reinforce \the [src].</span>"
return 1
to_chat(user, "<span class='warning'>\The [src] must be closed before you can reinforce it.</span>")
return TRUE
if(reinforcing < 2)
to_chat(user, "<span class='warning'>You will need more plasteel to reinforce \the [src].</span>")
return TRUE
var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user))
user << "<span class='notice'>You start to weld \the [reinforcing] into place.</span>"
playsound(src, 'sound/items/Welder.ogg', 100, 1)
if(do_after(user, 5 * reinforcing.amount) && welder && welder.isOn())
user << "<span class='notice'>You finish reinforcing \the [src].</span>"
to_chat(user, "<span class='notice'>You start to weld \the plasteel into place.</span>")
playsound(src, welder.usesound, 50, 1)
if(do_after(user, 10 * welder.toolspeed) && welder && welder.isOn())
to_chat(user, "<span class='notice'>You finish reinforcing \the [src].</span>")
heat_proof = 1
update_icon()
qdel(reinforcing)
reinforcing = null
return 1
if(repairing && istype(I, /obj/item/weapon/weldingtool) && (stat & BROKEN))
if(!density)
user << "<span class='warning'>\The [src] must be closed before you can shore it up.</span>"
return 1
var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user))
user << "<span class='notice'>You start to weld \the [repairing] into place.</span>"
playsound(src, 'sound/items/Welder.ogg', 100, 1)
if(do_after(user, 5 * repairing.amount) && welder && welder.isOn())
user << "<span class='notice'>You finish shoring up \the [src]. It'll hold for at least a little while.</span>"
var/damagerepaired = repairing.amount*DOOR_REPAIR_AMOUNT
if (destroy_hits < 10)
var/severedamage = 10 - destroy_hits
destroy_hits = between(destroy_hits, destroy_hits + (damagerepaired)/20, 10)
damagerepaired -= 20 * severedamage
health = between(health, health + damagerepaired, maxhealth)
update_icon()
qdel(repairing)
repairing = null
return 1
reinforcing = 0
return TRUE
if(reinforcing && istype(I, /obj/item/weapon/crowbar))
user << "<span class='notice'>You remove \the [reinforcing].</span>"
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
reinforcing.loc = user.loc
reinforcing = null
return 1
return 0
var/obj/item/stack/material/plasteel/reinforcing_sheet = new /obj/item/stack/material/plasteel(src.loc)
reinforcing_sheet.amount = reinforcing
reinforcing = 0
to_chat(user, "<span class='notice'>You remove \the [reinforcing_sheet].</span>")
playsound(src, I.usesound, 100, 1)
return TRUE
return FALSE
/obj/machinery/door/blast/regular/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return // blast doors are immune to fire completely.
+3 -1
View File
@@ -16,6 +16,9 @@
var/list/logs = list() // Gets written to by exonet's send_message() function.
//TFF 3/6/19 - Port Cit RP fix for infinite frames
circuit = /obj/item/weapon/circuitboard/telecomms/exonet_node
// Proc: New()
// Parameters: None
// Description: Adds components to the machine for deconstruction.
@@ -23,7 +26,6 @@
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/telecomms/exonet_node(src)
component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src)
component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+127
View File
@@ -0,0 +1,127 @@
/obj/machinery/feeder
name = "\improper Feeder"
icon = 'icons/obj/feeder.dmi'
anchored = 0
density = 0
/obj/machinery/feeder/var/mob/living/carbon/human/attached = null
/obj/machinery/feeder/var/obj/item/weapon/reagent_containers/beaker = null
/obj/machinery/feeder/update_icon()
if(attached)
icon_state = "feeding"
else
icon_state = ""
overlays = null
if(beaker)
var/datum/reagents/reagents = beaker.reagents
if(reagents.total_volume)
var/image/filling = image('icons/obj/feeder.dmi', src, "reagent")
var/percent = round((reagents.total_volume / beaker.volume) * 100)
switch(percent)
if(0 to 9) filling.icon_state = "reagent0"
if(10 to 19) filling.icon_state = "reagent10"
if(20 to 44) filling.icon_state = "reagent20"
if(45 to 59) filling.icon_state = "reagent45"
if(60 to 74) filling.icon_state = "reagent60"
if(75 to 89) filling.icon_state = "reagent75"
if(90 to 94) filling.icon_state = "reagent90"
if(95 to INFINITY) filling.icon_state = "reagent100"
filling.icon += reagents.get_color()
overlays += filling
/obj/machinery/feeder/MouseDrop(over_object, src_location, over_location)
..()
if(!isliving(usr))
return
if(attached)
visible_message("The feeding tube is pulled out of [attached]")
attached = null
update_icon()
return
if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1)
visible_message("[usr] inserts the feeding tube into \the [over_object].")
attached = over_object
update_icon()
/obj/machinery/feeder/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/reagent_containers))
if(!isnull(beaker))
user << "There is already a reagent container inserted!"
return
user.drop_item()
W.loc = src
beaker = W
user << "You insert \the [W] into \the [src]."
update_icon()
return
if(istype(W, /obj/item/weapon/screwdriver))
playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You start to dismantle the feeder.</span>"
if(do_after(user, 15))
user << "<span class='notice'>You dismantle the feeder.</span>"
var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic(src.loc)
A.amount = 4
if(beaker)
beaker.loc = get_turf(src)
beaker = null
qdel(src)
return
else
return ..()
/obj/machinery/feeder/process()
set background = 1
if(attached)
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
visible_message("The tube is pulled out of [attached]")
attached = null
update_icon()
return
if(attached && beaker)
// Give food
if(beaker.volume > 0)
var/transfer_amount = 2
beaker.reagents.trans_to_mob(attached, transfer_amount, CHEM_INGEST)
update_icon()
/obj/machinery/feeder/attack_hand(mob/user as mob)
if(beaker)
beaker.loc = get_turf(src)
beaker = null
update_icon()
else
return ..()
/obj/machinery/feeder/examine(mob/user)
..(user)
if(!(user in view(2)) && user != src.loc) return
if(beaker)
if(beaker.reagents && beaker.reagents.reagent_list.len)
usr << "<span class='notice'>Inserted is \a [beaker] with [beaker.reagents.total_volume] units of liquid.</span>"
else
usr << "<span class='notice'>Inserted is an empty [beaker].</span>"
else
usr << "<span class='notice'>No container is inserted.</span>"
usr << "<span class='notice'>[attached ? attached : "No one"] is being fed by it.</span>"
/obj/machinery/feeder/CanPass(atom/movable/mover, turf/target, height = 0, air_group = 0)
if(height && istype(mover) && mover.checkpass(PASSTABLE)) //allow bullets, beams, thrown objects, mice, drones, and the like through.
return 1
return ..()
+25
View File
@@ -13,6 +13,7 @@
icon = 'icons/obj/jukebox.dmi'
icon_state = "jukebox2-nopower"
var/state_base = "jukebox2"
var/jukebox_edition = "default"
anchored = 1
density = 1
power_channel = EQUIP
@@ -33,6 +34,12 @@
var/list/datum/track/tracks = list() // Available tracks
var/list/datum/track/secret_tracks = list() // Only visible if hacked
/obj/machinery/media/jukebox/casinojukebox
name = "space casino jukebox"
icon = 'icons/obj/casino.dmi'
icon_state = "casinojukebox-nopower"
state_base = "casinojukebox"
/obj/machinery/media/jukebox/New()
..()
default_apply_parts()
@@ -56,6 +63,24 @@
secret_tracks |= T
else
tracks |= T
if(T.casino)
tracks -= T
return
// On initialization, copy our tracks from the global list
/obj/machinery/media/jukebox/casinojukebox/initialize()
. = ..()
if(all_jukebox_tracks.len < 1)
stat |= BROKEN // No tracks configured this round!
return
// Ootherwise load from the global list!
for(var/datum/track/T in all_jukebox_tracks)
if(!T.casino)
tracks -= T
secret_tracks -= T
if(T.casino)
tracks |= T
return
/obj/machinery/media/jukebox/process()
+12 -4
View File
@@ -2,8 +2,10 @@
#define ICECREAM_CHOCOLATE 2
#define ICECREAM_STRAWBERRY 3
#define ICECREAM_BLUE 4
#define CONE_WAFFLE 5
#define CONE_CHOC 6
#define ICECREAM_MATCHA 5
#define CONE_WAFFLE 6
#define CONE_CHOC 7
// Ported wholesale from Apollo Station.
@@ -29,6 +31,8 @@
return list("milk", "ice", "berryjuice")
if(ICECREAM_BLUE)
return list("milk", "ice", "singulo")
if(ICECREAM_MATCHA)
return list("milk", "ice", "matcha")
if(CONE_WAFFLE)
return list("flour", "sugar")
if(CONE_CHOC)
@@ -44,6 +48,8 @@
return "strawberry"
if(ICECREAM_BLUE)
return "blue"
if(ICECREAM_MATCHA)
return "matcha"
if(CONE_WAFFLE)
return "waffle"
if(CONE_CHOC)
@@ -54,7 +60,7 @@
/obj/machinery/icecream_vat/initialize()
. = ..()
create_reagents(100)
while(product_types.len < 6)
while(product_types.len < 7)
product_types.Add(5)
reagents.add_reagent("milk", 5)
reagents.add_reagent("flour", 5)
@@ -72,7 +78,8 @@
dat += "<b>Vanilla icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_VANILLA]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_VANILLA];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_VANILLA];amount=5'><b>x5</b></a> [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)<br>"
dat += "<b>Strawberry icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_STRAWBERRY]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_STRAWBERRY];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_STRAWBERRY];amount=5'><b>x5</b></a> [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)<br>"
dat += "<b>Chocolate icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_CHOCOLATE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHOCOLATE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHOCOLATE];amount=5'><b>x5</b></a> [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)<br>"
dat += "<b>Blue icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br></div>"
dat += "<b>Blue icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br>"
dat += "<b>Matcha icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_MATCHA]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_MATCHA];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_MATCHA];amount=5'><b>x5</b></a> [product_types[ICECREAM_MATCHA]] dollops left. (Ingredients: milk, ice, matcha)<br></div>"
dat += "<br><b>CONES</b><br><div class='statusDisplay'>"
dat += "<b>Waffle cones:</b> <a href='?src=\ref[src];cone=[CONE_WAFFLE]'><b>Dispense</b></a> <a href='?src=\ref[src];make=[CONE_WAFFLE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[CONE_WAFFLE];amount=5'><b>x5</b></a> [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)<br>"
dat += "<b>Chocolate cones:</b> <a href='?src=\ref[src];cone=[CONE_CHOC]'><b>Dispense</b></a> <a href='?src=\ref[src];make=[CONE_CHOC];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[CONE_CHOC];amount=5'><b>x5</b></a> [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder)<br></div>"
@@ -191,5 +198,6 @@
#undef FLAVOUR_CHOCOLATE
#undef FLAVOUR_STRAWBERRY
#undef FLAVOUR_BLUE
#undef FLAVOUR_MATCHA
#undef CONE_WAFFLE
#undef CONE_CHOC
+4 -1
View File
@@ -329,7 +329,7 @@ Class Procs:
return FALSE
if(panel_open)
return FALSE // Close panel first!
playsound(loc, W.usesound, 50, 1)
playsound(loc, W.usesound, 50, 1)
var/actual_time = W.toolspeed * time
if(actual_time != 0)
user.visible_message( \
@@ -396,6 +396,9 @@ Class Procs:
/obj/machinery/proc/dismantle()
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
//TFF 3/6/19 - port Cit RP fix of infinite frames.
if(!circuit)
return 0
var/obj/structure/frame/A = new /obj/structure/frame(src.loc)
var/obj/item/weapon/circuitboard/M = circuit
A.circuit = M
+17 -17
View File
@@ -215,24 +215,24 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(computer_deconstruction_screwdriver(user, O))
return
if(istype(O, /obj/item/device/multitool))
if(panel_open)
var/input = sanitize(input(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department))
if(!input)
to_chat(usr, "No input found. Please hang up and try your call again.")
return
department = input
announcement.title = "[department] announcement"
announcement.newscast = 1
name = "[department] Requests Console"
allConsoles += src
if(departmentType & RC_ASSIST)
req_console_assistance |= department
if(departmentType & RC_SUPPLY)
req_console_supplies |= department
if(departmentType & RC_INFO)
req_console_information |= department
//TFF 2/5/19: Allow deconstruction to work correctly and enable setting the thing.
var/input = sanitize(input(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department))
if(!input)
to_chat(usr, "No input found. Please hang up and try your call again.")
return
department = input
announcement.title = "[department] announcement"
announcement.newscast = 1
name = "[department] Requests Console"
allConsoles += src
if(departmentType & RC_ASSIST)
req_console_assistance |= department
if(departmentType & RC_SUPPLY)
req_console_supplies |= department
if(departmentType & RC_INFO)
req_console_information |= department
return
if(istype(O, /obj/item/weapon/card/id))
if(inoperable(MAINT)) return
+44
View File
@@ -979,12 +979,19 @@
helmet.name = "engineering voidsuit helmet"
helmet.icon_state = "rig0-engineering"
helmet.item_state = "rig0-engineering"
helmet.max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
helmet.armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
helmet.desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
if(suit)
suit.name = "engineering voidsuit"
suit.icon_state = "rig-engineering"
suit.item_state = "rig-engineering"
suit.item_state_slots[slot_r_hand_str] = "eng_voidsuit"
suit.item_state_slots[slot_l_hand_str] = "eng_voidsuit"
suit.max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
suit.armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
suit.desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
if("Mining")
if(helmet)
helmet.name = "mining voidsuit helmet"
@@ -1001,12 +1008,16 @@
helmet.name = "medical voidsuit helmet"
helmet.icon_state = "rig0-medical"
helmet.item_state = "rig0-medical"
helmet.armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
helmet.desc = "A special helmet that protects against hazardous, low pressure environments. Has minor radiation shielding."
if(suit)
suit.name = "medical voidsuit"
suit.icon_state = "rig-medical"
suit.item_state = "rig-medical"
suit.item_state_slots[slot_r_hand_str] = "medical_voidsuit"
suit.item_state_slots[slot_l_hand_str] = "medical_voidsuit"
suit.armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
suit.desc = "A special suit that protects against hazardous, low pressure environments. Has minor radiation shielding."
if("Security")
if(helmet)
helmet.name = "security voidsuit helmet"
@@ -1034,56 +1045,89 @@
helmet.name = "atmospherics voidsuit helmet"
helmet.icon_state = "rig0-atmos"
helmet.item_state = "rig0-atmos"
helmet.max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
helmet.armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 50)
helmet.desc = "A special helmet designed for work in a hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
if(suit)
suit.name = "atmospherics voidsuit"
suit.icon_state = "rig-atmos"
suit.item_state = "rig-atmos"
suit.item_state_slots[slot_r_hand_str] = "atmos_voidsuit"
suit.item_state_slots[slot_l_hand_str] = "atmos_voidsuit"
suit.max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
suit.armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 50)
suit.desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
if("HAZMAT")
if(helmet)
helmet.name = "HAZMAT voidsuit helmet"
helmet.icon_state = "rig0-engineering_rad"
helmet.item_state = "rig0-engineering_rad"
helmet.max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
helmet.armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 50, bio = 100, rad = 100)
helmet.desc = "A engineering helmet designed for work in a low-pressure environment. Extra radiation shielding appears to have been installed at the price of comfort."
if(suit)
suit.name = "HAZMAT voidsuit"
suit.icon_state = "rig-engineering_rad"
suit.item_state = "rig-engineering_rad"
suit.item_state_slots[slot_r_hand_str] = "eng_voidsuit_rad"
suit.item_state_slots[slot_l_hand_str] = "eng_voidsuit_rad"
suit.max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
suit.armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 50, bio = 100, rad = 100)
suit.desc = "A engineering voidsuit that protects against hazardous, low pressure environments. Has enhanced radiation shielding compared to regular engineering voidsuits."
if("Construction")
if(helmet)
helmet.name = "Construction voidsuit helmet"
helmet.icon_state = "rig0-engineering_con"
helmet.item_state = "rig0-engineering_con"
helmet.max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
helmet.armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
helmet.desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
if(suit)
suit.name = "Construction voidsuit"
suit.icon_state = "rig-engineering_con"
suit.item_state = "rig-engineering_con"
suit.item_state_slots[slot_r_hand_str] = "eng_voidsuit_con"
suit.item_state_slots[slot_l_hand_str] = "eng_voidsuit_con"
suit.max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
suit.armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
suit.desc = "A special suit designed for work in a hazardous, low-pressure environment. Has radiation shielding."
if("Biohazard")
if(helmet)
helmet.name = "Biohazard voidsuit helmet"
helmet.icon_state = "rig0-medical_bio"
helmet.item_state = "rig0-medical_bio"
helmet.armor = list(melee = 45, bullet = 5, laser = 20, energy = 5, bomb = 15, bio = 100, rad = 75)
helmet.desc = "A special helmet that protects against hazardous environments. Has minor radiation shielding."
if(suit)
suit.name = "Biohazard voidsuit"
suit.icon_state = "rig-medical_bio"
suit.item_state = "rig-medical_bio"
suit.item_state_slots[slot_r_hand_str] = "medical_voidsuit_bio"
suit.item_state_slots[slot_l_hand_str] = "medical_voidsuit_bio"
suit.armor = list(melee = 45, bullet = 5, laser = 20, energy = 5, bomb = 15, bio = 100, rad = 75)
suit.desc = "A special suit that protects against hazardous, environments. It feels heavier than the standard suit with extra protection around the joints."
if("Emergency Medical Response")
if(helmet)
helmet.name = "emergency medical response voidsuit helmet"
helmet.icon_state = "rig0-medical_emt"
helmet.item_state = "rig0-medical_emt"
helmet.armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
helmet.desc = "A special helmet that protects against hazardous, low pressure environments. Has minor radiation shielding."
if(suit)
suit.name = "emergency medical response voidsuit"
suit.icon_state = "rig-medical_emt"
suit.item_state = "rig-medical_emt"
suit.item_state_slots[slot_r_hand_str] = "medical_voidsuit_emt"
suit.item_state_slots[slot_l_hand_str] = "medical_voidsuit_emt"
suit.armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
suit.desc = "A special suit that protects against hazardous, low pressure environments. Has minor radiation shielding."
if("^%###^%$" || "Mercenary")
if(helmet)
helmet.name = "blood-red voidsuit helmet"
+1 -1
View File
@@ -14,7 +14,7 @@
id = "[rand(1000, 9999)]"
..()
underlays.Cut()
underlays += image('icons/obj/stationobjs.dmi', icon_state = "telecomp-wires")
underlays += image('icons/obj/stationobjs.dmi', icon_state = "telecomp-wires") //TFF: Ports VOREStation Edit: different direction for wires to account for dirs.
return
/obj/machinery/computer/teleporter/initialize()
+1
View File
@@ -689,6 +689,7 @@
/obj/item/weapon/reagent_containers/food/drinks/glass2/mug = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/wine = 10,
/obj/item/weapon/reagent_containers/food/drinks/metaglass = 10,
/obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint = 10,
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 5,
+6 -6
View File
@@ -136,7 +136,7 @@
/obj/machinery/mecha_part_fabricator/attackby(var/obj/item/I, var/mob/user)
if(busy)
user << "<span class='notice'>\The [src] is busy. Please wait for completion of previous operation.</span>"
to_chat(user, "<span class='notice'>\The [src] is busy. Please wait for completion of previous operation.</span>")
return 1
if(default_deconstruction_screwdriver(user, I))
return
@@ -148,25 +148,25 @@
if(istype(I,/obj/item/stack/material))
var/obj/item/stack/material/S = I
if(!(S.material.name in materials))
user << "<span class='warning'>The [src] doesn't accept [S.material]!</span>"
to_chat(user, "<span class='warning'>The [src] doesn't accept [S.material]!</span>")
return
var/sname = "[S.name]"
var/amnt = S.perunit
if(materials[S.material.name] + amnt <= res_max_amount)
if(S && S.amount >= 1)
if(S && S.get_amount() >= 1) //TFF 2/5/19: Polaris fix for Synthesisers inserting more than what is present
var/count = 0
overlays += "mechfab-load-metal"
spawn(10)
overlays -= "mechfab-load-metal"
while(materials[S.material.name] + amnt <= res_max_amount && S.amount >= 1)
while(materials[S.material.name] + amnt <= res_max_amount && S.get_amount() >= 1) //TFF 2/5/19: Polaris fix for Synthesisers inserting more than what is present
materials[S.material.name] += amnt
S.use(1)
count++
user << "You insert [count] [sname] into the fabricator."
to_chat(user, "You insert [count] [sname] into the fabricator.")
update_busy()
else
user << "The fabricator cannot hold more [sname]."
to_chat(user, "The fabricator cannot hold more [sname].")
return
+6 -5
View File
@@ -175,25 +175,26 @@
if(istype(I,/obj/item/stack/material))
var/obj/item/stack/material/S = I
if(!(S.material.name in materials))
user << "<span class='warning'>The [src] doesn't accept [S.material]!</span>"
to_chat(user, "<span class='warning'>The [src] doesn't accept [S.material]!</span>")
return
//TFF 2/5/19: Polaris fix for Synthesisers inserting more than what is present
var/sname = "[S.name]"
var/amnt = S.perunit
if(materials[S.material.name] + amnt <= res_max_amount)
if(S && S.amount >= 1)
if(S && S.get_amount() >= 1)
var/count = 0
overlays += "fab-load-metal"
spawn(10)
overlays -= "fab-load-metal"
while(materials[S.material.name] + amnt <= res_max_amount && S.amount >= 1)
while(materials[S.material.name] + amnt <= res_max_amount && S.get_amount() >= 1)
materials[S.material.name] += amnt
S.use(1)
count++
user << "You insert [count] [sname] into the fabricator."
to_chat(user, "You insert [count] [sname] into the fabricator.")
update_busy()
else
user << "The fabricator cannot hold more [sname]."
to_chat(user, "The fabricator cannot hold more [sname].")
return
+23 -13
View File
@@ -49,22 +49,12 @@
unbuckle_all_mobs()
return ..()
//TFF 2/5/19: Polaris port for buckling-related bugs - chair-related buckling disabled
/atom/movable/proc/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE)
if(!buckled_mobs)
buckled_mobs = list()
if(!istype(M))
return FALSE
if(check_loc && M.loc != loc)
return FALSE
if((!can_buckle && !forced) || M.buckled || M.pinned.len || (buckled_mobs.len >= max_buckled_mobs) || (buckle_require_restraints && !M.restrained()))
return FALSE
if(has_buckled_mobs() && buckled_mobs.len >= max_buckled_mobs) //Handles trying to buckle yourself to the chair when someone is on it
to_chat(M, "<span class='notice'>\The [src] can't buckle anymore people.</span>")
if(!can_buckle_check(M, forced))
return FALSE
M.buckled = src
@@ -130,6 +120,9 @@
if(M in buckled_mobs)
to_chat(user, "<span class='warning'>\The [M] is already buckled to \the [src].</span>")
return FALSE
//TFF 2/5/19: Polaris port for buckling-related bugs - check for whether someone's buckled
if(!can_buckle_check(M, forced))
return FALSE
add_fingerprint(user)
// unbuckle_mob()
@@ -184,6 +177,23 @@
L.set_dir(dir)
return TRUE
//TFF 2/5/19: Polaris port for buckling-related bugs - check for whether someone's buckled
/atom/movable/proc/can_buckle_check(mob/living/M, forced = FALSE)
if(!buckled_mobs)
buckled_mobs = list()
if(!istype(M))
return FALSE
if((!can_buckle && !forced) || M.buckled || M.pinned.len || (buckled_mobs.len >= max_buckled_mobs) || (buckle_require_restraints && !M.restrained()))
return FALSE
if(has_buckled_mobs() && buckled_mobs.len >= max_buckled_mobs) //Handles trying to buckle yourself to the chair when someone is on it
to_chat(M, "<span class='notice'>\The [src] can't buckle anymore people.</span>")
return FALSE
return TRUE
/atom/movable/Move(atom/newloc, direct = 0)
. = ..()
if(. && has_buckled_mobs() && !handle_buckled_mob_movement(newloc, direct)) //movement failed due to buckled mob(s)
@@ -193,4 +203,4 @@
riding_datum.handle_vehicle_layer()
riding_datum.handle_vehicle_offsets()
//VOREStation Add End
+1 -6
View File
@@ -6,12 +6,7 @@
icon = 'icons/obj/apc_repair.dmi'
icon_state = "apc_frame"
flags = CONDUCT
/obj/item/frame/apc/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/material/steel( get_turf(src.loc), 2 )
qdel(src)
refund_amt = 2 //TFF 18/4/19: Polaris fix for APC frames giving more steel than used when made.
/obj/item/frame/apc/try_build(turf/on_wall, mob/user as mob)
if (get_dist(on_wall, user)>1)
@@ -655,6 +655,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
ui = new(user, src, ui_key, "pda.tmpl", title, 520, 400, state = inventory_state)
// add templates for screens in common with communicator.
ui.add_template("atmosphericScan", "atmospheric_scan.tmpl")
ui.add_template("crewManifest", "crew_manifest.tmpl") //TFF Port from VOREStation
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
@@ -13,8 +13,7 @@
var/im_contacts_ui[0] //List of communicators that have been messaged.
var/im_list_ui[0] //List of messages.
var/weather[0]
var/injection = null
// var/weather[0] //Unneeded variable since there's no weather at all!
var/modules_ui[0] //Home screen info.
//First we add other 'local' communicators.
@@ -68,7 +67,7 @@
for(var/I in im_list)
im_list_ui[++im_list_ui.len] = list("address" = I["address"], "to_address" = I["to_address"], "im" = I["im"])
//Weather reports.
/*//Weather reports.
if(planet_controller)
for(var/datum/planet/planet in planet_controller.planets)
if(planet.weather_holder && planet.weather_holder.current_weather)
@@ -80,9 +79,11 @@
"High" = planet.weather_holder.current_weather.temp_high - T0C,
"Low" = planet.weather_holder.current_weather.temp_low - T0C)
weather[++weather.len] = W
injection = "<div>Test</div>"
*/ //No planets with an atmosphere, doofus!
// Update manifest
data_core.get_manifest_list()
//Modules for homescreen.
for(var/list/R in modules)
modules_ui[++modules_ui.len] = R
@@ -107,19 +108,22 @@
data["ring"] = ringer
data["homeScreen"] = modules_ui
data["note"] = note // current notes
data["weather"] = weather
//data["weather"] = weather //Unneeded portion: no planets with an atmosphere that HAS weather!
data["aircontents"] = src.analyze_air()
data["flashlight"] = fon
data["injection"] = injection
data["manifest"] = PDA_Manifest
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
data["currentTab"] = 1 // Reset the current tab, because we're going to home page //TFF VOREStation port
ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 475, 700, state = key_state)
// add templates for screens in common with communicator.
ui.add_template("atmosphericScan", "atmospheric_scan.tmpl")
// TheFurryFeline: Adds Manifest listing
ui.add_template("crewManifest","crew_manifest.tmpl")
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
@@ -244,6 +248,14 @@
else
note = ""
notehtml = note
if(href_list["switch_template"])
var/datum/nanoui/ui = nanomanager.get_open_ui(usr, src, "main")
if(ui)
switch(href_list["switch_template"])
if("1")
ui.reinitialise("communicator.tmpl")
if("2")
ui.reinitialise("comm2.tmpl")
if(href_list["Light"])
fon = !fon
@@ -4,6 +4,16 @@
var/global/list/obj/item/device/communicator/all_communicators = list()
// List of core tabs the communicator can switch to //TFF Port from VOREStation
#define HOMETAB 1
#define PHONTAB 2
#define CONTTAB 3
#define MESSTAB 4
#define NOTETAB 5
#define ATMSTAB 6
#define MANITAB 7
#define SETTTAB 8
/obj/item/device/communicator
name = "communicator"
desc = "A personal device used to enable long range dialog between two people, utilizing existing telecommunications infrastructure to allow \
@@ -36,15 +46,16 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
var/flum = 2 // Brightness
var/list/modules = list(
list("module" = "Phone", "icon" = "phone64", "number" = 2),
list("module" = "Contacts", "icon" = "person64", "number" = 3),
list("module" = "Messaging", "icon" = "comment64", "number" = 4),
list("module" = "Note", "icon" = "note64", "number" = 5),
list("module" = "Weather", "icon" = "sun64", "number" = 6),
list("module" = "Settings", "icon" = "gear64", "number" = 7)
list("module" = "Phone", "icon" = "phone64", "number" = PHONTAB),
list("module" = "Contacts", "icon" = "person64", "number" = CONTTAB),
list("module" = "Messaging", "icon" = "comment64", "number" = MESSTAB),
list("module" = "Note", "icon" = "note64", "number" = NOTETAB),
list("module" = "Atmos", "icon" = "sun64", "number" = ATMSTAB),
list("module" = "Crew Manifest", "icon" = "note64", "number" = MANITAB), // Need a different icon, //TFF Port from VOREStation
list("module" = "Settings", "icon" = "gear64", "number" = SETTTAB),
) //list("module" = "Name of Module", "icon" = "icon name64", "number" = "what tab is the module")
var/selected_tab = 1
var/selected_tab = HOMETAB
var/owner = ""
var/occupation = ""
var/alert_called = 0
@@ -221,9 +232,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(video_source)
watch_video(user)
/obj/item/device/communicator/AltClick(mob/user) //Chomp edit.
attack_self(user) //wow big skill
// Proc: MouseDrop()
//Same thing PDAs do
/obj/item/device/communicator/MouseDrop(obj/over_object as obj)
@@ -71,6 +71,8 @@
/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user)
if(!(user in (viewers(world.view,target))))
return
if(!(target in view(user, world.view))) ///TFF 18/4/19: VOREStation port - prevent laser light reaching the other side of a wall.
return
if(!(world.time - last_used_time >= cooldown))
return
if (!diode)
@@ -55,6 +55,11 @@
var/failmsg = ""
var/charge = 0
// Eating used bulbs gives us bulb shards
var/bulb_shards = 0
// when we get this many shards, we get a free bulb.
var/shards_required = 4
/obj/item/device/lightreplacer/New()
failmsg = "The [name]'s refill light blinks red."
..()
@@ -77,18 +82,55 @@
to_chat(user, "<span class='warning'>You need one sheet of glass to replace lights.</span>")
if(istype(W, /obj/item/weapon/light))
var/new_bulbs = 0
var/obj/item/weapon/light/L = W
if(L.status == 0) // LIGHT OKAY
if(uses < max_uses)
if(!user.unEquip(W))
return
add_uses(1)
to_chat(user, "You insert \the [L.name] into \the [src.name]. You have [uses] light\s remaining.")
user.drop_item()
qdel(L)
return
else
to_chat(user, "You need a working light.")
if(!user.unEquip(W))
return
new_bulbs += AddShards(1)
qdel(L)
if(new_bulbs != 0)
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
to_chat(user, "You insert \the [L.name] into \the [src.name]. You have [uses] light\s remaining.")
return
if(istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
var/found_lightbulbs = FALSE
var/replaced_something = TRUE
for(var/obj/item/I in S.contents)
if(istype(I,/obj/item/weapon/light))
var/obj/item/weapon/light/L = I
found_lightbulbs = TRUE
if(src.uses >= max_uses)
break
if(L.status == LIGHT_OK)
replaced_something = TRUE
add_uses(1)
qdel(L)
else if(L.status == LIGHT_BROKEN || L.status == LIGHT_BURNED)
replaced_something = TRUE
AddShards(1)
qdel(L)
if(!found_lightbulbs)
to_chat(user, "<span class='warning'>\The [S] contains no bulbs.</span>")
return
if(!replaced_something && src.uses == max_uses)
to_chat(user, "<span class='warning'>\The [src] is full!</span>")
return
to_chat(user, "<span class='notice'>You fill \the [src] with lights from \the [S].</span>")
/obj/item/device/lightreplacer/attack_self(mob/user)
/* // This would probably be a bit OP. If you want it though, uncomment the code.
if(isrobot(user))
@@ -114,6 +156,15 @@
/obj/item/device/lightreplacer/proc/add_uses(var/amount = 1)
uses = min(max(uses + amount, 0), max_uses)
/obj/item/device/lightreplacer/proc/AddShards(amount = 1)
bulb_shards += amount
var/new_bulbs = round(bulb_shards / shards_required)
if(new_bulbs > 0)
add_uses(new_bulbs)
bulb_shards = bulb_shards % shards_required
return new_bulbs
/obj/item/device/lightreplacer/proc/Charge(var/mob/user, var/amount = 1)
charge += amount
if(charge > 6)
@@ -128,17 +179,10 @@
U << "<span class='notice'>You replace the [target.fitting] with the [src].</span>"
if(target.status != LIGHT_EMPTY)
var/obj/item/weapon/light/L1 = new target.light_type(target.loc)
L1.status = target.status
L1.rigged = target.rigged
L1.brightness_range = target.brightness_range
L1.brightness_power = target.brightness_power
L1.brightness_color = target.brightness_color
L1.switchcount = target.switchcount
target.switchcount = 0
L1.update()
var/new_bulbs = AddShards(1)
if(new_bulbs != 0)
to_chat(U, "<span class='notice'>\The [src] has fabricated a new bulb from the broken bulbs it has stored. It now has [uses] uses.</span>")
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
target.status = LIGHT_EMPTY
target.update()
@@ -5,7 +5,9 @@
icon = 'icons/obj/device.dmi'
icon_state = "suitcooler0"
slot_flags = SLOT_BACK
var/emagged = 0 //CHOMPEDIT Cooling suit emagging
//copied from tank.dm
flags = CONDUCT
force = 5.0
@@ -35,6 +37,9 @@
cell.loc = src
/obj/item/device/suit_cooling_unit/process()
if (emagged)
emagprocess() //CHOMPEDIT Should be good enough to override natural process
return
if (!on || !cell)
return
@@ -193,3 +198,91 @@
user << "The charge meter reads [round(cell.percent())]%."
else
user << "It doesn't have a power cell installed."
//CHOMPEDIT hey you wanna go out into space here i got you a spacesuit, even got a cooling module :) trust me friend.
//Tampered Cooling unit, or also "Heating unit"
/obj/item/device/suit_cooling_unit/tampered
name = "modified portable suit cooling unit"
origin_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4)
max_cooling = 10
thermostat = T20C
desc = "A portable heat sink and liquid cooled radiator that can be hooked up to a space suit's existing temperature controls to provide industrial levels of cooling. This ones panel seems a bit loose and wires are hanging out."
/obj/item/device/suit_cooling_unit/tampered/process()
emagprocess()
/obj/item/device/suit_cooling_unit/proc/emagprocess()
if (!on || !cell)
return
if (!ismob(loc))
return
if (!attached_to_suit(loc)) //make sure they have a suit and we are attached to it
return
var/mob/living/carbon/human/H = loc
var/efficiency = 1 - H.get_pressure_weakness() // You need to have a good seal for effective "cooling"
var/temp_adj = 0 // How much the unit heats you. Adjusted later on.
var/env_temp = get_environment_temperature() // This won't save you from a fire, yup
var/thermal_protection = H.get_heat_protection(env_temp) // ... unless you've got a good suit. not even then
if(thermal_protection < 0.99) //For some reason, < 1 returns false if the value is 1.
temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling)
else
temp_adj = min(H.bodytemperature - thermostat, max_cooling)
//if (temp_adj < 0.5) //no safety
// return
var/charge_usage = (temp_adj/max_cooling)*charge_consumption
H.bodytemperature += temp_adj*efficiency //plus instead of minus
cell.use(charge_usage)
if(cell.charge <= 0)
turn_off(1)
//CHOMPEDIT Let's go rogue bb
/obj/item/device/suit_cooling_unit/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
user << "<span class='danger'>You stealthily swipe the cryptographic sequencer through \the [src].</span>"
playsound(src, "sparks", 50, 1)
emagged = 1
if (!on)
on = 1 //automatically turns it on
/mob/living/simple_animal/hostile/jelly/cold //you are my test mob now fug you
hostile=0
retaliate=1
name = "Frostbite Jelly"
//might make a blue icon someday, not priority this is debug stuff
var/cooling = -5000 //variable cooling
var/isCooling = 1
cold_damage_per_tick = 0
maxbodytemp = 20000000
/mob/living/simple_animal/hostile/jelly/cold/proc/toggle_cooling()
isCooling=!isCooling
/mob/living/simple_animal/hostile/jelly/cold/proc/handle_cooling(var/datum/gas_mixture/environment)
var/datum/gas_mixture/gas
gas = environment.remove(0.5 * environment.total_moles)
if(gas)
gas.add_thermal_energy(cooling)
environment.merge(gas)
/mob/living/simple_animal/hostile/jelly/cold/Life()
..()
var/datum/gas_mixture/environment = src.loc.return_air()
if(icon_state != icon_dead && isCooling)
handle_cooling(environment)
//src.bodytemperature += cooling //Removing self nuke
if(src.bodytemperature<=-500)
isCooling = 0
if(src.bodytemperature>=-499)
isCooling = 1
//This thing is basically a cooling unit and could be used for the engine, I mean what
+8 -8
View File
@@ -319,10 +319,10 @@
var/newline = html_encode(input("Enter your line: ", "violin") as text|null)
if(!newline)
return
if(song.lines.len > 50)
if(song.lines.len > 500)
return
if(lentext(newline) > 50)
newline = copytext(newline, 1, 50)
if(lentext(newline) > 500)
newline = copytext(newline, 1, 500)
song.lines.Add(newline)
else if(href_list["deleteline"])
@@ -336,8 +336,8 @@
var/content = html_encode(input("Enter your line: ", "violin", song.lines[num]) as text|null)
if(!content)
return
if(lentext(content) > 50)
content = copytext(content, 1, 50)
if(lentext(content) > 500)
content = copytext(content, 1, 500)
if(num > song.lines.len || num < 1)
return
song.lines[num] = content
@@ -371,12 +371,12 @@
if(copytext(lines[1],1,6) == "BPM: ")
tempo = 600 / text2num(copytext(lines[1],6))
lines.Cut(1,2)
if(lines.len > 50)
if(lines.len > 500)
usr << "Too many lines!"
lines.Cut(51)
lines.Cut(501)
var/linenum = 1
for(var/l in lines)
if(lentext(l) > 50)
if(lentext(l) > 500)
usr << "Line [linenum] too long!"
lines.Remove(l)
else
@@ -9,3 +9,21 @@
return 1
else
return 0
//TFF: Ports VOREStation addition - ability for borgs to change size at will.
/obj/item/borg/upgrade/sizeshift
name = "robot size alteration module"
desc = "Using technology similar to one used in sizeguns, allows cyborgs to adjust their own size as neccesary."
icon_state = "cyborg_upgrade2"
item_state = "cyborg_upgrade"
require_module = 1
/obj/item/borg/upgrade/sizeshift/action(var/mob/living/silicon/robot/R)
if(..()) return 0
if(/mob/living/proc/set_size in R.verbs)
return 0
R.verbs += /mob/living/proc/set_size
return 1
+8 -2
View File
@@ -519,7 +519,7 @@
/obj/item/toy/figure/attack_self(mob/user as mob)
if(cooldown < world.time)
cooldown = (world.time + 30) //3 second cooldown
user.visible_message("<span class='notice'>The [src] says \"[toysay]\".</span>")
user.visible_message("<span class='notice'>The [src] says \"[toysay]\"</span>")
playsound(user, 'sound/machines/click.ogg', 20, 1)
/obj/item/toy/figure/cmo
@@ -746,7 +746,7 @@
/obj/item/toy/figure/paramedic
name = "Paramedic action figure"
desc = "A \"Space Life\" brand Paramedic action figure."
desc = "A \"Space Life\" brand space bounty hunter action figure."
icon_state = "paramedic"
toysay = "WHERE ARE YOU??"
@@ -755,6 +755,12 @@
desc = "A \"Space Life\" brand Emergency Response Team Commander action figure."
icon_state = "ert"
toysay = "We're probably the good guys!"
/obj/item/toy/figure/samus
name = "Space bounty hunter action figure"
desc = "A \"Space Life\" brand Emergency Response Team Commander action figure."
icon_state = "samus"
toysay = "The last greytide is in captivity. The station is at peace."
/*
* Plushies
@@ -18,10 +18,10 @@
/obj/item/weapon/soap/New()
..()
create_reagents(5)
wet()
/obj/item/weapon/soap/proc/wet()
reagents.add_reagent("cleaner", 5)
wet(5)
/obj/item/weapon/soap/proc/wet(var/amount)
reagents.add_reagent("cleaner", amount)
/obj/item/weapon/soap/Crossed(AM as mob|obj)
if (istype(AM, /mob/living))
@@ -47,7 +47,10 @@
T.clean(src, user)
else if(istype(target,/obj/structure/sink))
to_chat(user, "<span class='notice'>You wet \the [src] in the sink.</span>")
wet()
if(tile_clean_amount)
wet(tile_clean_amount)
else
wet(5)
else
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
target.clean_blood()
@@ -67,7 +70,7 @@
/obj/item/weapon/bikehorn/attack_self(mob/user as mob)
if (spam_flag == 0)
spam_flag = 1
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
playsound(src.loc, honkSound, 50, 1)
src.add_fingerprint(user)
spawn(20)
spam_flag = 0
@@ -149,17 +149,23 @@
item_state = "gold_id"
preserve_item = 1
//TFF 3/5/19 - allow Captain to get into Clown/Mime Office. Why? Because they already have access to the rest of the station.
/obj/item/weapon/card/id/gold/captain
assignment = "Colony Director"
rank = "Colony Director"
job_access_type = /datum/job/captain
/obj/item/weapon/card/id/gold/captain/initialize()
. = ..()
access = get_all_station_access() + access_mime + access_clown
/obj/item/weapon/card/id/gold/captain/spare
name = "\improper Colony Director's spare ID"
desc = "The spare ID of the High Lord himself."
registered_name = "Colony Director"
job_access_type = /datum/job/captain
//TFF 3/5/19 - allow borgs/drones to get into Clown/Mime Office. Why? Because they already have access to the rest of the station.
/obj/item/weapon/card/id/synthetic
name = "\improper Synthetic ID"
desc = "Access module for NanoTrasen Synthetics"
@@ -169,7 +175,7 @@
/obj/item/weapon/card/id/synthetic/initialize()
. = ..()
access = get_all_station_access() + access_synth
access = get_all_station_access() + access_clown + access_mime + access_synth
/obj/item/weapon/card/id/centcom
name = "\improper CentCom. ID"
@@ -277,6 +283,11 @@
primary_color = rgb(189,94,0)
secondary_color = rgb(223,159,95)
/obj/item/weapon/card/id/engineering/spare //CHOMPEDIT: So in case of emergency solars can be set up
name = "Spare Electrical access card"
desc = "A spare for the case that power related issues arise without engineers aboard."
primary_color = rgb(0,0,0)
/obj/item/weapon/card/id/engineering/engineer
assignment = "Station Engineer"
rank = "Station Engineer"
@@ -419,3 +430,14 @@
icon_state = "permit"
primary_color = rgb(142,94,0)
secondary_color = rgb(191,159,95)
//TFF 3/5/19 - allow clown/mime players to spawn in with real IDs and get into their places.
/obj/item/weapon/card/id/civilian/clown
assignment = "Clown"
rank = "Clown"
job_access_type = /datum/job/clown
/obj/item/weapon/card/id/civilian/mime
assignment = "Mime"
rank = "Mime"
job_access_type = /datum/job/mime
+28 -13
View File
@@ -33,6 +33,7 @@
author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "Particle Accelerator User's Guide"
//TFF 18/5/19 - update information, add Tesla engine usage section
/obj/item/weapon/book/manual/engineering_particle_accelerator/New()
..()
dat = {"<html>
@@ -59,7 +60,7 @@
<li>Close all the panels with your <b>screwdriver</b></li>
</ol>
<h2>Using the accelerator</h2>
<h2>Using the accelerator for the singularity engine</h2>
<ol>
<li>Open the control panel</li>
@@ -69,6 +70,16 @@
<li>Remember to wear a radiation suit when working with this machine... we did tell you that at the start, right?</li>
</ol>
<h2>Using the accelerator for the Tesla engine</h2>
<ol>
<li>Open the control panel</li>
<li>Set the speed to 2</li>
<li>Start firing at the tesla generator</li>
<li><font color='red'><b>When the energy ball gains a sufficient number of mini-balls orbiting it, such as around a dozen, set the speed down to 0, but don't shut it off</b></font></li>
<li>Remember to wear a radiation suit when working with this machine... we did tell you that at the start, right?</li>
</ol>
</body>
</html>
"}
@@ -80,6 +91,7 @@
author = "Central Engineering Division"
title = "Supermatter Engine Operating Manual"
//TFF 18/5/19 - update information
/obj/item/weapon/book/manual/supermatter_engine/New()
..()
dat = {"<html>
@@ -98,7 +110,7 @@
<br>
<h2>OPERATING PRINCIPLES</h2>
<br>
<li>The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction, and phoron carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.</li>
<li>The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction, and phoron carries the risk of fire, these must be filtered out.</li>
<br>
<li>Air in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.</li>
<br>
@@ -116,9 +128,9 @@
<br>
<h2>STARTUP PROCEDURE</h2>
<ol>
<li>Fill reactor loop and radiator loop with two (2) standard canisters of nitrogen gas each.</li>
<li>Fill reactor loop and radiator loop with two (2) standard canisters of any one type of gas each, excluding, obviously, oxygen.</li>
<li>Ensure that pumps and filters are on and operating at maximum power.</li>
<li>Fire 8-9 pulses from emitter at supermatter crystal. Reactor blast doors must be open for this procedure.</li>
<li>Fire from eight to sixteen pulses, depending on your chosen gas coolant, from emitter at supermatter crystal. Reactor blast doors must be open for this procedure.</li>
</ol>
<br>
<h2>OPERATION AND MAINTENANCE</h2>
@@ -149,6 +161,7 @@
// TESLA Engine
//TFF 18/5/19 - update information
/obj/item/weapon/book/manual/tesla_engine
name = "Tesla Operating Manual"
icon_state ="bookTesla"
@@ -196,7 +209,7 @@
<br>
<h2>OPERATION AND MAINTENANCE</h2>
<ol>
<li>Ensure that electrical protection and meson goggles are worn at all times while working in the engine room.</li>
<li>Ensure that electrical protection and welding tool protection are worn at all times while working with the engine and its individual components wherever they are set up.</li>
<li>Ensure that Telsa Coils and/or Grounding Rods are placed to safely collect or ground any and all shock.</li>
<li>Ensure that all Emitters remain activated and have unobstructed lines of fire to the Field Generators.</li>
<li>Do <b>not</b> let the Emitters run out of power.</li>
@@ -224,6 +237,7 @@
author = "Cindy Crawfish"
title = "R-UST Operating Manual"
//TFF 18/5/19 - TODO, update information on this if/when I get around to bringing a submap for engine rotation into the game.
/obj/item/weapon/book/manual/rust_engine/New()
..()
dat = {"<html>
@@ -272,7 +286,7 @@
</head>
<body>
<iframe width='100%' height='97%' src="[config.wikiurl]Hacking&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
<iframe width='100%' height='97%' src="[config.wikiurl]Guide_to_Hacking&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
</body>
</html>
@@ -462,7 +476,7 @@
</html>
"}
//TFF 18/5/19 - update information
/obj/item/weapon/book/manual/ripley_build_and_repair
name = "APLU \"Ripley\" Construction and Operation Manual"
icon_state ="book"
@@ -514,14 +528,14 @@
<li>Adjust the servohydraulics with a screwdriver.</li>
<li>Wire the chassis (Cable is not included).</li>
<li>Use the wirecutters to remove the excess cable if needed.</li>
<li>Install the central control module (Not included. Use supplied datadisk to create one).</li>
<li>Install the central control module (Not included. Print from a Circuit Imprinter in the Research and Development Room).</li>
<li>Secure the mainboard with a screwdriver.</li>
<li>Install the peripherals control module (Not included. Use supplied datadisk to create one).</li>
<li>Install the peripherals control module (Not included. Print from a Circuit Imprinter in the Research and Development Room).</li>
<li>Secure the peripherals control module with a screwdriver.</li>
<li>Install the internal armor plating (Not included due to corporate regulations. Can be made using 5 metal sheets).</li>
<li>Install the internal armor plating by using some sheets of steel in the appropriate closet of materials.</li>
<li>Secure the internal armor plating with a wrench.</li>
<li>Weld the internal armor plating to the chassis.</li>
<li>Install the external reinforced armor plating (Not included due to corporate regulations. Can be made using 5 reinforced metal sheets).</li>
<li>Install the external reinforced armor plating by using some sheets of plasteel in the appropriate closet of materials.</li>
<li>Secure the external reinforced armor plating with a wrench.</li>
<li>Weld the external reinforced armor plating to the chassis.</li>
</ol>
@@ -892,7 +906,8 @@
author = "Engineering Encyclopedia"
title = "Engineering Textbook"
/obj/item/weapon/book/manual/engineering_guide/New()
//TFF 18/5/19 - Temporary removal as we don't have the appropriate article on our wiki.
/*/obj/item/weapon/book/manual/engineering_guide/New()
..()
dat = {"
@@ -905,7 +920,7 @@
</html>
"}
*/
/obj/item/weapon/book/manual/chef_recipes
name = "Chef Recipes"
@@ -33,3 +33,12 @@
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
visible_message(span("danger", "[user] is slitting [TU.his] stomach open with \the [src.name]! It looks like [TU.hes] trying to commit seppuku."), span("danger", "You slit your stomach open with \the [src.name]!"), span("danger", "You hear the sound of flesh tearing open.")) // gory, but it gets the point across
return(BRUTELOSS)
//CHOMPEDIT CHAPLAIN SWORD OF ~~The honkmother~~
/obj/item/weapon/material/sword/chaplain
name = "chaplains claymore"
desc = "There can only honk one!"
force_divisor = 0.0
thrown_force_divisor = 0.0
sharp = 0
edge = 0
hitsound = 'sound/items/bikehorn.ogg'
+45 -10
View File
@@ -134,17 +134,18 @@ var/list/tape_roll_applications = list()
update_icon()
return ..()
//TFF 2/5/19: Polaris fix for taperolls not being usable on tiles with directional windows
/obj/item/taperoll/attack_self(mob/user as mob)
if(!start)
start = get_turf(src)
usr << "<span class='notice'>You place the first end of \the [src].</span>"
to_chat(user, "<span class='notice'>You place the first end of \the [src].</span>")
update_icon()
else
end = get_turf(src)
if(start.y != end.y && start.x != end.x || start.z != end.z)
start = null
update_icon()
usr << "<span class='notice'>\The [src] can only be laid horizontally or vertically.</span>"
to_chat(user, "<span class='notice'>\The [src] can only be laid horizontally or vertically.</span>")
return
if(start == end)
@@ -154,15 +155,18 @@ var/list/tape_roll_applications = list()
for(var/dir in cardinal)
T = get_step(start, dir)
if(T && T.density)
possible_dirs += dir
possible_dirs |= dir //TFF 2/5/19: Polaris fix for taperolls not being usable on tiles with directional windows
else
for(var/obj/structure/window/W in T)
if(W.is_fulltile() || W.dir == reverse_dir[dir])
possible_dirs += dir
possible_dirs |= dir
for(var/obj/structure/window/window in start)
if(istype(window) && !window.is_fulltile())
possible_dirs |= window.dir
if(!possible_dirs)
start = null
update_icon()
usr << "<span class='notice'>You can't place \the [src] here.</span>"
to_chat(user, "<span class='notice'>You can't place \the [src] here.</span>")
return
if(possible_dirs & (NORTH|SOUTH))
var/obj/item/tape/TP = new tape_type(start)
@@ -178,7 +182,7 @@ var/list/tape_roll_applications = list()
TP.update_icon()
start = null
update_icon()
usr << "<span class='notice'>You finish placing \the [src].</span>"
to_chat(user, "<span class='notice'>You finish placing \the [src].</span>")
return
var/turf/cur = start
@@ -196,6 +200,29 @@ var/list/tape_roll_applications = list()
can_place = 0
else
for(var/obj/O in cur)
//TFF 2/5/19: Handle places where you can't place down table (I think)
if(istype(O, /obj/structure/window))
var/obj/structure/window/window = O
if(window.is_fulltile())
can_place = 0
break
if(cur == start)
if(window.dir == orientation)
can_place = 0
break
else
continue
else if(cur == end)
if(window.dir == reverse_dir[orientation])
can_place = 0
break
else
continue
else if (window.dir == reverse_dir[orientation] || window.dir == orientation)
can_place = 0
break
else
continue
if(O.density)
can_place = 0
break
@@ -205,7 +232,7 @@ var/list/tape_roll_applications = list()
if (!can_place)
start = null
update_icon()
usr << "<span class='warning'>You can't run \the [src] through that!</span>"
to_chat(user, "<span class='warning'>You can't run \the [src] through that!</span>")
return
cur = start
@@ -221,6 +248,10 @@ var/list/tape_roll_applications = list()
for(var/obj/structure/window/W in T)
if(W.is_fulltile() || W.dir == orientation)
tape_dir = dir
//TFF 2/5/19 - reverse orientation
for(var/obj/structure/window/window in cur)
if(istype(window) && !window.is_fulltile() && window.dir == reverse_dir[orientation])
tape_dir = dir
else if(cur == end)
var/turf/T = get_step(end, orientation)
if(T && !T.density)
@@ -228,6 +259,10 @@ var/list/tape_roll_applications = list()
for(var/obj/structure/window/W in T)
if(W.is_fulltile() || W.dir == reverse_dir[orientation])
tape_dir = dir
//TFF 2/5/19 - regular orientation
for(var/obj/structure/window/window in cur)
if(istype(window) && !window.is_fulltile() && window.dir == orientation)
tape_dir = dir
for(var/obj/item/tape/T in cur)
if((T.tape_dir == tape_dir) && (T.icon_base == icon_base))
tapetest = 1
@@ -243,7 +278,7 @@ var/list/tape_roll_applications = list()
cur = get_step_towards(cur,end)
start = null
update_icon()
usr << "<span class='notice'>You finish placing \the [src].</span>"
to_chat(user, "<span class='notice'>You finish placing \the [src].</span>")
return
/obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity)
@@ -253,12 +288,12 @@ var/list/tape_roll_applications = list()
if (istype(A, /obj/machinery/door))
var/turf/T = get_turf(A)
if(locate(/obj/item/tape, A.loc))
user << "There's already tape over that door!"
to_chat(user, "There's already tape over that door!")
else
var/obj/item/tape/P = new tape_type(T)
P.update_icon()
P.layer = WINDOW_LAYER
user << "<span class='notice'>You finish placing \the [src].</span>"
to_chat(user, "<span class='notice'>You finish placing \the [src].</span>")
if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor))
var/turf/F = A
@@ -58,6 +58,14 @@
return
. = ..()
/obj/item/weapon/storage/backpack/storagecore
name = "Storage Core"
desc = "A repurposed technomancer core, your own little pocket dimension"
icon_state = "storagecore"
max_w_class = ITEMSIZE_LARGE
max_storage_space = 112
storage_cost = INVENTORY_STANDARD_SPACE + 1
//Please don't clutter the parent storage item with stupid hacks.
/obj/item/weapon/storage/backpack/holding/can_be_inserted(obj/item/W as obj, stop_messages = 0)
if(istype(W, /obj/item/weapon/storage/backpack/holding))
@@ -57,6 +57,7 @@
desc = "A survival box issued to crew members for use in emergency situations."
starts_with = list(
/obj/item/clothing/glasses/goggles, //VOREStation Add - Goggles for the phoron atmosphere,
/obj/item/weapon/prybar/red, //TFF: Ports prybar addition from VOREStation,
/obj/item/clothing/mask/breath
)
@@ -64,7 +65,8 @@
name = "synthetic supply box"
desc = "A survival box issued to synthetic crew members for use in emergency situations."
starts_with = list(
/obj/item/clothing/glasses/goggles //VOREStation Add - Goggles for the phoron atmosphere,
/obj/item/clothing/glasses/goggles, //VOREStation Add - Goggles for the phoron atmosphere,
/obj/item/weapon/prybar/red //TFF: Ports prybar addition from VOREStation,
)
/obj/item/weapon/storage/box/survival/comp
@@ -73,6 +75,7 @@
icon_state = "survival"
starts_with = list(
/obj/item/clothing/glasses/goggles, //VOREStation Add - Goggles for the phoron atmosphere,
/obj/item/weapon/prybar/red, //TFF: Ports prybar addition from VOREStation,
/obj/item/weapon/reagent_containers/hypospray/autoinjector,
/obj/item/stack/medical/bruise_pack,
/obj/item/device/flashlight/glowstick,
@@ -479,3 +482,9 @@
name = "ambrosia deus seeds box"
desc = "Contains the seeds you need to get a proper healthy high."
starts_with = list(/obj/item/seeds/ambrosiadeusseed = 7)
//TFF: Add special box for Command Secretaries' equipment.
/obj/item/weapon/storage/box/command_sec
name = "clipboards and pens"
desc = "Contains a few clipboards and pens for your new secretary!"
starts_with = list(/obj/item/weapon/pen = 4, /obj/item/weapon/clipboard = 4)
+1 -1
View File
@@ -166,7 +166,7 @@
var/mob/living/carbon/human/H = target
affecting = H.get_organ(hit_zone)
if(user.a_intent == I_HURT || user.a_intent == I_DISARM)
if(user.a_intent == I_HURT)
. = ..()
//whacking someone causes a much poorer electrical contact than deliberately prodding them.
agony *= 0.5
@@ -133,13 +133,13 @@
/obj/item/weapon/tank/emergency/oxygen
name = "emergency oxygen tank"
desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it."
desc = "Used for emergencies. Use sparingly if you need it." //TFF: Changes desc since it's got a full tank now.
icon_state = "emergency"
gauge_icon = "indicator_emergency"
/obj/item/weapon/tank/emergency/oxygen/New()
..()
src.air_contents.adjust_gas("oxygen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
src.air_contents.adjust_gas("oxygen", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) //TFF: Ports full tank version from Polaris.
return
@@ -167,7 +167,7 @@
/obj/item/weapon/tank/emergency/nitrogen/New()
..()
src.air_contents.adjust_gas("nitrogen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
src.air_contents.adjust_gas("nitrogen", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) //TFF: Ports Polaris's full tank edit. Note: Not sure why this is needed. Or more specifically was done. Probably isn't needed.
/obj/item/weapon/tank/emergency/nitrogen/double
name = "double emergency nitrogen tank"
@@ -183,7 +183,7 @@
/obj/item/weapon/tank/emergency/phoron/New()
..()
src.air_contents.adjust_gas("phoron", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
src.air_contents.adjust_gas("phoron", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) //TFF: Ports Polaris's full tank edit.
/obj/item/weapon/tank/emergency/phoron/double
name = "double emergency phoron tank"
+7
View File
@@ -5,6 +5,11 @@
icon_state = "taperoll"
w_class = ITEMSIZE_TINY
/obj/item/weapon/tape_roll/New()
..()
if(Holiday == "April Fool's Day")
name = "flextape roll"
/obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user)
if(istype(H))
var/can_place = 0
@@ -143,6 +148,8 @@
/obj/item/weapon/ducttape/New()
..()
flags |= NOBLUDGEON
if(Holiday == "April Fool's Day")
name = "flextape"
/obj/item/weapon/ducttape/examine(mob/user)
return stuck.examine(user)
+29
View File
@@ -978,6 +978,35 @@
user.put_in_active_hand(counterpart)
to_chat(user, "<span class='notice'>You attach the cutting jaws to [src].</span>")
//TFF: Add new tool, prybar, ported from VOREStation.
/obj/item/weapon/prybar
name = "pry bar"
desc = "A steel bar with a wedge, designed specifically for opening unpowered doors in an emergency. It comes in a variety of configurations - collect them all!"
icon = 'icons/obj/tools_vr.dmi'
icon_state = "prybar"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 4
throwforce = 5
pry = 1
item_state = "crowbar"
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_ENGINEERING = 1)
matter = list(DEFAULT_WALL_MATERIAL = 30)
attack_verb = list("whapped", "smacked", "swatted", "thwacked", "hit")
usesound = 'sound/items/crowbar.ogg'
toolspeed = 1
var/random_color = TRUE
/obj/item/weapon/prybar/red
icon_state = "prybar_red"
item_state = "crowbar_red"
random_color = FALSE
/obj/item/weapon/prybar/New()
if(random_color)
icon_state = "prybar[pick("","_green","_aubergine","_blue")]"
. = ..()
/*/obj/item/weapon/combitool
name = "combi-tool"
+4 -3
View File
@@ -16,7 +16,7 @@
/mob/living/simple_animal/hostile/scarybat = 70,
/mob/living/simple_animal/hostile/jelly = 25,
/mob/living/simple_animal/hostile/bear = 1,
/mob/living/simple_animal/hostile/deathclaw = 1,
/mob/living/simple_animal/hostile/deathclaw/minor = 1,
/mob/living/simple_animal/hostile/goose = 60,
/mob/living/simple_animal/retaliate/bee = 50,
/mob/living/simple_animal/hostile/metroid/mine = 20,
@@ -26,7 +26,8 @@
if(!ispath(mob_path))
return 0
var/mob/living/L = new mob_path(get_turf(src))
L/simple_animal.vore_escape_time = 15 SECONDS
if (ispath(L, /mob/living/simple_animal))
L/simple_animal.vore_escape_time = 15 SECONDS // Mob vore nerf!
L.source_spawner = src
spawned_mobs.Add(L)
last_spawn = world.time
@@ -34,4 +35,4 @@
total_spawns--
if(mob_faction)
L.faction = mob_faction
return L
return L
@@ -74,6 +74,23 @@
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt,
/obj/item/clothing/glasses/sunglasses)
//TFF: Command Secretary Equipment
/obj/structure/closet/secure_closet/comsecequip
name = "command secretary's equipment"
icon_state = "hopsecure1"
icon_closed = "hopsecure"
icon_locked = "hopsecure1"
icon_opened = "hopsecureopen"
icon_broken = "hopsecurebroken"
icon_off = "hopsecureoff"
req_access = list(access_hop, access_heads)
starts_with = list(
/obj/item/device/radio/headset/headset_com = 3,
/obj/item/clothing/under/suit_jacket/female/skirt = 2,
/obj/item/clothing/under/suit_jacket/charcoal = 2,
/obj/item/weapon/storage/box/command_sec)
/obj/structure/closet/secure_closet/hos
name = "head of security's locker"
+12 -12
View File
@@ -318,8 +318,8 @@
defined by tempo / x: <i>C,G/2,E/4</i><br>
Combined, an example is: <i>E-E4/4,/2,G#/8,B/8,E3-E4/4</i>
<br>
Lines may be up to 50 characters.<br>
A song may only contain up to 50 lines.<br>
Lines may be up to 500 characters.<br>
A song may only contain up to 500 lines.<br>
"}
else
dat += "<A href='?src=\ref[src];help=2'>Show Help</A><BR>"
@@ -360,10 +360,10 @@
var/newline = html_encode(input("Enter your line: ", "Piano") as text|null)
if(!newline)
return
if(song.lines.len > 50)
if(song.lines.len > 500)
return
if(lentext(newline) > 50)
newline = copytext(newline, 1, 50)
if(lentext(newline) > 500)
newline = copytext(newline, 1, 500)
song.lines.Add(newline)
else if(href_list["deleteline"])
@@ -377,8 +377,8 @@
var/content = html_encode(input("Enter your line: ", "Piano", song.lines[num]) as text|null)
if(!content)
return
if(lentext(content) > 50)
content = copytext(content, 1, 50)
if(lentext(content) > 500)
content = copytext(content, 1, 500)
if(num > song.lines.len || num < 1)
return
song.lines[num] = content
@@ -399,11 +399,11 @@
if (!in_range(src, usr))
return
if(lentext(t) >= 3072)
if(lentext(t) >= 5000)
var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no")
if(cont == "no")
break
while(lentext(t) > 3072)
while(lentext(t) > 5000)
//split into lines
spawn()
@@ -412,12 +412,12 @@
if(copytext(lines[1],1,6) == "BPM: ")
tempo = 600 / text2num(copytext(lines[1],6))
lines.Cut(1,2)
if(lines.len > 50)
if(lines.len > 500)
usr << "Too many lines!"
lines.Cut(51)
lines.Cut(501)
var/linenum = 1
for(var/l in lines)
if(lentext(l) > 50)
if(lentext(l) > 500)
usr << "Line [linenum] too long!"
lines.Remove(l)
else
@@ -189,6 +189,157 @@
/obj/structure/bed/chair/office/dark
icon_state = "officechair_dark"
/obj/structure/bed/chair/oldsofa //Original Paradise port kept in the event players like these couches.
name = "sofa"
desc = "It's a couch. It looks kinda dingy."
icon_state = "sofamiddleOLD"
base_icon = "sofamiddleOLD"
applies_material_colour = 0
/obj/structure/bed/chair/oldsofa/left
icon_state = "sofaend_leftOLD"
base_icon = "sofaend_leftOLD"
/obj/structure/bed/chair/oldsofa/right
icon_state = "sofaend_rightOLD"
base_icon = "sofaend_rightOLD"
/obj/structure/bed/chair/oldsofa/corner
icon_state = "sofacornerOLD"
base_icon = "sofacornerOLD"
//Middle couch pieces.
/obj/structure/bed/chair/sofa
name = "sofa"
desc = "It's a couch. It looks comfy."
icon_state = "sofamiddle"
base_icon = "sofamiddle"
/obj/structure/bed/chair/sofa/brown/New(var/newloc,var/newmaterial)
..(newloc,"steel","leather")
/obj/structure/bed/chair/sofa/red/New(var/newloc,var/newmaterial)
..(newloc,"steel","carpet")
/obj/structure/bed/chair/sofa/teal/New(var/newloc,var/newmaterial)
..(newloc,"steel","teal")
/obj/structure/bed/chair/sofa/black/New(var/newloc,var/newmaterial)
..(newloc,"steel","black")
/obj/structure/bed/chair/sofa/green/New(var/newloc,var/newmaterial)
..(newloc,"steel","green")
/obj/structure/bed/chair/sofa/purp/New(var/newloc,var/newmaterial)
..(newloc,"steel","purple")
/obj/structure/bed/chair/sofa/blue/New(var/newloc,var/newmaterial)
..(newloc,"steel","blue")
/obj/structure/bed/chair/sofa/beige/New(var/newloc,var/newmaterial)
..(newloc,"steel","beige")
/obj/structure/bed/chair/sofa/lime/New(var/newloc,var/newmaterial)
..(newloc,"steel","lime")
//Left couch pieces.
/obj/structure/bed/chair/sofa/left
icon_state = "sofaend_left"
base_icon = "sofaend_left"
/obj/structure/bed/chair/sofa/left/brown/New(var/newloc,var/newmaterial)
..(newloc,"steel","leather")
/obj/structure/bed/chair/sofa/left/red/New(var/newloc,var/newmaterial)
..(newloc,"steel","carpet")
/obj/structure/bed/chair/sofa/left/teal/New(var/newloc,var/newmaterial)
..(newloc,"steel","teal")
/obj/structure/bed/chair/sofa/left/black/New(var/newloc,var/newmaterial)
..(newloc,"steel","black")
/obj/structure/bed/chair/sofa/left/green/New(var/newloc,var/newmaterial)
..(newloc,"steel","green")
/obj/structure/bed/chair/sofa/left/purp/New(var/newloc,var/newmaterial)
..(newloc,"steel","purple")
/obj/structure/bed/chair/sofa/left/blue/New(var/newloc,var/newmaterial)
..(newloc,"steel","blue")
/obj/structure/bed/chair/sofa/left/beige/New(var/newloc,var/newmaterial)
..(newloc,"steel","beige")
/obj/structure/bed/chair/sofa/left/lime/New(var/newloc,var/newmaterial)
..(newloc,"steel","lime")
//Right couch pieces.
/obj/structure/bed/chair/sofa/right
icon_state = "sofaend_right"
base_icon = "sofaend_right"
/obj/structure/bed/chair/sofa/right/brown/New(var/newloc,var/newmaterial)
..(newloc,"steel","leather")
/obj/structure/bed/chair/sofa/right/red/New(var/newloc,var/newmaterial)
..(newloc,"steel","carpet")
/obj/structure/bed/chair/sofa/right/teal/New(var/newloc,var/newmaterial)
..(newloc,"steel","teal")
/obj/structure/bed/chair/sofa/right/black/New(var/newloc,var/newmaterial)
..(newloc,"steel","black")
/obj/structure/bed/chair/sofa/right/green/New(var/newloc,var/newmaterial)
..(newloc,"steel","green")
/obj/structure/bed/chair/sofa/right/purp/New(var/newloc,var/newmaterial)
..(newloc,"steel","purple")
/obj/structure/bed/chair/sofa/right/blue/New(var/newloc,var/newmaterial)
..(newloc,"steel","blue")
/obj/structure/bed/chair/sofa/right/beige/New(var/newloc,var/newmaterial)
..(newloc,"steel","beige")
/obj/structure/bed/chair/sofa/right/lime/New(var/newloc,var/newmaterial)
..(newloc,"steel","lime")
//Corner couch pieces.
/obj/structure/bed/chair/sofa/corner
icon_state = "sofacorner"
base_icon = "sofacorner"
/obj/structure/bed/chair/sofa/corner/brown/New(var/newloc,var/newmaterial)
..(newloc,"steel","leather")
/obj/structure/bed/chair/sofa/corner/red/New(var/newloc,var/newmaterial)
..(newloc,"steel","carpet")
/obj/structure/bed/chair/sofa/corner/teal/New(var/newloc,var/newmaterial)
..(newloc,"steel","teal")
/obj/structure/bed/chair/sofa/corner/black/New(var/newloc,var/newmaterial)
..(newloc,"steel","black")
/obj/structure/bed/chair/sofa/corner/green/New(var/newloc,var/newmaterial)
..(newloc,"steel","green")
/obj/structure/bed/chair/sofa/corner/purp/New(var/newloc,var/newmaterial)
..(newloc,"steel","purple")
/obj/structure/bed/chair/sofa/corner/blue/New(var/newloc,var/newmaterial)
..(newloc,"steel","blue")
/obj/structure/bed/chair/sofa/corner/beige/New(var/newloc,var/newmaterial)
..(newloc,"steel","beige")
/obj/structure/bed/chair/sofa/corner/lime/New(var/newloc,var/newmaterial)
..(newloc,"steel","lime")
// Chair types
/obj/structure/bed/chair/wood
name = "wooden chair"
@@ -6,6 +6,7 @@ var/global/list/stool_cache = list() //haha stool
desc = "Apply butt."
icon = 'icons/obj/furniture_vr.dmi' //VOREStation Edit - new Icons
icon_state = "stool_preview" //set for the map
can_buckle = 1 //TFF: You can now throw people with your immense strength while they're sitting on the stool! >:3
force = 10
throwforce = 10
w_class = ITEMSIZE_HUGE
@@ -105,6 +106,10 @@ var/global/list/stool_cache = list() //haha stool
material.place_sheet(get_turf(src))
if(padding_material)
padding_material.place_sheet(get_turf(src))
// Adding a safety net to prevent players from being perma-buckled to the stool..! - Jon
if(has_buckled_mobs())
for(var/A in buckled_mobs)
user_unbuckle_mob(A, src)
qdel(src)
/obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -147,3 +152,11 @@ var/global/list/stool_cache = list() //haha stool
remove_padding()
else
..()
// Chompstation ADD: A new proc to allow mobs to be unbuckled when clicking on a stool.
/obj/item/weapon/stool/attack_hand(mob/living/user as mob)
if(has_buckled_mobs())
for(var/A in buckled_mobs)
user_unbuckle_mob(A, user)
return
..()
+4 -1
View File
@@ -119,7 +119,10 @@
searchedby += user.ckey
I.forceMove(get_turf(src))
to_chat(H,"<span class='notice'>You found \a [I]!</span>")
var/disturbed_sleep = rand(1,100) //spawning of mobs, for now only the trash panda.
if(disturbed_sleep <= 5)
new /mob/living/simple_animal/raccoon(get_turf(user),name)
visible_message("A raccoon jumps out of the trash!.")
else
return ..()
@@ -332,6 +332,38 @@
icon = 'icons/obj/watercloset.dmi'
icon_state = "rubberducky"
//DUCK CODE START
/obj/item/weapon/bikehorn/rubberducky/evil
name = "Do not"
desc = "Evil fills the air, bath time will end, no one be spared."
/obj/item/weapon/bikehorn/rubberducky/evil/attack_self(mob/user as mob)
if (!spam_flag)
spam_flag = 1
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
var/darkduckrising = /mob/living/simple_animal/hostile/giant_spider/darkduck
new darkduckrising(get_turf(user))
spawn(100)
new darkduckrising(get_turf(user))
spawn(100)
new darkduckrising(get_turf(user))
spawn(100)
new darkduckrising(get_turf(user))
qdel(src)
return
/mob/living/simple_animal/hostile/giant_spider/darkduck
name = "The Duck"
desc = "Evil fills the air, bath time will end, no one be spared."
tt_desc = "Bath time stops"
icon = 'icons/mob/animal_VG.dmi'
icon_state = "Duck_lord"
icon_living = "Duck_lord_friendly"
icon_dead = "Duck_lord_dead"
isEdible = 1
poison_chance = 0
//DUCK CODE END
/obj/structure/sink
name = "sink"
icon = 'icons/obj/watercloset.dmi'
+2
View File
@@ -11,6 +11,8 @@
/turf/space/initialize()
. = ..()
if(Holiday == "April Fool's Day") //CHOMPEDIT: let's have some fun~
icon = 'icons/turf/vorespace.dmi'
if(!keep_sprite)
icon_state = "[((x + y) ^ ~(x * y) + z) % 25]"
update_starlight()
+26
View File
@@ -29,6 +29,32 @@
html += "<a onclick='togglesection(\"[ckey(H.real_name)] [curID] ooc\")'>OOC notes</a>"
html += "<p class='uiContent' style='display:none' id='[ckey(H.real_name)] [curID] ooc'>[H.ooc_notes]</p>"
html += "</div>"
//TFF: Ports VoreStation addition of Borg/AI listing to display on Char Directory. Yay!
if(isAI(C.mob))
var/mob/living/silicon/ai/A = C.mob
curID++
html += "<div class='block'>"
html += "<h3 class='uiContent highlight' style='font-size:16px'>[A.name] (Artificial Intelligence)</h3><br>"
if(A.ooc_notes)
html += "<a onclick='togglesection(\"[ckey(A.name)] [curID] ooc\")'>OOC notes</a>"
html += "<p class='uiContent' style='display:none' id='[ckey(A.name)] [curID] ooc'>[A.ooc_notes]</p>"
html += "</div>"
if(isrobot(C.mob))
var/mob/living/silicon/robot/R = C.mob
if(R.scrambledcodes || (R.module && R.module.hide_on_manifest))
continue
curID++
html += "<div class='block'>"
html += "<h3 class='uiContent highlight' style='font-size:16px'>[R.name] ([R.modtype] [R.braintype])</h3><br>"
if(R.flavor_text)
html += "<a onclick='togglesection(\"[ckey(R.name)] [curID] flavor\")'>Flavor text</a>"
html += "<p class='uiContent' style='display:none' id='[ckey(R.name)] [curID] flavor'>[R.flavor_text]</p>"
if(R.ooc_notes)
html += "<a onclick='togglesection(\"[ckey(R.name)] [curID] ooc\")'>OOC notes</a>"
html += "<p class='uiContent' style='display:none' id='[ckey(R.name)] [curID] ooc'>[R.ooc_notes]</p>"
html += "</div>"
if(!curID)
html += "<p class='uiContent'>404: Station not found</p>"
+11 -3
View File
@@ -12,13 +12,18 @@
src << "Guests may not use OOC."
return
//Chompstation ADD
msg = sanitize(msg)
if(!msg) return
//Chompstation ADD - Emoji Parsing
msg = emoji_parse(msg)
//Chompstation ADD - IC in OOC Warning filter
if((copytext(msg, 1, 2) in list(".",";",":","#")) || (findtext(lowertext(copytext(msg, 1, 5)), "say")))
if(alert("Your message \"[msg]\" looks like it was meant for in game communication, say it in OOC?", "Meant for OOC?", "No", "Yes") != "Yes")
return
msg = sanitize(msg)
if(!msg) return
if(!is_preference_enabled(/datum/client_preference/show_ooc))
src << "<span class='warning'>You have OOC muted.</span>"
@@ -96,6 +101,9 @@
if(!msg)
return
//Chompstation ADD - Emoji Parsing
msg = emoji_parse(msg)
if(!is_preference_enabled(/datum/client_preference/show_looc))
src << "<span class='danger'>You have LOOC muted.</span>"
return
+1
View File
@@ -4,4 +4,5 @@
robot_module_types += "Janihound"
robot_module_types += "Sci-borg"
robot_module_types += "Pupdozer"
robot_module_types += "Service-borg"
return 1
@@ -1,3 +1,4 @@
/datum/admin_secret_item/fun_secret/break_all_lights
name = "Break All Lights"

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