diff --git a/README.md b/README.md index 77f9127bf4..cbf74b6b30 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Going to make a Pull Request? Make sure you read the [CONTRIBUTING.md](.github/CONTRIBUTING.md) first! -CHOMPStation is a fork of the Yawn-wider code branch which is a fork of the VOREStation code branch which is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Space Station 13. +CHOMPStation was a fork of the Yawn-wider code branch which is a fork of the VOREStation code branch which is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, but we are now since separated from Yawn-wider code, while keeping some of their features, which is a fork of the VOREStation code branch which is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Space Station 13.  diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index 4e9d7fd6ad..a2e15e6890 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -173,6 +173,5 @@ What is the naming convention for planes or layers? plane = initial(plane) layer = initial(layer) - // Check if a mob can "logically" see an atom plane #define MOB_CAN_SEE_PLANE(M, P) (P <= PLANE_WORLD || (P in M.planes_visible)) diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm index 8909238db2..78054e6ba8 100644 --- a/code/__defines/species_languages_vr.dm +++ b/code/__defines/species_languages_vr.dm @@ -10,6 +10,7 @@ #define LANGUAGE_ENOCHIAN "Enochian" #define LANGUAGE_VESPINAE "Vespinae" #define LANGUAGE_SPACER "Spacer" +#define LANGUAGE_CLOWNISH "Coulrian" #define LANGUAGE_CHIMPANZEE "Chimpanzee" #define LANGUAGE_NEAERA "Neaera" diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm index e02c99290c..e94aa8d652 100644 --- a/code/_global_vars/lists/misc.dm +++ b/code/_global_vars/lists/misc.dm @@ -5,4 +5,6 @@ GLOBAL_LIST_EMPTY(meteor_list) GLOBAL_LIST_EMPTY(wire_color_directory) // This is an associative list with the `holder_type` as the key, and a list of colors as the value. // Reference list for disposal sort junctions. Filled up by sorting junction's New() -GLOBAL_LIST_EMPTY(tagger_locations) \ No newline at end of file +GLOBAL_LIST_EMPTY(tagger_locations) + +GLOBAL_LIST_INIT(char_directory_tags, list("Pred", "Prey", "Switch", "Non-Vore", "Unset")) \ No newline at end of file diff --git a/code/_helpers/global_lists_ch.dm b/code/_helpers/global_lists_ch.dm index ead50d7b5f..ff5c0a26e4 100644 --- a/code/_helpers/global_lists_ch.dm +++ b/code/_helpers/global_lists_ch.dm @@ -13,4 +13,12 @@ var/global/list/vore_reagent_sounds = list( 'sound/vore/walkslosh10.ogg', "None" = null) -/var/global/list/existing_metroids = list() //Global variable for tracking metroids for the event announcement. Needs to go here for load order. \ No newline at end of file +/var/global/list/existing_metroids = list() //Global variable for tracking metroids for the event announcement. Needs to go here for load order. + +//stuff that only synths can eat +var/global/list/edible_tech = list(/obj/item/weapon/cell, + /obj/item/weapon/circuitboard, + /obj/item/integrated_circuit, + /obj/item/broken_device, + /obj/item/brokenbug, + ) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 7a49e8b387..572f5c874a 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -124,9 +124,13 @@ var/global/list/global_vore_egg_types = list( "Slime glob", "Chicken", "Synthetic", - "Cooking error", + "Bluespace Floppy", + "Bluespace Compressed File", + "Bluespace CD", "Escape pod", + "Cooking error", "Web cocoon", + "Honeycomb", "Bug cocoon", "Rock", "Yellow", @@ -155,9 +159,13 @@ var/global/list/tf_vore_egg_types = list( "Slime glob" = /obj/item/weapon/storage/vore_egg/slimeglob, "Chicken" = /obj/item/weapon/storage/vore_egg/chicken, "Synthetic" = /obj/item/weapon/storage/vore_egg/synthetic, - "Cooking error" = /obj/item/weapon/storage/vore_egg/badrecipe, + "Bluespace Floppy" = /obj/item/weapon/storage/vore_egg/floppy, + "Bluespace Compressed File" = /obj/item/weapon/storage/vore_egg/file, + "Bluespace CD" = /obj/item/weapon/storage/vore_egg/cd, "Escape pod" = /obj/item/weapon/storage/vore_egg/escapepod, + "Cooking error" = /obj/item/weapon/storage/vore_egg/badrecipe, "Web cocoon" = /obj/item/weapon/storage/vore_egg/cocoon, + "Honeycomb" = /obj/item/weapon/storage/vore_egg/honeycomb, "Bug cocoon" = /obj/item/weapon/storage/vore_egg/bugcocoon, "Rock" = /obj/item/weapon/storage/vore_egg/rock, "Yellow" = /obj/item/weapon/storage/vore_egg/yellow, @@ -183,6 +191,7 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/device/paicard, /obj/item/device/pda, /obj/item/device/radio/headset, + /obj/item/device/starcaster_news, //chompstation addition /obj/item/inflatable/torn, /obj/item/organ, /obj/item/stack/material/cardboard, @@ -219,7 +228,8 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/weapon/storage/fancy/crayons, /obj/item/weapon/storage/fancy/egg_box, /obj/item/weapon/storage/wallet, - /obj/item/weapon/storage/vore_egg) + /obj/item/weapon/storage/vore_egg, + /obj/item/weapon/material/kitchen) //chompstation addition var/global/list/contamination_flavors = list( "Generic" = contamination_flavors_generic, diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index c7b399e4ee..f08b8c64e5 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1609,6 +1609,46 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) /proc/href(href_src, list/href_params, href_text) return "[href_text]" +// This is a helper for anything that wants to render the map in TGUI +/proc/get_tgui_plane_masters() + . = list() + // 'Utility' planes + . += new /obj/screen/plane_master/fullbright //Lighting system (lighting_overlay objects) + . += new /obj/screen/plane_master/lighting //Lighting system (but different!) + . += new /obj/screen/plane_master/ghosts //Ghosts! + . += new /obj/screen/plane_master{plane = PLANE_AI_EYE} //AI Eye! + + . += new /obj/screen/plane_master{plane = PLANE_CH_STATUS} //Status is the synth/human icon left side of medhuds + . += new /obj/screen/plane_master{plane = PLANE_CH_HEALTH} //Health bar + . += new /obj/screen/plane_master{plane = PLANE_CH_LIFE} //Alive-or-not icon + . += new /obj/screen/plane_master{plane = PLANE_CH_ID} //Job ID icon + . += new /obj/screen/plane_master{plane = PLANE_CH_WANTED} //Wanted status + . += new /obj/screen/plane_master{plane = PLANE_CH_IMPLOYAL} //Loyalty implants + . += new /obj/screen/plane_master{plane = PLANE_CH_IMPTRACK} //Tracking implants + . += new /obj/screen/plane_master{plane = PLANE_CH_IMPCHEM} //Chemical implants + . += new /obj/screen/plane_master{plane = PLANE_CH_SPECIAL} //"Special" role stuff + . += new /obj/screen/plane_master{plane = PLANE_CH_STATUS_OOC} //OOC status HUD + + . += new /obj/screen/plane_master{plane = PLANE_ADMIN1} //For admin use + . += new /obj/screen/plane_master{plane = PLANE_ADMIN2} //For admin use + . += new /obj/screen/plane_master{plane = PLANE_ADMIN3} //For admin use + + . += new /obj/screen/plane_master{plane = PLANE_MESONS} //Meson-specific things like open ceilings. + . += new /obj/screen/plane_master{plane = PLANE_BUILDMODE} //Things that only show up while in build mode + + // Real tangible stuff planes + . += new /obj/screen/plane_master/main{plane = TURF_PLANE} + . += new /obj/screen/plane_master/main{plane = OBJ_PLANE} + . += new /obj/screen/plane_master/main{plane = MOB_PLANE} + . += new /obj/screen/plane_master/cloaked //Cloaked atoms! + + //VOREStation Add - Random other plane masters + . += new /obj/screen/plane_master{plane = PLANE_CH_STATUS_R} //Right-side status icon + . += new /obj/screen/plane_master{plane = PLANE_CH_HEALTH_VR} //Health bar but transparent at 100 + . += new /obj/screen/plane_master{plane = PLANE_CH_BACKUP} //Backup implant status + . += new /obj/screen/plane_master{plane = PLANE_CH_VANTAG} //Vore Antags + . += new /obj/screen/plane_master{plane = PLANE_AUGMENTED} //Augmented reality + //VOREStation Add End /proc/CallAsync(datum/source, proctype, list/arguments) set waitfor = FALSE - return call(source, proctype)(arglist(arguments)) \ No newline at end of file + return call(source, proctype)(arglist(arguments)) diff --git a/code/_helpers/widelists_ch.dm b/code/_helpers/widelists_ch.dm new file mode 100644 index 0000000000..2d447b1110 --- /dev/null +++ b/code/_helpers/widelists_ch.dm @@ -0,0 +1,25 @@ +GLOBAL_LIST_EMPTY(widelists) + +/proc/widelist(var/list/input_list) + var/list_hash = gen_hash_list(input_list) + if(!(list_hash in GLOB.widelists)) + GLOB.widelists[list_hash] = input_list + return GLOB.widelists[list_hash] + +/proc/gen_hash_list(var/list/input_list) + var/string = "" + for(var/item in input_list) + var/p1 = "" + if(islist(item)) + p1 = ">>>::-;[gen_hash_list(item)];-::<<<" + else + p1 = "[item]" + + var/p2 = "" + if(islist(input_list[item])) + p2 = ">>>::-;[gen_hash_list(input_list[item])];-::<<<" + else + p2 = "[input_list[item]]" + + string += "[p1]::--::[p2]::;;;" + return md5(string) \ No newline at end of file diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index d31a64dcda..247d1d3f8b 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -161,6 +161,13 @@ #define ui_ghost_pai "SOUTH: 6,CENTER+2:24" #define ui_ghost_updown "SOUTH: 6,CENTER+3:24" +// NIF Soulcatcher guest ones +#define ui_nifsc_reenter "SOUTH:6,CENTER-3:24" +#define ui_nifsc_arproj "SOUTH:6,CENTER-2:24" +#define ui_nifsc_jumptoowner "SOUTH:6,CENTER-1:24" +#define ui_nifsc_nme "SOUTH:6,CENTER:24" +#define ui_nifsc_nsay "SOUTH:6,CENTER+1:24" + // Rig panel #define ui_rig_deco1 "WEST:-7, SOUTH+5" #define ui_rig_deco2 "WEST:-7, SOUTH+6" diff --git a/code/_onclick/hud/soulcatcher_guest.dm b/code/_onclick/hud/soulcatcher_guest.dm new file mode 100644 index 0000000000..555bcb8eba --- /dev/null +++ b/code/_onclick/hud/soulcatcher_guest.dm @@ -0,0 +1,102 @@ +/obj/screen/nifsc + icon = 'icons/mob/screen_nifsc.dmi' + +/obj/screen/nifsc/MouseEntered(location,control,params) + flick(icon_state + "_anim", src) + openToolTip(usr, src, params, title = name, content = desc) + +/obj/screen/nifsc/MouseExited() + closeToolTip(usr) + +/obj/screen/nifsc/Click() + closeToolTip(usr) + +/obj/screen/nifsc/reenter + name = "Re-enter NIF" + desc = "Return into the NIF" + icon_state = "reenter" + +/obj/screen/nifsc/reenter/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.reenter_soulcatcher() + +/obj/screen/nifsc/arproj + name = "AR project" + desc = "Project your form into Augmented Reality for those around your predator with the appearance of your loaded character." + icon_state = "arproj" + +/obj/screen/nifsc/arproj/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.ar_project() + +/obj/screen/nifsc/jumptoowner + name = "Jump back to host" + desc = "Jumb back to the Soulcather host" + icon_state = "jump" + +/obj/screen/nifsc/jumptoowner/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.jump_to_owner() + +/obj/screen/nifsc/nme + name = "Emote into Soulcatcher" + desc = "Emote into the NIF's Soulcatcher (circumventing AR emoting)" + icon_state = "nme" + +/obj/screen/nifsc/nme/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.nme() + +/obj/screen/nifsc/nsay + name = "Speak into Soulcatcher" + desc = "Speak into the NIF's Soulcatcher (circumventing AR speaking)" + icon_state = "nsay" + +/obj/screen/nifsc/nsay/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.nsay() + + +/mob/living/carbon/brain/caught_soul/create_mob_hud(datum/hud/HUD, apply_to_client = TRUE) + ..() + + var/list/adding = list() + HUD.adding = adding + + var/obj/screen/using + + using = new /obj/screen/nifsc/reenter() + using.screen_loc = ui_nifsc_reenter + using.hud = src + adding += using + + using = new /obj/screen/nifsc/arproj() + using.screen_loc = ui_nifsc_arproj + using.hud = src + adding += using + + using = new /obj/screen/nifsc/jumptoowner() + using.screen_loc = ui_nifsc_jumptoowner + using.hud = src + adding += using + + using = new /obj/screen/nifsc/nme() + using.screen_loc = ui_nifsc_nme + using.hud = src + adding += using + + using = new /obj/screen/nifsc/nsay() + using.screen_loc = ui_nifsc_nsay + using.hud = src + adding += using + + + if(client && apply_to_client) + client.screen = list() + client.screen += HUD.adding + client.screen += client.void diff --git a/code/controllers/subsystems/shuttles.dm b/code/controllers/subsystems/shuttles.dm index 0bce940385..40039edceb 100644 --- a/code/controllers/subsystems/shuttles.dm +++ b/code/controllers/subsystems/shuttles.dm @@ -4,9 +4,6 @@ // Also handles initialization and processing of overmap sectors. // -// This global variable exists for legacy support so we don't have to rename every shuttle_controller to SSshuttles yet. -var/global/datum/controller/subsystem/shuttles/shuttle_controller - SUBSYSTEM_DEF(shuttles) name = "Shuttles" wait = 2 SECONDS @@ -35,9 +32,6 @@ SUBSYSTEM_DEF(shuttles) var/tmp/list/current_run // Shuttles remaining to process this fire() tick -/datum/controller/subsystem/shuttles/PreInit() - global.shuttle_controller = src // TODO - Remove this! Change everything to point at SSshuttles intead - /datum/controller/subsystem/shuttles/Initialize(timeofday) last_landmark_registration_time = world.time // Find all declared shuttle datums and initailize them. (Okay, queue them for initialization a few lines further down) diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index fcc076231d..a5ab4d94cb 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -49,10 +49,7 @@ var/global/datum/controller/subsystem/ticker/ticker /datum/controller/subsystem/ticker/Initialize() pregame_timeleft = config.pregame_time send2mainirc("Server lobby is loaded and open at byond://[config.serverurl ? config.serverurl : (config.server ? config.server : "[world.address]:[world.port]")]") - - // Set up the global announcer - GLOB.autospeaker = new (null, null, null, 1) - + GLOB.autospeaker = new (null, null, null, 1) //Set up Global Announcer return ..() /datum/controller/subsystem/ticker/fire(resumed = FALSE) diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm index 9bb6b1a442..eae37c5869 100644 --- a/code/datums/supplypacks/recreation.dm +++ b/code/datums/supplypacks/recreation.dm @@ -51,7 +51,7 @@ /obj/item/weapon/reagent_containers/glass/paint/purple, /obj/item/weapon/reagent_containers/glass/paint/black, /obj/item/weapon/reagent_containers/glass/paint/white, - /obj/item/weapon/contraband/poster, + /obj/item/weapon/contraband/poster/custom, /obj/item/weapon/wrapping_paper = 3 ) cost = 10 diff --git a/code/datums/uplink/tools_vr.dm b/code/datums/uplink/tools_vr.dm index 30b2cd725e..9d0a8e0232 100644 --- a/code/datums/uplink/tools_vr.dm +++ b/code/datums/uplink/tools_vr.dm @@ -36,6 +36,11 @@ item_cost = 10 path = /obj/item/clothing/suit/space/void/autolok +/datum/uplink_item/item/tools/inflatable + name = "Inflatables" + item_cost = 10 + path = /obj/item/weapon/storage/briefcase/inflatable + /datum/uplink_item/item/tools/elitetablet name = "Tablet (Advanced)" item_cost = 15 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f0e87cc93a..a826f6e002 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -399,7 +399,7 @@ var/list/mob/living/forced_ambiance_list = new L << chosen_ambiance else L << sound(null, channel = CHANNEL_AMBIENCE_FORCED) - else if(src.ambience.len) + else if(src.ambience && src.ambience.len) var/ambience_odds = L?.client.prefs.ambience_chance if(prob(ambience_odds) && (world.time >= L.client.time_last_ambience_played + 1 MINUTE)) var/sound = pick(ambience) diff --git a/code/game/jobs/access_datum_vr.dm b/code/game/jobs/access_datum_vr.dm index 16038248d0..bd3906f16c 100644 --- a/code/game/jobs/access_datum_vr.dm +++ b/code/game/jobs/access_datum_vr.dm @@ -27,4 +27,22 @@ var/const/access_pilot = 67 /datum/access/entertainment id = access_entertainment desc = "Entertainment Backstage" - region = ACCESS_REGION_GENERAL \ No newline at end of file + region = ACCESS_REGION_GENERAL + +/var/const/access_mime = 138 +/datum/access/mime + id = access_mime + desc = "Mime Office" + region = ACCESS_REGION_GENERAL + +/var/const/access_clown = 136 +/datum/access/clown + id = access_clown + desc = "Clown Office" + region = ACCESS_REGION_GENERAL + +/var/const/access_tomfoolery = 137 +/datum/access/tomfoolery + id = access_tomfoolery + desc = "Tomfoolery Closet" + region = ACCESS_REGION_GENERAL diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm index 84333dad13..fc481186d0 100644 --- a/code/game/jobs/job/captain_vr.dm +++ b/code/game/jobs/job/captain_vr.dm @@ -26,13 +26,13 @@ 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_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth) 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_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth) /datum/alt_title/deputy_director title = "Deputy Director" diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special_vr.dm index 57f0e91d34..1429212e75 100644 --- a/code/game/jobs/job/special_vr.dm +++ b/code/game/jobs/job/special_vr.dm @@ -79,14 +79,14 @@ departments = list(DEPARTMENT_CIVILIAN) department_flag = CIVILIAN faction = "Station" - total_positions = -1 - spawn_positions = -1 + total_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. + spawn_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. supervisors = "the spirit of laughter" selection_color = "#515151" economic_modifier = 1 job_description = "A Clown is there to entertain the crew and keep high morale using various harmless pranks and ridiculous jokes!" whitelist_only = 1 - latejoin_only = 1 + latejoin_only = 0 outfit_type = /decl/hierarchy/outfit/job/clown pto_type = PTO_CIVILIAN alt_titles = list("Jester" = /datum/alt_title/jester, "Fool" = /datum/alt_title/fool) @@ -99,9 +99,9 @@ /datum/job/clown/get_access() if(config.assistant_maint) - return list(access_maint_tunnels, access_entertainment) + return list(access_maint_tunnels, access_entertainment, access_clown, access_tomfoolery) else - return list(access_entertainment) + return list(access_entertainment, access_clown, access_tomfoolery) /datum/job/mime title = "Mime" @@ -109,15 +109,15 @@ departments = list(DEPARTMENT_CIVILIAN) department_flag = CIVILIAN faction = "Station" - total_positions = -1 - spawn_positions = -1 + total_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. + spawn_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. supervisors = "the spirit of performance" selection_color = "#515151" economic_modifier = 1 job_description = "A Mime is there to entertain the crew and keep high morale using unbelievable performances and acting skills!" alt_titles = list("Poseur" = /datum/alt_title/poseur) whitelist_only = 1 - latejoin_only = 1 + latejoin_only = 0 outfit_type = /decl/hierarchy/outfit/job/mime pto_type = PTO_CIVILIAN @@ -126,6 +126,6 @@ /datum/job/mime/get_access() if(config.assistant_maint) - return list(access_maint_tunnels, access_entertainment) + return list(access_maint_tunnels, access_entertainment, access_tomfoolery, access_mime) else - return list(access_entertainment) + return list(access_entertainment, access_tomfoolery, access_mime) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index bc9c199ed2..9d7e5ed958 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -29,6 +29,7 @@ var/close_sound = 'sound/machines/door/blastdoorclose.ogg' var/damage = BLAST_DOOR_CRUSH_DAMAGE var/multiplier = 1 // The multiplier for how powerful our YEET is. + var/istransparent = 0 closed_layer = ON_WINDOW_LAYER // Above airlocks when closed var/id = 1.0 @@ -108,10 +109,13 @@ src.density = 1 update_nearby_tiles() src.update_icon() - src.set_opacity(1) + if(src.istransparent) + src.set_opacity(0) + else + src.set_opacity(1) sleep(15) src.operating = 0 - + // Blast door crushing. for(var/turf/turf in locs) for(var/atom/movable/AM in turf) @@ -276,10 +280,11 @@ // Parameters: None // Description: Closes the door. Does necessary checks. /obj/machinery/door/blast/close() + if (src.operating || (stat & BROKEN || stat & NOPOWER)) return - force_close() + force_close() // Proc: repair() // Parameters: None @@ -323,5 +328,52 @@ obj/machinery/door/blast/regular/open icon_state = "shutter1" damage = SHUTTER_CRUSH_DAMAGE +// SUBTYPE: Transparent +// Not technically a blast door but operates like one. Allows air and light. +obj/machinery/door/blast/gate + name = "thick gate" + icon_state_open = "tshutter0" + icon_state_opening = "tshutterc0" + icon_state_closed = "tshutter1" + icon_state_closing = "tshutterc1" + icon_state = "tshutter1" + damage = SHUTTER_CRUSH_DAMAGE + maxhealth = 400 + block_air_zones = 0 + opacity = 0 + istransparent = 1 + +obj/machinery/door/blast/gate/open + icon_state = "tshutter0" + density = 0 + +/obj/machinery/door/blast/gate/thin + name = "thin gate" + icon_state_open = "shutter2_0" + icon_state_opening = "shutter2_c0" + icon_state_closed = "shutter2_1" + icon_state_closing = "shutter2_c1" + icon_state = "shutter2_1" + maxhealth = 200 + opacity = 0 + +/obj/machinery/door/blast/gate/thin/open + icon_state = "shutter2_1" + density = 0 + +/obj/machinery/door/blast/gate/bars + name = "prison bars" + icon_state_open = "bars_0" + icon_state_opening = "bars_c0" + icon_state_closed = "bars_1" + icon_state_closing = "bars_c1" + icon_state = "bars_1" + maxhealth = 600 + opacity = 0 + +/obj/machinery/door/blast/gate/bars/open + icon_state = "bars_1" + density = 0 + #undef BLAST_DOOR_CRUSH_DAMAGE #undef SHUTTER_CRUSH_DAMAGE \ No newline at end of file diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index 92f6cd40df..c6945f1e79 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -376,10 +376,13 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) /obj/effect/projectile/tracer/pointdefense + icon = 'icons/obj/projectiles_vr.dmi' icon_state = "beam_pointdef" /obj/effect/projectile/muzzle/pointdefense + icon = 'icons/obj/projectiles_vr.dmi' icon_state = "muzzle_pointdef" /obj/effect/projectile/impact/pointdefense + icon = 'icons/obj/projectiles_vr.dmi' icon_state = "impact_pointdef" diff --git a/code/game/machinery/vending_machines_vr.dm b/code/game/machinery/vending_machines_vr.dm index 75e0c9d815..9d65e84432 100644 --- a/code/game/machinery/vending_machines_vr.dm +++ b/code/game/machinery/vending_machines_vr.dm @@ -1157,7 +1157,6 @@ /obj/item/clothing/suit/jacket/puffer/vest = 5, /obj/item/clothing/suit/storage/flannel/red = 5, /obj/item/clothing/suit/unathi/robe = 5, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 5, /obj/item/clothing/suit/storage/toggle/internalaffairs = 5, /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 5, /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5, @@ -1244,7 +1243,6 @@ /obj/item/clothing/suit/jacket/puffer/vest = 100, /obj/item/clothing/suit/storage/flannel/red = 100, /obj/item/clothing/suit/unathi/robe = 100, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 100, /obj/item/clothing/suit/storage/toggle/internalaffairs = 100, /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 100, /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 100, @@ -1447,7 +1445,7 @@ /obj/item/seeds/riceseed = 3, /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, - /obj/item/seeds/spineapple = 3, + /obj/item/seeds/pineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, @@ -1617,14 +1615,19 @@ products = list(/obj/item/weapon/card/id/syndicate/station_access = 1, /obj/item/weapon/storage/box/syndie_kit/chameleon = 1, /obj/item/clothing/mask/bandana = 1, + /obj/item/clothing/glasses/sunglasses = 1, /obj/item/device/radio/headset/syndicate/alt = 1, /obj/item/device/pda = 1, /obj/item/device/communicator = 1, /obj/item/weapon/tape_roll = 2, /obj/item/weapon/handcuffs = 4, + /obj/item/weapon/handcuffs/legcuffs = 4, /obj/item/weapon/cell/device/weapon/recharge/alien = 2, /obj/item/device/chameleon = 1, - /obj/item/weapon/storage/mre/menu11 = 2 + /obj/item/weapon/storage/mre/menu11 = 2, + /obj/item/device/flash = 2, + /obj/item/weapon/pen/reagent/paralysis = 4, + /obj/item/device/perfect_tele/alien = 1 ) vend_delay = 15 @@ -2514,7 +2517,6 @@ /obj/item/clothing/suit/jacket/puffer/vest = 5, /obj/item/clothing/suit/storage/flannel/red = 5, /obj/item/clothing/suit/unathi/robe = 5, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 5, /obj/item/clothing/suit/storage/toggle/internalaffairs = 5, /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 5, /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5, @@ -2601,7 +2603,6 @@ /obj/item/clothing/suit/jacket/puffer/vest = 100, /obj/item/clothing/suit/storage/flannel/red = 100, /obj/item/clothing/suit/unathi/robe = 100, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 100, /obj/item/clothing/suit/storage/toggle/internalaffairs = 100, /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 100, /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 100, @@ -3260,20 +3261,20 @@ /obj/item/clothing/under/rank/trek/command/voy = 5, /obj/item/clothing/under/rank/trek/command/ent = 5, /obj/item/clothing/under/rank/trek/eng = 5, + /obj/item/clothing/under/rank/trek/sec = 5, /obj/item/clothing/under/rank/trek/eng/next = 5, + /obj/item/clothing/under/rank/trek/sec/next = 5, /obj/item/clothing/under/rank/trek/eng/ds9 = 5, + /obj/item/clothing/under/rank/trek/sec/ds9 = 5, /obj/item/clothing/under/rank/trek/eng/voy = 5, + /obj/item/clothing/under/rank/trek/sec/voy = 5, /obj/item/clothing/under/rank/trek/eng/ent = 5, + /obj/item/clothing/under/rank/trek/sec/ent = 5, /obj/item/clothing/under/rank/trek/medsci = 5, /obj/item/clothing/under/rank/trek/medsci/next = 5, /obj/item/clothing/under/rank/trek/medsci/ds9 = 5, /obj/item/clothing/under/rank/trek/medsci/voy = 5, /obj/item/clothing/under/rank/trek/medsci/ent = 5, - /obj/item/clothing/under/rank/trek/sec = 5, - /obj/item/clothing/under/rank/trek/sec/next = 5, - /obj/item/clothing/under/rank/trek/sec/ds9 = 5, - /obj/item/clothing/under/rank/trek/sec/voy = 5, - /obj/item/clothing/under/rank/trek/sec/ent = 5, /obj/item/clothing/under/rank/khi/cmd = 5, /obj/item/clothing/under/rank/khi/eng = 5, /obj/item/clothing/under/rank/khi/med = 5, @@ -3504,7 +3505,6 @@ /obj/item/clothing/suit/jacket/puffer/vest = 5, /obj/item/clothing/suit/storage/flannel/red = 5, /obj/item/clothing/suit/unathi/robe = 5, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 5, /obj/item/clothing/suit/storage/toggle/internalaffairs = 5, /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 5, /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5, @@ -3943,7 +3943,7 @@ /obj/item/weapon/reagent_containers/food/snacks/slice/mushroompizza = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/orangecake = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/peanutcake = 10, - /obj/item/weapon/reagent_containers/food/snacks/slice/pineapple = 10, + /obj/item/weapon/reagent_containers/food/snacks/pineappleslice = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/plaincake = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/pumpkinpie = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/tofubread = 10, @@ -4407,7 +4407,7 @@ /obj/item/weapon/reagent_containers/food/snacks/slice/mushroompizza = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/orangecake = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/peanutcake = 10, - /obj/item/weapon/reagent_containers/food/snacks/slice/pineapple = 10, + /obj/item/weapon/reagent_containers/food/snacks/pineappleslice = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/plaincake = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/pumpkinpie = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/tofubread = 10, @@ -4579,7 +4579,7 @@ /obj/item/seeds/riceseed = 3, /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, - /obj/item/seeds/spineapple = 3, + /obj/item/seeds/pineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index c3716b031c..5286670849 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -90,6 +90,39 @@ serial_number = given_serial ..(loc) +//Selectable subtype +/obj/item/weapon/contraband/poster/custom + name = "rolled-up poly-poster" + desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. This one is made from some kind of e-paper, and could display almost anything!" + poster_type = /obj/structure/sign/poster/custom + +/obj/item/weapon/contraband/poster/custom/New(turf/loc, var/given_serial = 0) + if(given_serial == 0) + serial_number = 1 //Decidedly unrandom + else + serial_number = given_serial + ..(loc) + +/obj/item/weapon/contraband/poster/custom/verb/select_poster() + set name = "Set Poster type" + set category = "Object" + set desc = "Click to choose a poster to display." + + var/mob/M = usr + var/list/options = list() + for(var/datum/poster/posteroption in poster_designs) + options[posteroption.listing_name] = posteroption + + var/choice = input(M,"Choose a poster!","Customize Poster") in options + if(src && choice && !M.stat && in_range(M,src)) + var serial = poster_designs.Find(options[choice]) + serial_number = serial + name = "rolled-up poly-poster - No.[serial]" + to_chat(M, "The poster is now: [choice].") + return 1 + + + //############################## THE ACTUAL DECALS ########################### /obj/structure/sign/poster @@ -187,6 +220,7 @@ // Description suffix var/desc="" var/icon_state="" + var/listing_name="" // NT poster subtype. /obj/structure/sign/poster/nanotrasen @@ -201,3 +235,8 @@ set_poster(design) ..(newloc, placement_dir, serial, itemtype) + +//Non-Random Posters + +/obj/structure/sign/poster/custom + roll_type = /obj/item/weapon/contraband/poster/custom \ No newline at end of file diff --git a/code/game/objects/effects/decals/posters/bs12.dm b/code/game/objects/effects/decals/posters/bs12.dm index 7aadcb2ead..5c1c32d98b 100644 --- a/code/game/objects/effects/decals/posters/bs12.dm +++ b/code/game/objects/effects/decals/posters/bs12.dm @@ -1,290 +1,348 @@ // baystation12 posters /datum/poster/bay_1 icon_state="bsposter1" - name = "Unlucky Space Explorer" - desc = "This particular one depicts a skeletal form within a space suit." + name = "PSA: Unlucky Space Explorer" + desc = "This grim PSA depicts a skeletal form within a space suit. Thousands die every year as a result of failing to follow EVA safety guidelines." + listing_name = "PSA - EVA Accidents" /datum/poster/bay_2 icon_state="bsposter2" - name = "Positronic Logic Conflicts" - desc = "This particular one depicts the cold, unmoving stare of a particular advanced AI." + name = "PSA: Disobedient Drones" + desc = "This PSA depicts the cold, unmoving stare of a particularly advanced AI. Contact information for the Emergent Intelligence Oversight is included." + listing_name = "PSA - Emergent Drones" /datum/poster/bay_3 icon_state="bsposter3" - name = "Paranoia" - desc = "This particular one warns of the dangers of trusting your co-workers too much." + name = "PSA: Corporate Espionage" + desc = "This PSA warns of the dangers of trusting your co-workers with sensitive department information. They may be spying for a rival corporation, or worse!" + listing_name = "PSA - Corporate Espionage" /datum/poster/bay_4 icon_state="bsposter4" name = "Keep Calm" - desc = "This particular one is of a famous New Earth design, although a bit modified. Someone has scribbled an O over the A on the poster." + desc = "An incredibly vague message, presented in a classic form. Someone has scribbled an O over the A on the poster." + listing_name = "PSA - Keep Calm" /datum/poster/bay_5 icon_state="bsposter5" - name = "Martian Warlord" - desc = "This particular one depicts the cartoony mug of a certain Martial Warmonger." + name = "PSA: Saboteurs!" + desc = "A company PSA reminding employees to keep an eye out for suspicious activity, and report it immediately." + listing_name = "PSA - Saboteur" /datum/poster/bay_6 icon_state="bsposter6" - name = "Technological Singularity" - desc = "This particular one is of the blood-curdling symbol of a long-since defeated enemy of humanity." + name = "Eradicator XV" + desc = "An ad for the fifteenth installment in the Eradicator movie franchise, about a violent robotic uprising hellbent on wiping out humanity." + listing_name = "Ad - Eradicator XV" /datum/poster/bay_7 icon_state="bsposter7" - name = "Wasteland" - desc = "This particular one is of a couple of ragged gunmen, one male and one female, on top of a mound of rubble. The number \"12\" is visible on their blue jumpsuits." + name = "Wasteland: Battle for Earth" + desc = "This action movie ad shows a couple of ragged post-apocalyptic gunmen, one male and one female, on top of a mound of rubble." + listing_name = "Ad - Battle for Earth" /datum/poster/bay_8 icon_state="bsposter8" name = "Pinup Girl Cindy" - desc = "This particular one is of a historical corporate PR girl, Cindy, in a particularly feminine pose." + desc = "This is a vintage 2450s pin-up of NanoTrasen's PR girl, Cindy, in a particularly feminine pose." + listing_name = "Pin-up - Cindi" /datum/poster/bay_9 icon_state="bsposter9" name = "Pinup Girl Amy" - desc = "This particular one is of Amy, the nymphomaniac urban legend of deep space. How this photograph came to be is not known." + desc = "This pin-up is of Amy, one of NanoTrasen's most popular PR models." + listing_name = "Pin-up - Amy" /datum/poster/bay_10 icon_state="bsposter10" name = "Don't Panic" - desc = "This particular one depicts some sort of star in a grimace. The \"Don't Panic\" is written in big, friendly letters." + desc = "This ad for Vey-Medical anxiety pills depicts some sort of star in a grimace. The \"Don't Panic\" is written in big, friendly letters." + listing_name = "Ad - Don't panic." /datum/poster/bay_11 icon_state="bsposter11" - name = "Underwater Laboratory" - desc = "This particular one is of the fabled last crew of a previous Company project." + name = "Underwater Living" + desc = "This immigration poster encourages you to move to Earth;s premiere underwater city, Atlantis. One bedroom apartments start at half your salary." + listing_name = "Ad - Atlantis" /datum/poster/bay_12 icon_state="bsposter12" - name = "Rogue AI" - desc = "This particular one depicts the shell of the infamous AI that catastropically comandeered one of humanity's earliest space stations. Back then, the Company was just known as TriOptimum." + name = "Beware Rogue AI" + desc = "This ad for the Emergent Intelligence Oversight Recruitment Division depicts a menacing AI and asks if you're a bad enough dude to take it on." + listing_name = "Recruitment - EIO" /datum/poster/bay_13 icon_state="bsposter13" - name = "User of the Arcane Arts" - desc = "This particular one depicts a wizard, casting a spell. You can't really make out if it's an actual photograph or a computer-generated image." + name = "Become A User of the Arcane Arts" + desc = "This ad for popular Virtual Reality online game 'Wiz Online' depicts a wizard, casting a spell. You can't really make out if it's an actual photograph or a computer-generated image. Incredible graphics!" + listing_name = "Ad - Wiz Online" /datum/poster/bay_14 icon_state="bsposter14" name = "Levitating Skull" - desc = "This particular one is the portrait of a flying enchanted skull. Its adventures along with its fabled companion are now fading through history..." + desc = "This tacky ad is a portrait of the flying enchanted skull, Bones. Its adventures along with its fabled companion are showing now on a broadcast service near you!" + listing_name = "Ad - Bones Adventures" /datum/poster/bay_15 icon_state="bsposter15" name = "Augmented Legend" - desc = "This particular one is of an obviously augmented individual, gazing towards the sky. The cyber-city in the backround is rather punkish." + desc = "This ad for Ward-Takahashi cybernetic implants shows obviously augmented individual, gazing towards the sky. Is your body augmented?" + listing_name = "Ad - Ward-Takahashi Augments" /datum/poster/bay_16 icon_state="bsposter16" - name = "Dangerous Static" - desc = "This particular one depicts nothing remarkable other than a rather mesmerising pattern of monitor static. There's a tag on the sides of the poster, but it's ripped off." + name = "Snow Crash" + desc = "This particular one depicts nothing remarkable other than a rather mesmerising pattern of monitor static. You think it's an ad for something, but you're not sure what." + listing_name = "Ad - Snow Crash" /datum/poster/bay_17 icon_state="bsposter17" name = "Pinup Girl Val" desc = "Luscious Val McNeil, the vertically challenged Legal Extraordinaire, winner of Miss Space two years running and favoured pinup girl of Lawyers Weekly." + listing_name = "Pin-up - Val" /datum/poster/bay_18 icon_state="bsposter18" name = "Derpman, Enforcer of the State" - desc = "Here to protect and serve... your donuts! A generously proportioned man, he teaches you the value of hiding your snacks." + desc = "An ad for Centauri Provisions donuts. Officer Derpman is here to protect and serve... your donuts! A generously proportioned man, he teaches you the value of hiding your snacks." + listing_name = "Ad - Officer Derpman Donuts" /datum/poster/bay_19 icon_state="bsposter19" name = "Respect an Unathi" - desc = "This poster depicts a well dressed looking Unathi receiving a prestigious award. It appears to espouse greater co-operation and harmony between the two races." + desc = "This poster depicts a sharply dressed Unathi receiving a prestigious award. It appears to espouse greater co-operation and harmony between humanity and the Unathi." + listing_name = "PSA - Unathi" /datum/poster/bay_20 icon_state="bsposter20" - name = "Skrell Twilight" - desc = "This poster depicts a mysteriously inscrutable, alien scene. Numerous Skrell can be seen conversing amidst great, crystalline towers rising above crashing waves" + name = "Skrell Tourism" + desc = "This tourism poster depicts a mysteriously inscrutable, alien scene. Numerous Skrell can be seen conversing amidst great, crystalline towers rising above crashing waves." + listing_name = "Ad - Skrellian Tourism" /datum/poster/bay_21 icon_state="bsposter21" name = "Join the Fuzz!" desc = "It's a nice recruitment poster of a white haired Chinese woman that says; \"Big Guns, Hot Women, Good Times. Security. We get it done.\"" + listing_name = "Recruitment - NanoTrasen Security - Pinup" /datum/poster/bay_22 icon_state="bsposter22" name = "Looking for a career with excitement?" desc = "A recruitment poster starring a dark haired woman with glasses and a purple shirt that has \"Got Brains? Got Talent? Not afraid of electric flying monsters that want to suck the soul out of you? Then Xenobiology could use someone like you!\" written on the bottom." + listing_name = "Recruitment - Xenobiology" /datum/poster/bay_23 icon_state="bsposter23" name = "Safety first: because electricity doesn't wait!" desc = "A safety poster starring a clueless looking redhead with frazzled hair. \"Every year, hundreds of NT employees expose themselves to electric shock. Play it safe. Avoid suspicious doors after electrical storms, and always wear protection when doing electric maintenance.\"" + listing_name = "Safety - Electric Shock" /datum/poster/bay_24 icon_state="bsposter24" name = "Responsible medbay habits, No #259" desc = "A poster with a nervous looking geneticist on it states; \"Friends Tell Friends They're Clones. It can cause severe and irreparable emotional trauma if a person is not properly informed of their recent demise. Always follow your contractual obligation and inform them of their recent rejuvenation.\"" + listing_name = "Medical - Clone Disclosure" /datum/poster/bay_25 icon_state="bsposter25" name = "Irresponsible medbay habits, No #2" desc = "This is a safety poster starring a perverted looking naked doctor. \"Sexual harassment is never okay. REPORT any acts of sexual deviance or harassment that disrupt a healthy working environment.\"" + listing_name = "Medical - Sexual Harassment" /datum/poster/bay_26 icon_state="bsposter26" name = "The Men We Knew" - desc = "This movie poster depicts a group of soldiers fighting a large mech, the movie seems to be a patriotic war movie." + desc = "This movie poster depicts a group of soldiers fighting a large mech, it seems to be some kind of movie set during the Hegemony War." + listing_name = "Ad - Men We Knew" /datum/poster/bay_27 icon_state="bsposter27" name = "Plastic Sheep Can't Scream" - desc = "This is a movie poster for an upcoming horror movie, it features an AI in the front of it." + desc = "This is a movie poster for an upcoming horror movie, featuring a frightening looking robotic creature." + listing_name = "Ad - Plastic Sheep Can't Scream" /datum/poster/bay_28 icon_state="bsposter28" name = "The Stars Know Love" - desc = "This is a movie poster. A bleeding woman is shown drawing a heart in her blood on the window of space ship, it seems to be a romantic Drama." + desc = "This is a movie poster. A bleeding woman is shown drawing a heart in her blood on the window of space ship, it seems to be a romantic drama." + listing_name = "Ad - The Stars Know Love" /datum/poster/bay_29 icon_state="bsposter29" name = "Winter Is Coming" - desc = "On the poster is a frighteningly large wolf, he warns: \"Only YOU can keep the station from freezing during planetary occultation!\"" + desc = "On the poster is a frighteningly large wolf, he warns: \"Only YOU can keep yourself from freezing this winter!\". Below is the logo of NanoThreads clothing." + listing_name = "Ad - Cold-weather Gear" /datum/poster/bay_30 icon_state="bsposter30" name = "Ambrosia Vulgaris" - desc = "Just looking at this poster makes you feel a little bit dizzy." + desc = "It's an ad for getting absolutely shitfaced on psychadelics. Just looking at this poster makes you feel a little bit dizzy. Use responsibly." + listing_name = "Ad - Ambrosia Vulgaris" /datum/poster/bay_31 icon_state="bsposter31" - name = "Donut Corp" - desc = "This is an advertisement for Donut Corp, the new innovation in donut technology!" + name = "Donut Panic" + desc = "This is an advertisement for Donut Panic, the bi-monthly periodical for donut lovers galaxy-wide." + listing_name = "Ad - Donuts Panic" /datum/poster/bay_32 icon_state="bsposter32" name = "Eat!" - desc = "A poster depicting a hamburger. The poster orders you to consume the hamburger." + desc = "A NanoPastures poster depicting a synthmeat hamburger. The poster COMMANDS you to consume the hamburger." + listing_name = "Ad - Hamburger" /datum/poster/bay_33 icon_state="bsposter33" - name = "Tools, tools, tools" - desc = "You can never have enough tools, thats for sure!" + name = "Tools, tools, tools!" + desc = "Xion Manufacturing reminds you: Never trust an off-brand tool. " + listing_name = "Ad - Xion Tools" /datum/poster/bay_34 icon_state="bsposter34" name = "Power Up!" - desc = "High reward, higher risk!" + desc = "NanoTrasen are leaders in Phoron-based supermatter power! High reward, higher risk!" + listing_name = "Ad - Phoron Power" /datum/poster/bay_35 icon_state="bsposter35" - name = "Lamarr" - desc = "This is a poster depicting the pet and mascot of the science department." + name = "Kendrick" + desc = "This is a poster depicting the pet and mascot of the science department, and national corporate ambassador for slime-based science solutions.." + listing_name = "Ad - Slime Science" /datum/poster/bay_36 icon_state="bsposter36" name = "Fancy Borg" - desc = "A poster depicting a cyborg using the service module. 'Fancy Borg' is written on it." + desc = "A poster depicting a cyborg dressed to the nines. An ad for cybernetics enthusiast magazine, Borg Fancy." + listing_name = "Ad - Borg Fancy A" /datum/poster/bay_37 icon_state="bsposter37" name = "Fancier Borg" - desc = "A poster depicting a cyborg using the service module. 'Fancy Borg' is written on it. This is even fancier than the first poster." + desc = "A poster depicting a cyborg dressed to the nines. An ad for cybernetics enthusiast magazine, Borg Fancy. This is even fancier than the other poster." + listing_name = "Ad - Borg Fancy B" /datum/poster/bay_38 icon_state="bsposter38" name = "Toaster Love" - desc = "This is a poster of a toaster containing two slices of bread. The word LOVE is written in big pink letters underneath." + desc = "This is a poster of a toaster containing two slices of bread. The word LOVE is written in big pink letters underneath. An ad for a cybernetics 'enthusiast' magazine. " + listing_name = "Ad - Toaster Love" /datum/poster/bay_39 icon_state="bsposter39" name = "Responsible medbay habits, No #91" desc = "A safety poster with a chemist holding a vial. \"Always wear safety gear while handling dangerous chemicals, even if it concerns only small amounts.\"" + listing_name = "Safety - Chemicals" /datum/poster/bay_40 icon_state="bsposter40" name = "Agreeable work environment" desc = "This poster depicts a young woman in a stylish dress. \"Try to aim for a pleasant atmosphere in the workspace. A friendly word can do more than forms in triplicate.\"" + listing_name = "PSA - Agreeable Work Environment" /datum/poster/bay_41 icon_state="bsposter41" name = "Professional work environment" desc = "A safety poster featuring a green haired woman in a shimmering blue dress. \"As an Internal Affairs Agent, your job is to create a fair and agreeable work environment for the crewmembers, as discreetly and professionally as possible.\"" + listing_name = "Recruitment - Internal Affairs" /datum/poster/bay_42 icon_state="bsposter42" name = "Engineering pinup" desc = "This is pin-up poster. A half-naked girl with white hair, toned muscles and stunning blue eyes looks back at you from the poster. Her welding helmet, tattoos and grey jumpsuit hanging around her waist gives a bit of a rugged feel." + listing_name = "Pin-up - Engineer" /datum/poster/bay_43 icon_state="bsposter43" name = "Responsible medbay habits, No #3" desc = "A safety poster with a purple-haired surgeon. She looks a bit cross. \"Let the surgeons do their work. NEVER replace or remove a surgery tool from where the surgeon put it.\"" + listing_name = "Safety - Surgical Tools" /datum/poster/bay_44 icon_state="bsposter44" name = "Time for a drink?" - desc = "This poster depicts a friendly-looking Tajaran holding a tray of drinks." + desc = "This poster for a brand for \"Tajaran-style\" rum produced by Gilthari Exports depicts a friendly-looking Tajaran holding a tray of drinks." + listing_name = "Ad - Rarkajar Rum" /datum/poster/bay_45 icon_state="bsposter45" name = "Responsible engineering habits, No #1" desc = "A safety poster featuring a blue haired engineer. \"When repairing a machine or construction, always aim for long-term solutions.\"" + listing_name = "Safety - No Shortcut Fixes" /datum/poster/bay_46 icon_state="bsposter46" name = "Inspirational lawyer" - desc = "An inspirational poster depicting a Skrellian lawyer. He seems to be shouting something, while pointing fiercely to the right." + desc = "An inspirational poster depicting a Skrellian lawyer. He seems to be shouting something, while pointing fiercely to the right. It's an ad for a NanoTrasen subsidiary law firm." + listing_name = "Ad - NanoTrasen Law" /datum/poster/bay_47 icon_state="bsposter47" name = "Security pinup" desc = "This is a pin-up poster. A dark skinned white haired girl poses in the sunlight wearing a tank top with her stomach exposed. The text on the poster states \"M, Succubus of Security.\" and a lipstick mark stains the top right corner, as if kissed by the model herself." + listing_name = "Pin-up - Security" /datum/poster/bay_48 icon_state="bsposter48" - name = "Borg pinup?" - desc = "This is a.. pin-up poster? It is a diagram on an old model of cyborg with a note scribbled in marker on the bottom, on the top there is a large XO written in red marker." + name = "Remote Drones 4 U" + desc = "This is an ad for a fairly basic model of drone produced by Grayson Manufactories Ltd. for use in hazardous environments." + listing_name = "Ad - Grayson Drones" /datum/poster/bay_49 icon_state="bsposter49" name = "Engineering recruitment" desc = "This is a poster showing an engineer relaxing by a computer, the text states \"Living the life! Join Engineering today!\"" + listing_name = "Recruitment - Engineering" /datum/poster/bay_50 icon_state="bsposter50" name = "Pinup Girl Cindy Kate" - desc = "This particular one is of Cindy Kate, a seductive performer well known among less savoury circles." + desc = "This particular one is of Cindy Kate, a seductive virtual performer well known among less savoury exonet circles." + listing_name = "Pin-up - Cindi-Kate" /datum/poster/bay_51 icon_state="bsposter51" - name = "space appreciation poster" - desc = "This is a poster produced by the Generic Space Company, as a part of a series of commemorative posters on the wonders of space. One of three." + name = "space tourism poster" + desc = "This is a poster produced by the Visit Space Society. This one is targeted at planet-dwellers, suggesting they generally visit space." + listing_name = "Tourism - Space" /datum/poster/bay_52 icon_state="bsposter52" name = "fire safety poster" desc = "This is a poster reminding you of what you should do if you are on fire, or if you are at a dance party." + listing_name = "Safety - Stop Drop and Roll" /datum/poster/bay_53 icon_state="bsposter53" name = "fire extinguisher poster" desc = "This is a poster reminding you of what you should use to put out a fire." + listing_name = "Safety - Fire Extinguishers" /datum/poster/bay_54 icon_state="bsposter54" name = "firefighter poster" desc = "This is a poster of a particularly stern looking firefighter. The caption reads, \"Only you can prevent space fires.\"" + listing_name = "Safety - Prevent Fires" /datum/poster/bay_55 icon_state="bsposter55" - name = "Earth appreciation poster" - desc = "This is a poster produced by the Generic Space Company, as a part of a series of commemorative posters on the wonders of space. Two of three." + name = "Binma tourism poster" + desc = "This is a poster produced by the Visit Space Society. This one suggests you visit the exotic garden world of Binma, and try not to get eaten." + listing_name = "Tourism - Binma" /datum/poster/bay_56 icon_state="bsposter56" name = "Mars appreciation poster" - desc = "This is a poster produced by the Generic Space Company, as a part of a series of commemorative posters on the wonders of space. Three of three." + desc = "This is a poster produced by the Visit Space Society. This one suggests you visit historic Mars. Come for the domes, stay for the monuments to hubris!" /datum/poster/bay_57 icon_state="bsposter57" name = "space carp warning poster" desc = "This poster tells of the dangers of space carp infestations." + listing_name = "Safety - Carp" /datum/poster/bay_58 icon_state="bsposter58" name = "space carp information poster" - desc = "This poster showcases an old spacer saying on the dangers of migrant space carp." \ No newline at end of file + desc = "This poster showcases an old spacer saying on the dangers of migrant space carp." + listing_name = "Safety - Carp Information" + diff --git a/code/game/objects/effects/decals/posters/polarisposters.dm b/code/game/objects/effects/decals/posters/polarisposters.dm index d40cdd0db0..45cfd8622d 100644 --- a/code/game/objects/effects/decals/posters/polarisposters.dm +++ b/code/game/objects/effects/decals/posters/polarisposters.dm @@ -2,41 +2,49 @@ icon_state="polposter1" name = "Safety!" desc = "A poster advising you to learn how to put on your internals at a moment's notice." + listing_name = "Safety - Internals" /datum/poster/pol_2 icon_state="polposter2" name = "Safety!" desc = "A blue and white colored poster. This one advises you to wear your safety goggles when handling chemicals." + listing_name = "Safety - Goggles" /datum/poster/pol_3 icon_state="polposter3" name = "Safety!" desc = "A safety poster instructing you to comply with the authorities, especially in an emergency." + listing_name = "Safety - Follow Instruction" /datum/poster/pol_4 icon_state="polposter4" name = "Clean Hands Save Lives" desc = "A safety poster reminding you to wash your hands." + listing_name = "Safety - Hand Washing" /datum/poster/pol_5 icon_state="polposter5" name = "Help!" desc = "This poster depicts a man helping another man get up." + listing_name = "Safety - Help Others" /datum/poster/pol_6 icon_state="polposter6" name = "Walk!" desc = "This poster depicts a man walking, presumably to encourage you not to run in the halls." + listing_name = "Safety - No Running" /datum/poster/pol_7 icon_state="polposter7" name = "Place your signs!" desc = "A safety poster reminding custodial staff to place wet floor signs where needed. This reminder's rarely heeded." + listing_name = "Safety - Wet Floor Signs" /datum/poster/pol_8 icon_state="polposter8" name = "Safety!" desc = "An advertisement / safety poster for EVA training and certification. Training is available at your local Central Command." + listing_name = "Safety - EVA Training" /datum/poster/pol_9 icon_state="poster10" //Recycling this icon @@ -44,52 +52,138 @@ desc = "This poster appears to be reference material for maintenance personnel, instructing to always wear insulated gloves, that wirecutters and \ a multitool are the optimal tools to use, and where to find the maintenance panel on most airlocks. Unfortunately, the poster does not mention any \ wire codes." + listing_name = "Safety - Airlock Maintenance" /datum/poster/pol_10 icon_state="polposter9" name = "orchid" desc = "This poster appears strangely familiar, depicting the flower of a tree native to the planet Earth." + listing_name = "General - Orchid" -// A new subset of poster datum for Security posters. +/datum/poster/pol_11 + icon_state="polposter10" + name = "firefighter pinup" + desc = "A buff firefighter with his shirt off. Maybe he's trying to raise awareness about fire safety, but you're a little distracted." + listing_name = "Pin-up - Firefighter" + +/datum/poster/pol_12 + icon_state="polposter11" + name = "CHUCK" + desc = "With the budget Cyber Solutions 'Chuck' model work drone, your days of menial labour are numbered! \"With Cyber Solutions, there's always someone beside you, helping you. You know their face. You know my face.\"" + listing_name = "Ad - Chuck" + +/datum/poster/pol_13 + icon_state="polposter12" + name = "New You" + desc = "An ad for Kaleidoscope Cosmetics. \"The common factor in all your failed relationships is you. Fix it with affordable gene therapy!\"" + listing_name = "Ad - Kaleidoscope" + +/datum/poster/pol_14 + icon_state="polposter13" + name = "Take a Taxi" + desc = "An ad for the Major Bill's Transportation drone-operated taxi service operating in most major cities throughout Solar space." + listing_name = "Ad - Taxi" + +/datum/poster/pol_15 + icon_state="polposter14" + name = "Adopt A Teshpet" + desc = "An ad for definitively racist virtual pet game, Teshpets." + listing_name = "Ad - Teshpets" + +/datum/poster/pol_16 + icon_state="polposter15" + name = "Train and Fight" + desc = "This poster of sweaty, near-naked wrestlers is the most masculine thing you've ever seen. You can barely tell where one man ends and the other begins. Always seek manliness!" + listing_name = "Pinup - Wrestling" + +/datum/poster/nt_3 + icon_state = "ntposter03" + name = "Mechatronic Safety" + desc = "This poster displays three cutting-edge gygaxes standing in line in front of a man in plain clothes.\ + The poster's captions explain the importance of knowing how to operate a mechatronic vehicle safely, especially near other personnel.\ + The image seems important." + listing_name = "Safety - Mech Operation" + +/datum/poster/nt_4 + icon_state = "ntposter04" + name = "Beware Aetotheans" + desc = "This poster displays a distinctly hostile-looking red Promethean in a black coat. The fine-print around the edges warns the reader about the dangers posed by Almachi Prometheans." + listing_name = "Safety - Aetothean Danger" + +/datum/poster/nt_5 + icon_state = "ntposter05" + name = "Promethean" + desc = "This poster displays a friendly-looking green Promethean in a labcoat. The fine-print around the edges talks about the benefits Prometheans give in laboratories." + listing_name = "Safety - Prometheans" + +/datum/poster/nt_6 + icon_state = "ntposter06" + name = "NanoTrasen" + desc = "This poster showcases an NT emblem. There is writing in the ring around the inner points, probably some sort of slogan no one bothers to memorize." + listing_name = "Ad - NanoTrasen" + +/datum/poster/nt_7 + icon_state = "ntposter07" + name = "SolGov" + desc = "This poster showcases an SCG emblem. The outer ring reads,\ + \"NIL MORTALIBUS ARDUI EST\".\ + Solar Confederate Government." + listing_name = "Political - SolGov" + +/datum/poster/nt_8 + icon_state = "ntposter08" + name = "wildlife hazard" + desc = "This SifGov poster warns against attempting to kill a fully grown giant spider or other hostile life-form alone." + listing_name = "Safety - Spiders" + +// A new subset of poster datum for ONLY 'Internal' NanoTrasen posters, given to Security. /datum/poster/nanotrasen icon_state = "polposter1" name = "Safety!" desc = "A poster advising you to learn how to put on your internals at a moment's notice." + listing_name = "Safety - Internals" /datum/poster/nanotrasen/pol_2 icon_state="polposter2" name = "Safety!" desc = "A blue and white colored poster. This one advises you to wear your safety goggles when handling chemicals." + listing_name = "Safety - Goggles" /datum/poster/nanotrasen/pol_3 icon_state="polposter3" name = "Safety!" desc = "A safety poster instructing you to comply with the authorities, especially in an emergency." + listing_name = "Safety - Follow Instruction" /datum/poster/nanotrasen/pol_4 icon_state="polposter4" name = "Clean Hands Save Lives" desc = "A safety poster reminding you to wash your hands." + listing_name = "Safety - Hand Washing" /datum/poster/nanotrasen/pol_5 icon_state="polposter5" name = "Help!" desc = "This poster depicts a man helping another man get up." + listing_name = "Safety - Help Others" /datum/poster/nanotrasen/pol_6 icon_state="polposter6" name = "Walk!" desc = "This poster depicts a man walking, presumably to encourage you not to run in the halls." + listing_name = "Safety - No Running" /datum/poster/nanotrasen/pol_7 icon_state="polposter7" name = "Place your signs!" desc = "A safety poster reminding custodial staff to place wet floor signs where needed. This reminder's rarely heeded." + listing_name = "Safety - Wet Floor Signs" /datum/poster/nanotrasen/pol_8 icon_state="polposter8" name = "Safety!" desc = "An advertisement / safety poster for EVA training and certification. Training is available at your local Central Command." + listing_name = "Safety - EVA Training" /datum/poster/nanotrasen/pol_9 icon_state="poster10" @@ -97,81 +191,97 @@ desc = "This poster appears to be reference material for maintenance personnel, instructing to always wear insulated gloves, that wirecutters and \ a multitool are the optimal tools to use, and where to find the maintenance panel on most airlocks. Unfortunately, the poster does not mention any \ wire codes." + listing_name = "Safety - Airlock Maintenance" /datum/poster/nanotrasen/pol_10 icon_state="polposter9" name = "orchid" desc = "This poster suggests a feeling of peace. It depicts the flower of a tree native to the planet Earth." + listing_name = "General - Orchid" /datum/poster/nanotrasen/bay_9 icon_state="bsposter9" name = "Pinup Girl Amy" desc = "This particular one is of Amy, the nymphomaniac urban legend of deep space. How this photograph came to be is not known." + listing_name = "Pin-up - Amy" /datum/poster/nanotrasen/bay_21 icon_state="bsposter21" name = "Join the Fuzz!" desc = "It's a nice recruitment poster of a white haired Chinese woman that says; \"Big Guns, Hot Women, Good Times. Security. We get it done.\"" + listing_name = "Recruitment - NanoTrasen Security - Pinup" /datum/poster/nanotrasen/bay_22 icon_state="bsposter22" name = "Looking for a career with excitement?" desc = "A recruitment poster starring a dark haired woman with glasses and a purple shirt that has \"Got Brains? Got Talent? Not afraid of electric flying monsters that want to suck the soul out of you? Then Xenobiology could use someone like you!\" written on the bottom." + listing_name = "Recruitment - Xenobiology" /datum/poster/nanotrasen/bay_23 icon_state="bsposter23" name = "Safety first: because electricity doesn't wait!" desc = "A safety poster starring a clueless looking redhead with frazzled hair. \"Every year, hundreds of NT employees expose themselves to electric shock. Play it safe. Avoid suspicious doors after electrical storms, and always wear protection when doing electric maintenance.\"" + listing_name = "Safety - Electric Shock" /datum/poster/nanotrasen/bay_24 icon_state="bsposter24" name = "Responsible medbay habits, No #259" desc = "A poster with a nervous looking geneticist on it states; \"Friends Tell Friends They're Clones. It can cause severe and irreparable emotional trauma if a person is not properly informed of their recent demise. Always follow your contractual obligation and inform them of their recent rejuvenation.\"" + listing_name = "Medical - Clone Disclosure" /datum/poster/nanotrasen/bay_25 icon_state="bsposter25" name = "Irresponsible medbay habits, No #2" desc = "This is a safety poster starring a perverted looking naked doctor. \"Sexual harassment is never okay. REPORT any acts of sexual deviance or harassment that disrupt a healthy working environment.\"" + listing_name = "Medical - Sexual Harassment" /datum/poster/nanotrasen/bay_49 icon_state="bsposter49" name = "Engineering recruitment" desc = "This is a poster showing an engineer relaxing by a computer, the text states \"Living the life! Join Engineering today!\"" + listing_name = "Recruitment - Engineering" /datum/poster/nanotrasen/bay_52 icon_state="bsposter52" name = "fire safety poster" desc = "This is a poster reminding you of what you should do if you are on fire, or if you are at a dance party." + listing_name = "Safety - Stop Drop And Roll" /datum/poster/nanotrasen/bay_53 icon_state="bsposter53" name = "fire extinguisher poster" desc = "This is a poster reminding you of what you should use to put out a fire." + listing_name = "Safety - Extinguishers" /datum/poster/nanotrasen/bay_54 icon_state="bsposter54" name = "firefighter poster" desc = "This is a poster of a particularly stern looking firefighter. The caption reads, \"Only you can prevent space fires.\"" + listing_name = "Safety - Prevent Fires" /datum/poster/nanotrasen/bay_57 icon_state="bsposter57" name = "space carp warning poster" desc = "This poster tells of the dangers of space carp infestations." + listing_name = "Safety - Carp" /datum/poster/nanotrasen/bay_58 icon_state="bsposter58" name = "space carp information poster" desc = "This poster showcases an old spacer saying on the dangers of migrant space carp." + listing_name = "Safety - Carp Information" /datum/poster/nanotrasen/nt_1 icon_state = "ntposter01" name = "Security recruitment" desc = "This poster showcases an NT security guard in an excited pose, with a small blurb about the importance of Security." + listing_name = "Recruitment - NanoTrasen Security - Importance" /datum/poster/nanotrasen/nt_2 icon_state = "ntposter02" name = "Security recruitment" desc = "This poster showcases an NT security guard in an excited pose, with a small blurb about Security Employee benefits." + listing_name = "Recruitment - NanoTrasen Security - Benefits" /datum/poster/nanotrasen/nt_3 icon_state = "ntposter03" @@ -179,6 +289,7 @@ desc = "This poster displays three cutting-edge gygaxes standing in line in front of a man in plain clothes.\ The poster's captions explain the importance of knowing how to operate a mechatronic vehicle safely, especially near other personnel.\ The image seems important." + listing_name = "Safety - Mech Operation" //VOREStation Removal Start TFF 17/12/19 - lore not used in our station's own lore. /* @@ -186,6 +297,7 @@ icon_state = "ntposter04" name = "Beware Aetotheans" desc = "This poster displays a distinctly hostile-looking red Promethean in a black coat. The fine-print around the edges warns the reader about the dangers posed by Almachi Prometheans." + listing_name = "Safety - Aetothean Danger" */ //VOREstation Removal End @@ -193,11 +305,13 @@ icon_state = "ntposter05" name = "Promethean" desc = "This poster displays a friendly-looking green Promethean in a labcoat. The fine-print around the edges talks about the benefits Prometheans give in laboratories." + listing_name = "Safety - Prometheans" /datum/poster/nanotrasen/nt_6 icon_state = "ntposter06" name = "NanoTrasen" desc = "This poster showcases an NT emblem. There is writing in the ring around the inner points, probably some sort of slogan no one bothers to memorize." + listing_name = "Ad - NanoTrasen" /datum/poster/nanotrasen/nt_7 icon_state = "ntposter07" @@ -205,13 +319,16 @@ desc = "This poster showcases an SCG emblem. The outer ring reads,\ \"NIL MORTALIBUS ARDUI EST\".\ Solar Confederate Government." + listing_name = "Political - SolGov" /datum/poster/nanotrasen/nt_8 icon_state = "ntposter08" name = "wildlife hazard" desc = "This poster warns against attempting to kill a fully grown giant spider or other hostile life-form alone." + listing_name = "Safety - Spiders" /datum/poster/nanotrasen/nt_9 icon_state = "ntposter09" name = "Regulations and You" - desc = "This poster showcases an NT security guard reading from her PDA. The blurb advocates for the reader to keep corporate regulations in mind at all times, as an emergency can occur at any time." + desc = "This SifGov poster showcases an NT security guard reading from her PDA. The blurb advocates for the reader to keep corporate regulations in mind at all times, as an emergency can occur at any time." + listing_name = "Safety - Corporate Regulations" diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 1e804bbb26..0ec3f40036 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -33,6 +33,9 @@ would spawn and follow the beaker, even if it is carried or thrown. proc/start() + Destroy() + holder = null + return ..() ///////////////////////////////////////////// // GENERIC STEAM SPREAD SYSTEM diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index e48606a2ac..e45664e60d 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -74,6 +74,12 @@ light_power = 0.5 light_color = "#8837A3" +/obj/effect/projectile/impact/precursor //CHOMPedit add precursor impact + icon_state = "impact_prec" + light_range = 2 + light_power = 0.7 + light_color = "#FF0099" + /obj/effect/projectile/impact/tungsten icon_state = "impact_mhd_laser" light_range = 4 diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm index a5c70aab2c..0c47f4ebb9 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -62,6 +62,12 @@ light_power = 0.5 light_color = "#8837A3" +/obj/effect/projectile/muzzle/precursor //CHOMPedit add Precursor muzzle + icon_state = "muzzle_prec" + light_range = 2 + light_power = 0.7 + light_color = "#FF0099" + /obj/effect/projectile/muzzle/inversion icon_state = "muzzle_invert" light_range = 2 diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 4326bc536d..908342e3ea 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -91,6 +91,12 @@ light_power = 0.5 light_color = "#8837A3" +/obj/effect/projectile/tracer/precursor //CHOMPedit add precursor tracer + icon_state = "prec" + light_range = 2 + light_power = 0.7 + light_color = "#FF0099" + /obj/effect/projectile/tracer/inversion icon_state = "invert" light_range = 2 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ff0ff75426..95cd873259 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -612,9 +612,6 @@ var/list/global/slot_flags_enumeration = list( . = ..() if(blood_overlay) overlays.Remove(blood_overlay) - if(istype(src, /obj/item/clothing/gloves)) - var/obj/item/clothing/gloves/G = src - G.transfer_blood = 0 /obj/item/reveal_blood() if(was_bloodied && !fluorescent) diff --git a/code/game/objects/items/devices/communicator/UI_tgui.dm b/code/game/objects/items/devices/communicator/UI_tgui.dm index 8dabf77f42..4745a02488 100644 --- a/code/game/objects/items/devices/communicator/UI_tgui.dm +++ b/code/game/objects/items/devices/communicator/UI_tgui.dm @@ -1,3 +1,103 @@ +// Etc UI-only vars +/obj/item/device/communicator + // Stuff for moving cameras + var/turf/last_camera_turf + // Stuff needed to render the map + var/map_name + var/obj/screen/map_view/cam_screen + var/list/cam_plane_masters + var/obj/screen/background/cam_background + var/obj/screen/skybox/local_skybox + +// Proc: setup_tgui_camera() +// Parameters: None +// Description: This sets up all of the variables above to handle in-UI map windows. +/obj/item/device/communicator/proc/setup_tgui_camera() + map_name = "communicator_[REF(src)]_map" + + // Initialize map objects + cam_screen = new + cam_screen.name = "screen" + cam_screen.assigned_map = map_name + cam_screen.del_on_map_removal = FALSE + cam_screen.screen_loc = "[map_name]:1,1" + + cam_plane_masters = get_tgui_plane_masters() + + for(var/plane in cam_plane_masters) + var/obj/screen/instance = plane + instance.assigned_map = map_name + instance.del_on_map_removal = FALSE + instance.screen_loc = "[map_name]:CENTER" + + local_skybox = new() + local_skybox.assigned_map = map_name + local_skybox.del_on_map_removal = FALSE + local_skybox.screen_loc = "[map_name]:CENTER,CENTER" + cam_plane_masters += local_skybox + + cam_background = new + cam_background.assigned_map = map_name + cam_background.del_on_map_removal = FALSE + +// Proc: update_active_camera_screen() +// Parameters: None +// Description: This refreshes the camera location +/obj/item/device/communicator/proc/update_active_camera_screen() + if(!video_source?.can_use()) + show_static() + return + + var/newturf = get_turf(video_source) + if(!is_on_same_plane_or_station(get_z(newturf), get_z(src))) + show_static() + return + + var/obj/item/device/communicator/communicator = video_source.loc + if(istype(communicator)) + if(communicator.selfie_mode) + var/mob/target = get(communicator, /mob) + if(istype(target)) + cam_screen.vis_contents = list(target) + else + cam_screen.vis_contents = list(communicator) + cam_background.fill_rect(1, 1, 1, 1) + cam_background.icon_state = "clear" + local_skybox.cut_overlays() + return + + // If we're not forcing an update for some reason and the cameras are in the same location, + // we don't need to update anything. + if(last_camera_turf == newturf) + return + + // We get a new turf in case they've moved in the last half decisecond (it's BYOND, it might happen) + last_camera_turf = get_turf(video_source) + + if(!is_on_same_plane_or_station(get_z(last_camera_turf), get_z(src))) + show_static() + return + + var/list/visible_turfs = list() + var/list/visible_things = view(video_range, last_camera_turf) + for(var/turf/visible_turf in visible_things) + visible_turfs += visible_turf + + cam_screen.vis_contents = visible_turfs + cam_background.icon_state = "clear" + cam_background.fill_rect(1, 1, (video_range * 2), (video_range * 2)) + + local_skybox.cut_overlays() + local_skybox.add_overlay(SSskybox.get_skybox(get_z(last_camera_turf))) + local_skybox.scale_to_view(video_range * 2) + local_skybox.set_position("CENTER", "CENTER", (world.maxx>>1) - last_camera_turf.x, (world.maxy>>1) - last_camera_turf.y) + +/obj/item/device/communicator/proc/show_static() + cam_screen.vis_contents.Cut() + cam_background.icon_state = "scanline2" + cam_background.fill_rect(1, 1, (video_range * 2), (video_range * 2)) + local_skybox.cut_overlays() + // Proc: tgui_state() // Parameters: User // Description: This tells TGUI to only allow us to be interacted with while in a mob inventory. @@ -9,7 +109,15 @@ // Description: This proc handles opening the UI. It's basically just a standard stub. /obj/item/device/communicator/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) ui = SStgui.try_update_ui(user, src, ui) + // Update the camera every SStgui tick in case it moves + update_active_camera_screen() if(!ui) + // Register map objects + user.client.register_map_obj(cam_screen) + for(var/plane in cam_plane_masters) + user.client.register_map_obj(plane) + user.client.register_map_obj(cam_background) + // Setup UI ui = new(user, src, "Communicator", name) if(custom_state) ui.set_state(custom_state) @@ -188,6 +296,7 @@ data["target_feed"] = data["feeds"][newsfeed_channel] else data["target_feed"] = null + data["selfie_mode"] = selfie_mode return data @@ -200,6 +309,7 @@ if(data_core) data_core.get_manifest_list() data["manifest"] = PDA_Manifest + data["mapRef"] = map_name return data // Proc: tgui-act() @@ -231,6 +341,9 @@ if("toggle_ringer") ringer = !ringer + if("selfie_mode") + selfie_mode = !selfie_mode + if("add_hex") var/hex = params["add_hex"] add_to_EPv2(hex) @@ -324,3 +437,4 @@ if("newsfeed") newsfeed_channel = text2num(params["newsfeed"]) +#undef DEFAULT_MAP_SIZE \ No newline at end of file diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 358ef3b61b..46c89b0683 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -28,7 +28,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() origin_tech = list(TECH_ENGINEERING = 2, TECH_MAGNET = 2, TECH_BLUESPACE = 2, TECH_DATA = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) - var/video_range = 4 + var/video_range = 3 var/obj/machinery/camera/communicator/video_source // Their camera var/obj/machinery/camera/communicator/camera // Our camera @@ -72,6 +72,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list() var/update_ticks = 0 var/newsfeed_channel = 0 + // If you turn this on, it changes the way communicator video works. User configurable option. + var/selfie_mode = FALSE + // Proc: New() // Parameters: None // Description: Adds the new communicator to the global list of all communicators, sorts the list, obtains a reference to the Exonet node, then tries to @@ -86,6 +89,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list() camera.name = "[src] #[rand(100,999)]" camera.c_tag = camera.name + setup_tgui_camera() + //This is a pretty terrible way of doing this. addtimer(CALLBACK(src, .proc/register_to_holder), 5 SECONDS) @@ -124,9 +129,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list() /obj/item/device/communicator/examine(mob/user) . = ..() - if(Adjacent(user) && video_source) - . += "It looks like it's on a video call: \[view\]" - for(var/mob/living/voice/voice in contents) . += "On the screen, you can see a image feed of [voice]." @@ -142,17 +144,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list() else . += "The device doesn't appear to be transmitting any data." -// Proc: Topic() -// Parameters: href, href_list - Data from a link -// Description: Used by the above examine. -/obj/item/device/communicator/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["watchvideo"]) - if(video_source) - watch_video(usr) - // Proc: emp_act() // Parameters: None // Description: Drops all calls when EMPed, so the holder can then get murdered by the antagonist. @@ -234,8 +225,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list() alert_called = 0 update_icon() tgui_interact(user) - if(video_source) - watch_video(user) // Proc: MouseDrop() //Same thing PDAs do @@ -316,6 +305,11 @@ var/global/list/obj/item/device/communicator/all_communicators = list() QDEL_NULL(camera) QDEL_NULL(exonet) + last_camera_turf = null + qdel(cam_screen) + QDEL_LIST(cam_plane_masters) + qdel(cam_background) + return ..() // Proc: update_icon() diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm index 7075dbe958..bb25dce953 100644 --- a/code/game/objects/items/devices/communicator/phone.dm +++ b/code/game/objects/items/devices/communicator/phone.dm @@ -332,12 +332,15 @@ if(video_source) //Already in a video to_chat(user, "You are already connected to a video call!") + return if(user.blinded) //User is blinded to_chat(user, "You cannot see well enough to do that!") + return if(!(src in comm.communicating) || !comm.camera) //You called someone with a broken communicator or one that's fake or yourself or something to_chat(user, "[bicon(src)]ERROR: Video failed. Either bandwidth is too low, or the other communicator is malfunctioning.") + return to_chat(user, "[bicon(src)] Attempting to start video over existing call.") sleep(30) @@ -345,42 +348,16 @@ video_source = comm.camera comm.visible_message("[bicon(src)] New video connection from [comm].") - watch_video(user) + update_active_camera_screen() + GLOB.moved_event.register(video_source, src, .proc/update_active_camera_screen) update_icon() -// Proc: watch_video() -// Parameters: user - the mob doing the viewing of video -// Description: Moves a mob's eye to the far end for the duration of viewing the far end -/obj/item/device/communicator/proc/watch_video(mob/user) - if(!Adjacent(user) || !video_source) return - user.set_machine(video_source) - user.reset_view(video_source) - to_chat(user, "Now viewing video session. To leave camera view, close the communicator window OR: OOC -> Cancel Camera View") - to_chat(user, "To return to an active video session, use the communicator in your hand.") - spawn(0) - while(user.machine == video_source && Adjacent(user)) - var/turf/T = get_turf(video_source) - if(!T || !is_on_same_plane_or_station(T.z, user.z) || !video_source.can_use()) - to_chat(user, "The screen bursts into static, then goes black.") - video_cleanup(user) - return - sleep(10) - - video_cleanup(user) - -// Proc: video_cleanup() -// Parameters: user - the mob who doesn't want to see video anymore -// Description: Cleans up mob's client when they stop watching a video -/obj/item/device/communicator/proc/video_cleanup(mob/user) - if(!user) return - - user.reset_view(null) - user.unset_machine() - // Proc: end_video() // Parameters: reason - the text reason to print for why it ended // Description: Ends the video call by clearing video_source /obj/item/device/communicator/proc/end_video(var/reason) + GLOB.moved_event.unregister(video_source, src, .proc/update_active_camera_screen) + show_static() video_source = null . = "[bicon(src)] [reason ? reason : "Video session ended"]." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index d2511038dc..366853a7bf 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -297,7 +297,8 @@ var/global/list/default_medbay_channels = list( playsound(src, "button", 10) GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) -/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels) //BS12 EDIT + +/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels) if(!GLOB.autospeaker) return var/datum/radio_frequency/connection = null @@ -308,7 +309,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) else connection = radio_connection channel = null - if (!istype(connection)) + if(!istype(connection)) return if(!LAZYLEN(zlevels)) @@ -507,7 +508,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) else if(adhoc_fallback) //Less huzzah, we have to fallback to_chat(loc, "\The [src] pings as it falls back to local radio transmission.") subspace_transmission = FALSE - + else //Oh well return FALSE @@ -594,7 +595,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) /obj/item/device/radio/examine(mob/user) . = ..() - + if((in_range(src, user) || loc == user)) if(b_stat) . += "\The [src] can be attached and modified!" diff --git a/code/game/objects/items/pizza_voucher_vr.dm b/code/game/objects/items/pizza_voucher_vr.dm index 1d48bc9cda..4c968b55ac 100644 --- a/code/game/objects/items/pizza_voucher_vr.dm +++ b/code/game/objects/items/pizza_voucher_vr.dm @@ -8,6 +8,7 @@ w_class = ITEMSIZE_SMALL /obj/item/pizzavoucher/New() + ..() var/list/descstrings = list("24/7 PIZZA PIE HEAVEN", "WE ALWAYS DELIVER!", "24-HOUR PIZZA PIE POWER!", diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index f828b97b23..cd48a4a78a 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -77,7 +77,7 @@ /obj/item/weapon/lipstick/random, /obj/item/weapon/grenade/smokebomb, /obj/item/weapon/corncob, - /obj/item/weapon/contraband/poster, + /obj/item/weapon/contraband/poster/custom, /obj/item/weapon/book/manual/barman_recipes, /obj/item/weapon/book/manual/chef_recipes, /obj/item/weapon/bikehorn, diff --git a/code/game/objects/items/weapons/shields_vr.dm b/code/game/objects/items/weapons/shields_vr.dm index a9bce1d548..514ecd15c9 100644 --- a/code/game/objects/items/weapons/shields_vr.dm +++ b/code/game/objects/items/weapons/shields_vr.dm @@ -65,7 +65,6 @@ light_applied = 0 update_icon(user) user.update_action_buttons() - light = !light playsound(src, 'sound/weapons/empty.ogg', 15, 1, -3) /obj/item/weapon/shield/riot/explorer/update_icon() @@ -92,4 +91,4 @@ if(on) icon_state = "explorer_shield_P_lighted" else - icon_state = "explorer_shield_P" \ No newline at end of file + icon_state = "explorer_shield_P" diff --git a/code/game/objects/items/weapons/storage/egg_vr.dm b/code/game/objects/items/weapons/storage/egg_vr.dm index 0ea3b673e1..f7849040db 100644 --- a/code/game/objects/items/weapons/storage/egg_vr.dm +++ b/code/game/objects/items/weapons/storage/egg_vr.dm @@ -113,24 +113,44 @@ /obj/item/weapon/storage/vore_egg/synthetic name = "synthetic egg" - desc = "Can robots lay eggs?" + desc = "Smells like Easter morning." icon_state = "egg_synthetic" -/obj/item/weapon/storage/vore_egg/badrecipe - name = "Burned mess" - desc = "Someone didn't cook this egg quite right..." - icon_state = "egg_badrecipe" - /obj/item/weapon/storage/vore_egg/escapepod name = "small escape pod" desc = "Someone left in a hurry." icon_state = "egg_escapepod" +/obj/item/weapon/storage/vore_egg/floppy + name = "blue space floppy disc" + desc = "Probably shouldn't copy THIS floppy." + icon_state = "egg_floppy" + +/obj/item/weapon/storage/vore_egg/cd + name = "blue space cd" + desc = "What could even be on this?!" + icon_state = "egg_cd" + +/obj/item/weapon/storage/vore_egg/file + name = "blue space file" + desc = "Gotta wonder how much is compressed in there." + icon_state = "egg_file" + +/obj/item/weapon/storage/vore_egg/badrecipe + name = "Burned mess" + desc = "Someone didn't cook this egg quite right..." + icon_state = "egg_badrecipe" + /obj/item/weapon/storage/vore_egg/cocoon name = "web cocoon" desc = "It straight up smells like spiders in here." icon_state = "egg_cocoon" +/obj/item/weapon/storage/vore_egg/honeycomb + name = "honeycomb" + desc = "Smells delicious!" + icon_state = "egg_honeycomb" + /obj/item/weapon/storage/vore_egg/bugcocoon name = "bug cocoon" desc = "Metamorphosis!" diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 13568c27e6..fdc84aa3c4 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -262,7 +262,7 @@ prob(8);/obj/item/weapon/haircomb, prob(4);/obj/item/weapon/storage/pill_bottle/happy, prob(4);/obj/item/weapon/storage/pill_bottle/zoom, - prob(10);/obj/item/weapon/contraband/poster, + prob(10);/obj/item/weapon/contraband/poster/custom, prob(4);/obj/item/weapon/material/butterfly, prob(6);/obj/item/weapon/material/butterflyblade, prob(6);/obj/item/weapon/material/butterflyhandle, diff --git a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm index 2d8f8198c5..08cb7c78ba 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm @@ -45,5 +45,5 @@ trigger() /obj/structure/ghost_pod/ghost_activated/Initialize() - ..() + . = ..() ghostpod_startup(spawn_active) \ No newline at end of file diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index 57c9832fde..12f6f45282 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -254,8 +254,8 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/item/stack/material/steel{amount = 5}, /obj/item/stack/material/cardboard{amount = 5}, /obj/item/weapon/contraband/poster, + /obj/item/weapon/contraband/poster/custom, /obj/item/weapon/material/wirerod, - /obj/item/weapon/contraband/poster, /obj/item/weapon/newspaper, /obj/item/weapon/paper/crumpled, /obj/item/weapon/paper/crumpled/bloody diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index f93ceaf0a1..78384b0285 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -321,73 +321,344 @@ desc = "A warning sign which reads XENOBIOLOGY." icon_state = "xenobio3" +//direction signs presented by the order they appear in the dmi /obj/structure/sign/directions name = "direction sign" - desc = "A direction sign, claiming to know the way." + desc = "A direction sign, claiming to know the way to... somewhere?" icon_state = "direction" + icon = 'icons/obj/decals_directions.dmi' + //TODO: set up overlay systems, inc. interactions (e.g. vines clear w/ plantbgone or fire, snow can be brushed off or melted, and so on) +//disabled this proc, it serves no purpose except to overwrite the description that already exists. may have been intended for making your own signs? +//seems to defeat the point of having a generic directional sign that mappers could edit and use in POIs? left it here in case something breaks. +/* /obj/structure/sign/directions/New() ..() - desc = "A direction sign, pointing out which way \the [src] is." - -/obj/structure/sign/directions/science - name = "\improper Science department" - desc = "A direction sign, pointing out which way the Science department is." - icon_state = "direction_sci" + desc = "A direction sign, pointing out the way to \the [src]." +*/ +//engineering signs /obj/structure/sign/directions/engineering - name = "\improper Engineering department" - desc = "A direction sign, pointing out which way the Engineering department is." + name = "\improper Engineering Department" + desc = "A direction sign, pointing out the way to the Engineering Department." icon_state = "direction_eng" +/obj/structure/sign/directions/engineering/reactor + name = "\improper Reactor" + desc = "A direction sign, pointing out the way to the Reactor." + icon_state = "direction_core" + +/obj/structure/sign/directions/engineering/solars + name = "\improper Solar Array" + desc = "A direction sign, pointing out the way to the nearest Solar Array." + icon_state = "direction_solar" + +/obj/structure/sign/directions/engineering/atmospherics + name = "\improper Atmospherics Department" + desc = "A direction sign, pointing out the way to the Atmospherics Department." + icon_state = "direction_atmos" + +/obj/structure/sign/directions/engineering/gravgen + name = "\improper Gravity Generator" + desc = "A direction sign, pointing out the way to the Artificial Gravity Generator." + icon_state = "direction_grav" + +/obj/structure/sign/directions/engineering/engeqp + name = "\improper Engineering Equipment Storage" + desc = "A direction sign, pointing out the way to Engineering Equipment Storage." + icon_state = "direction_engeqp" + +//security signs /obj/structure/sign/directions/security - name = "\improper Security department" - desc = "A direction sign, pointing out which way the Security department is." + name = "\improper Security Department" + desc = "A direction sign, pointing out the way to the Security Department." icon_state = "direction_sec" +/obj/structure/sign/directions/security/armory + name = "\improper Armory" + desc = "A direction sign, pointing out the way to the Armory." + icon_state = "direction_armory" + +/obj/structure/sign/directions/security/brig + name = "\improper Brig" + desc = "A direction sign, pointing out the way to the Brig." + icon_state = "direction_brig" + +/obj/structure/sign/directions/security/seceqp + name = "\improper Security Equipment Storage" + desc = "A direction sign, pointing out the way to Security Equipment Storage." + icon_state = "direction_seceqp" + +/obj/structure/sign/directions/security/internal_affairs + name = "\improper Internal Affairs Office" + desc = "A direction sign, pointing out the way to the Internal Affairs Office." + icon_state = "direction_intaff" + +/obj/structure/sign/directions/security/forensics + name = "\improper Forensics Lab" + desc = "A direction sign, pointing out the way to the Forensics Lab." + icon_state = "direction_forensics" + +/obj/structure/sign/directions/security/forensics/alt + icon_state = "direction_lab" + +/obj/structure/sign/directions/security/interrogation + name = "\improper Interrogations" + desc = "A direction sign, pointing out the way to Interrogations." + icon_state = "direction_interrogation" + +//science signs +/obj/structure/sign/directions/science + name = "\improper Science Department" + desc = "A direction sign, pointing out the way to the Science Department." + icon_state = "direction_sci" + +/obj/structure/sign/directions/science/rnd + name = "\improper Research & Development" + desc = "A direction sign, pointing out the way to Research & Development." + icon_state = "direction_rnd" + +/obj/structure/sign/directions/science/toxins + name = "\improper Toxins Lab" + desc = "A direction sign, pointing out the way to the Toxins Lab." + icon_state = "direction_sci" + +/obj/structure/sign/directions/science/robotics + name = "\improper Robotics Workshop" + desc = "A direction sign, pointing out the way to the Robotics Workshop." + icon_state = "direction_robotics" + +/obj/structure/sign/directions/science/xenoarch + name = "\improper Xenoarchaeology Lab" + desc = "A direction sign, pointing out the way to the Xenoarchaeology Lab." + icon_state = "direction_xenoarch" + +/obj/structure/sign/directions/science/xenobiology + name = "\improper Xenobiology Lab" + desc = "A direction sign, pointing out the way to the Xenobiology Lab." + icon_state = "direction_xbio" + +/obj/structure/sign/directions/science/xenoflora + name = "\improper Xenoflora Lab" + desc = "A direction sign, pointing out the way to the Xenoflora Lab." + icon_state = "direction_xflora" + +/obj/structure/sign/directions/science/exploration + name = "\improper Exploration Department" + desc = "A direction sign, pointing out the way to the Exploration Department." + icon_state = "direction_explo" + +//medical signs /obj/structure/sign/directions/medical name = "\improper Medical Bay" - desc = "A direction sign, pointing out which way the Medical Bay is." + desc = "A direction sign, pointing out the way to the Medical Bay." icon_state = "direction_med" +/obj/structure/sign/directions/medical/chemlab + name = "\improper Chemistry Lab" + desc = "A direction sign, pointing out the way to the Chemistry Lab." + icon_state = "direction_med" + +/obj/structure/sign/directions/medical/surgery + name = "\improper Surgery" + desc = "A direction sign, pointing out the way to Surgery." + icon_state = "direction_surgery" + +/obj/structure/sign/directions/medical/operating_1 + name = "\improper Operating Theatre 1" + desc = "A direction sign, pointing out the way to Operating Theatre 1." + icon_state = "direction_op1" + +/obj/structure/sign/directions/medical/operating_2 + name = "\improper Operating Theatre 2" + desc = "A direction sign, pointing out the way to Operating Theatre 2." + icon_state = "direction_op2" + +/obj/structure/sign/directions/medical/virology + name = "\improper Virology" + desc = "A direction sign, pointing out the way to the Virology Lab." + icon_state = "direction_viro" + +/obj/structure/sign/directions/medical/medeqp + name = "\improper Medical Equipment Storage" + desc = "A direction sign, pointing out the way to Medical Equipment Storage." + icon_state = "direction_medeqp" + +/obj/structure/sign/directions/medical/morgue + name = "\improper Morgue" + desc = "A direction sign, pointing out the way to the Morgue." + icon_state = "direction_morgue" + +/obj/structure/sign/directions/medical/cloning + name = "\improper Cloning Lab" + desc = "A direction sign, pointing out the way to the Cloning Lab." + icon_state = "direction_cloning" + +/obj/structure/sign/directions/medical/resleeving + name = "\improper Resleeving Lab" + desc = "A direction sign, pointing out the way to the Resleeving Lab." + icon_state = "direction_resleeve" + +//special signs /obj/structure/sign/directions/evac name = "\improper Evacuation" - desc = "A direction sign, pointing out which way the Escape Shuttle dock is." + desc = "A direction sign, pointing out the way to the Escape Shuttle Dock." icon_state = "direction_evac" +/obj/structure/sign/directions/eva + name = "\improper Extra-Vehicular Activity" + desc = "A direction sign, pointing out the way to the EVA Bay." + icon_state = "direction_eva" + +//command signs +/obj/structure/sign/directions/ai_core + name = "\improper AI Core" + desc = "A direction sign, pointing out the way to the AI Core." + icon_state = "direction_ai_core" + /obj/structure/sign/directions/bridge name = "\improper Bridge" + desc = "A direction sign, pointing out the way to the Bridge." icon_state = "direction_bridge" +/obj/structure/sign/directions/command + name = "\improper Command" + desc = "A direction sign, pointing out the way to the Command Center." + icon_state = "direction_command" + +/obj/structure/sign/directions/teleporter + name = "\improper Teleporter" + desc = "A direction sign, pointing out the way to the Teleporter." + icon_state = "direction_teleport" + +/obj/structure/sign/directions/telecomms + name = "\improper Telecommunications Hub" + desc = "A direction sign, pointing out the way to the Telecommunications Hub." + icon_state = "direction_tcomms" + +//cargonia signs /obj/structure/sign/directions/cargo - name = "\improper Cargo department" - desc = "A direction sign, pointing out which way the Cargo department is." + name = "\improper Cargo Department" + desc = "A direction sign, pointing out the way to the Cargo Department." icon_state = "direction_crg" -// VOREStation Edit - New signs for us -/obj/structure/sign/directions/command - icon = 'icons/obj/decals_vr.dmi' - name = "\improper Command department" - desc = "A direction sign, pointing out which way the Command department is." - icon_state = "direction_cmd" +/obj/structure/sign/directions/cargo/mining + name = "\improper Mining Department" + desc = "A direction sign, pointing out the way to the Mining Department." + icon_state = "direction_mining" -/obj/structure/sign/directions/elevator - icon = 'icons/obj/decals_vr.dmi' - name = "\improper Space Elevator" - desc = "A direction sign, pointing out which way the Space Elevator is." - icon_state = "direction_elv" -// VOREStation Edit End - -/obj/structure/sign/directions/cryo - name = "\improper Cryogenic Storage" - desc = "A direction sign, pointing out which way cryogenic storage is." - icon_state = "direction_cry" +/obj/structure/sign/directions/cargo/refinery + name = "\improper Refinery" + desc = "A direction sign, pointing out the way to the Refinery." + icon_state = "direction_refinery" +//civilian/misc signs /obj/structure/sign/directions/roomnum name = "room number" desc = "A sign detailing the number of the room beside it." icon_state = "roomnum" +/obj/structure/sign/directions/cryo + name = "\improper Cryogenic Storage" + desc = "A direction sign, pointing out the way to Cryogenic Storage." + icon_state = "direction_cry" + +/obj/structure/sign/directions/elevator + name = "\improper Elevator" + desc = "A direction sign, pointing out the way to the nearest elevator." + icon_state = "direction_elv" + +/obj/structure/sign/directions/bar + name = "\improper Bar" + desc = "A direction sign, pointing out the way to the nearest watering hole." + icon_state = "direction_bar" + +/obj/structure/sign/directions/kitchen + name = "\improper Kitchen" + desc = "A pictographic direction sign with a knife, plate, and fork, pointing out the way to the nearest dining establishment." + icon_state = "direction_kitchen" + +/obj/structure/sign/directions/tram + name = "\improper Public Transit Station" + desc = "A direction sign, pointing out the way to the nearest public transit station." + icon_state = "direction_tram" + +/obj/structure/sign/directions/janitor + name = "\improper Custodial Closet" + desc = "A direction sign, pointing out the way to the Custodial Closet." + icon_state = "direction_janitor" + +/obj/structure/sign/directions/chapel + name = "\improper Chapel" + desc = "A direction sign, pointing out the way to the Chapel." + icon_state = "direction_chapel" + +/obj/structure/sign/directions/dorms + name = "\improper Dormitories" + desc = "A direction sign, pointing out the way to the Dormitories." + icon_state = "direction_dorms" + +/obj/structure/sign/directions/library + name = "\improper Library" + desc = "A direction sign, pointing out the way to the Library." + icon_state = "direction_library" + +/obj/structure/sign/directions/dock + name = "\improper Dock" + desc = "A direction sign, pointing out the way to the nearest docking area." + icon_state = "direction_dock" + +/obj/structure/sign/directions/gym + name = "\improper Gym" + desc = "A direction sign, pointing out the way to the Gym." + icon_state = "direction_gym" + +/obj/structure/sign/directions/pool + name = "\improper Pool" + desc = "A direction sign, pointing out the way to the Pool." + icon_state = "direction_pool" + +/obj/structure/sign/directions/recreation + name = "\improper Recreation Area" + desc = "A direction sign, pointing out the way to the nearest Recreation Area." + icon_state = "direction_recreation" + +/obj/structure/sign/directions/stairwell + name = "\improper Stairwell" + desc = "A direction sign with stairs and a door, pointing out the way to the nearest stairwell." + icon_state = "stairwell" + +/obj/structure/sign/directions/stairs_up + name = "\improper Stairs Up" + desc = "A direction sign with stairs and an upward-slanted arrow, pointing out the way to the nearest set of stairs that go up." + icon_state = "stairs_up" + +/obj/structure/sign/directions/stairs_down + name = "\improper Stairs Down" + desc = "A direction sign with stairs and a downward-slanted arrow, pointing out the way to the nearest set of stairs that go down." + icon_state = "stairs_down" + +/obj/structure/sign/directions/ladderwell + name = "\improper Access Shaft" + desc = "A direction sign with a ladder and a door, pointing out the way to the nearest access shaft." + icon_state = "ladderwell" + +/obj/structure/sign/directions/ladder_up + name = "\improper Ladder Up" + desc = "A direction sign with a ladder and an upward arrow, pointing out the way to the nearest ladder that goes up." + icon_state = "ladder_up" + +/obj/structure/sign/directions/ladder_down + name = "\improper Ladder Down" + desc = "A direction sign with a ladder and a downward arrow, pointing out the way to the nearest ladder that goes down." + icon_state = "ladder_down" + +/obj/structure/sign/directions/exit + name = "\improper Emergency Exit" + desc = "A lurid green sign that unmistakably identifies that the door it's next to as an emergency exit route." + icon_state = "exit_sign" + +//OTHER STUFF /obj/structure/sign/christmas/lights name = "Christmas lights" desc = "Flashy and pretty." diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index a7037105d2..282a10f9e0 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -215,82 +215,14 @@ L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily if(iscarbon(O)) - var/mob/living/carbon/M = O - if(M.r_hand) - M.r_hand.clean_blood() - if(M.l_hand) - M.l_hand.clean_blood() - if(M.back) - if(M.back.clean_blood()) - M.update_inv_back(0) - //flush away reagents on the skin + var/mob/living/carbon/M = O if(M.touching) var/remove_amount = M.touching.maximum_volume * M.reagent_permeability() //take off your suit first M.touching.remove_any(remove_amount) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/washgloves = 1 - var/washshoes = 1 - var/washmask = 1 - var/washears = 1 - var/washglasses = 1 - - if(H.wear_suit) - washgloves = !(H.wear_suit.flags_inv & HIDEGLOVES) - washshoes = !(H.wear_suit.flags_inv & HIDESHOES) - - if(H.head) - washmask = !(H.head.flags_inv & HIDEMASK) - washglasses = !(H.head.flags_inv & HIDEEYES) - washears = !(H.head.flags_inv & HIDEEARS) - - if(H.wear_mask) - if (washears) - washears = !(H.wear_mask.flags_inv & HIDEEARS) - if (washglasses) - washglasses = !(H.wear_mask.flags_inv & HIDEEYES) - - if(H.head) - if(H.head.clean_blood()) - H.update_inv_head(0) - if(H.wear_suit) - if(H.wear_suit.clean_blood()) - H.update_inv_wear_suit(0) - else if(H.w_uniform) - if(H.w_uniform.clean_blood()) - H.update_inv_w_uniform(0) - if(H.gloves && washgloves) - if(H.gloves.clean_blood()) - H.update_inv_gloves(0) - if(H.shoes && washshoes) - if(H.shoes.clean_blood()) - H.update_inv_shoes(0) - if(H.wear_mask && washmask) - if(H.wear_mask.clean_blood()) - H.update_inv_wear_mask(0) - if(H.glasses && washglasses) - if(H.glasses.clean_blood()) - H.update_inv_glasses(0) - if(H.l_ear && washears) - if(H.l_ear.clean_blood()) - H.update_inv_ears(0) - if(H.r_ear && washears) - if(H.r_ear.clean_blood()) - H.update_inv_ears(0) - if(H.belt) - if(H.belt.clean_blood()) - H.update_inv_belt(0) - H.clean_blood(washshoes) - else - if(M.wear_mask) //if the mob is not human, it cleans the mask without asking for bitflags - if(M.wear_mask.clean_blood()) - M.update_inv_wear_mask(0) - M.clean_blood() - else - O.clean_blood() - + M.clean_blood() + if(isturf(loc)) var/turf/tile = loc for(var/obj/effect/E in tile) diff --git a/code/game/objects/structures/watercloset_vr.dm b/code/game/objects/structures/watercloset_vr.dm new file mode 100644 index 0000000000..7e8790fbcc --- /dev/null +++ b/code/game/objects/structures/watercloset_vr.dm @@ -0,0 +1,41 @@ +//Flushable toilets on station levels. Flushing sends stuff directly to a trashpit landmark without stinking up the cargo office. +//Only on-station toilets are affected and only if the trashpit landmark also exists. Otherwise toilets will stay normal. + +/obj/structure/toilet + var/teleplumbed = FALSE + var/exit_landmark + +/obj/structure/toilet/Initialize() + if(z in global.using_map.map_levels) + teleplumbed = TRUE + exit_landmark = locate(/obj/effect/landmark/teleplumb_exit) + if(teleplumbed && exit_landmark) + desc = "The BS-500, a bluespace rift-rotation-based waste disposal unit for small matter. This one seems remarkably clean." + return ..() + +/obj/structure/toilet/attack_hand(mob/living/user as mob) + if(open && teleplumbed && exit_landmark) + var/list/bowl_contents = list() + for(var/obj/item/I in loc.contents) + if(istype(I) && !I.anchored) + bowl_contents += I + if(bowl_contents.len) + user.visible_message("[user] flushes the toilet.", "You flush the toilet.") + playsound(src, 'sound/vore/death7.ogg', 50, 1) //Got lazy about getting new sound files. Have a sick remix lmao. + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + playsound(src, 'sound/mecha/powerup.ogg', 30, 1) + for(var/obj/item/F in bowl_contents) + F.forceMove(get_turf(exit_landmark)) + bowl_contents -= F + return + return ..() + +/obj/structure/toilet/attack_ai(mob/user as mob) + if(isrobot(user)) + if(user.client && user.client.eye == user) + return attack_hand(user) + else + return attack_hand(user) + +/obj/effect/landmark/teleplumb_exit + name = "teleplumbing exit" diff --git a/code/game/verbs/character_directory.dm b/code/game/verbs/character_directory.dm index 99f95700b8..13d0120123 100644 --- a/code/game/verbs/character_directory.dm +++ b/code/game/verbs/character_directory.dm @@ -1,61 +1,130 @@ +GLOBAL_DATUM(character_directory, /datum/character_directory) + /client/verb/show_character_directory() set name = "Character Directory" set category = "OOC" set desc = "Shows a listing of all active characters, along with their associated OOC notes, flavor text, and more." - if(mob.next_move >= world.time) //This is primarily to stop malicious users from trying to lag the server by spamming this verb + // This is primarily to stop malicious users from trying to lag the server by spamming this verb + if(!usr.checkMoveCooldown()) + to_chat(usr, "Don't spam character directory refresh.") return + usr.setMoveCooldown(10) - mob.next_move = world.time + 10 + if(!GLOB.character_directory) + GLOB.character_directory = new + GLOB.character_directory.tgui_interact(mob) - var/html = "" - var/curID = 0 +// This is a global singleton. Keep in mind that all operations should occur on usr, not src. +/datum/character_directory +/datum/character_directory/tgui_state(mob/user) + return GLOB.tgui_always_state + +/datum/character_directory/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CharacterDirectory", "Character Directory") + ui.open() + +/datum/character_directory/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) + var/list/data = ..() + + data["personalVisibility"] = user?.client?.prefs?.show_in_directory + data["personalTag"] = user?.client?.prefs?.directory_tag + + return data + +/datum/character_directory/tgui_static_data(mob/user, datum/tgui/ui, datum/tgui_state/state) + var/list/data = ..() + + var/list/directory_mobs = list() for(var/client/C in GLOB.clients) - if(C.prefs && !C.prefs.show_in_directory) + // Allow opt-out. + if(!C?.prefs?.show_in_directory) continue + + // These are the three vars we're trying to find + // The approach differs based on the mob the client is controlling + var/name = null + var/ooc_notes = null + var/flavor_text = null + var/tag = C.prefs.directory_tag + var/character_ad = C.prefs.directory_ad + if(ishuman(C.mob)) var/mob/living/carbon/human/H = C.mob if(data_core && data_core.general) if(!find_general_record("name", H.real_name)) if(!find_record("name", H.real_name, data_core.hidden_general)) continue - curID++ - html += "
404: Station not found
" + name = "[R.name] ([R.modtype] [R.braintype])" + ooc_notes = R.ooc_notes + flavor_text = R.flavor_text - var/datum/browser/popup = new(mob, "chardir", "Character Directory", 640, 480) - popup.set_content(html) - popup.open() + // It's okay if we fail to find OOC notes and flavor text + // But if we can't find the name, they must be using a non-compatible mob type currently. + if(!name) + continue + + directory_mobs.Add(list(list( + "name" = name, + "ooc_notes" = ooc_notes, + "tag" = tag, + "character_ad" = character_ad, + "flavor_text" = flavor_text, + ))) + + data["directory"] = directory_mobs + + return data + + +/datum/character_directory/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + . = ..() + if(.) + return + + switch(action) + if("refresh") + // This is primarily to stop malicious users from trying to lag the server by spamming this verb + if(!usr.checkMoveCooldown()) + to_chat(usr, "Don't spam character directory refresh.") + return + usr.setMoveCooldown(10) + update_tgui_static_data(usr, ui) + return TRUE + if("setTag") + var/list/new_tag = input(usr, "Pick a new tag for the character directory", "Character Tag", usr?.client?.prefs?.directory_tag) as null|anything in GLOB.char_directory_tags + if(!new_tag) + return + usr?.client?.prefs?.directory_tag = new_tag + return TRUE + if("setVisible") + usr?.client?.prefs?.show_in_directory = !usr?.client?.prefs?.show_in_directory + to_chat(usr, "You are now [usr.client.prefs.show_in_directory ? "shown" : "not shown"] in the directory.") + return TRUE + if("editAd") + if(!usr?.client?.prefs) + return + + var/current_ad = usr.client.prefs.directory_ad + var/new_ad = sanitize(input(usr, "Change your character ad", "Character Ad", current_ad) as message|null, extra = 0) + if(isnull(new_ad)) + return + usr.client.prefs.directory_ad = new_ad + return TRUE \ No newline at end of file diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 3d169758f5..1a9bb0cdc5 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -948,7 +948,7 @@ var/datum/announcement/minor/admin_min_announcer = new log_admin("[key_name(usr)] toggled persistence to [config.persistence_disabled ? "Off" : "On"].") world.update_status() feedback_add_details("admin_verb","TPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - + /datum/admins/proc/togglemaploadpersistence() set category = "Server" set desc="Whether mapload persistent data will be saved from now on." diff --git a/code/modules/admin/admin_verb_lists.dm b/code/modules/admin/admin_verb_lists.dm index a33611b459..501132ac91 100644 --- a/code/modules/admin/admin_verb_lists.dm +++ b/code/modules/admin/admin_verb_lists.dm @@ -60,6 +60,7 @@ var/list/admin_verbs_admin = list( /client/proc/check_ai_laws, //shows AI and borg laws, /client/proc/rename_silicon, //properly renames silicons, /client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. , + /client/proc/shuttle_panel, // Allows controlling all shuttles remotely. /client/proc/check_antagonists, /client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others, /client/proc/dsay, //talk in deadchat using our ckey/fakekey, @@ -452,6 +453,7 @@ var/list/admin_verbs_event_manager = list( /client/proc/check_ai_laws, //shows AI and borg laws, /client/proc/rename_silicon, //properly renames silicons, /client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. , + /client/proc/shuttle_panel, // Allows controlling all shuttles remotely. /client/proc/check_antagonists, /client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others, /client/proc/dsay, //talk in deadchat using our ckey/fakekey, diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 6635b07061..d8deb0dce6 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -437,6 +437,17 @@ set_security_level(sec_level) log_admin("[key_name(usr)] changed the security level to code [sec_level].") +/client/proc/shuttle_panel() + set name = "Shuttle Control Panel" + set category = "Admin" + + if(!check_rights(R_ADMIN | R_EVENT)) + return + + var/datum/tgui_module/admin_shuttle_controller/A = new(src) + A.tgui_interact(usr) + log_and_message_admins("has opened the shuttle panel.") + feedback_add_details("admin_verb","SHCP") //---- bs12 verbs ---- @@ -525,4 +536,4 @@ T.spell_list += new S feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") - message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) + message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) \ No newline at end of file diff --git a/code/modules/admin/verbs/change_appearance.dm b/code/modules/admin/verbs/change_appearance.dm index 2f7166a2c0..94c5170347 100644 --- a/code/modules/admin/verbs/change_appearance.dm +++ b/code/modules/admin/verbs/change_appearance.dm @@ -92,15 +92,7 @@ var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neuter") if (new_gender) - if(new_gender == "Male") - M.gender = MALE - M.dna.SetUIState(DNA_UI_GENDER, FALSE) - else if (new_gender == "Female") - M.gender = FEMALE - M.dna.SetUIState(DNA_UI_GENDER, TRUE) - else - M.gender = NEUTER - M.dna.SetUIState(DNA_UI_GENDER, FALSE) + M.set_gender(new_gender) M.update_dna(M) M.update_hair(FALSE) diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 6c59499b53..d3d8ec086e 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -157,6 +157,29 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.g_synth = pref.g_synth character.b_synth = pref.b_synth character.synth_markings = pref.synth_markings + character.ear_style = ear_styles_list[pref.ear_style] + character.r_ears = pref.r_ears + character.b_ears = pref.b_ears + character.g_ears = pref.g_ears + character.r_ears2 = pref.r_ears2 + character.b_ears2 = pref.b_ears2 + character.g_ears2 = pref.g_ears2 + character.tail_style = tail_styles_list[pref.tail_style] + character.r_tail = pref.r_tail + character.b_tail = pref.b_tail + character.g_tail = pref.g_tail + character.r_tail2 = pref.r_tail2 + character.b_tail2 = pref.b_tail2 + character.g_tail2 = pref.g_tail2 + character.wing_style = wing_styles_list[pref.wing_style] + character.r_wing = pref.r_wing + character.b_wing = pref.b_wing + character.g_wing = pref.g_wing + character.r_wing2 = pref.r_wing2 + character.b_wing2 = pref.b_wing2 + character.g_wing2 = pref.g_wing2 + character.set_gender( pref.biological_gender) + if(pref.species == "Grey")//YWadd START character.wingdings = pref.wingdings @@ -171,7 +194,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(pref.haemophilia == 1) character.add_modifier(/datum/modifier/trait/haemophilia) - //YWadd END + //YWadd END // Destroy/cyborgize organs and limbs. for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)) diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index 14f78b6e91..31bd79b6b9 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -88,6 +88,11 @@ display_name = "cap, grey" path = /obj/item/clothing/head/soft/grey +/datum/gear/head/cap/med + display_name = "cap, medical (Medical)" + path = /obj/item/clothing/head/soft/med + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Search and Rescue") + /datum/gear/head/cap/orange display_name = "cap, orange" path = /obj/item/clothing/head/soft/orange diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm index 2911c8a10d..7f868e7286 100644 --- a/code/modules/client/preference_setup/vore/09_misc.dm +++ b/code/modules/client/preference_setup/vore/09_misc.dm @@ -6,10 +6,14 @@ /datum/category_item/player_setup_item/vore/misc/load_character(var/savefile/S) S["show_in_directory"] >> pref.show_in_directory + S["directory_tag"] >> pref.directory_tag + S["directory_ad"] >> pref.directory_ad S["sensorpref"] >> pref.sensorpref //TFF 5/8/19 - add sensor pref setting to load after saved /datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S) S["show_in_directory"] << pref.show_in_directory + S["directory_tag"] << pref.directory_tag + S["directory_ad"] << pref.directory_ad S["sensorpref"] << pref.sensorpref //TFF 5/8/19 - add sensor pref setting to be saveable //TFF 5/8/19 - add new datum category to allow for setting multiple settings when this is selected in the loadout. @@ -20,17 +24,30 @@ /datum/category_item/player_setup_item/vore/misc/sanitize_character() pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory)) + pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag)) pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) //TFF - 5/8/19 - add santisation for sensor prefs /datum/category_item/player_setup_item/vore/misc/content(var/mob/user) . += "