"
@@ -157,7 +157,7 @@
textbody += "[initial(powerdata.desc)]
"
textbody += "[powerdata.helptext] "
if(powerdata.enhancedtext != "")
- textbody += "WHEN EHANCED: [powerdata.enhancedtext] "
+ textbody += "WHEN ENHANCED: [powerdata.enhancedtext] "
if(powerdata in my_client.mob.mind.changeling.purchased_powers)
textbody += "This ability is already evolved!"
else if(cat != "Inherent")
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index a80af293bd..bc87275800 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -291,7 +291,7 @@
if (!steal.select_target())
return
- if("download","capture","absorb")
+ if("download","capture","absorb", "vore")
var/def_num
if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]"))
def_num = objective.target_amount
@@ -310,6 +310,9 @@
if("absorb")
new_objective = new /datum/objective/absorb
new_objective.explanation_text = "Absorb [target_number] compatible genomes."
+ if("vore")
+ new_objective = new /datum/objective/vore
+ new_objective.explanation_text = "Devour [target_number] [target_number == 1 ? "person" : "people"]. What happens to them after you do that is irrelevant."
new_objective.owner = src
new_objective.target_amount = target_number
diff --git a/code/datums/mind_vr.dm b/code/datums/mind_vr.dm
index d2ae478410..a6758ca229 100644
--- a/code/datums/mind_vr.dm
+++ b/code/datums/mind_vr.dm
@@ -4,6 +4,7 @@
var/directory_tag
var/directory_erptag
var/directory_ad
+ var/vore_prey_eaten = 0
/mob/living/mind_initialize()
. = ..()
diff --git a/code/datums/supplypacks/atmospherics.dm b/code/datums/supplypacks/atmospherics.dm
index e6fb05f220..d86e8db9c6 100644
--- a/code/datums/supplypacks/atmospherics.dm
+++ b/code/datums/supplypacks/atmospherics.dm
@@ -82,6 +82,14 @@
containername = "Disposal Dispenser Crate"
access = access_atmospherics
+/datum/supply_pack/atmos/rapid_pipe_dispenser
+ contains = list(/obj/item/weapon/pipe_dispenser)
+ name = "Rapid Pipe Dispenser"
+ cost = 100
+ containertype = /obj/structure/closet/crate/secure/aether
+ containername = "Rapid Pipe Dispenser Crate"
+ access = access_atmospherics
+
/datum/supply_pack/atmos/internals
name = "Internals crate"
contains = list(
@@ -118,4 +126,4 @@
)
cost = 35
containertype = /obj/structure/closet/crate/aether
- containername = "Firefighting crate"*/
\ No newline at end of file
+ containername = "Firefighting crate"*/
diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm
index 40caa4c405..ca19cc342a 100644
--- a/code/datums/supplypacks/recreation.dm
+++ b/code/datums/supplypacks/recreation.dm
@@ -72,15 +72,16 @@
/obj/item/device/camera_film = 2,
/obj/item/weapon/storage/photo_album,
/obj/item/weapon/packageWrap,
- /obj/item/weapon/reagent_containers/glass/paint/red,
- /obj/item/weapon/reagent_containers/glass/paint/green,
- /obj/item/weapon/reagent_containers/glass/paint/blue,
- /obj/item/weapon/reagent_containers/glass/paint/yellow,
- /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/poster/custom,
- /obj/item/weapon/wrapping_paper = 3
+ /obj/item/weapon/wrapping_paper = 3,
+ /obj/structure/easel,
+ /obj/item/paint_brush,
+ /obj/item/paint_palette,
+ /obj/item/canvas = 3,
+ /obj/item/canvas/nineteen_nineteen = 2,
+ /obj/item/canvas/twentythree_nineteen = 2,
+ /obj/item/canvas/twentythree_twentythree = 2,
+ /obj/item/canvas/twentyfour_twentyfour = 2
)
cost = 10
containertype = /obj/structure/closet/crate/allico
@@ -94,7 +95,17 @@
contains = list(
/obj/item/device/pipe_painter = 2,
/obj/item/device/floor_painter = 2,
- ///obj/item/device/closet_painter = 2
+ /obj/item/weapon/reagent_containers/glass/paint/red,
+ /obj/item/weapon/reagent_containers/glass/paint/green,
+ /obj/item/weapon/reagent_containers/glass/paint/blue,
+ /obj/item/weapon/reagent_containers/glass/paint/yellow,
+ /obj/item/weapon/reagent_containers/glass/paint/violet,
+ /obj/item/weapon/reagent_containers/glass/paint/cyan,
+ /obj/item/weapon/reagent_containers/glass/paint/orange,
+ /obj/item/weapon/reagent_containers/glass/paint/purple,
+ /obj/item/weapon/reagent_containers/glass/paint/grey,
+ /obj/item/weapon/reagent_containers/glass/paint/black,
+ /obj/item/weapon/reagent_containers/glass/paint/white = 3
)
/datum/supply_pack/recreation/cheapbait
diff --git a/code/datums/underwear/bottom.dm b/code/datums/underwear/bottom.dm
index 3458c6bab2..7f16ba66b7 100644
--- a/code/datums/underwear/bottom.dm
+++ b/code/datums/underwear/bottom.dm
@@ -72,4 +72,19 @@
/datum/category_item/underwear/bottom/thinpanties
name = "Panties, Thin"
icon_state = "thinpanties"
+ has_color = TRUE
+
+/datum/category_item/underwear/bottom/neko
+ name = "Panties, Neko"
+ icon_state = "panties_neko"
+ has_color = TRUE
+
+/datum/category_item/underwear/bottom/swimbottom
+ name = "Swimming Bottoms"
+ icon_state = "swimbottom"
+ has_color = TRUE
+
+/datum/category_item/underwear/bottom/onepiece
+ name = "Swimming One Piece"
+ icon_state = "onepiece"
has_color = TRUE
\ No newline at end of file
diff --git a/code/datums/underwear/socks.dm b/code/datums/underwear/socks.dm
index 72803644df..ac29b579d1 100644
--- a/code/datums/underwear/socks.dm
+++ b/code/datums/underwear/socks.dm
@@ -188,4 +188,24 @@
/datum/category_item/underwear/socks/rippedpantyhose
name = "Pantyhose, Ripped"
- icon_state = "rippedpantyhose"
\ No newline at end of file
+ icon_state = "rippedpantyhose"
+
+/datum/category_item/underwear/socks/stirrup
+ name = "Normal, stirrup"
+ icon_state = "socks_norm-stir"
+ has_color = TRUE
+
+/datum/category_item/underwear/socks/stirrup_knee
+ name = "Knee, stirrup"
+ icon_state = "socks_knee-stir"
+ has_color = TRUE
+
+/datum/category_item/underwear/socks/stirrup_thigh
+ name = "Thigh, stirrup"
+ icon_state = "socks_thigh-stir"
+ has_color = TRUE
+
+/datum/category_item/underwear/socks/stirrup_thigh_black
+ name = "Black Stirrup Stockings"
+ icon_state = "leggings-stir-black"
+ has_color = TRUE
\ No newline at end of file
diff --git a/code/datums/underwear/top.dm b/code/datums/underwear/top.dm
index 3811bf4fbd..5af7870f04 100644
--- a/code/datums/underwear/top.dm
+++ b/code/datums/underwear/top.dm
@@ -77,3 +77,22 @@
icon_state = "onesleeve"
has_color = TRUE
+/datum/category_item/underwear/top/neko
+ name = "Neko bra"
+ icon_state = "bra_neko"
+ has_color = TRUE
+
+/datum/category_item/underwear/top/tape
+ name = "Tape"
+ icon_state = "pasties_alt"
+ has_color = TRUE
+
+/datum/category_item/underwear/top/sarashi
+ name = "Sarashi"
+ icon_state = "bandages"
+ has_color = TRUE
+
+/datum/category_item/underwear/top/swimtop
+ name = "Swimming Top"
+ icon_state = "swimtop"
+ has_color = TRUE
\ No newline at end of file
diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm
index 11c4f1f6b3..2c32ad8e76 100644
--- a/code/datums/underwear/undershirts.dm
+++ b/code/datums/underwear/undershirts.dm
@@ -206,4 +206,24 @@
/datum/category_item/underwear/undershirt/dress_shirt
name = "Dress shirt, masculine"
icon_state = "undershirt_dress"
+ has_color = TRUE
+
+/datum/category_item/underwear/undershirt/midriff
+ name = "Tanktop, midriff"
+ icon_state = "tank_midriff"
+ has_color = TRUE
+
+/datum/category_item/underwear/undershirt/midriffshort
+ name = "Tanktop, midriff, short"
+ icon_state = "tank_midriff_short"
+ has_color = TRUE
+
+/datum/category_item/underwear/undershirt/shibari
+ name = "Shibari Binding"
+ icon_state = "shibari"
+ has_color = TRUE
+
+/datum/category_item/underwear/undershirt/leotard
+ name = "Leotard"
+ icon_state = "leotard"
has_color = TRUE
\ No newline at end of file
diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm
index f6742fb815..5bc7dde793 100644
--- a/code/datums/uplink/announcements.dm
+++ b/code/datums/uplink/announcements.dm
@@ -74,6 +74,7 @@
general.fields["faction"] = random_general_record.fields["faction"]
general.fields["fingerprint"] = random_general_record.fields["fingerprint"]
general.fields["home_system"] = random_general_record.fields["home_system"]
+ general.fields["birthplace"] = random_general_record.fields["birthplace"]
general.fields["religion"] = random_general_record.fields["religion"]
if(random_medical_record)
medical.fields["b_type"] = random_medical_record.fields["b_type"]
diff --git a/code/game/antagonist/antagonist_print.dm b/code/game/antagonist/antagonist_print.dm
index 99216b9ef5..16fa6176df 100644
--- a/code/game/antagonist/antagonist_print.dm
+++ b/code/game/antagonist/antagonist_print.dm
@@ -23,10 +23,10 @@
feedback_add_details(feedback_tag,"[O.type]|FAIL")
failed = TRUE
num++
- if(failed)
- text += " The [role_text] has failed."
- else
- text += " The [role_text] was successful!"
+ if(failed)
+ text += " The [role_text] has failed."
+ else
+ text += " The [role_text] was successful!"
if(global_objectives && global_objectives.len)
text += " Their objectives were:"
diff --git a/code/game/antagonist/outsider/shipwreck_survivor.dm b/code/game/antagonist/outsider/shipwreck_survivor.dm
new file mode 100644
index 0000000000..6fdcc47b97
--- /dev/null
+++ b/code/game/antagonist/outsider/shipwreck_survivor.dm
@@ -0,0 +1,45 @@
+var/datum/antagonist/shipwreck_survivor/survivors
+
+//Shipwreck survivors can only spawn from ghost_pods at time of this commit.
+//These are NOT meant to be real antagonists
+//They are, at best, comparable to ERT.
+/datum/antagonist/SURVIVOR
+ id = MODE_SURVIVOR
+ role_type = BE_SURVIVOR
+ role_text = "Shipwreck Survivor"
+ role_text_plural = "Shipwreck Survivors"
+ bantype = "Shipwreck Survivor" //also blocked by GhostRoles ban, in current implementation at least
+ welcome_text = "Something disastrous happened to the ship you were on! You awaken to your supposed rescuers in pain..."
+ antag_text = "You are a NOT an antagonist! All rules apply to you as well. Your job is to help make the world seem more alive. \n \
+ You are not an existing station character, but some average person who has suffered a terrible accident. \
+ Feel free to make up what happened to the ship you awakened on as you please, \
+ but listening to your rescuers for context might help improve your mutual immersion! \n \
+ Please play along. It is OK to not be co-operative, but 'yes, and' and \
+ 'no, but' are better ways to approach things than to shut them down outright.\n\n \
+ Please ahelp if you are uncertain about anything pertaining to this role. \
+ It is always better to be safe than sorry! \n\n \
+ You will receive the option to set your ambitions. Please remember the server rules \
+ abuse can mean being banned from ghost roles \n \
+ You should use your ambitions to flesh out why your ship got wrecked \
+ and how you wish to proceed now that you were rescued. \n \
+ You DON'T need to set your ambitions. Feel free to ignore them."
+
+ antag_sound = 'sound/voice/hiss1.ogg'
+
+ can_speak_aooc = FALSE
+ can_hear_aooc = FALSE
+
+/datum/antagonist/SURVIVOR/greet(var/datum/mind/player)
+ to_chat(player.current, SPAN_WARNING("You are a NOT an antagonist! All rules apply to you as well. Your job is to help make the world seem more alive. \n \
+ You are not an existing station character, but some average person who has suffered a terrible accident. \
+ Feel free to make up what happened to the ship you awakened on as you please, \
+ but listening to your rescuers for context might help improve your mutual immersion! \n \
+ Please play along. It is OK to not be co-operative, but 'yes, and' and \
+ 'no, but' are better ways to approach things than to shut them down outright.\n\n \
+ Please ahelp if you are uncertain about anything pertaining to this role. \
+ It is always better to be safe than sorry! \n\n \
+ You will receive the option to set your ambitions. Please remember the server rules \
+ abuse can mean being banned from ghost roles \n \
+ You should use your ambitions to flesh out why your ship got wrecked \
+ and how you wish to proceed now that you were rescued. \n \
+ You DON'T need to set your ambitions. Feel free to ignore them."))
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 5125b09278..cfce2394b3 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -423,7 +423,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/atoms.dm b/code/game/atoms.dm
index d3207d0293..e299368120 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -211,6 +211,9 @@
found += A.search_contents_for(path,filter_path)
return found
+/atom/proc/get_examine_desc()
+ return desc
+
//All atoms
/atom/proc/examine(mob/user, var/infix = "", var/suffix = "")
//This reformat names to get a/an properly working on item descriptions when they are bloody
@@ -225,14 +228,13 @@
else
f_name += "oil-stained [name][infix]."
- var/list/output = list("\icon[src.examine_icon()][bicon(src)] That's [f_name] [suffix]", desc)
+ var/list/output = list("\icon[src.examine_icon()][bicon(src)] That's [f_name] [suffix]", get_examine_desc())
if(user.client?.prefs.examine_text_mode == EXAMINE_MODE_INCLUDE_USAGE)
output += description_info
if(user.client?.prefs.examine_text_mode == EXAMINE_MODE_SWITCH_TO_PANEL)
user.client.statpanel = "Examine" // Switch to stat panel
-
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, output)
return output
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index df62ad8ecf..791524d221 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -118,6 +118,8 @@ var/global/list/datum/dna/gene/dna_genes[0]
var/custom_ask
var/custom_whisper
var/custom_exclaim
+ var/list/custom_heat = list()
+ var/list/custom_cold = list()
// VOREStation
// New stuff
@@ -144,6 +146,8 @@ var/global/list/datum/dna/gene/dna_genes[0]
new_dna.custom_ask=custom_ask //VOREStaton Edit
new_dna.custom_whisper=custom_whisper //VOREStaton Edit
new_dna.custom_exclaim=custom_exclaim //VOREStaton Edit
+ new_dna.custom_heat=custom_heat //VOREStation Edit
+ new_dna.custom_cold=custom_cold //VOREStation Edit
var/list/body_markings_genetic = (body_markings - body_marking_nopersist_list)
new_dna.body_markings=body_markings_genetic.Copy()
for(var/b=1;b<=DNA_SE_LENGTH;b++)
@@ -216,6 +220,8 @@ var/global/list/datum/dna/gene/dna_genes[0]
src.custom_ask = character.custom_ask
src.custom_whisper = character.custom_whisper
src.custom_exclaim = character.custom_exclaim
+ src.custom_heat = character.custom_heat
+ src.custom_cold = character.custom_cold
// +1 to account for the none-of-the-above possibility
SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1)
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index d5cdc700c7..9b57cd87e1 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -244,6 +244,8 @@
H.custom_whisper = dna.custom_whisper
H.custom_exclaim = dna.custom_exclaim
H.species.blood_color = dna.blood_color
+ H.custom_heat = dna.custom_heat
+ H.custom_cold = dna.custom_cold
var/datum/species/S = H.species
S.produceCopy(dna.species_traits, H, dna.base_species)
// VOREStation Edit End
diff --git a/code/game/gamemodes/mixed/mercwiz.dm b/code/game/gamemodes/mixed/mercwiz.dm
index 93869f3845..28df75725b 100644
--- a/code/game/gamemodes/mixed/mercwiz.dm
+++ b/code/game/gamemodes/mixed/mercwiz.dm
@@ -9,4 +9,4 @@
end_on_antag_death = 0
antag_tags = list(MODE_MERCENARY, MODE_TECHNOMANCER)
require_all_templates = 1
- votable = 0
\ No newline at end of file
+ votable = 0
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 2818e3e7b4..53e6c61304 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -627,6 +627,12 @@ var/global/list/all_objectives = list()
else
return 0
+/datum/objective/vore/check_completion()
+ if(owner && owner.vore_prey_eaten >= target_amount)
+ return 1
+ else
+ return 0
+
// Heist objectives.
/datum/objective/heist/proc/choose_target()
return
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index cf09d52861..443b188b60 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -70,6 +70,7 @@
if(CLASS_MIDDLE) income = 1
if(CLASS_LOWMID) income = 0.75
if(CLASS_LOWER) income = 0.50
+ if(CLASS_BROKE) income = 0 //VOREStation Add - Rent's not cheap
//give them an account in the station database
var/money_amount = (rand(15,40) + rand(15,40)) * income * economic_modifier * ECO_MODIFIER //VOREStation Edit - Smoothed peaks, ECO_MODIFIER rather than per-species ones.
@@ -182,4 +183,4 @@
return TRUE
if(brain_type in banned_job_species)
return TRUE
- */
\ No newline at end of file
+ */
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 0f80f5c778..2cea520fd2 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -465,7 +465,7 @@ var/global/datum/controller/occupations/job_master
else
spawn_in_storage += thing
else
- to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.")
+ to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.")
H.job = rank
log_game("JOINED [key_name(H)] as \"[rank]\"")
@@ -533,16 +533,16 @@ var/global/datum/controller/occupations/job_master
W.color = R.color
qdel(R)
- to_chat(H, "You are [job.total_positions == 1 ? "the" : "a"] [alt_title ? alt_title : rank].")
+ to_chat(H, "You are [job.total_positions == 1 ? "the" : "a"] [alt_title ? alt_title : rank].")
if(job.supervisors)
- to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.")
+ to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.")
if(job.has_headset)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear)
- to_chat(H, "To speak on your department's radio channel use :h. For the use of other channels, examine your headset.")
+ to_chat(H, "To speak on your department's radio channel use :h. For the use of other channels, examine your headset.")
if(job.req_admin_notify)
- to_chat(H, "You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.")
+ to_chat(H, "You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.")
// EMAIL GENERATION
// Email addresses will be created under this domain name. Mostly for the looks.
@@ -559,13 +559,13 @@ var/global/datum/controller/occupations/job_master
// If even fallback login generation failed, just don't give them an email. The chance of this happening is astronomically low.
if(ntnet_global.does_email_exist(complete_login))
- to_chat(H, "You were not assigned an email address.")
+ to_chat(H, "You were not assigned an email address.")
H.mind.store_memory("You were not assigned an email address.")
else
var/datum/computer_file/data/email_account/EA = new/datum/computer_file/data/email_account()
EA.password = GenerateKey()
EA.login = complete_login
- to_chat(H, "Your email account address is [EA.login] and the password is [EA.password]. This information has also been placed into your notes.")
+ to_chat(H, "Your email account address is [EA.login] and the password is [EA.password]. This information has also been placed into your notes.")
H.mind.store_memory("Your email account address is [EA.login] and the password is [EA.password].")
// END EMAIL GENERATION
@@ -682,7 +682,7 @@ var/global/datum/controller/occupations/job_master
if(fail_deadly)
to_chat(C, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Please correct your spawn point choice.")
return
- to_chat(C, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.")
+ to_chat(C, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.")
var/spawning = pick(latejoin)
.["turf"] = get_turf(spawning)
.["msg"] = "will arrive at the station shortly"
diff --git a/code/game/machinery/clawmachine.dm b/code/game/machinery/clawmachine.dm
index ff65f31c84..b9ce0dd797 100644
--- a/code/game/machinery/clawmachine.dm
+++ b/code/game/machinery/clawmachine.dm
@@ -58,8 +58,13 @@
/obj/item/toy/plushie/tuxedo_cat,
/obj/item/toy/plushie/borgplushie/medihound,
/obj/item/toy/plushie/borgplushie/scrubpuppy,
- /obj/item/toy/plushie/borgplushie/drakiesec,
- /obj/item/toy/plushie/borgplushie/drakiemed,
+ /obj/item/toy/plushie/borgplushie/drake/sec,
+ /obj/item/toy/plushie/borgplushie/drake/med,
+ /obj/item/toy/plushie/borgplushie/drake/sci,
+ /obj/item/toy/plushie/borgplushie/drake/eng,
+ /obj/item/toy/plushie/borgplushie/drake/mine,
+ /obj/item/toy/plushie/borgplushie/drake/jani,
+ /obj/item/toy/plushie/borgplushie/drake/trauma,
/obj/item/toy/plushie/otter
)
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index 1984171af6..dd33db4f86 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -111,6 +111,9 @@
to_chat(user, "The guest pass terminal denies to accept the guest pass.")
return
if(istype(I, /obj/item/weapon/card/id))
+ if(stat & NOPOWER) //checking for power in here so crowbar and screwdriver and stuff still works.
+ to_chat(user, SPAN_WARNING("The terminal refuses your I.D as it is unpowered!"))
+ return
if(!giver && user.unEquip(I))
I.forceMove(src)
giver = I
@@ -123,6 +126,26 @@
/obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob)
return attack_hand(user)
+/obj/machinery/computer/guestpass/verb/eject_id()
+ set category = "Object"
+ set name = "Eject ID Card"
+ set src in oview(1)
+
+ if(!usr || usr.stat || usr.lying) return
+
+ if(giver)
+ to_chat(usr, SPAN_NOTICE("You remove \the [giver] from \the [src]."))
+ giver.loc = get_turf(src)
+ if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
+ usr.put_in_hands(giver)
+ else
+ giver.loc = src.loc
+ giver = null
+ accesses.Cut()
+ else
+ to_chat(usr, SPAN_WARNING("There is nothing to remove from the console."))
+ return
+
/obj/machinery/computer/guestpass/attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 63b067d542..60e5727a7c 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -33,6 +33,7 @@
field_edit_questions = list(
// General
"sex" = "Please select new sex:",
+ "species" = "Please input new species:",
"age" = "Please input new age:",
"fingerprint" = "Please input new fingerprint hash:",
"p_stat" = "Please select new physical status:",
@@ -137,6 +138,7 @@
fields[++fields.len] = FIELD("Name", active1.fields["name"], null)
fields[++fields.len] = FIELD("ID", active1.fields["id"], null)
fields[++fields.len] = FIELD("Sex", active1.fields["sex"], "sex")
+ fields[++fields.len] = FIELD("Species", active1.fields["species"], "species")
fields[++fields.len] = FIELD("Age", "[active1.fields["age"]]", "age")
fields[++fields.len] = FIELD("Fingerprint", active1.fields["fingerprint"], "fingerprint")
fields[++fields.len] = FIELD("Physical Status", active1.fields["p_stat"], "p_stat")
@@ -418,6 +420,7 @@
if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
\nSex: [active1.fields["sex"]]
+ \nSpecies: [active1.fields["species"]]
\nAge: [active1.fields["age"]]
\nFingerprint: [active1.fields["fingerprint"]]
\nPhysical Status: [active1.fields["p_stat"]]
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 4222e1264c..2e315362cf 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -31,6 +31,7 @@
"name" = "Please enter new name:",
"id" = "Please enter new id:",
"sex" = "Please select new sex:",
+ "species" = "Please input new species:",
"age" = "Please input new age:",
"rank" = "Please enter new rank:",
"fingerprint" = "Please input new fingerprint hash:",
@@ -148,6 +149,7 @@
fields[++fields.len] = FIELD("ID", active1.fields["id"], "id")
fields[++fields.len] = FIELD("Entity Classification", active1.fields["brain_type"], "brain_type")
fields[++fields.len] = FIELD("Sex", active1.fields["sex"], "sex")
+ fields[++fields.len] = FIELD("Species", active1.fields["species"], "species")
fields[++fields.len] = FIELD("Age", "[active1.fields["age"]]", "age")
fields[++fields.len] = FIELD("Rank", active1.fields["rank"], "rank")
fields[++fields.len] = FIELD("Fingerprint", active1.fields["fingerprint"], "fingerprint")
@@ -424,6 +426,7 @@
if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
\nSex: [active1.fields["sex"]]
+ \nSpecies: [active1.fields["species"]]
\nAge: [active1.fields["age"]]
\nFingerprint: [active1.fields["fingerprint"]]
\nPhysical Status: [active1.fields["p_stat"]]
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 7fe2e80364..26e45d7f40 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -36,8 +36,15 @@
"name" = "Please input new name:",
"id" = "Please input new ID:",
"sex" = "Please select new sex:",
+ "species" = "Please input new species:",
"age" = "Please input new age:",
"fingerprint" = "Please input new fingerprint hash:",
+ "home_system" = "Please input new home:",
+ "birthplace" = "Please input new birthplace:",
+ "citizenship" = "Please input new citizenship:",
+ "languages" = "Please input known languages:",
+ "faction" = "Please input new employer:",
+ "religion" = "Please input new religion:",
)
field_edit_choices = list(
// General
@@ -109,8 +116,15 @@
fields[++fields.len] = FIELD("Name", active1.fields["name"], "name")
fields[++fields.len] = FIELD("ID", active1.fields["id"], "id")
fields[++fields.len] = FIELD("Sex", active1.fields["sex"], "sex")
+ fields[++fields.len] = FIELD("Species", active1.fields["species"], "species")
fields[++fields.len] = FIELD("Age", active1.fields["age"], "age")
fields[++fields.len] = FIELD("Fingerprint", active1.fields["fingerprint"], "fingerprint")
+ fields[++fields.len] = FIELD("Home", active1.fields["home_system"], "home_system")
+ fields[++fields.len] = FIELD("Birthplace", active1.fields["birthplace"], "birthplace")
+ fields[++fields.len] = FIELD("Citizenship", active1.fields["citizenship"], "citizenship")
+ fields[++fields.len] = FIELD("Faction", active1.fields["faction"], "faction")
+ fields[++fields.len] = FIELD("Religion", active1.fields["religion"], "religion")
+ fields[++fields.len] = FIELD("Known Languages", active1.fields["languages"], "languages")
fields[++fields.len] = FIELD("Physical Status", active1.fields["p_stat"], null)
fields[++fields.len] = FIELD("Mental Status", active1.fields["m_stat"], null)
var/list/photos = list()
@@ -307,8 +321,15 @@
if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
\nSex: [active1.fields["sex"]]
+ \nSpecies: [active1.fields["species"]]
\nAge: [active1.fields["age"]]
\nFingerprint: [active1.fields["fingerprint"]]
+ \nHome: [active1.fields["home_system"]]
+ \nBirthplace: [active1.fields["birthplace"]]
+ \nCitizenship: [active1.fields["citizenship"]]
+ \nFaction: [active1.fields["faction"]]
+ \nReligion: [active1.fields["religion"]]
+ \nKnown Languages: [active1.fields["languages"]]
\nPhysical Status: [active1.fields["p_stat"]]
\nMental Status: [active1.fields["m_stat"]]
\nEmployment/Skills Summary: [active1.fields["notes"]]
diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm
index c6ede9ac37..c7db7b94e3 100644
--- a/code/game/machinery/computer/syndicate_specops_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm
@@ -1,6 +1,6 @@
/obj/machinery/computer/syndicate_elite_shuttle
- name = "elite syndicate squad shuttle control console"
+ name = "elite mercenary squad shuttle control console"
icon_keyboard = "syndie_key"
icon_screen = "syndishuttle"
light_color = "#00ffff"
- req_access = list(access_cent_specops)
\ No newline at end of file
+ req_access = list(access_cent_specops)
diff --git a/code/game/machinery/doors/checkForMultipleDoors.dm b/code/game/machinery/doors/checkForMultipleDoors.dm
index 9005a7fda4..f7c6ff98b1 100644
--- a/code/game/machinery/doors/checkForMultipleDoors.dm
+++ b/code/game/machinery/doors/checkForMultipleDoors.dm
@@ -12,5 +12,5 @@
for(var/obj/machinery/door/D in locate(src.x,src.y,src.z))
if(!istype(D, /obj/machinery/door/window) && D.density)
return 0
- //There are no false wall checks because that would be fucking retarded
- return 1
\ No newline at end of file
+ //There are no false wall checks because that would be mischievious
+ return 1
diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
index 6c71e63207..c3fa1701fd 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -202,6 +202,12 @@
frame_class = FRAME_CLASS_MACHINE
frame_size = 3
+/datum/frame/frame_types/injector_maker
+ name = "Ready-to-Use Medicine 3000"
+ frame_class = FRAME_CLASS_MACHINE
+ circuit = /obj/machinery/atmospheric_field_generator
+ frame_size = 3
+
//////////////////////////////
// Frame Object (Structure)
//////////////////////////////
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 41851575af..b93d72c73f 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -121,8 +121,17 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
hologram.anchored = TRUE//So space wind cannot drag it.
hologram.name = "[A.name] (Hologram)"//If someone decides to right click.
- hologram.set_light(2) //hologram lighting
- hologram.color = color //painted holopad gives coloured holograms
+
+ if(!isnull(color))
+ hologram.color = color
+ else
+ hologram.color = A.holo_color
+
+ if(hologram.color) //hologram lighting
+ hologram.set_light(2,1,hologram.color)
+ else
+ hologram.set_light(2)
+
masters[A] = hologram
set_light(2) //pad lighting
icon_state = "holopad1"
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 07ac93b565..4e1e239915 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -1,159 +1,161 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
-// Beacon randomly spawns in space
-// When a non-traitor (no special role in /mind) uses it, he is given the choice to become a traitor
-// If he accepts there is a random chance he will be accepted, rejected, or rejected and killed
-// Bringing certain items can help improve the chance to become a traitor
-
-/obj/machinery/syndicate_beacon
- name = "ominous beacon"
- desc = "This looks suspicious..."
- icon = 'icons/obj/device.dmi'
- icon_state = "syndbeacon"
- anchored = TRUE
- density = TRUE
- var/temptext = ""
- var/selfdestructing = 0
- var/charges = 1
-
-/obj/machinery/syndicate_beacon/attack_hand(var/mob/user as mob)
- usr.set_machine(src)
- var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]... Identity confirmed, "
- if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
- if(is_special_character(user))
- dat += "Operative record found. Greetings, Agent [user.name]. "
- else if(charges < 1)
- dat += "Connection severed. "
- else
- var/honorific = "Mr."
- if(user.gender == FEMALE)
- honorific = "Ms."
- dat += "Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]? "
- if(!selfdestructing)
- dat += "
\"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\" "
- dat += temptext
- user << browse(dat, "window=syndbeacon")
- onclose(user, "syndbeacon")
-
-/obj/machinery/syndicate_beacon/Topic(href, href_list)
- if(..())
- return
- if(href_list["betraitor"])
- if(charges < 1)
- updateUsrDialog()
- return
- var/mob/M = locate(href_list["traitormob"])
- if(M.mind.special_role || jobban_isbanned(M, "Syndicate"))
- temptext = "We have no need for you at this time. Have a pleasant day. "
- updateUsrDialog()
- return
- charges -= 1
- switch(rand(1,2))
- if(1)
- temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind."
- updateUsrDialog()
- spawn(rand(50,200)) selfdestruct()
- return
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/N = M
- to_chat(N, "You have joined the ranks of the Syndicate and become a traitor to the station!")
- traitors.add_antagonist(N.mind)
- traitors.equip(N)
- message_admins("[N]/([N.ckey]) has accepted a traitor objective from a syndicate beacon.")
-
- updateUsrDialog()
- return
-
-/obj/machinery/syndicate_beacon/proc/selfdestruct()
- selfdestructing = 1
- spawn() explosion(src.loc, 1, rand(1,3), rand(3,8), 10)
-
-////////////////////////////////////////
-//Singularity beacon
-////////////////////////////////////////
-/obj/machinery/power/singularity_beacon
- name = "ominous beacon"
- desc = "This looks suspicious..."
- icon = 'icons/obj/singularity.dmi'
- icon_state = "beacon"
-
- anchored = FALSE
- density = TRUE
- layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS
- stat = 0
-
- var/active = 0
- var/icontype = "beacon"
-
-/obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null)
- if(surplus() < 1500)
- if(user)
- to_chat(user, "The connected wire doesn't have enough current.")
- return
- for(var/obj/singularity/singulo in GLOB.all_singularities)
- if(singulo.z == z)
- singulo.target = src
- icon_state = "[icontype]1"
- active = 1
- START_MACHINE_PROCESSING(src)
- if(user)
- to_chat(user, "You activate the beacon.")
-
-/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
- for(var/obj/singularity/singulo in GLOB.all_singularities)
- if(singulo.target == src)
- singulo.target = null
- icon_state = "[icontype]0"
- active = 0
- if(user)
- to_chat(user, "You deactivate the beacon.")
-
-/obj/machinery/power/singularity_beacon/attack_ai(mob/user as mob)
- return
-
-/obj/machinery/power/singularity_beacon/attack_hand(var/mob/user as mob)
- if(anchored)
- return active ? Deactivate(user) : Activate(user)
- else
- to_chat(user, "You need to screw the beacon to the floor first!")
- return
-
-/obj/machinery/power/singularity_beacon/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(W.is_screwdriver())
- if(active)
- to_chat(user, "You need to deactivate the beacon first!")
- return
-
- if(anchored)
- anchored = FALSE
- to_chat(user, "You unscrew the beacon from the floor.")
- playsound(src, W.usesound, 50, 1)
- disconnect_from_network()
- return
- else
- if(!connect_to_network())
- to_chat(user, "This device must be placed over an exposed cable.")
- return
- anchored = TRUE
- to_chat(user, "You screw the beacon to the floor and attach the cable.")
- playsound(src, W.usesound, 50, 1)
- return
- ..()
- return
-
-/obj/machinery/power/singularity_beacon/Destroy()
- if(active)
- Deactivate()
- ..()
-
-//stealth direct power usage
-/obj/machinery/power/singularity_beacon/process()
- if(!active)
- return PROCESS_KILL
- else
- if(draw_power(1500) < 1500)
- Deactivate()
-
-/obj/machinery/power/singularity_beacon/syndicate
- icontype = "beaconsynd"
- icon_state = "beaconsynd0"
+//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+
+// Beacon randomly spawns in space
+// When a non-traitor (no special role in /mind) uses it, he is given the choice to become a traitor
+// If he accepts there is a random chance he will be accepted, rejected, or rejected and killed
+// Bringing certain items can help improve the chance to become a traitor
+
+/obj/machinery/syndicate_beacon
+ name = "ominous beacon"
+ desc = "This looks suspicious..."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "syndbeacon"
+ anchored = TRUE
+ density = TRUE
+ var/temptext = ""
+ var/selfdestructing = 0
+ var/charges = 1
+
+/obj/machinery/syndicate_beacon/attack_hand(var/mob/user as mob)
+ usr.set_machine(src)
+ var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]... Identity confirmed, "
+ if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
+ if(is_special_character(user))
+ dat += "Operative record found. Greetings, Agent [user.name]. "
+ else if(charges < 1)
+ dat += "Connection severed. "
+ else
+ var/honorific = "Mr."
+ if(user.gender == FEMALE)
+ honorific = "Ms."
+ dat += "Identity not found in operative database. What can the Syndicate do for you today, [honorific] [user.name]? "
+ if(!selfdestructing)
+ dat += "
\"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\" "
+ dat += temptext
+ user << browse(dat, "window=syndbeacon")
+ onclose(user, "syndbeacon")
+
+/obj/machinery/syndicate_beacon/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["betraitor"])
+ if(charges < 1)
+ updateUsrDialog()
+ return
+ var/mob/M = locate(href_list["traitormob"])
+ if(M.mind.special_role || jobban_isbanned(M, "Syndicate"))
+ temptext = "We have no need for you at this time. Have a pleasant day. "
+ updateUsrDialog()
+ return
+ charges -= 1
+ switch(rand(1,2))
+ if(1)
+ temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind."
+ updateUsrDialog()
+ spawn(rand(50,200)) selfdestruct()
+ return
+ if(2)
+ return
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/N = M
+ to_chat(N, "You have joined the ranks of the Syndicate and become a traitor to the station!")
+ traitors.add_antagonist(N.mind)
+ traitors.equip(N)
+ message_admins("[N]/([N.ckey]) has accepted a traitor objective from a syndicate beacon.")
+
+ updateUsrDialog()
+ return
+
+/obj/machinery/syndicate_beacon/proc/selfdestruct()
+ selfdestructing = 1
+ spawn() explosion(src.loc, 1, rand(1,3), rand(3,8), 10)
+
+////////////////////////////////////////
+//Singularity beacon
+////////////////////////////////////////
+/obj/machinery/power/singularity_beacon
+ name = "ominous beacon"
+ desc = "This looks suspicious..."
+ icon = 'icons/obj/singularity.dmi'
+ icon_state = "beacon"
+
+ anchored = FALSE
+ density = TRUE
+ layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS
+ stat = 0
+
+ var/active = 0
+ var/icontype = "beacon"
+
+/obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null)
+ if(surplus() < 1500)
+ if(user)
+ to_chat(user, "The connected wire doesn't have enough current.")
+ return
+ for(var/obj/singularity/singulo in GLOB.all_singularities)
+ if(singulo.z == z)
+ singulo.target = src
+ icon_state = "[icontype]1"
+ active = 1
+ START_MACHINE_PROCESSING(src)
+ if(user)
+ to_chat(user, "You activate the beacon.")
+
+/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
+ for(var/obj/singularity/singulo in GLOB.all_singularities)
+ if(singulo.target == src)
+ singulo.target = null
+ icon_state = "[icontype]0"
+ active = 0
+ if(user)
+ to_chat(user, "You deactivate the beacon.")
+
+/obj/machinery/power/singularity_beacon/attack_ai(mob/user as mob)
+ return
+
+/obj/machinery/power/singularity_beacon/attack_hand(var/mob/user as mob)
+ if(anchored)
+ return active ? Deactivate(user) : Activate(user)
+ else
+ to_chat(user, "You need to screw the beacon to the floor first!")
+ return
+
+/obj/machinery/power/singularity_beacon/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(W.is_screwdriver())
+ if(active)
+ to_chat(user, "You need to deactivate the beacon first!")
+ return
+
+ if(anchored)
+ anchored = FALSE
+ to_chat(user, "You unscrew the beacon from the floor.")
+ playsound(src, W.usesound, 50, 1)
+ disconnect_from_network()
+ return
+ else
+ if(!connect_to_network())
+ to_chat(user, "This device must be placed over an exposed cable.")
+ return
+ anchored = TRUE
+ to_chat(user, "You screw the beacon to the floor and attach the cable.")
+ playsound(src, W.usesound, 50, 1)
+ return
+ ..()
+ return
+
+/obj/machinery/power/singularity_beacon/Destroy()
+ if(active)
+ Deactivate()
+ ..()
+
+//stealth direct power usage
+/obj/machinery/power/singularity_beacon/process()
+ if(!active)
+ return PROCESS_KILL
+ else
+ if(draw_power(1500) < 1500)
+ Deactivate()
+
+/obj/machinery/power/singularity_beacon/syndicate
+ icontype = "beaconsynd"
+ icon_state = "beaconsynd0"
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 5bcf571f61..c07722523c 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -454,11 +454,13 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/part_b_extra = ""
if(data == DATA_ANTAG) // intercepted radio message
part_b_extra = " (Intercepted)"
- var/part_a = "\icon[radio][bicon(radio)]\[[freq_text]\][part_b_extra] " // goes in the actual output
+ var/part_a = ""
+ var/part_b = "\icon[radio][bicon(radio)]\[[freq_text]\][part_b_extra] " // goes in the actual output
// --- Some more pre-message formatting ---
- var/part_b = " " // Tweaked for security headsets -- TLE
- var/part_c = ""
+ var/part_c = " " // Tweaked for security headsets -- TLE
+ var/part_d = ""
+ var/part_e = ""
// --- Filter the message; place it in quotes apply a verb ---
@@ -470,8 +472,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- This following recording is intended for research and feedback in the use of department radio channels ---
- var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE
- var/blackbox_msg = "[part_a][name][part_blackbox_b][quotedmsg][part_c]"
+ var/part_blackbox_c = " \[[freq_text]\] " // Tweaked for security headsets -- TLE
+ var/blackbox_msg = "[part_a][part_b][name][part_blackbox_c][quotedmsg][part_d][part_e]"
//var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
//BR.messages_admin += blackbox_admin_msg
@@ -510,21 +512,21 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/* --- Process all the mobs that heard a masked voice (understood) --- */
if(length(heard_masked))
for (var/mob/R in heard_masked)
- R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M, 0, name)
+ R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 0, name)
if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
R << 'sound/effects/radio_common_quieter.ogg'
/* --- Process all the mobs that heard the voice normally (understood) --- */
if(length(heard_normal))
for (var/mob/R in heard_normal)
- R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M, 0, realname)
+ R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 0, realname)
if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
R << 'sound/effects/radio_common_quieter.ogg'
/* --- Process all the mobs that heard the voice normally (did not understand) --- */
if(length(heard_voice))
for (var/mob/R in heard_voice)
- R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M,0, vname)
+ R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M,0, vname)
if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
R << 'sound/effects/radio_common_quieter.ogg'
@@ -532,14 +534,14 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// Displays garbled message (ie "f*c* **u, **i*er!")
if(length(heard_garbled))
for (var/mob/R in heard_garbled)
- R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M, 1, vname)
+ R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 1, vname)
if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
R << 'sound/effects/radio_common_quieter.ogg'
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
if(length(heard_gibberish))
for (var/mob/R in heard_gibberish)
- R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M, 1)
+ R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 1)
if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
R << 'sound/effects/radio_common_quieter.ogg'
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index 7661bb3255..88dace7ff9 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -7,7 +7,6 @@
maint_access = 0
//add_req_access = 0
//operation_req_access = list(access_hos)
- damage_absorption = list("brute"=0.7,"fire"=1,"bullet"=0.7,"laser"=0.85,"energy"=1,"bomb"=0.8)
var/am = "d3c2fbcadca903a41161ccc9df9cf948"
max_hull_equip = 2
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index 19bd2b9c53..4ea027f154 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -8,7 +8,6 @@
health = 300
maxhealth = 300 //Don't forget to update the /old variant if you change this number.
deflect_chance = 20
- damage_absorption = list("brute"=0.5,"fire"=1.1,"bullet"=0.65,"laser"=0.85,"energy"=0.9,"bomb"=0.8)
max_temperature = 30000
infra_luminosity = 8
force = 40
@@ -85,4 +84,4 @@
..()
health = 25
maxhealth = 250 //Just slightly worse.
- cell.charge = rand(0, (cell.charge/2))
\ No newline at end of file
+ cell.charge = rand(0, (cell.charge/2))
diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm
index 09992b5774..76a3dcc2d4 100644
--- a/code/game/mecha/combat/gorilla.dm
+++ b/code/game/mecha/combat/gorilla.dm
@@ -12,7 +12,7 @@
opacity = 0 // Because there's big tall legs to look through. Also it looks fucky if this is set to 1.
deflect_chance = 50
damage_absorption = list("brute"=0.1,"fire"=0.7,"bullet"=0.1,"laser"=0.6,"energy"=0.7,"bomb"=0.7) //values show how much damage will pass through, not how much will be absorbed.
- max_temperature = 35000
+ max_temperature = 35000 //Just a bit better than the Durand.
infra_luminosity = 3
wreckage = /obj/effect/decal/mecha_wreckage/gorilla
add_req_access = 0
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index b2b5fe613f..1fa6933add 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -8,7 +8,6 @@
health = 250
maxhealth = 250 //Don't forget to update the /old variant if you change this number.
deflect_chance = 15
- damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 25000
infra_luminosity = 6
wreckage = /obj/effect/decal/mecha_wreckage/gygax
@@ -55,7 +54,6 @@
health = 400
maxhealth = 400
deflect_chance = 25
- damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8)
max_temperature = 45000
overload_coeff = 1
wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark
@@ -92,7 +90,6 @@
maxhealth = 150
deflect_chance = 20
step_in = 2
- damage_absorption = list("brute"=0.9,"fire"=1,"bullet"=0.9,"laser"=0.8,"energy"=0.9,"bomb"=1)
max_temperature = 20000
overload_coeff = 1
wreckage = /obj/effect/decal/mecha_wreckage/gygax/serenity
@@ -148,4 +145,4 @@
..()
health = 25
maxhealth = 250 //Just slightly worse.
- cell.charge = rand(0, (cell.charge/2))
\ No newline at end of file
+ cell.charge = rand(0, (cell.charge/2))
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index c218493847..8fc089c495 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -8,7 +8,6 @@
health = 350
maxhealth = 350 //Don't forget to update the /old variant if you change this number.
deflect_chance = 25
- damage_absorption = list("brute"=0.5,"fire"=0.7,"bullet"=0.45,"laser"=0.6,"energy"=0.7,"bomb"=0.7)
max_temperature = 60000
infra_luminosity = 3
operation_req_access = list(access_cent_specops)
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index 8ec100ad1e..04e3869cc1 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -9,7 +9,6 @@
health = 200 //God this is low
maxhealth = 200 //Don't forget to update the /old variant if you change this number.
deflect_chance = 30
- damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7)
max_temperature = 25000
infra_luminosity = 3
wreckage = /obj/effect/decal/mecha_wreckage/phazon
@@ -38,6 +37,7 @@
cloak_possible = TRUE
phasing_possible = TRUE
switch_dmg_type_possible = TRUE
+ var/list/inherent_damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7)
/obj/mecha/combat/phazon/equipped/Initialize()
. = ..()
@@ -92,7 +92,7 @@
health = 350
maxhealth = 350
deflect_chance = 30
- damage_absorption = list("brute"=0.6,"fire"=0.7,"bullet"=0.7,"laser"=0.9,"energy"=0.7,"bomb"=0.5)
+ inherent_damage_absorption = list("brute"=0.6,"fire"=0.7,"bullet"=0.7,"laser"=0.9,"energy"=0.7,"bomb"=0.5)
max_temperature = 10000
infra_luminosity = 3
wreckage = /obj/effect/decal/mecha_wreckage/janus
@@ -125,7 +125,7 @@
src.visible_message("The [src.name] absorbs the incoming projectile's force, negating it!")
src.log_append_to_last("Armor negated.")
return
- else if((Proj.damage && !Proj.nodamage) && istype(Proj, /obj/item/projectile/beam) && prob(max(1, (50 - round((Proj.damage / 2) * damage_absorption["laser"])) * (1 - (Proj.armor_penetration / 100))))) // Base 50% chance to deflect a beam,lowered by half the beam's damage scaled to laser absorption, then multiplied by the remaining percent of non-penetrated armor, with a minimum chance of 1%.
+ else if((Proj.damage && !Proj.nodamage) && istype(Proj, /obj/item/projectile/beam) && prob(max(1, (50 - round((Proj.damage / 2) * inherent_damage_absorption["laser"])) * (1 - (Proj.armor_penetration / 100))))) // Base 50% chance to deflect a beam,lowered by half the beam's damage scaled to laser absorption, then multiplied by the remaining percent of non-penetrated armor, with a minimum chance of 1%.
src.occupant_message("The armor reflects the incoming beam, negating it!")
src.visible_message("The [src.name] reflects the incoming beam, negating it!")
src.log_append_to_last("Armor reflected.")
@@ -134,7 +134,7 @@
..()
/obj/mecha/combat/phazon/janus/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
- if(prob(max(1, (50 - round((W.force / 2) * damage_absorption["brute"])) * (1 - (W.armor_penetration / 100)))))
+ if(prob(max(1, (50 - round((W.force / 2) * inherent_damage_absorption["brute"])) * (1 - (W.armor_penetration / 100)))))
src.occupant_message("The armor absorbs the incoming attack's force, negating it!")
src.visible_message("The [src.name] absorbs the incoming attack's force, negating it!")
src.log_append_to_last("Armor absorbed.")
@@ -162,4 +162,4 @@
..()
health = 25
maxhealth = 150 //Just slightly worse.
- cell.charge = rand(0, (cell.charge/2))
\ No newline at end of file
+ cell.charge = rand(0, (cell.charge/2))
diff --git a/code/game/mecha/equipment/weapons/energy/laser.dm b/code/game/mecha/equipment/weapons/energy/laser.dm
index 5a480a9691..5d81dca416 100644
--- a/code/game/mecha/equipment/weapons/energy/laser.dm
+++ b/code/game/mecha/equipment/weapons/energy/laser.dm
@@ -67,4 +67,15 @@
equip_type = EQUIP_UTILITY
- origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4, TECH_PHORON = 3, TECH_ILLEGAL = 1)
\ No newline at end of file
+ origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4, TECH_PHORON = 3, TECH_ILLEGAL = 1)
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/gamma
+ equip_cooldown = 5
+ name = "\improper GA-X \"Render\" Experimental Gamma Laser"
+ desc = "A experimental suppression laser that fires rapid blasts of radiation charged photons, extremely effective against infantry."
+ icon_state = "mecha_coil"
+ energy_drain = 80
+ projectile = /obj/item/projectile/beam/gamma
+ fire_sound = 'sound/weapons/emitter.ogg'
+
+ origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 4, TECH_PHORON = 4, TECH_POWER = 4, TECH_ILLEGAL = 3)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 63d2304749..f5821b18d1 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -44,17 +44,6 @@
var/health = 300 //Health is health
var/maxhealth = 300 //Maxhealth is maxhealth.
var/deflect_chance = 10 //Chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
- //the values in this list show how much damage will pass through, not how much will be absorbed.
- var/list/damage_absorption = list(
- "brute"=0.8,
- "fire"=1.2,
- "bullet"=0.9,
- "laser"=1,
- "energy"=1,
- "bomb"=1,
- "bio"=1,
- "rad"=1
- )
var/damage_minimum = 10 //Incoming damage lower than this won't actually deal damage. Scrapes shouldn't be a real thing.
var/minimum_penetration = 15 //Incoming damage won't be fully applied if you don't have at least 20. Almost all AP clears this.
@@ -1043,15 +1032,8 @@
/obj/mecha/proc/get_damage_absorption()
var/obj/item/mecha_parts/component/armor/AC = internal_components[MECH_ARMOR]
-
- if(!istype(AC))
- return
-
- else
- if(AC.get_efficiency() > 0.25)
- return AC.damage_absorption
-
- return
+ if(istype(AC) && AC.get_efficiency() > 0.25)
+ return AC.damage_absorption
/obj/mecha/proc/absorbDamage(damage,damage_type)
return call((proc_res["dynabsorbdamage"]||src), "dynabsorbdamage")(damage,damage_type)
diff --git a/code/game/mecha/micro/micro.dm b/code/game/mecha/micro/micro.dm
index 97d6728f54..d1e5aedf59 100644
--- a/code/game/mecha/micro/micro.dm
+++ b/code/game/mecha/micro/micro.dm
@@ -26,7 +26,6 @@
max_micro_weapon_equip = 1
//add_req_access = 0
//operation_req_access = list(access_hos)
- damage_absorption = list("brute"=1,"fire"=1,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1)
var/am = "d3c2fbcadca903a41161ccc9df9cf948"
damage_minimum = 0 //Incoming damage lower than this won't actually deal damage. Scrapes shouldn't be a real thing.
minimum_penetration = 0 //Incoming damage won't be fully applied if you don't have at least 20. Almost all AP clears this.
diff --git a/code/game/mecha/micro/security.dm b/code/game/mecha/micro/security.dm
index d6d054a4f5..777ae8912b 100644
--- a/code/game/mecha/micro/security.dm
+++ b/code/game/mecha/micro/security.dm
@@ -22,7 +22,6 @@
health = 150
step_energy_drain = 4 // less efficient than base micromech, but still a micromech.
deflect_chance = 10
- damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 15000
infra_luminosity = 6
wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/polecat
@@ -45,7 +44,6 @@
dir_in = 2 //Facing south.
health = 100
deflect_chance = 5
- damage_absorption = list("brute"=1,"fire"=1,"bullet"=0.9,"laser"=0.8,"energy"=0.85,"bomb"=1)
max_temperature = 5000
wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/weasel
internal_damage_threshold = 20
diff --git a/code/game/mecha/micro/utility.dm b/code/game/mecha/micro/utility.dm
index 9ceaa2bae9..4587a89a21 100644
--- a/code/game/mecha/micro/utility.dm
+++ b/code/game/mecha/micro/utility.dm
@@ -9,7 +9,6 @@
dir_in = 2 //Facing south.
health = 100
deflect_chance = 10
- damage_absorption = list("brute"=0.9,"fire"=1,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1)
max_temperature = 15000
infra_luminosity = 6
wreckage = /obj/effect/decal/mecha_wreckage/micro/utility/gopher
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 61b4d90183..8d4ee98fbf 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -59,7 +59,6 @@
max_temperature = 65000
health = 250
lights_power = 8
- damage_absorption = list("fire"=0.5,"bullet"=0.8,"bomb"=0.5)
wreckage = /obj/effect/decal/mecha_wreckage/ripley/firefighter
max_hull_equip = 2
max_weapon_equip = 0
diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm
index f983a480ff..248b9cfbb4 100644
--- a/code/game/objects/effects/decals/crayon.dm
+++ b/code/game/objects/effects/decals/crayon.dm
@@ -28,4 +28,4 @@
add_overlay(mainOverlay)
add_overlay(shadeOverlay)
- add_hiddenprint(usr)
\ No newline at end of file
+ add_hiddenprint(usr)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 47d3843b7c..573e498aa4 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -25,6 +25,7 @@
var/list/origin_tech = null //Used by R&D to determine what research bonuses it grants.
var/list/attack_verb //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/force = 0
+ var/can_cleave = FALSE // If true, a 'cleaving' attack will occur.
var/heat_protection = 0 //flags which determine which body parts are protected from heat. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm
var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm
@@ -503,17 +504,22 @@ var/list/global/slot_flags_enumeration = list(
return
if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr))
return
- if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain
+ if(isanimal(usr)) //VOREStation Edit Start - Allows simple mobs with hands to use the pickup verb
+ var/mob/living/simple_mob/s = usr
+ if(!s.has_hands)
+ to_chat(usr, "You can't pick things up!")
+ return
+ else if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain
to_chat(usr, "You can't pick things up!")
return
- var/mob/living/carbon/C = usr
+ var/mob/living/L = usr
if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained
to_chat(usr, "You can't pick things up!")
return
if(src.anchored) //Object isn't anchored
to_chat(usr, "You can't pick that up!")
return
- if(C.get_active_hand()) //Hand is not full
+ if(L.get_active_hand()) //Hand is not full //VOREStation Edit End
to_chat(usr, "Your hand is full.")
return
if(!istype(src.loc, /turf)) //Object is on a turf
@@ -675,7 +681,7 @@ GLOBAL_LIST_EMPTY(blood_overlays_by_type)
/obj/item/proc/showoff(mob/user)
for (var/mob/M in view(user))
- M.show_message("[user] holds up [src]. Take a closer look.",1)
+ M.show_message("[user] holds up [src]. Take a closer look.",1)
/mob/living/carbon/verb/showoff()
set name = "Show Held Item"
@@ -705,13 +711,13 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
var/cannotzoom
if((usr.stat && !zoom) || !(istype(usr,/mob/living/carbon/human)))
- to_chat(usr, "You are unable to focus through the [devicename]")
+ to_chat(usr, "You are unable to focus through the [devicename].")
cannotzoom = 1
else if(!zoom && (global_hud.darkMask[1] in usr.client.screen))
- to_chat(usr, "Your visor gets in the way of looking through the [devicename]")
+ to_chat(usr, "Your visor gets in the way of looking through the [devicename].")
cannotzoom = 1
else if(!zoom && usr.get_active_hand() != src)
- to_chat(usr, "You are too distracted to look through the [devicename], perhaps if it was in your active hand this might work better")
+ to_chat(usr, "You are too distracted to look through the [devicename], perhaps if it was in your active hand this might work better.")
cannotzoom = 1
//We checked above if they are a human and returned already if they weren't.
@@ -741,7 +747,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
H.client.pixel_x = -viewoffset
H.client.pixel_y = 0
- H.visible_message("[usr] peers through the [zoomdevicename ? "[zoomdevicename] of the [src.name]" : "[src.name]"].")
+ H.visible_message("[usr] peers through the [zoomdevicename ? "[zoomdevicename] of the [src.name]" : "[src.name]"].")
if(!ignore_visor_zoom_restriction)
H.looking_elsewhere = TRUE
H.handle_vision()
@@ -759,7 +765,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
H.handle_vision()
if(!cannotzoom)
- usr.visible_message("[zoomdevicename ? "[usr] looks up from the [src.name]" : "[usr] lowers the [src.name]"].")
+ usr.visible_message("[zoomdevicename ? "[usr] looks up from the [src.name]" : "[usr] lowers the [src.name]"].")
return
diff --git a/code/game/objects/items/devices/advnifrepair.dm b/code/game/objects/items/devices/advnifrepair.dm
index 913aad68ad..ca3e455acc 100644
--- a/code/game/objects/items/devices/advnifrepair.dm
+++ b/code/game/objects/items/devices/advnifrepair.dm
@@ -24,7 +24,7 @@
/obj/item/device/nifrepairer/attackby(obj/W, mob/user)
if(istype(W,/obj/item/stack/nanopaste))
var/obj/item/stack/nanopaste/np = W
- if(np.use(1) && supply.get_free_space() >= efficiency)
+ if((supply.get_free_space() >= efficiency) && np.use(1))
to_chat(user, "You convert some nanopaste into programmed nanites inside \the [src].")
supply.add_reagent(id = "nifrepairnanites", amount = efficiency)
update_icon()
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 70e0d3d768..0b987e04c7 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -1,6 +1,6 @@
/obj/item/device/flash
name = "flash"
- desc = "Used for blinding and being an asshole."
+ desc = "Used for blinding and disorienting."
icon_state = "flash"
item_state = "flashtool"
throwforce = 5
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index cc902d3b6d..339b57f055 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -4,6 +4,7 @@
name = "power sink"
desc = "A nulling power sink which drains energy from electrical systems."
icon_state = "powersink0"
+ icon = 'icons/obj/device.dmi'
w_class = ITEMSIZE_LARGE
throwforce = 5
throw_speed = 1
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index e456f22b26..26e7f00046 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -212,37 +212,37 @@
/obj/item/device/radio/headset/heads/rd
name = "research director's headset"
- desc = "Headset of the researching God."
+ desc = "Headset of the eccentric-in-chief."
icon_state = "com_headset"
ks2type = /obj/item/device/encryptionkey/heads/rd
/obj/item/device/radio/headset/heads/rd/alt
name = "research director's bowman headset"
- desc = "Headset of the researching God."
+ desc = "Headset of the eccentric-in-chief."
icon_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/heads/rd
/obj/item/device/radio/headset/heads/hos
name = "head of security's headset"
- desc = "The headset of the man who protects your worthless lifes."
+ desc = "The headset of the hardass who protects your worthless lifes."
icon_state = "com_headset"
ks2type = /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/hos/alt
name = "head of security's bowman headset"
- desc = "The headset of the man who protects your worthless lifes."
+ desc = "The headset of the hardass who protects your worthless lifes."
icon_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/ce
name = "chief engineer's headset"
- desc = "The headset of the guy who is in charge of morons"
+ desc = "The headset of the clown who is in charge of the circus."
icon_state = "com_headset"
ks2type = /obj/item/device/encryptionkey/heads/ce
/obj/item/device/radio/headset/heads/ce/alt
name = "chief engineer's bowman headset"
- desc = "The headset of the guy who is in charge of morons"
+ desc = "The headset of the clown who is in charge of the circus."
icon_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/heads/ce
@@ -260,13 +260,13 @@
/obj/item/device/radio/headset/heads/hop
name = "head of personnel's headset"
- desc = "The headset of the guy who will one day be Site Manager."
+ desc = "The headset of the poor fool who will one day be Site Manager."
icon_state = "com_headset"
ks2type = /obj/item/device/encryptionkey/heads/hop
/obj/item/device/radio/headset/heads/hop/alt
name = "head of personnel's bowman headset"
- desc = "The headset of the guy who will one day be Site Manager."
+ desc = "The headset of the poor fool who will one day be Site Manager."
icon_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/heads/hop
@@ -279,13 +279,13 @@
/obj/item/device/radio/headset/headset_cargo
name = "supply radio headset"
- desc = "A headset used by the QM and his slaves."
+ desc = "A headset used by the QM and their cronies."
icon_state = "cargo_headset"
ks2type = /obj/item/device/encryptionkey/headset_cargo
/obj/item/device/radio/headset/headset_cargo/alt
name = "supply bowman headset"
- desc = "A bowman headset used by the QM and his slaves."
+ desc = "A bowman headset used by the QM and their cronies."
icon_state = "cargo_headset_alt"
ks2type = /obj/item/device/encryptionkey/headset_cargo
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index ace1cbc2cd..45df3c628f 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -27,7 +27,7 @@
user.drop_item()
item.forceMove(src)
to_chat(user, "You attach the tank to the transfer valve.")
- message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. (JMP)")
+ message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. [ADMIN_JMP(location)]")
log_game("[key_name_admin(user)] attached both tanks to a transfer valve.")
update_icon()
@@ -49,7 +49,7 @@
A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
bombers += "[key_name(user)] attached a [item] to a transfer valve."
- message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)")
+ message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. [ADMIN_JMP(location)]")
log_game("[key_name_admin(user)] attached a [item] to a transfer valve.")
attacher = user
SStgui.update_uis(src) // update all UIs attached to src
@@ -190,16 +190,16 @@
else
attacher_name = "[attacher.name]([attacher.ckey])"
- var/log_str = "Bomb valve opened in [A.name] "
+ var/log_str = "Bomb valve opened in [A.name] "
log_str += "with [attached_device ? attached_device : "no device"] attacher: [attacher_name]"
if(attacher)
- log_str += "(?)"
+ log_str += ADMIN_QUE(attacher)
var/mob/mob = get_mob_by_key(src.fingerprintslast)
var/last_touch_info = ""
if(mob)
- last_touch_info = "(?)"
+ last_touch_info = ADMIN_QUE(mob)
log_str += " Last touched by: [src.fingerprintslast][last_touch_info]"
bombers += log_str
diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm
index 4c07229df7..ef5ae25fa7 100644
--- a/code/game/objects/items/devices/uplink.dm
+++ b/code/game/objects/items/devices/uplink.dm
@@ -139,6 +139,7 @@
data["exploit"]["species"] = html_encode(L.fields["species"])
data["exploit"]["rank"] = html_encode(L.fields["rank"])
data["exploit"]["home_system"] = html_encode(L.fields["home_system"])
+ data["exploit"]["birthplace"] = html_encode(L.fields["birthplace"])
data["exploit"]["citizenship"] = html_encode(L.fields["citizenship"])
data["exploit"]["faction"] = html_encode(L.fields["faction"])
data["exploit"]["religion"] = html_encode(L.fields["religion"])
diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm
index 33ca335a9f..3367574393 100644
--- a/code/game/objects/items/paintkit.dm
+++ b/code/game/objects/items/paintkit.dm
@@ -98,10 +98,8 @@
suit.desc = new_desc
suit.icon_state = "[new_icon]_suit"
suit.toggleicon = "[new_icon]_suit"
- suit.item_state = "[new_icon]_suit"
var/obj/item/clothing/head/hood/S = suit.hood
S.icon_state = "[new_icon]_helmet"
- S.item_state = "[new_icon]_helmet"
if(new_icon_file)
suit.icon = new_icon_file
S.icon = new_icon_file
diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm
index dbe34a94e3..cb879b7139 100644
--- a/code/game/objects/items/toys/toys_vr.dm
+++ b/code/game/objects/items/toys/toys_vr.dm
@@ -94,16 +94,55 @@
name = "janihound plushie"
icon_state = "scrubpuppy"
-/obj/item/toy/plushie/borgplushie/drakiesec
- name = "security drake plushie"
+/obj/item/toy/plushie/borgplushie/drake
icon = 'icons/obj/drakietoy_vr.dmi'
+ var/lights_glowing = FALSE
+
+/obj/item/toy/plushie/borgplushie/drake/AltClick(mob/living/user)
+ . = ..()
+ var/turf/T = get_turf(src)
+ if(!T.AdjacentQuick(user)) // So people aren't messing with these from across the room
+ return FALSE
+ lights_glowing = !lights_glowing
+ to_chat(user, "You turn the [src]'s glow-fabric [lights_glowing ? "on" : "off"].")
+ update_icon()
+
+/obj/item/toy/plushie/borgplushie/drake/update_icon()
+ cut_overlays()
+ if (lights_glowing)
+ add_overlay(emissive_appearance(icon, "[icon_state]-lights"))
+
+/obj/item/toy/plushie/borgplushie/drake/get_description_info()
+ return "The lights on the plushie can be toggled [lights_glowing ? "off" : "on"] by alt-clicking on it."
+
+/obj/item/toy/plushie/borgplushie/drake/sec
+ name = "security drake plushie"
icon_state = "secdrake"
-/obj/item/toy/plushie/borgplushie/drakiemed
+/obj/item/toy/plushie/borgplushie/drake/med
name = "medical drake plushie"
- icon = 'icons/obj/drakietoy_vr.dmi'
icon_state = "meddrake"
+/obj/item/toy/plushie/borgplushie/drake/sci
+ name = "science drake plushie"
+ icon_state = "scidrake"
+
+/obj/item/toy/plushie/borgplushie/drake/jani
+ name = "janitor drake plushie"
+ icon_state = "janidrake"
+
+/obj/item/toy/plushie/borgplushie/drake/eng
+ name = "engineering drake plushie"
+ icon_state = "engdrake"
+
+/obj/item/toy/plushie/borgplushie/drake/mine
+ name = "mining drake plushie"
+ icon_state = "minedrake"
+
+/obj/item/toy/plushie/borgplushie/drake/trauma
+ name = "trauma drake plushie"
+ icon_state = "traumadrake"
+
/obj/item/toy/plushie/foxbear
name = "toy fox"
desc = "Issa fox!"
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index c8c8d376c8..7e5f8fd079 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -350,7 +350,7 @@
drop_sound = 'sound/items/drop/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'
-/obj/item/trash/spacercake_wrap
+/obj/item/trash/spacer_cake_wrap
name = "snack cake wrapper"
icon_state = "spacercake_wrap"
@@ -416,6 +416,10 @@
name = "burrito packaging"
icon_state = "smolburrito"
+/obj/item/trash/candybowl
+ name = "candy bowl"
+ icon_state = "candy_bowl"
+
/obj/item/trash/brainzsnax
name = "\improper BrainzSnax can"
icon_state = "brainzsnax"
@@ -426,4 +430,4 @@
name = "\improper BrainzSnax RED can"
icon_state = "brainzsnaxred"
drop_sound = 'sound/items/drop/soda.ogg'
- pickup_sound = 'sound/items/pickup/soda.ogg'
\ No newline at end of file
+ pickup_sound = 'sound/items/pickup/soda.ogg'
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index 0c318fc8dd..72c0c1915c 100644
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -427,11 +427,11 @@ AI MODULES
origin_tech = list(TECH_DATA = 3, TECH_ILLEGAL = 1)
laws = new/datum/ai_laws/nanotrasen_aggressive()
-/******************** Syndicate Directives ********************/
+/******************** Mercenary Directives ********************/
/obj/item/weapon/aiModule/syndicate_override
- name = "\improper 'Syndicate Directives' core AI module"
- desc = "A 'Syndicate Directives' Core AI Module: 'Reconfigures the AI's core laws.'"
+ name = "\improper 'Mercenary Directives' core AI module"
+ desc = "A 'Mercenary Directives' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 4)
laws = new/datum/ai_laws/syndicate_override()
diff --git a/code/game/objects/items/weapons/capture_crystal.dm b/code/game/objects/items/weapons/capture_crystal.dm
index 4cc748af13..36447ce9cc 100644
--- a/code/game/objects/items/weapons/capture_crystal.dm
+++ b/code/game/objects/items/weapons/capture_crystal.dm
@@ -451,7 +451,9 @@
//Let's let our mob out!
/obj/item/capture_crystal/proc/unleash(mob/living/user, atom/target)
if(!user && !target) //We got thrown but we're not sure who did it, let's go to where the crystal is
- bound_mob.forceMove(src.drop_location())
+ var/drop_loc = get_turf(src)
+ if (drop_loc)
+ bound_mob.forceMove(drop_loc)
return
if(!target) //We know who wants to let us out, but they didn't say where, so let's drop us on them
bound_mob.forceMove(user.drop_location())
diff --git a/code/game/objects/items/weapons/chewables.dm b/code/game/objects/items/weapons/chewables.dm
index 59e95f103f..caf5ae74c3 100644
--- a/code/game/objects/items/weapons/chewables.dm
+++ b/code/game/objects/items/weapons/chewables.dm
@@ -267,7 +267,7 @@
color = reagents.get_color()
update_icon()
-/obj/item/weapon/storage/box/pocky //ADDITION 04/17/2021
+/obj/item/weapon/storage/box/pocky
name = "\improper Totemo yoi Pocky"
desc = "A bundle of chocolate-coated bisquit sticks."
icon = 'icons/obj/food_snacks.dmi'
@@ -282,7 +282,7 @@
foldable = null
trash = /obj/item/trash/pocky
-/obj/item/clothing/mask/chewable/candy/pocky //ADDITION 04/17/2021
+/obj/item/clothing/mask/chewable/candy/pocky
name = "chocolate pocky"
desc = "A chocolate-coated biscuit stick."
icon_state = "pockystick"
diff --git a/code/game/objects/items/weapons/circuitboards/circuitboards_vr.dm b/code/game/objects/items/weapons/circuitboards/circuitboards_vr.dm
index 174e1cde97..6228166751 100644
--- a/code/game/objects/items/weapons/circuitboards/circuitboards_vr.dm
+++ b/code/game/objects/items/weapons/circuitboards/circuitboards_vr.dm
@@ -2,6 +2,17 @@
#error T_BOARD macro is not defined but we need it!
#endif
+/obj/item/weapon/circuitboard/get_examine_desc()
+ . = ..()
+ if(LAZYLEN(req_components))
+ var/list/nice_list = list()
+ for(var/B in req_components)
+ var/atom/A = B
+ if(!ispath(A))
+ continue
+ nice_list += list("[req_components[A]] [initial(A.name)]")
+ . += "Required components: [english_list(nice_list)]."
+
// VOREStation specific circuit boards!
// Board for the parts lathe in partslathe.dm
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
index 7ef7c4bfef..000cd011f6 100644
--- a/code/game/objects/items/weapons/circuitboards/frame.dm
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -264,4 +264,17 @@
/obj/item/weapon/stock_parts/micro_laser/high = 2, //field emitters
/obj/item/weapon/stock_parts/scanning_module = 1, //atmosphere sensor
/obj/item/weapon/stock_parts/capacitor/adv = 1, //for the JUICE
- /obj/item/stack/cable_coil = 10)
\ No newline at end of file
+ /obj/item/stack/cable_coil = 10)
+
+
+/obj/item/weapon/circuitboard/injector_maker
+ name = T_BOARD("Ready-to-Use Medicine 3000")
+ build_path = /obj/machinery/injector_maker
+ board_type = new /datum/frame/frame_types/injector_maker
+ origin_tech = list(TECH_BIO = 3, TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1
+ )
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index c3a94fb100..d7208d5db3 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -54,7 +54,7 @@
wet()
else
to_chat(user, "You clean \the [target.name].")
- target.clean_blood()
+ target.clean_blood(TRUE)
return
//attack_as_weapon
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 8eba05ddd5..b20a44650e 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -183,7 +183,7 @@
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
//Transfer 5% of current tank air contents to turf
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(0.02*(throw_amount/100))
- //air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE
+ //air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is mischievious and I could probably make it work without fucking it up like this, but there you have it. -- TLE
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(target,air_transfer.gas["phoron"],get_dir(loc,target))
air_transfer.gas["phoron"] = 0
target.assume_air(air_transfer)
diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm
index 9154f34843..f7b1f3b197 100644
--- a/code/game/objects/items/weapons/id cards/station_ids.dm
+++ b/code/game/objects/items/weapons/id cards/station_ids.dm
@@ -13,6 +13,7 @@
slot_flags = SLOT_ID | SLOT_EARS
var/age = "\[UNSET\]"
+ var/species = "\[UNSET\]"
var/blood_type = "\[UNSET\]"
var/dna_hash = "\[UNSET\]"
var/fingerprint_hash = "\[UNSET\]"
@@ -61,6 +62,7 @@
id_card.age = 0
id_card.registered_name = real_name
id_card.sex = capitalize(gender)
+ id_card.species = SPECIES_HUMAN
id_card.set_id_photo(src)
if(dna)
@@ -72,6 +74,7 @@
/mob/living/carbon/human/set_id_info(var/obj/item/weapon/card/id/id_card)
..()
id_card.age = age
+ id_card.species = "[custom_species ? "[custom_species] ([species.name])" : species.name]"
id_card.sex = capitalize(name_gender())
/obj/item/weapon/card/id/tgui_data(mob/user)
@@ -79,6 +82,7 @@
data["registered_name"] = registered_name
data["sex"] = sex
+ data["species"] = species
data["age"] = age
data["assignment"] = assignment
data["fingerprint_hash"] = fingerprint_hash
@@ -143,7 +147,7 @@
/obj/item/weapon/card/id/gold/captain/spare
name = "\improper Site Manager's spare ID"
- desc = "The spare ID of the High Lord himself."
+ desc = "The emergency spare ID for the station's very own Big Cheese."
icon_state = "gold-id-alternate"
registered_name = "Site Manager"
diff --git a/code/game/objects/items/weapons/id cards/syndicate_ids.dm b/code/game/objects/items/weapons/id cards/syndicate_ids.dm
index 0c36756bcc..727d76fd26 100644
--- a/code/game/objects/items/weapons/id cards/syndicate_ids.dm
+++ b/code/game/objects/items/weapons/id cards/syndicate_ids.dm
@@ -88,9 +88,9 @@
return name
/obj/item/weapon/card/id/syndicate_command
- name = "syndicate ID card"
- desc = "An ID straight from the Syndicate."
- registered_name = "Syndicate"
- assignment = "Syndicate Commander"
+ name = "operative ID card"
+ desc = "An ID straight from a mercenary organisation."
+ registered_name = "Operative"
+ assignment = "Operative Commander"
icon_state = "syndicate-id"
access = list(access_syndicate, access_external_airlocks)
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index feb778e530..72fd024db6 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -328,7 +328,7 @@
Power outage
- A power problem has made the entire station lose power? Could be station-wide wiring problems or syndicate power sinks. In any case follow these steps:
+ A power problem has made the entire station lose power? Could be station-wide wiring problems or illegal power sinks. In any case follow these steps:
- PANIC!
@@ -1123,7 +1123,7 @@
name = "Fission Mailed: Nuclear Sabotage 101"
icon_state ="bookNuclear"
item_state = "book8"
- author = "Syndicate"
+ author = "Stealth Assault Enterprises"
title = "Fission Mailed: Nuclear Sabotage 101"
dat = {"
@@ -1139,7 +1139,7 @@
Nuclear Explosives 101
- Hello and thank you for choosing the Syndicate for your nuclear information needs. Today's crash course will deal with the operation of a Nuclear Fission Device.
+ Hello and thank you for choosing Stealth Assault Enterprises for your nuclear information needs. Today's crash course will deal with the operation of a Nuclear Fission Device.
First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done, to unbolt it, one must completely log in, which at this time may not be possible.
@@ -1155,7 +1155,7 @@
You now have activated the device. To deactivate the buttons at anytime, for example when you've already prepped the bomb for detonation, remove the authentication disk OR press R on the keypad.
Now the bomb CAN ONLY be detonated using the timer. Manual detonation is not an option. Toggle off the SAFETY.
- Note: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step.
+ Note: You wouldn't believe how many SAARE Operatives with doctorates have forgotten this step.
So use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.
Note: THE BOMB IS STILL SET AND WILL DETONATE
diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
index 4f9bc00e0f..290925a366 100644
--- a/code/game/objects/items/weapons/material/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -145,7 +145,6 @@
base_icon = "spearglass"
name = "spear"
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
- description_info = "This weapon can strike from two tiles away, and over certain objects such as tables, or other people."
force = 10
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 04ed3f1411..92234d4da0 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -2,11 +2,12 @@
var/active = 0
var/active_force
var/active_throwforce
+ var/active_armourpen
var/active_w_class
var/active_embed_chance = 0 //In the off chance one of these is supposed to embed, you can just tweak this var
sharp = FALSE
edge = FALSE
- armor_penetration = 50
+ armor_penetration = 0
flags = NOCONDUCT | NOBLOODY
var/lrange = 2
var/lpower = 2
@@ -54,6 +55,7 @@
embed_chance = active_embed_chance
force = active_force
throwforce = active_throwforce
+ armor_penetration = active_armourpen
sharp = TRUE
edge = TRUE
w_class = active_w_class
@@ -70,6 +72,7 @@
embed_chance = initial(embed_chance)
force = initial(force)
throwforce = initial(throwforce)
+ armor_penetration = initial(armor_penetration)
sharp = initial(sharp)
edge = initial(edge)
w_class = initial(w_class)
@@ -192,7 +195,8 @@
/obj/item/weapon/melee/energy/examine(mob/user)
. = ..()
- . += "Alt-click to recolor it."
+ if(colorable)
+ . += "Alt-click to recolor it."
/*
* Energy Axe
@@ -206,11 +210,13 @@
lcolor = null
//active_force = 150 //holy...
active_force = 60
+ active_armourpen = 65
active_throwforce = 35
active_w_class = ITEMSIZE_HUGE
//force = 40
//throwforce = 25
force = 20
+ armor_penetration = 20
throwforce = 10
throw_speed = 1
throw_range = 5
@@ -236,6 +242,7 @@
desc = "An energised axe."
active_force = 35
active_throwforce = 20
+ active_armourpen = 30
force = 15
use_cell = TRUE
@@ -255,6 +262,7 @@
icon_state = "esword"
item_state = "esword"
active_force = 30
+ active_armourpen = 50
active_throwforce = 20
active_w_class = ITEMSIZE_LARGE
force = 3
@@ -264,8 +272,6 @@
w_class = ITEMSIZE_SMALL
flags = NOBLOODY
origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
- sharp = TRUE
- edge = TRUE
colorable = TRUE
drop_sound = 'sound/items/drop/sword.ogg'
pickup_sound = 'sound/items/pickup/sword.ogg'
@@ -344,6 +350,7 @@
icon_state = "ionrapier"
item_state = "ionrapier"
active_force = 5
+ active_armourpen = 80
active_throwforce = 3
active_embed_chance = 0
sharp = TRUE
@@ -383,7 +390,7 @@
name = "zero-point lance"
desc = "Designed specifically for disrupting electronics at relatively close range, however it is still capable of dealing some damage to living beings."
active_force = 20
- armor_penetration = 15
+ active_armourpen = 15
reach = 2
/*
@@ -395,7 +402,7 @@
desc = "A small, handheld device which emits a high-energy 'blade'."
origin_tech = list(TECH_COMBAT = 5, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
active_force = 25
- armor_penetration = 25
+ active_armourpen = 25
projectile_parry_chance = 40
colorable = TRUE
@@ -501,7 +508,7 @@
name = "energy spear"
desc = "Concentrated energy forming a sharp tip at the end of a long rod."
icon_state = "espear"
- armor_penetration = 75
+ armor_penetration = 0
sharp = TRUE
edge = TRUE
force = 5
@@ -511,6 +518,7 @@
reach = 2
w_class = ITEMSIZE_LARGE
active_force = 25
+ active_armourpen = 75
active_throwforce = 30
active_w_class = ITEMSIZE_HUGE
colorable = TRUE
diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm
index 80ec8d7f7c..a86c3d4bd4 100644
--- a/code/game/objects/items/weapons/paint.dm
+++ b/code/game/objects/items/weapons/paint.dm
@@ -27,44 +27,52 @@ var/global/list/cached_icons = list()
return ..()
/obj/item/weapon/reagent_containers/glass/paint/New()
- if(paint_type && length(paint_type) > 0)
- name = paint_type + " " + name
..()
- reagents.add_reagent("water", volume*3/5)
- reagents.add_reagent("plasticide", volume/5)
- if(paint_type == "white") //why don't white crayons exist
- reagents.add_reagent("aluminum", volume/5)
- else if (paint_type == "black")
- reagents.add_reagent("carbon", volume/5)
- else
- reagents.add_reagent("marker_ink_[paint_type]", volume/5)
- reagents.handle_reactions()
+ if(paint_type)
+ reagents.add_reagent("paint", volume, paint_type)
/obj/item/weapon/reagent_containers/glass/paint/red
icon_state = "paint_red"
- paint_type = "red"
+ paint_type = "#FF0000"
/obj/item/weapon/reagent_containers/glass/paint/yellow
icon_state = "paint_yellow"
- paint_type = "yellow"
+ paint_type = "#FFFF00"
/obj/item/weapon/reagent_containers/glass/paint/green
icon_state = "paint_green"
- paint_type = "green"
+ paint_type = "#00FF00"
/obj/item/weapon/reagent_containers/glass/paint/blue
icon_state = "paint_blue"
- paint_type = "blue"
+ paint_type = "#0000FF"
-/obj/item/weapon/reagent_containers/glass/paint/purple
+/obj/item/weapon/reagent_containers/glass/paint/violet
icon_state = "paint_violet"
- paint_type = "purple"
+ paint_type = "#FF00FF"
/obj/item/weapon/reagent_containers/glass/paint/black
icon_state = "paint_black"
- paint_type = "black"
+ paint_type = "#000000"
+
+/obj/item/weapon/reagent_containers/glass/paint/grey
+ icon_state = "paint_neutral"
+ paint_type = "#808080"
+
+/obj/item/weapon/reagent_containers/glass/paint/orange
+ icon_state = "paint_orange"
+ paint_type = "#FFA500"
+
+/obj/item/weapon/reagent_containers/glass/paint/purple
+ icon_state = "paint_purple"
+ paint_type = "#A500FF"
+
+/obj/item/weapon/reagent_containers/glass/paint/cyan
+ icon_state = "paint_cyan"
+ paint_type = "#00FFFF"
/obj/item/weapon/reagent_containers/glass/paint/white
+ name = "paint remover bucket"
icon_state = "paint_white"
- paint_type = "white"
+ paint_type = "#FFFFFF"
diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm
index 2b55d0557a..a964eec980 100644
--- a/code/game/objects/items/weapons/storage/mre.dm
+++ b/code/game/objects/items/weapons/storage/mre.dm
@@ -235,8 +235,8 @@ MRE Stuff
open(user)
/obj/item/weapon/storage/mrebag/open(mob/user)
- if(!opened)
- to_chat(usr, "The pouch heats up as you break the vaccum seal.")
+ if(!opened && !isobserver(user))
+ to_chat(usr, "The pouch heats up as you break the vacuum seal.")
opened = 1
update_icon()
. = ..()
@@ -377,6 +377,6 @@ MRE Stuff
icon_state = "tgmcmre_dessert"
nutriment_amt = 2
starts_with = list("sugar" = 1)
-
+
package_open_state = "tgmcmre_[flavor]"
nutriment_desc = list("[new_taste]" = nutriment_amt)
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index bd80bf247e..9c6795aa12 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -3,7 +3,7 @@
*/
/obj/item/weapon/storage/toolbox
name = "toolbox"
- desc = "Danger. Very robust."
+ desc = "A metal toolbox with remarkably robust construction."
icon = 'icons/obj/storage_vr.dmi'
icon_state = "red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
diff --git a/code/game/objects/micro_structures.dm b/code/game/objects/micro_structures.dm
index 7f911d249d..062c576702 100644
--- a/code/game/objects/micro_structures.dm
+++ b/code/game/objects/micro_structures.dm
@@ -11,6 +11,7 @@
micro_target = TRUE
var/static/non_micro_types = list(
+ /mob/living/simple_mob/vore/squirrel,
/mob/living/simple_mob/vore/alienanimals/catslug,
/mob/living/simple_mob/vore/hostile/morph,
/mob/living/simple_mob/protean_blob,
diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm
index 63faacd0f3..b8ff810fe2 100644
--- a/code/game/objects/random/mapping.dm
+++ b/code/game/objects/random/mapping.dm
@@ -837,7 +837,14 @@
/obj/random/firstaid,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/random/unidentified_medicine/fresh_medicine,
- /obj/structure/closet/crate/veymed //VM FAKS
+ /obj/structure/closet/crate/freezer/veymed //VM FAKS
+ ),
+ prob(5);list(
+ /obj/random/internal_organ,
+ /obj/random/internal_organ,
+ /obj/random/internal_organ,
+ /obj/random/internal_organ,
+ /obj/structure/closet/crate/freezer/veymed //VM ORGANSES
),
prob(10);list(
/obj/random/tech_supply/nofail,
@@ -854,7 +861,7 @@
/obj/random/medical/pillbottle,
/obj/random/medical/lite,
/obj/random/medical/lite,
- /obj/structure/closet/crate/zenghu //ZENGHU GRABBAG
+ /obj/structure/closet/crate/freezer/zenghu //ZENGHU GRABBAG
),
prob(10);list(
/obj/random/medical/pillbottle,
@@ -863,7 +870,7 @@
/obj/random/medical/pillbottle,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/random/unidentified_medicine/fresh_medicine,
- /obj/structure/closet/crate/zenghu //ZENGHU PILLS
+ /obj/structure/closet/crate/freezer/zenghu //ZENGHU PILLS
),
prob(10);list(
/obj/item/device/toner,
@@ -1099,7 +1106,7 @@
/obj/random/medical,
/obj/random/medical/lite,
/obj/random/medical/lite,
- /obj/structure/closet/crate/veymed //VM GRABBAG
+ /obj/structure/closet/crate/freezer/veymed //VM GRABBAG
),
prob(10);list(
/obj/random/firstaid,
@@ -1108,7 +1115,14 @@
/obj/random/firstaid,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/random/unidentified_medicine/fresh_medicine,
- /obj/structure/closet/crate/veymed //VM FAKS
+ /obj/structure/closet/crate/freezer/veymed //VM FAKS
+ ),
+ prob(5);list(
+ /obj/random/internal_organ,
+ /obj/random/internal_organ,
+ /obj/random/internal_organ,
+ /obj/random/internal_organ,
+ /obj/structure/closet/crate/freezer/veymed //VM ORGANSES
),
prob(10);list(
/obj/random/tech_supply/nofail,
@@ -1125,7 +1139,7 @@
/obj/random/medical/pillbottle,
/obj/random/medical/lite,
/obj/random/medical/lite,
- /obj/structure/closet/crate/zenghu //ZENGHU GRABBAG
+ /obj/structure/closet/crate/freezer/zenghu //ZENGHU GRABBAG
),
prob(10);list(
/obj/random/medical/pillbottle,
@@ -1134,7 +1148,7 @@
/obj/random/medical/pillbottle,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/random/unidentified_medicine/fresh_medicine,
- /obj/structure/closet/crate/zenghu //ZENGHU PILLS
+ /obj/structure/closet/crate/freezer/zenghu //ZENGHU PILLS
),
prob(10);list(
/obj/item/device/toner,
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 546af717c8..d7ea5873be 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -748,8 +748,13 @@
/obj/item/toy/plushie/nukeplushie,
/obj/item/toy/plushie/otter,
/obj/item/toy/plushie/vox,
- /obj/item/toy/plushie/borgplushie/drakiesec,
- /obj/item/toy/plushie/borgplushie/drakiemed,
+ pick(list(/obj/item/toy/plushie/borgplushie/drake/sec,
+ /obj/item/toy/plushie/borgplushie/drake/med,
+ /obj/item/toy/plushie/borgplushie/drake/sci,
+ /obj/item/toy/plushie/borgplushie/drake/jani,
+ /obj/item/toy/plushie/borgplushie/drake/eng,
+ /obj/item/toy/plushie/borgplushie/drake/mine,
+ /obj/item/toy/plushie/borgplushie/drake/trauma)))
//VOREStation Add End
//YawnWider Add Start
/obj/item/toy/plushie/teshari/_yw,
diff --git a/code/game/objects/random/misc_vr.dm b/code/game/objects/random/misc_vr.dm
index 3f2644348d..c6c2ec106b 100644
--- a/code/game/objects/random/misc_vr.dm
+++ b/code/game/objects/random/misc_vr.dm
@@ -216,3 +216,22 @@
prob(5);/obj/item/instrument/glockenspiel,
prob(1);/obj/item/instrument/musicalmoth
)
+
+/obj/random/internal_organ
+ name = "random organ"
+ desc = "A random internal organ. Juicy fresh! Or... maybe not."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "heart"
+ spawn_nothing_percentage = 10
+
+/obj/random/internal_organ/item_to_spawn()
+ return pick(prob(5);/obj/item/organ/internal/appendix,
+ prob(5);/obj/item/organ/internal/eyes,
+ prob(5);/obj/item/organ/internal/heart,
+ prob(5);/obj/item/organ/internal/kidneys,
+ prob(5);/obj/item/organ/internal/liver,
+ prob(5);/obj/item/organ/internal/spleen,
+ prob(5);/obj/item/organ/internal/lungs,
+ prob(5);/obj/item/organ/internal/stomach,
+ prob(5);/obj/item/organ/internal/voicebox,
+ )
diff --git a/code/game/objects/random/mob_vr.dm b/code/game/objects/random/mob_vr.dm
index b153ce360b..d32f365dc8 100644
--- a/code/game/objects/random/mob_vr.dm
+++ b/code/game/objects/random/mob_vr.dm
@@ -249,4 +249,58 @@
prob(2);/obj/random/multiple/minevault,
prob(1);/obj/random/coin,
prob(1);/obj/random/drinkbottle,
- prob(1);/obj/random/tool/alien)
\ No newline at end of file
+ prob(1);/obj/random/tool/alien)
+
+//Scug spawner for the picnic!
+/obj/random/mob/wildscugs
+ name = "Random catslug spawner"
+ desc = "Spawns catslugs with random colours!"
+ icon_state = "vore"
+ mob_faction = "vore"
+ spawn_nothing_percentage = 25
+ mob_wander_distance = 4
+ mob_wander = 1
+ mob_returns_home = 1
+ var/newname = null
+ var/newdesc = null
+
+
+/obj/random/mob/wildscugs/item_to_spawn()
+ return pick(prob(99); /mob/living/simple_mob/vore/alienanimals/catslug,
+ prob(1); /mob/living/simple_mob/vore/alienanimals/catslug/suslug/color) //A super rare surprise
+
+/obj/random/mob/wildscugs/spawn_item()
+ var/build_path = item_to_spawn()
+
+ var/mob/living/simple_mob/M = new build_path(src.loc)
+ if(!istype(M))
+ return
+ if(M.has_AI())
+ var/datum/ai_holder/AI = M.ai_holder
+ AI.go_sleep() //Don't fight eachother while we're still setting up!
+ AI.returns_home = mob_returns_home
+ AI.wander = mob_wander
+ AI.max_home_distance = mob_wander_distance
+ if(overwrite_hostility)
+ AI.hostile = mob_hostile
+ AI.retaliate = mob_retaliate
+ AI.go_wake() //Now you can kill eachother if your faction didn't override.
+
+ if(pixel_x || pixel_y)
+ M.pixel_x = pixel_x
+ M.pixel_y = pixel_y
+
+ if(mob_faction)
+ M.faction = mob_faction
+
+ M.color = pick(COLOR_WHITE, COLOR_RED, COLOR_PURPLE, COLOR_YELLOW, COLOR_CYAN_BLUE, COLOR_RED_GRAY, COLOR_BEIGE, COLOR_PINK, COLOR_BLACK)
+ if(newname)
+ if(islist(newname))
+ M.name = pick(newname)
+ else
+ M.name = newname
+ if(newdesc)
+ if(islist(newdesc))
+ M.desc = pick(newdesc)
+ else
+ M.desc = newdesc
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index 9bcd59b39f..e3faa052f0 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -248,7 +248,7 @@
framed_offset_y = 6
/obj/item/canvas/twentyfour_twentyfour
- name = "ai universal standard canvas"
+ //name = "ai universal standard canvas" // Uncomment this when AI can actually
//desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up." // Not yet
icon_state = "24x24"
width = 24
diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm
index 454a070cfe..cf196ddf0a 100644
--- a/code/game/objects/structures/crates_lockers/__closets.dm
+++ b/code/game/objects/structures/crates_lockers/__closets.dm
@@ -397,6 +397,13 @@
if(ishuman(usr) || isrobot(usr))
add_fingerprint(usr)
toggle(usr)
+ else if(isanimal(usr)) //VOREStation Addition Start
+ var/mob/living/simple_mob/s = usr
+ if(s.has_hands)
+ add_fingerprint(usr)
+ toggle(usr)
+ else
+ to_chat(usr, "This mob type can't use this verb.") //VOREStation Addition End
else
to_chat(usr, "This mob type can't use this verb.")
diff --git a/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm b/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm
index c64593078f..b967465ac9 100644
--- a/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm
+++ b/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm
@@ -809,6 +809,19 @@
"nano" = COLOR_OFF_WHITE
)
+/decl/closet_appearance/crate/freezer/veymed
+ color = COLOR_BABY_BLUE
+ extra_decals = list(
+ "lid_stripes" = COLOR_RED,
+ "crate_cross" = COLOR_GREEN
+ )
+
+/decl/closet_appearance/crate/freezer/zenghu
+ color = COLOR_BABY_BLUE
+ extra_decals = list(
+ "zenghu" = COLOR_OFF_WHITE
+ )
+
// Corporate Branding
/decl/closet_appearance/crate/aether
@@ -1444,7 +1457,7 @@
"stripes" = COLOR_OFF_WHITE,
"glass" = COLOR_WHITE
)
-
+
/decl/closet_appearance/wall_double/survival
color = COLOR_CYAN_BLUE
decals = null
@@ -1452,6 +1465,119 @@
"stripe_outer" = COLOR_WHITE
)
+/decl/closet_appearance/wall_double/emergency_engi
+ color = COLOR_YELLOW_GRAY
+ decals = null
+ extra_decals = list(
+ "stripe_inner" = COLOR_ORANGE,
+ "stripe_outer" = COLOR_OFF_WHITE,
+ "glass" = COLOR_WHITE
+ )
+
+/decl/closet_appearance/wall_double/security
+ color = COLOR_NT_RED
+ decals = null
+ extra_decals = list(
+ "vertical_stripe_left_l" = COLOR_WARM_YELLOW,
+ "vertical_stripe_left_m" = COLOR_WARM_YELLOW
+ )
+
+/decl/closet_appearance/wall_double/cargo
+ color = COLOR_WARM_YELLOW
+
+/decl/closet_appearance/wall_double/gaming
+ color = COLOR_DARK_BLUE_GRAY
+ decals = null
+ extra_decals = list(
+ "stripe_outer" = COLOR_PALE_PINK,
+ "glass" = COLOR_WHITE
+ )
+
+/decl/closet_appearance/wall_double/science
+ decals = list(
+ "holes"
+ )
+ color = COLOR_OFF_WHITE
+ extra_decals = list(
+ "stripe_inner_lower" = COLOR_PURPLE,
+ "stripe_inner_middle" = COLOR_PURPLE
+ )
+
+/decl/closet_appearance/wall_double/command
+ decals = list(
+ "holes_right"
+ )
+ color = COLOR_BLUE_GRAY
+ extra_decals = list(
+ "vertical_stripe_left_l" = COLOR_GOLD,
+ "vertical_stripe_left_m" = COLOR_GOLD,
+ "vertical_stripe_left_r" = COLOR_GOLD
+ )
+
+/decl/closet_appearance/wall_double/ce
+ decals = list(
+ "holes_right"
+ )
+ color = COLOR_OFF_WHITE
+ extra_decals = list(
+ "vertical_stripe_left_l" = COLOR_DARK_GOLD,
+ "vertical_stripe_left_m" = COLOR_DARK_GOLD,
+ "vertical_stripe_left_r" = COLOR_DARK_GOLD
+ )
+
+/decl/closet_appearance/wall_double/rd
+ decals = list(
+ "holes_right"
+ )
+ color = COLOR_OFF_WHITE
+ extra_decals = list(
+ "vertical_stripe_left_l" = COLOR_PURPLE,
+ "vertical_stripe_left_m" = COLOR_GOLD,
+ "vertical_stripe_left_r" = COLOR_PURPLE
+ )
+
+/decl/closet_appearance/wall_double/cmo
+ decals = list(
+ "holes_right"
+ )
+ color = COLOR_BABY_BLUE
+ extra_decals = list(
+ "vertical_stripe_left_l" = COLOR_GOLD,
+ "vertical_stripe_left_m" = COLOR_GOLD,
+ "vertical_stripe_left_r" = COLOR_GOLD
+ )
+
+/decl/closet_appearance/wall_double/hos
+ decals = list(
+ "holes_right"
+ )
+ color = COLOR_NT_RED
+ extra_decals = list(
+ "vertical_stripe_left_l" = COLOR_GOLD,
+ "vertical_stripe_left_m" = COLOR_WARM_YELLOW,
+ "vertical_stripe_left_r" = COLOR_GOLD
+ )
+
+/decl/closet_appearance/wall_double/iaa
+ decals = list(
+ "holes_right"
+ )
+ color = COLOR_DARK_BLUE_GRAY
+ extra_decals = list(
+ "vertical_stripe_left_l" = COLOR_GOLD,
+ "vertical_stripe_left_m" = COLOR_GOLD,
+ "vertical_stripe_left_r" = COLOR_GOLD
+ )
+
+/decl/closet_appearance/wall_double/engineering
+ decals = list(
+ "holes"
+ )
+ color = COLOR_YELLOW_GRAY
+
+/decl/closet_appearance/wall_double/generic_civ
+ color = COLOR_DARK_BLUE_GRAY
+
// Carts
/decl/closet_appearance/cart
color = COLOR_GRAY20
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index c83dbe0f1a..8fc75b1c8a 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -196,6 +196,7 @@
/obj/structure/closet/hydrant //wall mounted fire closet
name = "fire-safety closet"
desc = "It's a storage unit for fire-fighting supplies."
+ icon = 'icons/obj/closets/bases/wall.dmi'
closet_appearance = /decl/closet_appearance/wall/hydrant
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
@@ -218,7 +219,10 @@
/obj/structure/closet/medical_wall //wall mounted medical closet
name = "first-aid closet"
desc = "It's wall-mounted storage unit for first aid supplies."
+ icon = 'icons/obj/closets/bases/wall.dmi'
closet_appearance = /decl/closet_appearance/wall/medical
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
anchored = TRUE
density = FALSE
wall_mounted = 1
diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm
index f1949dfeb5..1f0f0f6956 100644
--- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm
+++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm
@@ -3,7 +3,7 @@
/obj/structure/closet/walllocker
desc = "A wall mounted storage locker."
- name = "Wall Locker"
+ name = "wall locker"
icon = 'icons/obj/closets/bases/wall.dmi'
closet_appearance = /decl/closet_appearance/wall
density = FALSE
@@ -85,7 +85,7 @@
//double-size "cabinet" lockers, from Killian
/obj/structure/closet/walllocker_double
desc = "A wall mounted storage cabinet."
- name = "Wall Cabinet"
+ name = "wall cabinet"
icon = 'icons/obj/closets/bases/wall_double.dmi'
closet_appearance = /decl/closet_appearance/wall_double
density = FALSE
@@ -116,7 +116,7 @@
/obj/structure/closet/walllocker_double/kitchen
desc = "A wall mounted storage cabinet, for the kitchen. Now where's the flour gone..?"
- name = "Kitchen Cabinet"
+ name = "kitchen cabinet"
icon = 'icons/obj/closets/bases/wall_double.dmi'
closet_appearance = /decl/closet_appearance/wall_double/kitchen
density = FALSE
@@ -139,7 +139,7 @@
dir = EAST
/obj/structure/closet/walllocker_double/medical
- name = "Medical Cabinet"
+ name = "medical cabinet"
desc = "A wall mounted medical supply cabinet. Probably full of drugs!" //not actually full of drugs, sorry!
closet_appearance = /decl/closet_appearance/wall_double/medical
@@ -159,12 +159,37 @@
pixel_x = 32
dir = EAST
+/obj/structure/closet/walllocker_double/emergency_engi
+ name = "emergency supplies cabinet"
+ desc = "A wall mounted cabinet. Seemingly has cool stuff for 'emergency use only'."
+ closet_appearance = /decl/closet_appearance/wall_double/emergency_engi
+
+ starts_with = list(
+ /obj/item/clothing/mask/breath = 2,
+ /obj/item/weapon/tank/emergency/oxygen/engi = 2,
+ /obj/item/weapon/storage/briefcase/inflatable,
+ /obj/item/device/radio = 3)
+
+/obj/structure/closet/walllocker_double/emergency_engi/north
+ pixel_y = 32
+ dir = SOUTH
+
+/obj/structure/closet/walllocker_double/emergency_engi/south
+ pixel_y = -32
+ dir = NORTH
+
+/obj/structure/closet/walllocker_double/emergency_engi/west
+ pixel_x = -32
+ dir = WEST
+
+/obj/structure/closet/walllocker_double/emergency_engi/east
+ pixel_x = 32
+ dir = EAST
+
/obj/structure/closet/walllocker_double/hydrant
name = "fire-safety closet"
desc = "It's a storage cabinet packed with fire-fighting supplies."
closet_appearance = /decl/closet_appearance/wall_double/fire_safety
- anchored = TRUE
- density = FALSE
starts_with = list(
/obj/item/clothing/suit/fire,
@@ -192,7 +217,7 @@
/obj/structure/closet/walllocker_double/survival
desc = "A wall mounted storage cabinet. It contains a small amount of emergency supplies for wilderness survival, but they probably won't last very long."
- name = "Emergency Survival Wall Cabinet"
+ name = "emergency survival wall cabinet"
icon = 'icons/obj/closets/bases/wall_double.dmi'
closet_appearance = /decl/closet_appearance/wall_double/survival
density = FALSE
@@ -228,5 +253,159 @@
dir = WEST
/obj/structure/closet/walllocker_double/survival/east
+ pixel_x = 32
+ dir = EAST
+
+/obj/structure/closet/walllocker_double/security
+ name = "security cabinet"
+ desc = "A wall mounted cabinet. This one is suspiciously red."
+ closet_appearance = /decl/closet_appearance/wall_double/security
+
+/obj/structure/closet/walllocker_double/security/north
+ pixel_y = 32
+ dir = SOUTH
+
+/obj/structure/closet/walllocker_double/security/south
+ pixel_y = -32
+ dir = NORTH
+
+/obj/structure/closet/walllocker_double/security/west
+ pixel_x = -32
+ dir = WEST
+
+/obj/structure/closet/walllocker_double/security/east
+ pixel_x = 32
+ dir = EAST
+
+/obj/structure/closet/walllocker_double/misc_civ
+ closet_appearance = /decl/closet_appearance/wall_double/gaming
+
+/obj/structure/closet/walllocker_double/misc_civ/north
+ pixel_y = 32
+ dir = SOUTH
+
+/obj/structure/closet/walllocker_double/misc_civ/south
+ pixel_y = -32
+ dir = NORTH
+
+/obj/structure/closet/walllocker_double/misc_civ/west
+ pixel_x = -32
+ dir = WEST
+
+/obj/structure/closet/walllocker_double/misc_civ/east
+ pixel_x = 32
+ dir = EAST
+
+/obj/structure/closet/walllocker_double/generic_civ
+ closet_appearance = /decl/closet_appearance/wall_double/generic_civ
+
+/obj/structure/closet/walllocker_double/generic_civ/north
+ pixel_y = 32
+ dir = SOUTH
+
+/obj/structure/closet/walllocker_double/generic_civ/south
+ pixel_y = -32
+ dir = NORTH
+
+/obj/structure/closet/walllocker_double/generic_civ/west
+ pixel_x = -32
+ dir = WEST
+
+/obj/structure/closet/walllocker_double/generic_civ/east
+ pixel_x = 32
+ dir = EAST
+
+/obj/structure/closet/walllocker_double/cargo
+ desc = "A wall mounted cabinet. This one is in cargo colors."
+ closet_appearance = /decl/closet_appearance/wall_double/cargo
+
+/obj/structure/closet/walllocker_double/cargo/north
+ pixel_y = 32
+ dir = SOUTH
+
+/obj/structure/closet/walllocker_double/cargo/south
+ pixel_y = -32
+ dir = NORTH
+
+/obj/structure/closet/walllocker_double/cargo/west
+ pixel_x = -32
+ dir = WEST
+
+/obj/structure/closet/walllocker_double/cargo/east
+ pixel_x = 32
+ dir = EAST
+
+/obj/structure/closet/walllocker_double/science
+ desc = "A wall mounted cabinet. This one is in research colors."
+ closet_appearance = /decl/closet_appearance/wall_double/science
+
+/obj/structure/closet/walllocker_double/science/north
+ pixel_y = 32
+ dir = SOUTH
+
+/obj/structure/closet/walllocker_double/science/south
+ pixel_y = -32
+ dir = NORTH
+
+/obj/structure/closet/walllocker_double/science/west
+ pixel_x = -32
+ dir = WEST
+
+/obj/structure/closet/walllocker_double/science/east
+ pixel_x = 32
+ dir = EAST
+
+/obj/structure/closet/walllocker_double/command
+ desc = "A wall mounted cabinet. This one is in command colors."
+ closet_appearance = /decl/closet_appearance/wall_double/command
+
+/obj/structure/closet/walllocker_double/command/north
+ pixel_y = 32
+ dir = SOUTH
+
+/obj/structure/closet/walllocker_double/command/south
+ pixel_y = -32
+ dir = NORTH
+
+/obj/structure/closet/walllocker_double/command/west
+ pixel_x = -32
+ dir = WEST
+
+/obj/structure/closet/walllocker_double/command/east
+ pixel_x = 32
+ dir = EAST
+
+/obj/structure/closet/walllocker_double/command/ce
+ closet_appearance = /decl/closet_appearance/wall_double/ce
+
+/obj/structure/closet/walllocker_double/command/cmo
+ closet_appearance = /decl/closet_appearance/wall_double/cmo
+
+/obj/structure/closet/walllocker_double/command/rd
+ closet_appearance = /decl/closet_appearance/wall_double/rd
+
+/obj/structure/closet/walllocker_double/command/hos
+ closet_appearance = /decl/closet_appearance/wall_double/hos
+
+/obj/structure/closet/walllocker_double/command/iaa
+ closet_appearance = /decl/closet_appearance/wall_double/iaa
+
+/obj/structure/closet/walllocker_double/engineering
+ desc = "A wall mounted cabinet. This one is in engineering colors."
+ closet_appearance = /decl/closet_appearance/wall_double/engineering
+
+/obj/structure/closet/walllocker_double/engineering/north
+ pixel_y = 32
+ dir = SOUTH
+
+/obj/structure/closet/walllocker_double/engineering/south
+ pixel_y = -32
+ dir = NORTH
+
+/obj/structure/closet/walllocker_double/engineering/west
+ pixel_x = -32
+ dir = WEST
+
+/obj/structure/closet/walllocker_double/engineering/east
pixel_x = 32
dir = EAST
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 102e4d23a1..d48958a704 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -314,6 +314,14 @@
desc = "A freezer stamped with the logo of NanoTrasen."
closet_appearance = /decl/closet_appearance/crate/freezer/nanotrasen
+/obj/structure/closet/crate/freezer/veymed
+ desc = "A freezer stamped with the logo of Vey-Medical."
+ closet_appearance = /decl/closet_appearance/crate/freezer/veymed
+
+/obj/structure/closet/crate/freezer/zenghu
+ desc = "A freezer stamped with the logo of Zeng-Hu Pharmaceuticals."
+ closet_appearance = /decl/closet_appearance/crate/freezer/zenghu
+
/obj/structure/closet/crate/freezer/return_air()
var/datum/gas_mixture/gas = (..())
if(!gas) return null
diff --git a/code/game/objects/structures/flora/flora.dm b/code/game/objects/structures/flora/flora.dm
index 2b03156385..a6850cd769 100644
--- a/code/game/objects/structures/flora/flora.dm
+++ b/code/game/objects/structures/flora/flora.dm
@@ -607,7 +607,7 @@
to forming buds, the petals of which secrete the luminescent sap containing the pollen at the time of blooming. Certain \
horticulturists have found ways of halting this process prior to the secretion of the sap, leaving the flower's petals \
bright, at the cost of making that bud sterile."
- value = CATALOGUER_REWARD_HARD
+ value = CATALOGUER_REWARD_MEDIUM
/obj/structure/flora/sif/frostbelle
name = "frostbelle shrub"
diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm
index 1bcf5dd147..1842fe7a1a 100644
--- a/code/game/objects/structures/ghost_pods/event_vr.dm
+++ b/code/game/objects/structures/ghost_pods/event_vr.dm
@@ -47,7 +47,8 @@
"Nurse Giant Spider" = /mob/living/simple_mob/animal/giant_spider/nurse/eggless,
"Giant Spider Queen" = /mob/living/simple_mob/animal/giant_spider/nurse/queen/eggless,
"Weretiger" = /mob/living/simple_mob/vore/weretiger,
- "Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug
+ "Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug,
+ "Squirrel" = /mob/living/simple_mob/vore/squirrel/big
)
/obj/structure/ghost_pod/ghost_activated/maintpred/create_occupant(var/mob/M)
diff --git a/code/game/objects/structures/ghost_pods/survivor.dm b/code/game/objects/structures/ghost_pods/survivor.dm
new file mode 100644
index 0000000000..62dbc2441d
--- /dev/null
+++ b/code/game/objects/structures/ghost_pods/survivor.dm
@@ -0,0 +1,138 @@
+//Based on /manual/human but not created as a child for better control over how we create a mob.
+/obj/structure/ghost_pod/manual/survivor
+ name = "Emergency Cryopod"
+ desc = "A damaged cryopod smeared with blood. An injured body seems frozen in time within."
+ description_info = "This contains a body, which may wake at any time. The external controls\
+ seem to be functioning, though the warning lights that flash give no solace.."
+ ghost_query_type = /datum/ghost_query/shipwreck_survivor
+ var/occupant_type = "shipwreck survivor"
+
+ icon = 'icons/obj/Cryogenic2.dmi'
+ icon_state = "sleeper_1"
+ icon_state_opened = "sleeper_0"
+ density = TRUE
+
+ var/allow_appearance_change = TRUE
+ var/special_role = MODE_SURVIVOR //Set this to NULL as GM if you don't want the "survivor" stuff to fire.
+ var/list/clothing_possibilities
+
+ var/start_injured = FALSE //failsafe to prevent accidentally making a pod that deals damage when not intended
+
+ var/suffer_brute = FALSE
+ var/brute_severity = 20 //We inflict UP TO this much damage. Range is 1 to this value
+ var/brute_instances = 3 //We inflict damage this many times. Helps spread it around multiple limbs!
+
+
+ var/suffer_burn = FALSE
+ var/burn_severity = 20
+ var/burn_instances = 3
+
+ var/suffer_toxloss = FALSE
+ var/tox_severity = 20
+
+ var/suffer_oxloss = FALSE
+ var/oxy_severity = 20
+
+ var/suffer_cloneloss = FALSE
+ var/clone_severity = 5
+
+/obj/structure/ghost_pod/manual/survivor/Initialize()
+ . = ..()
+
+ handle_clothing_setup()
+
+/obj/structure/ghost_pod/manual/survivor/proc/handle_clothing_setup()
+ clothing_possibilities = list()
+
+ clothing_possibilities |= subtypesof(/obj/item/clothing/under/utility)
+ clothing_possibilities |= subtypesof(/obj/item/clothing/head/beret)
+ clothing_possibilities |= /obj/item/clothing/shoes/black
+ clothing_possibilities |= /obj/item/device/radio/headset
+
+/obj/structure/ghost_pod/manual/survivor/create_occupant(var/mob/M)
+ ..()
+ var/turf/T = get_turf(src)
+ var/mob/living/carbon/human/H = new(src)
+ if(M.mind)
+ M.mind.transfer_to(H)
+ to_chat(M, "You are a [occupant_type]!")
+ H.ckey = M.ckey
+ visible_message("As \the [src] opens, the pipes on \the [src] surge, before it grows dark.")
+ log_and_message_admins("successfully opened \a [src] and got a [occupant_type].")
+
+ var/list/uniform_options
+ var/list/shoe_options
+ var/list/head_options
+ var/list/headset_options
+
+ if(clothing_possibilities && clothing_possibilities.len)
+ for(var/path in clothing_possibilities)
+ if(ispath(path, /obj/item/clothing/under))
+ if(!uniform_options)
+ uniform_options = list()
+ uniform_options |= path
+ if(ispath(path, /obj/item/clothing/shoes))
+ if(!shoe_options)
+ shoe_options = list()
+ shoe_options |= path
+ if(ispath(path, /obj/item/clothing/head))
+ if(!head_options)
+ head_options = list()
+ head_options |= path
+ if(ispath(path, /obj/item/device/radio/headset))
+ if(!headset_options)
+ headset_options = list()
+ headset_options |= path
+
+ if(uniform_options && uniform_options.len)
+ var/newpath = pick(uniform_options)
+ var/obj/item/clothing/C = new newpath(H)
+ H.equip_to_appropriate_slot(C)
+
+ if(shoe_options && shoe_options.len)
+ var/newpath = pick(shoe_options)
+ var/obj/item/clothing/C = new newpath(H)
+ H.equip_to_appropriate_slot(C)
+
+ if(head_options && head_options.len)
+ var/newpath = pick(head_options)
+ var/obj/item/clothing/C = new newpath(H)
+ H.equip_to_appropriate_slot(C)
+
+ if(headset_options && headset_options.len)
+ var/newpath = pick(headset_options)
+ var/obj/item/C = new newpath(H)
+ H.equip_to_appropriate_slot(C)
+
+ var/newname = sanitize(tgui_input_text(H, "Your mind feels foggy, and you recall your name might be [H.real_name]. Would you like to change your name?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
+ if (newname)
+ H.real_name = newname
+
+ icon_state = icon_state_opened
+
+ H.forceMove(T)
+
+ if(special_role)
+ var/datum/antagonist/role = all_antag_types[special_role] //Explicitly NOT an antagonist.
+ if(role)
+ if(role.add_antagonist(H.mind, 1, 1, 0, 1, 1))
+ log_admin("\The [src] made [key_name(src)] into a [role.role_text].")
+
+ if(start_injured) //Doublechecking if we actually want them to be injured
+ if(suffer_brute)
+ for(var/br = 1, br < brute_instances, br++)
+ H.adjustBruteLoss(rand(1,brute_severity))
+ if(suffer_burn)
+ for(var/bu = 1, bu < burn_instances, bu++)
+ H.adjustFireLoss(rand(1,burn_severity))
+ if(suffer_oxloss)
+ H.adjustOxyLoss(rand(1,oxy_severity))
+ if(suffer_toxloss)
+ H.adjustToxLoss(rand(1,tox_severity))
+ if(suffer_cloneloss)
+ H.adjustCloneLoss(rand(1,clone_severity))
+
+ if(allow_appearance_change)
+ H.change_appearance(APPEARANCE_ALL, H, check_species_whitelist = 1)
+
+ visible_message("\The [src] [pick("gurgles", "seizes", "clangs")] before releasing \the [H]!")
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 1aeb9cdf4c..43aeed44c1 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -38,7 +38,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
to_chat(user, "There's no room in [src] for [I].")
return FALSE
- if(!user.unEquip(I, 0, src))
+ if(!user.canUnEquip(I))
to_chat(user, "[I] is stuck to your hand.")
return FALSE
@@ -83,6 +83,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
to_chat(user, "There's no room in [src] for [I].")
return FALSE
+ user.drop_from_inventory(I, src)
update_icon()
to_chat(user, "You put [I] into [src].")
return TRUE
@@ -369,7 +370,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
-//old style retardo-cart
+//old style mischievio-cart
/obj/structure/bed/chair/janicart
name = "janicart"
icon = 'icons/obj/vehicles.dmi'
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index fd861c5ad1..2a7bda2d3f 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -12,7 +12,7 @@
/obj/structure/morgue
name = "morgue"
- desc = "Used to keep bodies in untill someone fetches them."
+ desc = "A refrigerated unit used to store bodies, or for surreptitious naps."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "morgue1"
dir = EAST
diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm
index 1ce0ab46c2..968ff4b66d 100644
--- a/code/game/objects/structures/props/prop.dm
+++ b/code/game/objects/structures/props/prop.dm
@@ -39,7 +39,8 @@
/obj/structure/prop/vv_edit_var(var_name, var_value)
if(var_name == "state")
change_state(var_value)
-
+ else
+ ..()
//Misc stuff that fits no category
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index 50071efe4e..6ac0d6b502 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -22,15 +22,17 @@ FLOOR SAFES
var/maxspace = 24 //the maximum combined w_class of stuff in the safe
-/obj/structure/safe/New()
+/obj/structure/safe/Initialize()
tumbler_1_pos = rand(0, 72)
tumbler_1_open = rand(0, 72)
tumbler_2_pos = rand(0, 72)
tumbler_2_open = rand(0, 72)
+ if(. != INITIALIZE_HINT_QDEL)
+ return INITIALIZE_HINT_LATELOAD
-/obj/structure/safe/Initialize()
+/obj/structure/safe/LateInitialize()
. = ..()
for(var/obj/item/I in loc)
if(space >= maxspace)
@@ -115,7 +117,7 @@ FLOOR SAFES
if(canhear)
to_chat(user, "You hear a [pick("click", "chink", "clink")] from \the [src].")
playsound(src, 'sound/machines/click.ogg', 20, 1)
- check_unlocked(user, canhear)
+ check_unlocked(user, canhear)
updateUsrDialog()
return
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 6a43d769c9..45a1d808b3 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -256,12 +256,12 @@
/obj/structure/sign/redcross
name = "medbay"
- desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
+ desc = "An interstellar symbol of medical institutions. You'll probably get help here."
icon_state = "bluecross"
/obj/structure/sign/greencross
name = "medbay"
- desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
+ desc = "An interstellar symbol of medical institutions. You'll probably get help here."
icon_state = "bluecross2"
/obj/structure/sign/goldenplaque
@@ -817,6 +817,16 @@
desc = "A pictographic direction sign with a knife, plate, and fork, stating the level to find the nearest dining establishment on."
icon_state = "level_kitchen"
+/obj/structure/sign/directions/shuttle_bay
+ name = "\improper Shuttle Bay"
+ desc = "A direction sign, pointing out the way to the nearest shuttle bay."
+ icon_state = "direction_bay"
+
+/obj/structure/sign/levels/shuttle_bay
+ name = "\improper Shuttle Bay"
+ desc = "A direction sign, stating the level to find the nearest shuttle bay on."
+ icon_state = "level_bay"
+
/obj/structure/sign/directions/tram
name = "\improper Public Transit Station"
desc = "A direction sign, pointing out the way to the nearest public transit station."
diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm
index ea70fa44a6..4c49624d92 100644
--- a/code/game/objects/structures/simple_doors.dm
+++ b/code/game/objects/structures/simple_doors.dm
@@ -14,7 +14,7 @@
var/oreAmount = 7
var/knock_sound = 'sound/machines/door/knock_glass.ogg'
var/knock_hammer_sound = 'sound/weapons/sonic_jackhammer.ogg'
-
+
/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
TemperatureAct(exposed_temperature)
@@ -171,7 +171,7 @@
return
/obj/structure/simple_door/bullet_act(var/obj/item/projectile/Proj)
- hardness -= Proj.force/10
+ take_damage(Proj.damage/10)
CheckHardness()
/obj/structure/simple_door/take_damage(var/damage)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index b6c5885ac4..aff55b7225 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -194,7 +194,7 @@
wash(M)
process_heat(M)
for (var/atom/movable/G in src.loc)
- G.clean_blood()
+ G.clean_blood(TRUE)
else
soundloop.stop()
diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm
index cd0190c71e..cc9e2fa5c7 100644
--- a/code/game/objects/weapons.dm
+++ b/code/game/objects/weapons.dm
@@ -2,7 +2,6 @@
name = "weapon"
icon = 'icons/obj/weapons.dmi'
hitsound = "swing_hit"
- var/can_cleave = FALSE // If true, a 'cleaving' attack will occur.
var/cleaving = FALSE // Used to avoid infinite cleaving.
/obj/item/weapon/Bump(mob/M as mob)
diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm
index 0eb44576cf..2beeef160f 100644
--- a/code/game/turfs/flooring/flooring.dm
+++ b/code/game/turfs/flooring/flooring.dm
@@ -189,7 +189,7 @@ var/list/flooring_types
/decl/flooring/mud
name = "mud"
- desc = "STICKY AND WET!"
+ desc = "Wet and fragrant mud, bane of the freshly mopped floor."
icon = 'icons/turf/outdoors.dmi'
icon_base = "mud_dark"
footstep_sounds = list("human" = list(
@@ -200,7 +200,7 @@ var/list/flooring_types
/decl/flooring/asteroid
name = "coarse sand"
- desc = "Gritty and unpleasant."
+ desc = "You got a pebble in your shoe just looking at it."
icon = 'icons/turf/flooring/asteroid.dmi'
icon_base = "asteroid"
flags = TURF_REMOVE_SHOVEL | TURF_ACID_IMMUNE
@@ -213,8 +213,8 @@ var/list/flooring_types
'sound/effects/footstep/asteroid5.ogg'))
/decl/flooring/dirt
- name = "dirt"
- desc = "Gritty and unpleasant, just like dirt."
+ name = "soil"
+ desc = "Widely considered to be some of the planet's top soil."
icon = 'icons/turf/outdoors.dmi'
icon_base = "dirt-dark"
flags = TURF_REMOVE_SHOVEL
@@ -275,7 +275,7 @@ var/list/flooring_types
/decl/flooring/carpet
name = "carpet"
- desc = "Imported and comfy."
+ desc = "Lush synthetic carpeting, perfectly engineered for easy cleaning."
icon = 'icons/turf/flooring/carpet.dmi'
icon_base = "carpet"
build_type = /obj/item/stack/tile/carpet
@@ -299,7 +299,7 @@ var/list/flooring_types
build_type = /obj/item/stack/tile/carpet/blucarpet
/decl/flooring/carpet/turcarpet
- name = "tur carpet"
+ name = "turquoise carpet"
icon_base = "turcarpet"
build_type = /obj/item/stack/tile/carpet/turcarpet
@@ -309,7 +309,7 @@ var/list/flooring_types
build_type = /obj/item/stack/tile/carpet/sblucarpet
/decl/flooring/carpet/gaycarpet
- name = "clown carpet"
+ name = "pink carpet"
icon_base = "gaycarpet"
build_type = /obj/item/stack/tile/carpet/gaycarpet
@@ -391,18 +391,19 @@ var/list/flooring_types
'sound/effects/footstep/floor5.ogg'))
/decl/flooring/tiling/tech
- desc = "Scuffed from the passage of countless greyshirts."
+ desc = "Metal floor tiles with a corrugated anti-slip texture."
icon = 'icons/turf/flooring/techfloor.dmi'
icon_base = "techfloor_gray"
build_type = /obj/item/stack/tile/floor/techgrey
can_paint = null
/decl/flooring/tiling/tech/grid
+ desc = "Metal floor tiles with a barred anti-slip construction. Don't skin your knee!"
icon_base = "techfloor_grid"
build_type = /obj/item/stack/tile/floor/techgrid
/decl/flooring/tiling/new_tile
- name = "floor"
+ desc = "Metal floor tiles with a corrugated anti-slip texture."
icon_base = "tile_full"
flags = TURF_CAN_BREAK | TURF_CAN_BURN | TURF_IS_FRAGILE
build_type = null
@@ -530,8 +531,7 @@ var/list/flooring_types
'sound/effects/footstep/wood5.ogg'))
/decl/flooring/wood/sif
- name = "alien wooden floor"
- desc = "Polished alien wood planks."
+ desc = "Polished wood planks made from sivian wood."
icon = 'icons/turf/flooring/wood.dmi'
icon_base = "sifwood"
build_type = /obj/item/stack/tile/wood/sif
@@ -604,7 +604,7 @@ var/list/flooring_types
/decl/flooring/lava // Defining this in case someone DOES step on lava and survive. Somehow.
name = "lava"
- desc = "Lava. Y'know. Sets you on fire. AAAAAAAAAAA"
+ desc = "It may look inviting, but it will kill you, painfully."
icon = 'icons/turf/outdoors.dmi'
icon_base = "lava"
is_plating = TRUE
@@ -616,7 +616,7 @@ var/list/flooring_types
/decl/flooring/concrete
name = "concrete"
- desc = "A flat area of concrete flooring."
+ desc = "A flat area of poured concrete flooring."
icon = 'icons/turf/concrete.dmi'
icon_base = "concrete"
is_plating = FALSE //VOREStation edit. It's a lot cooler if it's actual tile.
diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm
index bbbac3bd76..5b96e1703b 100644
--- a/code/game/turfs/flooring/flooring_premade.dm
+++ b/code/game/turfs/flooring/flooring_premade.dm
@@ -118,6 +118,11 @@
icon_state = "wood"
initial_flooring = /decl/flooring/wood
+/turf/simulated/floor/wood/airless
+ oxygen = 0
+ nitrogen = 0
+ temperature = TCMB
+
/turf/simulated/floor/wood/broken
icon_state = "wood-broken0" // This gets changed when spawned.
@@ -271,6 +276,7 @@
/turf/simulated/floor/tiled/kafel_full
name = "floor"
+ desc = "Ceramic tile flooring."
icon_state = "kafel_full"
initial_flooring = /decl/flooring/tiling/new_tile/kafel
/turf/simulated/floor/tiled/kafel_full/white
diff --git a/code/game/turfs/flooring/seasonal.dm b/code/game/turfs/flooring/seasonal.dm
index 19eca39da1..6ebc258ebe 100644
--- a/code/game/turfs/flooring/seasonal.dm
+++ b/code/game/turfs/flooring/seasonal.dm
@@ -41,8 +41,7 @@ var/world_time_season
/obj/structure/flora/tree/jungle
)
animal_types = list(
- /mob/living/simple_mob/vore/redpanda = 40,
- /mob/living/simple_mob/vore/redpanda/fae = 2,
+ /mob/living/simple_mob/vore/redpanda = 5,
/mob/living/simple_mob/vore/sheep = 20,
/mob/living/simple_mob/vore/rabbit/black = 20,
/mob/living/simple_mob/vore/rabbit/white = 20,
@@ -50,7 +49,13 @@ var/world_time_season
/mob/living/simple_mob/vore/leopardmander = 2,
/mob/living/simple_mob/vore/horse/big = 10,
/mob/living/simple_mob/vore/bigdragon/friendly = 1,
- /mob/living/simple_mob/vore/alienanimals/dustjumper = 20
+ /mob/living/simple_mob/vore/alienanimals/dustjumper = 20,
+ /mob/living/simple_mob/vore/bee = 20,
+ /mob/living/simple_mob/vore/horse/big = 5,
+ /mob/living/simple_mob/animal/wolf = 5,
+ /mob/living/simple_mob/animal/wolf/direwolf = 1,
+ /mob/living/simple_mob/animal/wolf/direwolf/dog = 1,
+ /mob/living/simple_mob/vore/squirrel = 20
)
grass_types = list(
/obj/structure/flora/ausbushes/sparsegrass,
@@ -73,8 +78,7 @@ var/world_time_season
/obj/structure/flora/tree/jungle
)
animal_types = list(
- /mob/living/simple_mob/vore/redpanda = 40,
- /mob/living/simple_mob/vore/redpanda/fae = 2,
+ /mob/living/simple_mob/vore/redpanda = 1,
/mob/living/simple_mob/vore/sheep = 20,
/mob/living/simple_mob/vore/rabbit/black = 20,
/mob/living/simple_mob/vore/rabbit/white = 20,
@@ -82,7 +86,14 @@ var/world_time_season
/mob/living/simple_mob/vore/leopardmander = 2,
/mob/living/simple_mob/vore/horse/big = 10,
/mob/living/simple_mob/vore/bigdragon/friendly = 1,
- /mob/living/simple_mob/vore/alienanimals/dustjumper = 20
+ /mob/living/simple_mob/vore/alienanimals/dustjumper = 20,
+ /mob/living/simple_mob/vore/bee = 5,
+ /mob/living/simple_mob/vore/horse/big = 5,
+ /mob/living/simple_mob/vore/pakkun = 2,
+ /mob/living/simple_mob/vore/fennix = 1,
+ /mob/living/simple_mob/animal/wolf/direwolf/dog = 1,
+ /mob/living/simple_mob/animal/passive/bird/parrot = 1,
+ /mob/living/simple_mob/vore/squirrel = 20
)
grass_types = list(
/obj/structure/flora/ausbushes/sparsegrass,
@@ -102,7 +113,12 @@ var/world_time_season
/mob/living/simple_mob/vore/rabbit/white = 20,
/mob/living/simple_mob/vore/rabbit/brown = 20,
/mob/living/simple_mob/vore/horse/big = 10,
- /mob/living/simple_mob/vore/alienanimals/dustjumper = 20
+ /mob/living/simple_mob/vore/alienanimals/dustjumper = 20,
+ /mob/living/simple_mob/vore/horse/big = 1,
+ /mob/living/simple_mob/animal/wolf = 1,
+ /mob/living/simple_mob/animal/wolf/direwolf = 1,
+ /mob/living/simple_mob/animal/wolf/direwolf/dog = 1,
+ /mob/living/simple_mob/vore/squirrel = 20
)
grass_types = list(
/obj/structure/flora/ausbushes/sparsegrass,
@@ -121,7 +137,15 @@ var/world_time_season
animal_types = list(
/mob/living/simple_mob/vore/rabbit/white = 40,
- /mob/living/simple_mob/vore/redpanda = 10
+ /mob/living/simple_mob/vore/redpanda = 10,
+ /mob/living/simple_mob/animal/wolf = 10,
+ /mob/living/simple_mob/animal/wolf/direwolf = 1,
+ /mob/living/simple_mob/animal/wolf/direwolf/dog = 1,
+ /mob/living/simple_mob/otie/friendly = 2,
+ /mob/living/simple_mob/otie/friendly/chubby = 1,
+ /mob/living/simple_mob/otie/red/friendly = 1,
+ /mob/living/simple_mob/otie/red/chubby = 1,
+ /mob/living/simple_mob/vore/squirrel = 20
)
if(prob(snow_chance))
chill()
diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm
index 01e34e87f6..2b6f5422b4 100644
--- a/code/game/turfs/simulated/floor_attackby.dm
+++ b/code/game/turfs/simulated/floor_attackby.dm
@@ -201,7 +201,7 @@
return
if(!try_deconstruct_tile(W, user))
return
- if(flooring)
+ if(flooring && !flooring.is_plating)
return
attackby(T, user)
diff --git a/code/game/turfs/simulated/outdoors/survival_action_vr.dm b/code/game/turfs/simulated/outdoors/survival_action_vr.dm
index c7f90171c7..9f88959493 100644
--- a/code/game/turfs/simulated/outdoors/survival_action_vr.dm
+++ b/code/game/turfs/simulated/outdoors/survival_action_vr.dm
@@ -1,9 +1,12 @@
+var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
+
/turf/simulated/floor/outdoors/newdirt/attack_hand(mob/user)
if(user.pulling)
return ..()
- var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
if(!Adjacent(user))
return ..()
+ if(user.a_intent != I_HELP)
+ return ..()
if(icon_state in has_rocks)
user.visible_message("[user] loosens rocks from \the [src]...", "You loosen rocks from \the [src]...")
if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
@@ -76,4 +79,4 @@
S.pixel_y = rand(-6,6)
sticks = FALSE
else
- to_chat(user, "You don't see any loose sticks...")
\ No newline at end of file
+ to_chat(user, "You don't see any loose sticks...")
diff --git a/code/global.dm b/code/global.dm
index 6f634ebc7b..534b5d3fd8 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -173,7 +173,11 @@ var/static/list/scarySounds = list(
'sound/items/Welder2.ogg',
'sound/machines/door/old_airlock.ogg',
'sound/effects/clownstep1.ogg',
- 'sound/effects/clownstep2.ogg'
+ 'sound/effects/clownstep2.ogg',
+ 'sound/voice/teppi/roar.ogg', //VOREStation Add
+ 'sound/voice/moth/scream_moth.ogg', //VOREStation Add
+ 'sound/voice/nya.ogg', //VOREStation Add
+ 'sound/voice/succlet_shriek.ogg' //VOREStation Add
)
// Bomb cap!
diff --git a/code/global_vr.dm b/code/global_vr.dm
index 6ed3403aaf..6293c2197f 100644
--- a/code/global_vr.dm
+++ b/code/global_vr.dm
@@ -44,3 +44,18 @@ var/global/list/acceptable_fruit_types= list(
"watermelon",
"wheat",
"whitebeet")
+
+// Some "scary" sounds.
+var/static/list/scawwySownds = list(
+ 'sound/voice/ScawwySownds/a scawey sownd.ogg',
+ 'sound/voice/ScawwySownds/is that you.ogg',
+ 'sound/voice/ScawwySownds/lookit this darkness wow.ogg',
+ 'sound/voice/ScawwySownds/maint preds.ogg',
+ 'sound/voice/ScawwySownds/spooky sounds.ogg',
+ 'sound/voice/ScawwySownds/sus.ogg',
+ 'sound/voice/ScawwySownds/this is scaewy.ogg',
+ 'sound/voice/ScawwySownds/what is that behind you.ogg',
+ 'sound/voice/ScawwySownds/what you doin over dere.ogg',
+ 'sound/voice/ScawwySownds/whats up with all the trash.ogg',
+ 'sound/voice/ScawwySownds/youre afraid of the dark arent you.ogg'
+ )
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index af8799004b..dfd236c0d9 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -279,7 +279,8 @@
output += ""
- output += " | |