mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-29 23:16:21 +01:00
Merge remote-tracking branch 'upstream/master' into cahse
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -333,4 +333,4 @@
|
||||
#define EXAMINE_SKIPARMS 0x0020
|
||||
#define EXAMINE_SKIPHANDS 0x0040
|
||||
#define EXAMINE_SKIPLEGS 0x0080
|
||||
#define EXAMINE_SKIPFEET 0x0100
|
||||
#define EXAMINE_SKIPFEET 0x0100
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.")
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 = ""
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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>
|
||||
"}
|
||||
@@ -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
|
||||
//
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
@@ -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'
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user