diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 1f7414e17f..0d72808545 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -47,6 +47,8 @@
var/radio_filter_out
var/radio_filter_in
+ var/datum/looping_sound/air_pump/soundloop
+
/obj/machinery/atmospherics/unary/vent_pump/on
use_power = 1
icon_state = "map_vent_out"
@@ -68,6 +70,10 @@
pressure_checks = 2
pressure_checks_default = 2
+/obj/machinery/atmospherics/unary/vent_pump/Initialize()
+ . = ..()
+ soundloop = new(list(src), FALSE)
+
/obj/machinery/atmospherics/unary/vent_pump/New()
..()
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP
@@ -84,6 +90,7 @@
if(initial_loc)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
+ QDEL_NULL(soundloop)
return ..()
/obj/machinery/atmospherics/unary/vent_pump/high_volume
@@ -164,11 +171,15 @@
/obj/machinery/atmospherics/unary/vent_pump/proc/can_pump()
if(stat & (NOPOWER|BROKEN))
+ soundloop.stop()
return 0
if(!use_power)
+ soundloop.stop()
return 0
if(welded)
+ soundloop.stop()
return 0
+ soundloop.start()
return 1
/obj/machinery/atmospherics/unary/vent_pump/process()
diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm
index 394fe72478..59837bbe5f 100644
--- a/code/ZAS/Airflow.dm
+++ b/code/ZAS/Airflow.dm
@@ -9,13 +9,13 @@ mob/proc/airflow_stun()
if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0
if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN))
- src << "You stay upright as the air rushes past you."
+ to_chat(src, "You stay upright as the air rushes past you.")
return 0
if(buckled)
- src << "Air suddenly rushes past you!"
+ to_chat(src, "Air suddenly rushes past you!")
return 0
if(!lying)
- src << "The sudden rush of air knocks you over!"
+ to_chat(src, "The sudden rush of air knocks you over!")
Weaken(5)
last_airflow_stun = world.time
diff --git a/code/ZAS/Diagnostic.dm b/code/ZAS/Diagnostic.dm
index 29ab678ef1..41fcdcad85 100644
--- a/code/ZAS/Diagnostic.dm
+++ b/code/ZAS/Diagnostic.dm
@@ -10,10 +10,10 @@ client/proc/ZoneTick()
var/result = air_master.Tick()
if(result)
- src << "Successfully Processed."
+ to_chat(src, "Successfully Processed.")
else
- src << "Failed to process! ([air_master.tick_progress])"
+ to_chat(src, "Failed to process! ([air_master.tick_progress])")
*/
client/proc/Zone_Info(turf/T as null|turf)
diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm
index 9f913d40c4..e12beb900f 100644
--- a/code/ZAS/Phoron.dm
+++ b/code/ZAS/Phoron.dm
@@ -102,7 +102,8 @@ obj/var/contaminated = 0
if(vsc.plc.SKIN_BURNS && (species.breath_type != "phoron"))
if(!pl_head_protected() || !pl_suit_protected())
burn_skin(0.75)
- if(prob(20)) src << "Your skin burns!"
+ if(prob(20))
+ to_chat(src, "Your skin burns!")
updatehealth()
//Burn eyes if exposed.
@@ -133,17 +134,18 @@ obj/var/contaminated = 0
if(vsc.plc.GENETIC_CORRUPTION && (species.breath_type != "phoron"))
if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION)
randmutb(src)
- src << "High levels of toxins cause you to spontaneously mutate!"
+ to_chat(src, "High levels of toxins cause you to spontaneously mutate!")
domutcheck(src,null)
/mob/living/carbon/human/proc/burn_eyes()
var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES]
if(E)
- if(prob(20)) src << "Your eyes burn!"
+ if(prob(20))
+ to_chat(src, "Your eyes burn!")
E.damage += 2.5
eye_blurry = min(eye_blurry+1.5,50)
if (prob(max(0,E.damage - 15) + 1) &&!eye_blind)
- src << "You are blinded!"
+ to_chat(src, "You are blinded!")
Blind(20)
/mob/living/carbon/human/proc/pl_head_protected()
diff --git a/code/_helpers/_global_objects_vr.dm b/code/_helpers/_global_objects_vr.dm
new file mode 100644
index 0000000000..84642cc4d1
--- /dev/null
+++ b/code/_helpers/_global_objects_vr.dm
@@ -0,0 +1 @@
+var/datum/gear_tweak/collar_tag/gear_tweak_collar_tag = new()
\ No newline at end of file
diff --git a/code/_helpers/files.dm b/code/_helpers/files.dm
index 4a7b9fa646..dd8c5dd690 100644
--- a/code/_helpers/files.dm
+++ b/code/_helpers/files.dm
@@ -39,7 +39,7 @@
var/extension = copytext(path,-4,0)
if( !fexists(path) || !(extension in valid_extensions) )
- src << "Error: browse_files(): File not found/Invalid file([path])."
+ to_chat(src, "Error: browse_files(): File not found/Invalid file([path]).")
return
return path
@@ -53,7 +53,7 @@
/client/proc/file_spam_check()
var/time_to_wait = fileaccess_timer - world.time
if(time_to_wait > 0)
- src << "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds."
+ to_chat(src, "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.")
return 1
fileaccess_timer = world.time + FTPDELAY
return 0
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 9104bc71d9..d85c33a4e5 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -358,7 +358,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
break
if(newname)
break //That's a suitable name!
- src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
+ to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.")
if(!newname) //we'll stick with the oldname then
return
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 19634bace7..6fc470cc81 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -189,7 +189,7 @@
/mob/living/UnarmedAttack(var/atom/A, var/proximity_flag)
if(!ticker)
- src << "You cannot attack people before the game has started."
+ to_chat(src, "You cannot attack people before the game has started.")
return 0
if(stat)
@@ -322,7 +322,7 @@
nutrition = max(nutrition - rand(1,5),0)
handle_regular_hud_updates()
else
- src << "You're out of energy! You need food!"
+ to_chat(src, "You're out of energy! You need food!")
// Simple helper to face what you clicked on, in case it should be needed in more than one place
/mob/proc/face_atom(var/atom/A)
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 1dcc2bc955..8d107e8f64 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -45,7 +45,7 @@
if(is_component_functioning("camera"))
aiCamera.captureimage(A, usr)
else
- src << "Your camera isn't functional."
+ to_chat(src, "Your camera isn't functional.")
return
/*
diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm
index 1fa58ff1ab..655a451e92 100644
--- a/code/_onclick/hud/ability_screen_objects.dm
+++ b/code/_onclick/hud/ability_screen_objects.dm
@@ -283,7 +283,7 @@
if(!mob)
return // Paranoid.
if(isnull(slot) || !isnum(slot))
- src << ".activate_ability requires a number as input, corrisponding to the slot you wish to use."
+ to_chat(src, ".activate_ability requires a number as input, corrisponding to the slot you wish to use.")
return // Bad input.
if(!mob.ability_master)
return // No abilities.
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index f34a68a742..d5197cb30f 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -6,9 +6,9 @@
if(!client) return
client.inquisitive_ghost = !client.inquisitive_ghost
if(client.inquisitive_ghost)
- src << "You will now examine everything you click on."
+ to_chat(src, "You will now examine everything you click on.")
else
- src << "You will no longer examine things you click on."
+ to_chat(src, "You will no longer examine things you click on.")
/mob/observer/dead/DblClickOn(var/atom/A, var/params)
if(client.buildmode)
diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm
index 5f2561c25c..ed7a1c7e2f 100644
--- a/code/_onclick/rig.dm
+++ b/code/_onclick/rig.dm
@@ -18,15 +18,15 @@
switch(hardsuit_click_mode)
if(MIDDLE_CLICK)
- src << "Hardsuit activation mode set to middle-click."
+ to_chat(src, "Hardsuit activation mode set to middle-click.")
if(ALT_CLICK)
- src << "Hardsuit activation mode set to alt-click."
+ to_chat(src, "Hardsuit activation mode set to alt-click.")
if(CTRL_CLICK)
- src << "Hardsuit activation mode set to control-click."
+ to_chat(src, "Hardsuit activation mode set to control-click.")
else
// should never get here, but just in case:
soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]")
- src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click."
+ to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.")
hardsuit_click_mode = MIDDLE_CLICK
/mob/living/MiddleClickOn(atom/A)
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index aef0fd0ac2..4dad60db89 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -35,10 +35,10 @@ client/verb/showrevinfo()
set desc = "Check the current server code revision"
if(revdata.revision)
- src << "Server revision: [revdata.branch] - [revdata.date]"
+ to_chat(src, "Server revision: [revdata.branch] - [revdata.date]")
if(config.githuburl)
- src << "[revdata.revision]"
+ to_chat(src, "[revdata.revision]")
else
src << revdata.revision
else
- src << "Revision unknown"
+ to_chat(src, "Revision unknown")
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index 8b927b3a54..599f8f4632 100644
--- a/code/datums/looping_sounds/machinery_sounds.dm
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -43,4 +43,15 @@
mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1)
mid_length = 10
end_sound = 'sound/machines/microwave/microwave-end.ogg'
- volume = 90
\ No newline at end of file
+ volume = 90
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/air_pump
+ start_sound = 'sound/machines/air_pump/airpumpstart.ogg'
+ start_length = 10
+ mid_sounds = list('sound/machines/air_pump/airpumpidle.ogg' = 1)
+ mid_length = 4
+ end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg'
+ volume = 15
+ pref_check = /datum/client_preference/air_pump_noise
\ No newline at end of file
diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm
index e8a69d2aaf..e4c27752f0 100644
--- a/code/datums/uplink/visible_weapons.dm
+++ b/code/datums/uplink/visible_weapons.dm
@@ -15,37 +15,17 @@
path = /obj/item/weapon/material/knife/tacknife/combatknife
/datum/uplink_item/item/visible_weapons/energy_sword
- name = "Energy Sword, Random"
+ name = "Energy Sword, Colorable"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword
-/datum/uplink_item/item/visible_weapons/energy_sword_blue
- name = "Energy Sword, Blue"
- item_cost = 40
- path = /obj/item/weapon/melee/energy/sword/blue
-
-/datum/uplink_item/item/visible_weapons/energy_sword_green
- name = "Energy Sword, Green"
- item_cost = 40
- path = /obj/item/weapon/melee/energy/sword/green
-
-/datum/uplink_item/item/visible_weapons/energy_sword_red
- name = "Energy Sword, Red"
- item_cost = 40
- path = /obj/item/weapon/melee/energy/sword/red
-
-/datum/uplink_item/item/visible_weapons/energy_sword_purple
- name = "Energy Sword, Purple"
- item_cost = 40
- path = /obj/item/weapon/melee/energy/sword/purple
-
/datum/uplink_item/item/visible_weapons/energy_sword_pirate
- name = "Energy Cutlass"
+ name = "Energy Cutlass, Colorable"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword/pirate
/datum/uplink_item/item/visible_weapons/energy_spear
- name = "Energy Spear"
+ name = "Energy Spear, Colorable"
item_cost = 50
path = /obj/item/weapon/melee/energy/spear
@@ -192,4 +172,4 @@
/datum/uplink_item/item/visible_weapons/xray
name = "Xray Gun"
item_cost = 85
- path = /obj/item/weapon/gun/energy/xray
\ No newline at end of file
+ path = /obj/item/weapon/gun/energy/xray
diff --git a/code/game/antagonist/antagonist_factions.dm b/code/game/antagonist/antagonist_factions.dm
index 83c9957be2..a072196c1b 100644
--- a/code/game/antagonist/antagonist_factions.dm
+++ b/code/game/antagonist/antagonist_factions.dm
@@ -14,33 +14,33 @@
return
if(faction.is_antagonist(player))
- src << "\The [player.current] already serves the [faction.faction_descriptor]."
+ to_chat(src, "\The [player.current] already serves the [faction.faction_descriptor].")
return
if(player_is_antag(player))
- src << "\The [player.current]'s loyalties seem to be elsewhere..."
+ to_chat(src, "\The [player.current]'s loyalties seem to be elsewhere...")
return
if(!faction.can_become_antag(player))
- src << "\The [player.current] cannot be \a [faction.faction_role_text]!"
+ to_chat(src, "\The [player.current] cannot be \a [faction.faction_role_text]!")
return
if(world.time < player.rev_cooldown)
- src << "You must wait five seconds between attempts."
+ to_chat(src, "You must wait five seconds between attempts.")
return
- src << "You are attempting to convert \the [player.current]..."
+ to_chat(src, "You are attempting to convert \the [player.current]...")
log_admin("[src]([src.ckey]) attempted to convert [player.current].")
message_admins("[src]([src.ckey]) attempted to convert [player.current].")
player.rev_cooldown = world.time+100
var/choice = alert(player.current,"Asked by [src]: Do you want to join the [faction.faction_descriptor]?","Join the [faction.faction_descriptor]?","No!","Yes!")
if(choice == "Yes!" && faction.add_antagonist_mind(player, 0, faction.faction_role_text, faction.faction_welcome))
- src << "\The [player.current] joins the [faction.faction_descriptor]!"
+ to_chat(src, "\The [player.current] joins the [faction.faction_descriptor]!")
return
if(choice == "No!")
player << "You reject this traitorous cause!"
- src << "\The [player.current] does not support the [faction.faction_descriptor]!"
+ to_chat(src, "\The [player.current] does not support the [faction.faction_descriptor]!")
/mob/living/proc/convert_to_loyalist(mob/M as mob in oview(src))
set name = "Convert Recidivist"
diff --git a/code/game/antagonist/antagonist_objectives.dm b/code/game/antagonist/antagonist_objectives.dm
index 5dc6c5f327..fba6467983 100644
--- a/code/game/antagonist/antagonist_objectives.dm
+++ b/code/game/antagonist/antagonist_objectives.dm
@@ -38,8 +38,8 @@
if(!mind)
return
if(!is_special_character(mind))
- src << "While you may perhaps have goals, this verb's meant to only be visible \
- to antagonists. Please make a bug report!"
+ to_chat(src, "While you may perhaps have goals, this verb's meant to only be visible \
+ to antagonists. Please make a bug report!")
return
var/new_ambitions = input(src, "Write a short sentence of what your character hopes to accomplish \
today as an antagonist. Remember that this is purely optional. It will be shown at the end of the \
@@ -49,7 +49,7 @@
new_ambitions = sanitize(new_ambitions)
mind.ambitions = new_ambitions
if(new_ambitions)
- src << "You've set your goal to be '[new_ambitions]'."
+ to_chat(src, "You've set your goal to be '[new_ambitions]'.")
else
- src << "You leave your ambitions behind."
+ to_chat(src, "You leave your ambitions behind.")
log_and_message_admins("has set their ambitions to now be: [new_ambitions].")
diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm
index feaf8857ba..6f2a7fe2e3 100644
--- a/code/game/antagonist/outsider/wizard.dm
+++ b/code/game/antagonist/outsider/wizard.dm
@@ -115,18 +115,18 @@ obj/item/clothing
/*Checks if the wizard is wearing the proper attire.
Made a proc so this is not repeated 14 (or more) times.*/
/mob/proc/wearing_wiz_garb()
- src << "Silly creature, you're not a human. Only humans can cast this spell."
+ to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.")
return 0
// Humans can wear clothes.
/mob/living/carbon/human/wearing_wiz_garb()
if(!is_wiz_garb(src.wear_suit))
- src << "I don't feel strong enough without my robe."
+ to_chat(src, "I don't feel strong enough without my robe.")
return 0
if(!is_wiz_garb(src.shoes))
- src << "I don't feel strong enough without my sandals."
+ to_chat(src, "I don't feel strong enough without my sandals.")
return 0
if(!is_wiz_garb(src.head))
- src << "I don't feel strong enough without my hat."
+ to_chat(src, "I don't feel strong enough without my hat.")
return 0
return 1
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 627b4e8b14..373aefa0d8 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -129,19 +129,19 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
return
if(src.stat > max_stat)
- src << "We are incapacitated."
+ to_chat(src, "We are incapacitated.")
return
if(changeling.absorbed_dna.len < required_dna)
- src << "We require at least [required_dna] samples of compatible DNA."
+ to_chat(src, "We require at least [required_dna] samples of compatible DNA.")
return
if(changeling.chem_charges < required_chems)
- src << "We require at least [required_chems] units of chemicals to do that!"
+ to_chat(src, "We require at least [required_chems] units of chemicals to do that!")
return
if(changeling.geneticdamage > max_genetic_damage)
- src << "Our genomes are still reassembling. We need time to recover first."
+ to_chat(src, "Our genomes are still reassembling. We need time to recover first.")
return
return changeling
@@ -204,11 +204,11 @@ turf/proc/AdjacentTurfsRangedSting()
if(M.loc == src.loc)
return 1 //target and source are in the same thing
if(!isturf(src.loc) || !isturf(M.loc))
- src << "We cannot reach \the [M] with a sting!"
+ to_chat(src, "We cannot reach \the [M] with a sting!")
return 0 //One is inside, the other is outside something.
// Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising
if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail
- src << "We cannot find a path to sting \the [M] by!"
+ to_chat(src, "We cannot find a path to sting \the [M] by!")
return 0
return 1
@@ -225,7 +225,7 @@ turf/proc/AdjacentTurfsRangedSting()
if(!T)
return
if(T.isSynthetic())
- src << "We are unable to pierce the outer shell of [T]."
+ to_chat(src, "We are unable to pierce the outer shell of [T].")
return
if(!(T in view(changeling.sting_range))) return
if(!sting_can_reach(T, changeling.sting_range)) return
@@ -236,7 +236,7 @@ turf/proc/AdjacentTurfsRangedSting()
src.verbs -= verb_path
spawn(10) src.verbs += verb_path
- src << "We stealthily sting [T]."
+ to_chat(src, "We stealthily sting [T].")
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
T << "You feel a tiny prick."
return
diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm
index ef1ab650a1..f2d7b45831 100644
--- a/code/game/gamemodes/changeling/generic_equip_procs.dm
+++ b/code/game/gamemodes/changeling/generic_equip_procs.dm
@@ -32,7 +32,7 @@
return 1
if(M.head || M.wear_suit) //Make sure our slots aren't full
- src << "We require nothing to be on our head, and we cannot wear any external suits, or shoes."
+ to_chat(src, "We require nothing to be on our head, and we cannot wear any external suits, or shoes.")
return 0
var/obj/item/clothing/suit/A = new armor_type(src)
@@ -242,7 +242,7 @@
var/mob/living/carbon/human/M = src
if(M.hands_are_full()) //Make sure our hands aren't full.
- src << "Our hands are full. Drop something first."
+ to_chat(src, "Our hands are full. Drop something first.")
return 0
var/obj/item/weapon/W = new weapon_type(src)
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 45b230b00c..02285a0c7e 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -16,41 +16,41 @@
var/obj/item/weapon/grab/G = src.get_active_hand()
if(!istype(G))
- src << "We must be grabbing a creature in our active hand to absorb them."
+ to_chat(src, "We must be grabbing a creature in our active hand to absorb them.")
return
var/mob/living/carbon/human/T = G.affecting
if(!istype(T) || T.isSynthetic())
- src << "\The [T] is not compatible with our biology."
+ to_chat(src, "\The [T] is not compatible with our biology.")
return
if(T.species.flags & NO_SCAN)
- src << "We do not know how to parse this creature's DNA!"
+ to_chat(src, "We do not know how to parse this creature's DNA!")
return
if(HUSK in T.mutations) //Lings can always absorb other lings, unless someone beat them to it first.
if(!T.mind.changeling || T.mind.changeling && T.mind.changeling.geneticpoints < 0)
- src << "This creature's DNA is ruined beyond useability!"
+ to_chat(src, "This creature's DNA is ruined beyond useability!")
return
if(G.state != GRAB_KILL)
- src << "We must have a tighter grip to absorb this creature."
+ to_chat(src, "We must have a tighter grip to absorb this creature.")
return
if(changeling.isabsorbing)
- src << "We are already absorbing!"
+ to_chat(src, "We are already absorbing!")
return
changeling.isabsorbing = 1
for(var/stage = 1, stage<=3, stage++)
switch(stage)
if(1)
- src << "This creature is compatible. We must hold still..."
+ to_chat(src, "This creature is compatible. We must hold still...")
if(2)
- src << "We extend a proboscis."
+ to_chat(src, "We extend a proboscis.")
src.visible_message("[src] extends a proboscis!")
if(3)
- src << "We stab [T] with the proboscis."
+ to_chat(src, "We stab [T] with the proboscis.")
src.visible_message("[src] stabs [T] with the proboscis!")
T << "You feel a sharp stabbing pain!"
add_attack_logs(src,T,"Absorbed (changeling)")
@@ -60,11 +60,11 @@
feedback_add_details("changeling_powers","A[stage]")
if(!do_mob(src, T, 150) || G.state != GRAB_KILL)
- src << "Our absorption of [T] has been interrupted!"
+ to_chat(src, "Our absorption of [T] has been interrupted!")
changeling.isabsorbing = 0
return
- src << "We have absorbed [T]!"
+ to_chat(src, "We have absorbed [T]!")
src.visible_message("[src] sucks the fluids from [T]!")
T << "You have been absorbed by the changeling!"
if(src.nutrition < 400)
@@ -76,7 +76,7 @@
if(changeling.readapts > changeling.max_readapts)
changeling.readapts = changeling.max_readapts
- src << "We can now re-adapt, reverting our evolution so that we may start anew, if needed."
+ to_chat(src, "We can now re-adapt, reverting our evolution so that we may start anew, if needed.")
var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts, T.modifiers)
absorbDNA(newDNA)
@@ -98,7 +98,7 @@
changeling.geneticpoints += 4
changeling.max_geneticpoints += 4
- src << "We absorbed another changeling, and we grow stronger. Our genomes increase."
+ to_chat(src, "We absorbed another changeling, and we grow stronger. Our genomes increase.")
T.mind.changeling.chem_charges = 0
T.mind.changeling.geneticpoints = -1
diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm
index 947f06cee4..c05ad96e81 100644
--- a/code/game/gamemodes/changeling/powers/armblade.dm
+++ b/code/game/gamemodes/changeling/powers/armblade.dm
@@ -14,7 +14,7 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater))
- src << "We prepare an extra sharp blade."
+ to_chat(src, "We prepare an extra sharp blade.")
return 1
else
@@ -39,7 +39,7 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15))
- src << "We prepare an extra sharp claw."
+ to_chat(src, "We prepare an extra sharp claw.")
return 1
else
diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
index 3f3c1bd7ad..192f8b3874 100644
--- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
+++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
@@ -25,7 +25,7 @@
if(held_item == null)
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent,0))
- src << "We will shock others more efficently."
+ to_chat(src, "We will shock others more efficently.")
return 1
else
if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
@@ -54,7 +54,7 @@
"Our hand channels raw electricity into [G.affecting].",
"You hear sparks!")
else
- src << "Our gloves block us from shocking \the [G.affecting]."
+ to_chat(src, "Our gloves block us from shocking \the [G.affecting].")
src.mind.changeling.chem_charges -= 10
return 1
@@ -92,7 +92,7 @@
sleep(1 SECOND)
success = 1
if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals.
- src << "We are unable to affect \the [held_item]."
+ to_chat(src, "We are unable to affect \the [held_item].")
else
src.mind.changeling.chem_charges -= 10
return success
@@ -143,7 +143,7 @@
var/mob/living/carbon/C = target
if(user.mind.changeling.chem_charges < shock_cost)
- src << "We require more chemicals to electrocute [C]!"
+ to_chat(src, "We require more chemicals to electrocute [C]!")
return 0
C.electrocute_act(electrocute_amount * siemens,src,1.0,BP_TORSO)
@@ -156,7 +156,7 @@
"Our hand channels raw electricity into [C]",
"You hear sparks!")
else
- src << "Our gloves block us from shocking \the [C]."
+ to_chat(src, "Our gloves block us from shocking \the [C].")
//qdel(src) //Since we're no longer a one hit stun, we need to stick around.
user.mind.changeling.chem_charges -= shock_cost
return 1
@@ -165,7 +165,7 @@
var/mob/living/silicon/S = target
if(user.mind.changeling.chem_charges < 10)
- src << "We require more chemicals to electrocute [S]!"
+ to_chat(src, "We require more chemicals to electrocute [S]!")
return 0
S.electrocute_act(60,src,0.75) //If only they had surge protectors.
@@ -205,7 +205,7 @@
success = 1
break
if(success == 0)
- src << "We are unable to affect \the [target]."
+ to_chat(src, "We are unable to affect \the [target].")
else
qdel(src)
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/blind_sting.dm b/code/game/gamemodes/changeling/powers/blind_sting.dm
index 347881df9b..e2fede649e 100644
--- a/code/game/gamemodes/changeling/powers/blind_sting.dm
+++ b/code/game/gamemodes/changeling/powers/blind_sting.dm
@@ -21,7 +21,7 @@
var/duration = 300
if(src.mind.changeling.recursive_enhancement)
duration = duration + 150
- src << "They will be deprived of sight for longer."
+ to_chat(src, "They will be deprived of sight for longer.")
spawn(duration)
T.disabilities &= ~NEARSIGHTED
T.Blind(10)
diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm
index bc68428d89..e1a2b10cff 100644
--- a/code/game/gamemodes/changeling/powers/cryo_sting.dm
+++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm
@@ -20,12 +20,12 @@
var/inject_amount = 10
if(src.mind.changeling.recursive_enhancement)
inject_amount = inject_amount * 1.5
- src << "We inject extra chemicals."
+ to_chat(src, "We inject extra chemicals.")
if(T.reagents)
T.reagents.add_reagent("cryotoxin", inject_amount)
feedback_add_details("changeling_powers","CS")
src.verbs -= /mob/proc/changeling_cryo_sting
spawn(3 MINUTES)
- src << "Our cryogenic string is ready to be used once more."
+ to_chat(src, "Our cryogenic string is ready to be used once more.")
src.verbs |= /mob/proc/changeling_cryo_sting
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/deaf_sting.dm b/code/game/gamemodes/changeling/powers/deaf_sting.dm
index a94ad1744a..92e7a80a30 100644
--- a/code/game/gamemodes/changeling/powers/deaf_sting.dm
+++ b/code/game/gamemodes/changeling/powers/deaf_sting.dm
@@ -19,7 +19,7 @@
var/duration = 300
if(src.mind.changeling.recursive_enhancement)
duration = duration + 100
- src << "They will be unable to hear for a little longer."
+ to_chat(src, "They will be unable to hear for a little longer.")
T << "Your ears pop and begin ringing loudly!"
T.sdisabilities |= DEAF
spawn(duration) T.sdisabilities &= ~DEAF
diff --git a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
index 7853a9603e..f50460a826 100644
--- a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
+++ b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
@@ -32,7 +32,7 @@
var/type_to_give = /datum/modifier/delayed_toxin_sting
if(src.mind.changeling.recursive_enhancement)
type_to_give = /datum/modifier/delayed_toxin_sting/strong
- src << "Our toxin will be extra potent, when it strikes."
+ to_chat(src, "Our toxin will be extra potent, when it strikes.")
T.add_modifier(type_to_give, 2 MINUTES)
diff --git a/code/game/gamemodes/changeling/powers/enfeebling_string.dm b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
index 16303f7c58..81930a7ebc 100644
--- a/code/game/gamemodes/changeling/powers/enfeebling_string.dm
+++ b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
@@ -40,7 +40,7 @@
var/type_to_give = /datum/modifier/enfeeble
if(src.mind.changeling.recursive_enhancement)
type_to_give = /datum/modifier/enfeeble/strong
- src << "We make them extremely weak."
+ to_chat(src, "We make them extremely weak.")
H.add_modifier(type_to_give, 2 MINUTES)
feedback_add_details("changeling_powers","ES")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm
index 0c5d91d83b..35ce94daf0 100644
--- a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm
+++ b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm
@@ -24,15 +24,15 @@
return
if(!istype(T) || T.isSynthetic())
- src << "\The [T] is not compatible with our biology."
+ to_chat(src, "\The [T] is not compatible with our biology.")
return 0
if(T.species.flags & NO_SCAN)
- src << "We do not know how to parse this creature's DNA!"
+ to_chat(src, "We do not know how to parse this creature's DNA!")
return 0
if(HUSK in T.mutations)
- src << "This creature's DNA is ruined beyond useability!"
+ to_chat(src, "This creature's DNA is ruined beyond useability!")
return 0
add_attack_logs(src,T,"DNA extraction sting (changeling)")
diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm
index cae98164a0..3581a8d06a 100644
--- a/code/game/gamemodes/changeling/powers/fake_death.dm
+++ b/code/game/gamemodes/changeling/powers/fake_death.dm
@@ -19,7 +19,7 @@
var/mob/living/carbon/C = src
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
- src << "We have no genomes, not even our own, and cannot regenerate."
+ to_chat(src, "We have no genomes, not even our own, and cannot regenerate.")
return 0
if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No")
@@ -44,7 +44,7 @@
spawn(rand(2 MINUTES, 4 MINUTES))
//The ling will now be able to choose when to revive
src.verbs += /mob/proc/changeling_revive
- src << "We are ready to rise. Use the Revive verb when you are ready."
+ to_chat(src, "We are ready to rise. Use the Revive verb when you are ready.")
feedback_add_details("changeling_powers","FD")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm
index f7760e9ce6..ed60400517 100644
--- a/code/game/gamemodes/changeling/powers/fleshmend.dm
+++ b/code/game/gamemodes/changeling/powers/fleshmend.dm
@@ -22,10 +22,10 @@
var/heal_amount = 2
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
- src << "We will heal much faster."
+ to_chat(src, "We will heal much faster.")
spawn(0)
- src << "We begin to heal ourselves."
+ to_chat(src, "We begin to heal ourselves.")
for(var/i = 0, i<50,i++)
if(C)
C.adjustBruteLoss(-heal_amount)
@@ -35,7 +35,7 @@
src.verbs -= /mob/proc/changeling_fleshmend
spawn(50 SECONDS)
- src << "Our regeneration has slowed to normal levels."
+ to_chat(src, "Our regeneration has slowed to normal levels.")
src.verbs += /mob/proc/changeling_fleshmend
feedback_add_details("changeling_powers","FM")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm
index c8e5f11604..105de8f4f5 100644
--- a/code/game/gamemodes/changeling/powers/hivemind.dm
+++ b/code/game/gamemodes/changeling/powers/hivemind.dm
@@ -34,7 +34,7 @@ var/list/datum/dna/hivemind_bank = list()
names += DNA.name
if(names.len <= 0)
- src << "The airwaves already have all of our DNA."
+ to_chat(src, "The airwaves already have all of our DNA.")
return
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
@@ -46,7 +46,7 @@ var/list/datum/dna/hivemind_bank = list()
changeling.chem_charges -= 10
hivemind_bank += chosen_dna
- src << "We channel the DNA of [S] to the air."
+ to_chat(src, "We channel the DNA of [S] to the air.")
feedback_add_details("changeling_powers","HU")
return 1
@@ -64,7 +64,7 @@ var/list/datum/dna/hivemind_bank = list()
names[DNA.name] = DNA
if(names.len <= 0)
- src << "There's no new DNA to absorb from the air."
+ to_chat(src, "There's no new DNA to absorb from the air.")
return
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
@@ -75,6 +75,6 @@ var/list/datum/dna/hivemind_bank = list()
changeling.chem_charges -= 20
absorbDNA(chosen_dna)
- src << "We absorb the DNA of [S] from the air."
+ to_chat(src, "We absorb the DNA of [S] from the air.")
feedback_add_details("changeling_powers","HD")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/lesser_form.dm b/code/game/gamemodes/changeling/powers/lesser_form.dm
index f2742490f6..6a5cf80730 100644
--- a/code/game/gamemodes/changeling/powers/lesser_form.dm
+++ b/code/game/gamemodes/changeling/powers/lesser_form.dm
@@ -13,13 +13,13 @@
if(!changeling) return
if(src.has_brain_worms())
- src << "We cannot perform this ability at the present time!"
+ to_chat(src, "We cannot perform this ability at the present time!")
return
var/mob/living/carbon/human/H = src
if(!istype(H) || !H.species.primitive_form)
- src << "We cannot perform this ability in this form!"
+ to_chat(src, "We cannot perform this ability in this form!")
return
changeling.chem_charges--
diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm
index ae95317683..6b84c577ff 100644
--- a/code/game/gamemodes/changeling/powers/mimic_voice.dm
+++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm
@@ -19,7 +19,7 @@
if(changeling.mimicing)
changeling.mimicing = ""
- src << "We return our vocal glands to their original location."
+ to_chat(src, "We return our vocal glands to their original location.")
return
var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
@@ -28,8 +28,8 @@
changeling.mimicing = mimic_voice
- src << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active."
- src << "Use this power again to return to our original voice and reproduce chemicals again."
+ to_chat(src, "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active.")
+ to_chat(src, "Use this power again to return to our original voice and reproduce chemicals again.")
feedback_add_details("changeling_powers","MV")
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index 660434d185..30679b6ef5 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -18,7 +18,7 @@
return 0
src.mind.changeling.chem_charges -= 20
- src << "We cleanse impurities from our form."
+ to_chat(src, "We cleanse impurities from our form.")
var/mob/living/carbon/human/C = src
@@ -32,7 +32,7 @@
var/heal_amount = 5
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
- src << "We will heal much faster."
+ to_chat(src, "We will heal much faster.")
for(var/i = 0, i<10,i++)
if(C)
diff --git a/code/game/gamemodes/changeling/powers/rapid_regen.dm b/code/game/gamemodes/changeling/powers/rapid_regen.dm
index 2eb628b8f6..6d1e9ee300 100644
--- a/code/game/gamemodes/changeling/powers/rapid_regen.dm
+++ b/code/game/gamemodes/changeling/powers/rapid_regen.dm
@@ -24,7 +24,7 @@
var/healing_amount = 40
if(src.mind.changeling.recursive_enhancement)
healing_amount = C.maxHealth
- src << "We completely heal ourselves."
+ to_chat(src, "We completely heal ourselves.")
spawn(0)
C.adjustBruteLoss(-healing_amount)
C.adjustFireLoss(-healing_amount)
diff --git a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
index 9362333c57..77bab9bd99 100644
--- a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
+++ b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
@@ -15,10 +15,10 @@
if(!changeling)
return 0
if(src.mind.changeling.recursive_enhancement)
- src << "We will no longer empower our abilities."
+ to_chat(src, "We will no longer empower our abilities.")
src.mind.changeling.recursive_enhancement = 0
return 0
- src << "We empower ourselves. Our abilities will now be extra potent."
+ to_chat(src, "We empower ourselves. Our abilities will now be extra potent.")
src.mind.changeling.recursive_enhancement = 1
feedback_add_details("changeling_powers","RE")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/respec.dm b/code/game/gamemodes/changeling/powers/respec.dm
index 1387e14999..a50a41269f 100644
--- a/code/game/gamemodes/changeling/powers/respec.dm
+++ b/code/game/gamemodes/changeling/powers/respec.dm
@@ -26,6 +26,6 @@
H.remove_modifiers_of_type(/datum/modifier/endoarmor) //Revert endoarmor too.
src.make_changeling() //And give back our freebies.
- src << "We have removed our evolutions from this form, and are now ready to readapt."
+ to_chat(src, "We have removed our evolutions from this form, and are now ready to readapt.")
ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 7fe4ab232b..0648fa8ab6 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -9,7 +9,7 @@
return 0
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
- src << "You have no genomes, not even your own, and cannot revive."
+ to_chat(src, "You have no genomes, not even your own, and cannot revive.")
return 0
if(src.stat == DEAD)
diff --git a/code/game/gamemodes/changeling/powers/self_respiration.dm b/code/game/gamemodes/changeling/powers/self_respiration.dm
index 6d6228eba8..5108361669 100644
--- a/code/game/gamemodes/changeling/powers/self_respiration.dm
+++ b/code/game/gamemodes/changeling/powers/self_respiration.dm
@@ -19,13 +19,13 @@
if(istype(src,/mob/living/carbon))
var/mob/living/carbon/C = src
if(C.suiciding)
- src << "You're committing suicide, this isn't going to work."
+ to_chat(src, "You're committing suicide, this isn't going to work.")
return 0
if(C.does_not_breathe == 0)
C.does_not_breathe = 1
- src << "We stop breathing, as we no longer need to."
+ to_chat(src, "We stop breathing, as we no longer need to.")
return 1
else
C.does_not_breathe = 0
- src << "We resume breathing, as we now need to again."
+ to_chat(src, "We resume breathing, as we now need to again.")
return 0
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm
index 4989c27f87..a2b9013c5a 100644
--- a/code/game/gamemodes/changeling/powers/shriek.dm
+++ b/code/game/gamemodes/changeling/powers/shriek.dm
@@ -95,13 +95,13 @@
if(!changeling) return 0
if(is_muzzled())
- src << "Mmmf mrrfff!"
+ to_chat(src, "Mmmf mrrfff!")
return 0
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.silent)
- src << "You can't speak!"
+ to_chat(src, "You can't speak!")
return 0
if(world.time < (changeling.last_shriek + 10 SECONDS) )
@@ -125,7 +125,7 @@
range_med = range_med * 2
range_light = range_light * 2
range_long = range_long * 2
- src << "We are extra loud."
+ to_chat(src, "We are extra loud.")
src.mind.changeling.recursive_enhancement = 0
visible_message("[src] appears to shout.")
diff --git a/code/game/gamemodes/changeling/powers/silence_sting.dm b/code/game/gamemodes/changeling/powers/silence_sting.dm
index 334b0c139f..16d24c878f 100644
--- a/code/game/gamemodes/changeling/powers/silence_sting.dm
+++ b/code/game/gamemodes/changeling/powers/silence_sting.dm
@@ -19,7 +19,7 @@
var/duration = 30
if(src.mind.changeling.recursive_enhancement)
duration = duration + 10
- src << "They will be unable to cry out in fear for a little longer."
+ to_chat(src, "They will be unable to cry out in fear for a little longer.")
T.silent += duration
feedback_add_details("changeling_powers","SS")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/transform_sting.dm b/code/game/gamemodes/changeling/powers/transform_sting.dm
index 678e195e22..1f6bc7b93d 100644
--- a/code/game/gamemodes/changeling/powers/transform_sting.dm
+++ b/code/game/gamemodes/changeling/powers/transform_sting.dm
@@ -34,7 +34,7 @@
if(!T)
return 0
if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
- src << "Our sting appears ineffective against its DNA."
+ to_chat(src, "Our sting appears ineffective against its DNA.")
return 0
add_attack_logs(src,T,"Transformation sting (changeling)")
T.visible_message("[T] transforms!")
diff --git a/code/game/gamemodes/cult/cultify/mob.dm b/code/game/gamemodes/cult/cultify/mob.dm
index d78956c40a..0cadd06d6c 100644
--- a/code/game/gamemodes/cult/cultify/mob.dm
+++ b/code/game/gamemodes/cult/cultify/mob.dm
@@ -12,7 +12,7 @@
icon_state = "ghost-narsie"
overlays = 0
invisibility = 0
- src << "Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone."
+ to_chat(src, "Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.")
/mob/living/cultify()
if(iscultist(src) && client)
diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm
index 7904b5cb6c..6dc3f2d52b 100644
--- a/code/game/gamemodes/technomancer/instability.dm
+++ b/code/game/gamemodes/technomancer/instability.dm
@@ -122,13 +122,13 @@
electrocute_act(instability * 0.3, "unstable energies", 0.75)
if(1)
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
- src << "Your chassis alerts you to overheating from an unknown external force!"
+ to_chat(src, "Your chassis alerts you to overheating from an unknown external force!")
if(2)
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
- src << "Your chassis makes the sound of metal groaning!"
+ to_chat(src, "Your chassis makes the sound of metal groaning!")
if(3)
safe_blink(src, range = 6)
- src << "You're teleported against your will!"
+ to_chat(src, "You're teleported against your will!")
if(4)
emp_act(3)
@@ -141,10 +141,10 @@
emp_act(2)
if(2)
adjustFireLoss(instability * 0.3) //30 burn @ 100 instability
- src << "Your chassis alerts you to extreme overheating from an unknown external force!"
+ to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!")
if(3)
adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability
- src << "Your chassis makes the sound of metal groaning and tearing!"
+ to_chat(src, "Your chassis makes the sound of metal groaning and tearing!")
if(101 to 200) //Lethal
rng = rand(0,4)
@@ -155,10 +155,10 @@
emp_act(1)
if(2)
adjustFireLoss(instability * 0.4) //40 burn @ 100 instability
- src << "Your chassis alerts you to extreme overheating from an unknown external force!"
+ to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!")
if(3)
adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability
- src << "Your chassis makes the sound of metal groaning and tearing!"
+ to_chat(src, "Your chassis makes the sound of metal groaning and tearing!")
/mob/living/carbon/human/instability_effects()
if(instability)
@@ -190,23 +190,23 @@
if(2)
if(can_feel_pain())
apply_effect(instability * 0.3, AGONY)
- src << "You feel a sharp pain!"
+ to_chat(src, "You feel a sharp pain!")
if(3)
apply_effect(instability * 0.3, EYE_BLUR)
- src << "Your eyes start to get cloudy!"
+ to_chat(src, "Your eyes start to get cloudy!")
if(4)
electrocute_act(instability * 0.3, "unstable energies")
if(5)
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
- src << "You feel your skin burn!"
+ to_chat(src, "You feel your skin burn!")
if(6)
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
- src << "You feel a sharp pain as an unseen force harms your body!"
+ to_chat(src, "You feel a sharp pain as an unseen force harms your body!")
if(7)
adjustToxLoss(instability * 0.15) //7.5 tox @ 50 instability
if(8)
safe_blink(src, range = 6)
- src << "You're teleported against your will!"
+ to_chat(src, "You're teleported against your will!")
if(50 to 100) //Severe
rng = rand(0,8)
@@ -218,18 +218,18 @@
if(2)
if(can_feel_pain())
apply_effect(instability * 0.7, AGONY)
- src << "You feel an extremly angonizing pain from all over your body!"
+ to_chat(src, "You feel an extremly angonizing pain from all over your body!")
if(3)
apply_effect(instability * 0.5, EYE_BLUR)
- src << "Your eyes start to get cloudy!"
+ to_chat(src, "Your eyes start to get cloudy!")
if(4)
electrocute_act(instability * 0.5, "extremely unstable energies")
if(5)
fire_act()
- src << "You spontaneously combust!"
+ to_chat(src, "You spontaneously combust!")
if(6)
adjustCloneLoss(instability * 0.05) //5 cloneloss @ 100 instability
- src << "You feel your body slowly degenerate."
+ to_chat(src, "You feel your body slowly degenerate.")
if(7)
adjustToxLoss(instability * 0.25) //25 tox @ 100 instability
@@ -245,18 +245,18 @@
if(2)
if(can_feel_pain())
apply_effect(instability, AGONY)
- src << "You feel an extremly angonizing pain from all over your body!"
+ to_chat(src, "You feel an extremly angonizing pain from all over your body!")
if(3)
apply_effect(instability, EYE_BLUR)
- src << "Your eyes start to get cloudy!"
+ to_chat(src, "Your eyes start to get cloudy!")
if(4)
electrocute_act(instability, "extremely unstable energies")
if(5)
fire_act()
- src << "You spontaneously combust!"
+ to_chat(src, "You spontaneously combust!")
if(6)
adjustCloneLoss(instability * 0.10) //5 cloneloss @ 100 instability
- src << "You feel your body slowly degenerate."
+ to_chat(src, "You feel your body slowly degenerate.")
if(7)
adjustToxLoss(instability * 0.40) //40 tox @ 100 instability
diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm
index 681d29da50..adfeda58ab 100644
--- a/code/game/gamemodes/technomancer/spell_objs.dm
+++ b/code/game/gamemodes/technomancer/spell_objs.dm
@@ -292,7 +292,7 @@
if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too.
l_spell.on_combine_cast(S, src)
else //Welp
- src << "You require a free hand to use this function."
+ to_chat(src, "You require a free hand to use this function.")
return 0
if(S.run_checks())
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index d5322d5f0e..b5d42ba2f6 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -389,9 +389,6 @@ var/global/datum/controller/occupations/job_master
H << "Your current species, job or whitelist status does not permit you to spawn with [thing]!"
continue
- if(G.exploitable)
- H.amend_exploitable(G.path)
-
if(G.slot == "implant")
var/obj/item/weapon/implant/I = G.spawn_item(H)
I.invisibility = 100
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 4f6b7df94f..a1c954df00 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -47,24 +47,24 @@
loc = sanitize(loc)
if(!loc)
- src << "Must supply a location name"
+ to_chat(src, "Must supply a location name")
return
if(stored_locations.len >= max_locations)
- src << "Cannot store additional locations. Remove one first"
+ to_chat(src, "Cannot store additional locations. Remove one first")
return
if(loc in stored_locations)
- src << "There is already a stored location by this name"
+ to_chat(src, "There is already a stored location by this name")
return
var/L = src.eyeobj.getLoc()
if (InvalidPlayerTurf(get_turf(L)))
- src << "Unable to store this location"
+ to_chat(src, "Unable to store this location")
return
stored_locations[loc] = L
- src << "Location '[loc]' stored"
+ to_chat(src, "Location '[loc]' stored")
/mob/living/silicon/ai/proc/sorted_stored_locations()
return sortList(stored_locations)
@@ -75,7 +75,7 @@
set desc = "Returns to the selected camera location"
if (!(loc in stored_locations))
- src << "Location [loc] not found"
+ to_chat(src, "Location [loc] not found")
return
var/L = stored_locations[loc]
@@ -87,11 +87,11 @@
set desc = "Deletes the selected camera location"
if (!(loc in stored_locations))
- src << "Location [loc] not found"
+ to_chat(src, "Location [loc] not found")
return
stored_locations.Remove(loc)
- src << "Location [loc] removed"
+ to_chat(src, "Location [loc] removed")
// Used to allow the AI is write in mob names/camera name from the CMD line.
/datum/trackable
@@ -134,7 +134,7 @@
set desc = "Select who you would like to track."
if(src.stat == 2)
- src << "You can't follow [target_name] with cameras because you are dead!"
+ to_chat(src, "You can't follow [target_name] with cameras because you are dead!")
return
if(!target_name)
src.cameraFollow = null
@@ -147,7 +147,7 @@
if(!cameraFollow)
return
- src << "Follow camera mode [forced ? "terminated" : "ended"]."
+ to_chat(src, "Follow camera mode [forced ? "terminated" : "ended"].")
cameraFollow.tracking_cancelled()
cameraFollow = null
@@ -266,14 +266,14 @@ mob/living/proc/tracking_initiated()
mob/living/silicon/robot/tracking_initiated()
tracking_entities++
if(tracking_entities == 1 && has_zeroth_law())
- src << "Internal camera is currently being accessed."
+ to_chat(src, "Internal camera is currently being accessed.")
mob/living/proc/tracking_cancelled()
mob/living/silicon/robot/tracking_initiated()
tracking_entities--
if(!tracking_entities && has_zeroth_law())
- src << "Internal camera is no longer being accessed."
+ to_chat(src, "Internal camera is no longer being accessed.")
#undef TRACKING_POSSIBLE
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 7939514beb..a8c9492e23 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -931,7 +931,7 @@
/obj/machinery/suit_cycler/proc/finished_job()
var/turf/T = get_turf(src)
- T.audible_message("\icon[src]The [src] beeps several times.")
+ T.visible_message("\icon[src]The [src] beeps several times.")
icon_state = initial(icon_state)
active = 0
playsound(src, 'sound/machines/boobeebeep.ogg', 50)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 663230b11f..48f9e3c4f2 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -772,6 +772,7 @@
name = "Robust Softdrinks"
desc = "A softdrink vendor provided by Robust Industries, LLC."
icon_state = "Cola_Machine" //VOREStation Edit
+ icon_vend = "Cola_Machine-purchase" //VOREStation Edit
product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 10,
diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm
index 0bf7b94714..f96cd83029 100644
--- a/code/game/machinery/vending_vr.dm
+++ b/code/game/machinery/vending_vr.dm
@@ -145,4 +145,1104 @@
/obj/item/weapon/reagent_containers/blood/empty = 5)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 2)
req_log_access = access_cmo
- has_logs = 1
\ No newline at end of file
+ has_logs = 1
+
+/obj/machinery/vending/loadout
+ name = "Fingers and Toes"
+ desc = "A special vendor for gloves and shoes!"
+ product_ads = "Do you have fingers and toes? COVER THEM UP!;Show me your toes! Wait. NO DON'T! BUY NEW SHOES!;Don't leave prints, BUY SOME GLOVES!;Remember to check your shoes for micros! You don't have to let them out, but just check for them!;Fingers and Toes is not liable for micro entrapment or abuse under the feet of our patrons.!;This little piggy went WE WE WE all the way down to FINGERS AND TOES to pick up some sweet new gloves and shoes."
+ icon_state = "glovesnshoes"
+ products = list(/obj/item/clothing/gloves/evening = 5,
+ /obj/item/clothing/gloves/fingerless = 5,
+ /obj/item/clothing/gloves/black = 5,
+ /obj/item/clothing/gloves/blue = 5,
+ /obj/item/clothing/gloves/brown = 5,
+ /obj/item/clothing/gloves/color = 5,
+ /obj/item/clothing/gloves/green = 5,
+ /obj/item/clothing/gloves/grey = 5,
+ /obj/item/clothing/gloves/sterile/latex = 5,
+ /obj/item/clothing/gloves/light_brown = 5,
+ /obj/item/clothing/gloves/sterile/nitrile = 5,
+ /obj/item/clothing/gloves/orange = 5,
+ /obj/item/clothing/gloves/purple = 5,
+ /obj/item/clothing/gloves/red = 5,
+ /obj/item/clothing/gloves/fluff/siren = 5,
+ /obj/item/clothing/gloves/white = 5,
+ /obj/item/clothing/gloves/duty = 5,
+ /obj/item/clothing/shoes/athletic = 5,
+ /obj/item/clothing/shoes/boots/fluff/siren = 5,
+ /obj/item/clothing/shoes/slippers = 5,
+ /obj/item/clothing/shoes/boots/cowboy/classic = 5,
+ /obj/item/clothing/shoes/boots/cowboy = 5,
+ /obj/item/clothing/shoes/boots/duty = 5,
+ /obj/item/clothing/shoes/flats/white/color = 5,
+ /obj/item/clothing/shoes/flipflop = 5,
+ /obj/item/clothing/shoes/heels = 5,
+ /obj/item/clothing/shoes/hitops/black = 5,
+ /obj/item/clothing/shoes/hitops/blue = 5,
+ /obj/item/clothing/shoes/hitops/green = 5,
+ /obj/item/clothing/shoes/hitops/orange = 5,
+ /obj/item/clothing/shoes/hitops/purple = 5,
+ /obj/item/clothing/shoes/hitops/red = 5,
+ /obj/item/clothing/shoes/flats/white/color = 5,
+ /obj/item/clothing/shoes/hitops/yellow = 5,
+ /obj/item/clothing/shoes/boots/jackboots = 5,
+ /obj/item/clothing/shoes/boots/jungle = 5,
+ /obj/item/clothing/shoes/black/cuffs = 5,
+ /obj/item/clothing/shoes/black/cuffs/blue = 5,
+ /obj/item/clothing/shoes/black/cuffs/red = 5,
+ /obj/item/clothing/shoes/sandal = 5,
+ /obj/item/clothing/shoes/black = 5,
+ /obj/item/clothing/shoes/blue = 5,
+ /obj/item/clothing/shoes/brown = 5,
+ /obj/item/clothing/shoes/laceup = 5,
+ /obj/item/clothing/shoes/green = 5,
+ /obj/item/clothing/shoes/leather = 5,
+ /obj/item/clothing/shoes/orange = 5,
+ /obj/item/clothing/shoes/purple = 5,
+ /obj/item/clothing/shoes/red = 5,
+ /obj/item/clothing/shoes/white = 5,
+ /obj/item/clothing/shoes/yellow = 5,
+ /obj/item/clothing/shoes/skater = 5,
+ /obj/item/clothing/shoes/boots/cowboy/snakeskin = 5,
+ /obj/item/clothing/shoes/boots/jackboots/toeless = 5,
+ /obj/item/clothing/shoes/boots/workboots/toeless = 5,
+ /obj/item/clothing/shoes/boots/winter = 5,
+ /obj/item/clothing/shoes/boots/workboots = 5,
+ /obj/item/clothing/shoes/footwraps = 5)
+ prices = list(/obj/item/clothing/gloves/evening = 200,
+ /obj/item/clothing/gloves/fingerless = 200,
+ /obj/item/clothing/gloves/black = 200,
+ /obj/item/clothing/gloves/blue = 200,
+ /obj/item/clothing/gloves/brown = 200,
+ /obj/item/clothing/gloves/color = 200,
+ /obj/item/clothing/gloves/green = 200,
+ /obj/item/clothing/gloves/grey = 200,
+ /obj/item/clothing/gloves/sterile/latex = 200,
+ /obj/item/clothing/gloves/light_brown = 200,
+ /obj/item/clothing/gloves/sterile/nitrile = 200,
+ /obj/item/clothing/gloves/orange = 200,
+ /obj/item/clothing/gloves/purple = 200,
+ /obj/item/clothing/gloves/red = 200,
+ /obj/item/clothing/gloves/fluff/siren = 200,
+ /obj/item/clothing/gloves/white = 200,
+ /obj/item/clothing/gloves/duty = 200,
+ /obj/item/clothing/shoes/athletic = 100,
+ /obj/item/clothing/shoes/boots/fluff/siren = 100,
+ /obj/item/clothing/shoes/slippers = 100,
+ /obj/item/clothing/shoes/boots/cowboy/classic = 100,
+ /obj/item/clothing/shoes/boots/cowboy = 100,
+ /obj/item/clothing/shoes/boots/duty = 200,
+ /obj/item/clothing/shoes/flats/white/color = 100,
+ /obj/item/clothing/shoes/flipflop = 100,
+ /obj/item/clothing/shoes/heels = 100,
+ /obj/item/clothing/shoes/hitops/black = 100,
+ /obj/item/clothing/shoes/hitops/blue = 100,
+ /obj/item/clothing/shoes/hitops/green = 100,
+ /obj/item/clothing/shoes/hitops/orange = 100,
+ /obj/item/clothing/shoes/hitops/purple = 100,
+ /obj/item/clothing/shoes/hitops/red = 100,
+ /obj/item/clothing/shoes/flats/white/color = 100,
+ /obj/item/clothing/shoes/hitops/yellow = 100,
+ /obj/item/clothing/shoes/boots/jackboots = 100,
+ /obj/item/clothing/shoes/boots/jungle = 200,
+ /obj/item/clothing/shoes/black/cuffs = 100,
+ /obj/item/clothing/shoes/black/cuffs/blue = 100,
+ /obj/item/clothing/shoes/black/cuffs/red = 100,
+ /obj/item/clothing/shoes/sandal = 100,
+ /obj/item/clothing/shoes/black = 100,
+ /obj/item/clothing/shoes/blue = 100,
+ /obj/item/clothing/shoes/brown = 100,
+ /obj/item/clothing/shoes/laceup = 100,
+ /obj/item/clothing/shoes/green = 100,
+ /obj/item/clothing/shoes/leather = 100,
+ /obj/item/clothing/shoes/orange = 100,
+ /obj/item/clothing/shoes/purple = 100,
+ /obj/item/clothing/shoes/red = 100,
+ /obj/item/clothing/shoes/white = 100,
+ /obj/item/clothing/shoes/yellow = 100,
+ /obj/item/clothing/shoes/skater = 100,
+ /obj/item/clothing/shoes/boots/cowboy/snakeskin = 100,
+ /obj/item/clothing/shoes/boots/jackboots/toeless = 100,
+ /obj/item/clothing/shoes/boots/workboots/toeless = 100,
+ /obj/item/clothing/shoes/boots/winter = 100,
+ /obj/item/clothing/shoes/boots/workboots = 100,
+ /obj/item/clothing/shoes/footwraps = 100)
+ premium = list(/obj/item/clothing/gloves/rainbow = 1,
+ /obj/item/clothing/shoes/rainbow = 1,)
+ contraband = list(/obj/item/clothing/shoes/syndigaloshes = 1,
+ /obj/item/clothing/shoes/clown_shoes = 1)
+/obj/machinery/vending/loadout/uniform
+ name = "The Basics"
+ desc = "A vendor using compressed matter cartridges to store large amounts of basic station uniforms."
+ product_ads = "Don't get caught naked!;Pick up your uniform!;Using compressed matter cartridges and VERY ETHICAL labor practices, we bring you the uniforms you need!;No uniform? No problem!;We've got your covered!;The Basics is not responsible for being crushed under the amount of things inside our machines. DO NOT VEND IN EXCESS!!"
+ icon_state = "loadout"
+ icon_vend = "loadout-purchase"
+ vend_delay = 16
+ products = list(/obj/item/device/pda = 50,
+ /obj/item/device/radio/headset = 50,
+ /obj/item/weapon/storage/backpack/ = 10,
+ /obj/item/weapon/storage/backpack/messenger = 10,
+ /obj/item/weapon/storage/backpack/satchel = 10,
+ /obj/item/clothing/under/color = 5,
+ /obj/item/clothing/under/color/aqua = 5,
+ /obj/item/clothing/under/color/black = 5,
+ /obj/item/clothing/under/color/blackjumpskirt = 5,
+ /obj/item/clothing/under/color/blue = 5,
+ /obj/item/clothing/under/color/brown = 5,
+ /obj/item/clothing/under/color/green = 5,
+ /obj/item/clothing/under/color/grey = 5,
+ /obj/item/clothing/under/color/orange = 5,
+ /obj/item/clothing/under/color/pink = 5,
+ /obj/item/clothing/under/color/red = 5,
+ /obj/item/clothing/under/color/white = 5,
+ /obj/item/clothing/under/color/yellow = 5,
+ /obj/item/clothing/shoes/black = 20,
+ /obj/item/clothing/shoes/white = 20)
+/obj/machinery/vending/loadout/accessory
+ name = "Looty Inc."
+ desc = "A special vendor for accessories."
+ product_ads = "Want shinies? We have the shinies.;Need that special something to complete your outfit? We have what you need!;Ditch that old dull dangly something you've got and pick up one of our shinies!;Bracelets, collars, scarfs rings and more! We have the fancy things you need!;Does your pet need a collar? We don't judge! Keep them in line with one of one of ours!;Top of the line materials! 'Hand crafted' goods!"
+ icon_state = "accessory"
+ icon_vend = "accessory-purchase"
+ vend_delay = 6
+ products = list(/obj/item/clothing/accessory = 5,
+ /obj/item/clothing/accessory/armband/med/color = 10,
+ /obj/item/clothing/accessory/asymmetric = 5,
+ /obj/item/clothing/accessory/asymmetric/purple = 5,
+ /obj/item/clothing/accessory/asymmetric/green = 5,
+ /obj/item/clothing/accessory/bracelet = 5,
+ /obj/item/clothing/accessory/bracelet/material = 5,
+ /obj/item/clothing/accessory/bracelet/friendship = 5,
+ /obj/item/clothing/accessory/chaps = 5,
+ /obj/item/clothing/accessory/chaps/black = 5,
+ /obj/item/weapon/storage/briefcase/clutch = 1,
+ /obj/item/clothing/accessory/collar = 5,
+ /obj/item/clothing/accessory/collar/bell = 5,
+ /obj/item/clothing/accessory/collar/spike = 5,
+ /obj/item/clothing/accessory/collar/pink = 5,
+ /obj/item/clothing/accessory/collar/holo = 5,
+ /obj/item/clothing/accessory/collar/shock = 5,
+ /obj/item/weapon/storage/belt/fannypack = 1,
+ /obj/item/weapon/storage/belt/fannypack/white = 5,
+ /obj/item/clothing/accessory/fullcape = 5,
+ /obj/item/clothing/accessory/halfcape = 5,
+ /obj/item/clothing/accessory/hawaii = 5,
+ /obj/item/clothing/accessory/hawaii/random = 5,
+ /obj/item/clothing/accessory/locket = 5,
+ /obj/item/weapon/storage/backpack/purse = 1,
+ /obj/item/clothing/accessory/sash = 5,
+ /obj/item/clothing/accessory/scarf = 5,
+ /obj/item/clothing/accessory/scarf/red = 5,
+ /obj/item/clothing/accessory/scarf/darkblue = 5,
+ /obj/item/clothing/accessory/scarf/purple = 5,
+ /obj/item/clothing/accessory/scarf/yellow = 5,
+ /obj/item/clothing/accessory/scarf/orange = 5,
+ /obj/item/clothing/accessory/scarf/lightblue = 5,
+ /obj/item/clothing/accessory/scarf/white = 5,
+ /obj/item/clothing/accessory/scarf/black = 5,
+ /obj/item/clothing/accessory/scarf/zebra = 5,
+ /obj/item/clothing/accessory/scarf/christmas = 5,
+ /obj/item/clothing/accessory/scarf/stripedred = 5,
+ /obj/item/clothing/accessory/scarf/stripedgreen = 5,
+ /obj/item/clothing/accessory/scarf/stripedblue = 5,
+ /obj/item/clothing/accessory/jacket = 5,
+ /obj/item/clothing/accessory/jacket/checkered = 5,
+ /obj/item/clothing/accessory/jacket/burgundy = 5,
+ /obj/item/clothing/accessory/jacket/navy = 5,
+ /obj/item/clothing/accessory/jacket/charcoal = 5,
+ /obj/item/clothing/accessory/vest = 5,
+ /obj/item/clothing/accessory/sweater = 5,
+ /obj/item/clothing/accessory/sweater/pink = 5,
+ /obj/item/clothing/accessory/sweater/mint = 5,
+ /obj/item/clothing/accessory/sweater/blue = 5,
+ /obj/item/clothing/accessory/sweater/heart = 5,
+ /obj/item/clothing/accessory/sweater/nt = 5,
+ /obj/item/clothing/accessory/sweater/keyhole = 5,
+ /obj/item/clothing/accessory/sweater/winterneck = 5,
+ /obj/item/clothing/accessory/sweater/uglyxmas = 5,
+ /obj/item/clothing/accessory/sweater/flowersweater = 5,
+ /obj/item/clothing/accessory/sweater/redneck = 5,
+ /obj/item/clothing/accessory/tie = 5,
+ /obj/item/clothing/accessory/tie/horrible = 5,
+ /obj/item/clothing/accessory/tie/white = 5,
+ /obj/item/clothing/accessory/tie/navy = 5,
+ /obj/item/clothing/accessory/tie/yellow = 5,
+ /obj/item/clothing/accessory/tie/darkgreen = 5,
+ /obj/item/clothing/accessory/tie/black = 5,
+ /obj/item/clothing/accessory/tie/red_long = 5,
+ /obj/item/clothing/accessory/tie/red_clip = 5,
+ /obj/item/clothing/accessory/tie/blue_long = 5,
+ /obj/item/clothing/accessory/tie/blue_clip = 5,
+ /obj/item/clothing/accessory/tie/red = 5,
+ /obj/item/clothing/accessory/wcoat = 5,
+ /obj/item/clothing/accessory/wcoat/red = 5,
+ /obj/item/clothing/accessory/wcoat/grey = 5,
+ /obj/item/clothing/accessory/wcoat/brown = 5,
+ /obj/item/clothing/accessory/wcoat/gentleman = 5,
+ /obj/item/clothing/accessory/wcoat/swvest = 5,
+ /obj/item/clothing/accessory/wcoat/swvest/blue = 5,
+ /obj/item/clothing/accessory/wcoat/swvest/red = 5,
+ /obj/item/weapon/storage/wallet = 5,
+ /obj/item/weapon/storage/wallet/poly = 5,
+ /obj/item/weapon/storage/wallet/womens = 5,
+ /obj/item/weapon/lipstick = 5,
+ /obj/item/weapon/lipstick/purple = 5,
+ /obj/item/weapon/lipstick/jade = 5,
+ /obj/item/weapon/lipstick/black = 5,
+ /obj/item/clothing/ears/earmuffs = 5,
+ /obj/item/clothing/ears/earmuffs/headphones = 5,
+ /obj/item/clothing/ears/earring/stud = 5,
+ /obj/item/clothing/ears/earring/dangle = 5,
+ /obj/item/clothing/gloves/ring/mariner = 5,
+ /obj/item/clothing/gloves/ring/engagement = 5,
+ /obj/item/clothing/gloves/ring/seal/signet = 5,
+ /obj/item/clothing/gloves/ring/seal/mason = 5,
+ /obj/item/clothing/gloves/ring/material/plastic = 5,
+ /obj/item/clothing/gloves/ring/material/steel = 5,
+ /obj/item/clothing/gloves/ring/material/gold = 5,
+ /obj/item/clothing/glasses/eyepatch = 5,
+ /obj/item/clothing/glasses/gglasses = 5,
+ /obj/item/clothing/glasses/regular/hipster = 5,
+ /obj/item/clothing/glasses/rimless = 5,
+ /obj/item/clothing/glasses/thin = 5,
+ /obj/item/clothing/glasses/monocle = 5,
+ /obj/item/clothing/glasses/goggles = 5,
+ /obj/item/clothing/glasses/fluff/spiffygogs = 5,
+ /obj/item/clothing/glasses/fakesunglasses = 5,
+ /obj/item/clothing/glasses/fakesunglasses/aviator = 5,
+ /obj/item/clothing/mask/bandana/blue = 5,
+ /obj/item/clothing/mask/bandana/gold = 5,
+ /obj/item/clothing/mask/bandana/green = 5,
+ /obj/item/clothing/mask/bandana/red = 5,
+ /obj/item/clothing/mask/surgical = 5)
+ prices = list(/obj/item/clothing/accessory = 100,
+ /obj/item/clothing/accessory/armband/med/color = 100,
+ /obj/item/clothing/accessory/asymmetric = 100,
+ /obj/item/clothing/accessory/asymmetric/purple = 100,
+ /obj/item/clothing/accessory/asymmetric/green = 100,
+ /obj/item/clothing/accessory/bracelet = 100,
+ /obj/item/clothing/accessory/bracelet/material = 100,
+ /obj/item/clothing/accessory/bracelet/friendship = 100,
+ /obj/item/clothing/accessory/chaps = 100,
+ /obj/item/clothing/accessory/chaps/black = 100,
+ /obj/item/weapon/storage/briefcase/clutch = 100,
+ /obj/item/clothing/accessory/collar = 100,
+ /obj/item/clothing/accessory/collar/bell = 100,
+ /obj/item/clothing/accessory/collar/spike = 100,
+ /obj/item/clothing/accessory/collar/pink = 100,
+ /obj/item/clothing/accessory/collar/holo = 100,
+ /obj/item/clothing/accessory/collar/shock = 100,
+ /obj/item/weapon/storage/belt/fannypack = 100,
+ /obj/item/weapon/storage/belt/fannypack/white = 100,
+ /obj/item/clothing/accessory/fullcape = 100,
+ /obj/item/clothing/accessory/halfcape = 100,
+ /obj/item/clothing/accessory/hawaii = 100,
+ /obj/item/clothing/accessory/hawaii/random = 100,
+ /obj/item/clothing/accessory/locket = 100,
+ /obj/item/weapon/storage/backpack/purse = 100,
+ /obj/item/clothing/accessory/sash = 100,
+ /obj/item/clothing/accessory/scarf = 5,
+ /obj/item/clothing/accessory/scarf/red = 100,
+ /obj/item/clothing/accessory/scarf/darkblue = 100,
+ /obj/item/clothing/accessory/scarf/purple = 100,
+ /obj/item/clothing/accessory/scarf/yellow = 100,
+ /obj/item/clothing/accessory/scarf/orange = 100,
+ /obj/item/clothing/accessory/scarf/lightblue = 100,
+ /obj/item/clothing/accessory/scarf/white = 100,
+ /obj/item/clothing/accessory/scarf/black = 100,
+ /obj/item/clothing/accessory/scarf/zebra = 100,
+ /obj/item/clothing/accessory/scarf/christmas = 100,
+ /obj/item/clothing/accessory/scarf/stripedred = 100,
+ /obj/item/clothing/accessory/scarf/stripedgreen = 100,
+ /obj/item/clothing/accessory/scarf/stripedblue = 100,
+ /obj/item/clothing/accessory/jacket = 100,
+ /obj/item/clothing/accessory/jacket/checkered = 100,
+ /obj/item/clothing/accessory/jacket/burgundy = 100,
+ /obj/item/clothing/accessory/jacket/navy = 100,
+ /obj/item/clothing/accessory/jacket/charcoal = 100,
+ /obj/item/clothing/accessory/vest = 100,
+ /obj/item/clothing/accessory/sweater = 100,
+ /obj/item/clothing/accessory/sweater/pink = 100,
+ /obj/item/clothing/accessory/sweater/mint = 100,
+ /obj/item/clothing/accessory/sweater/blue = 100,
+ /obj/item/clothing/accessory/sweater/heart = 100,
+ /obj/item/clothing/accessory/sweater/nt = 5,
+ /obj/item/clothing/accessory/sweater/keyhole = 100,
+ /obj/item/clothing/accessory/sweater/winterneck = 100,
+ /obj/item/clothing/accessory/sweater/uglyxmas = 5,
+ /obj/item/clothing/accessory/sweater/flowersweater = 100,
+ /obj/item/clothing/accessory/sweater/redneck = 100,
+ /obj/item/clothing/accessory/tie = 100,
+ /obj/item/clothing/accessory/tie/horrible = 100,
+ /obj/item/clothing/accessory/tie/white = 100,
+ /obj/item/clothing/accessory/tie/navy = 100,
+ /obj/item/clothing/accessory/tie/yellow = 100,
+ /obj/item/clothing/accessory/tie/darkgreen = 100,
+ /obj/item/clothing/accessory/tie/black = 100,
+ /obj/item/clothing/accessory/tie/red_long = 100,
+ /obj/item/clothing/accessory/tie/red_clip = 100,
+ /obj/item/clothing/accessory/tie/blue_long = 100,
+ /obj/item/clothing/accessory/tie/blue_clip = 100,
+ /obj/item/clothing/accessory/tie/red = 100,
+ /obj/item/clothing/accessory/wcoat = 100,
+ /obj/item/clothing/accessory/wcoat/red = 100,
+ /obj/item/clothing/accessory/wcoat/grey = 100,
+ /obj/item/clothing/accessory/wcoat/brown = 100,
+ /obj/item/clothing/accessory/wcoat/gentleman = 100,
+ /obj/item/clothing/accessory/wcoat/swvest = 100,
+ /obj/item/clothing/accessory/wcoat/swvest/blue = 100,
+ /obj/item/clothing/accessory/wcoat/swvest/red = 100,
+ /obj/item/weapon/storage/wallet = 100,
+ /obj/item/weapon/storage/wallet/poly = 100,
+ /obj/item/weapon/storage/wallet/womens = 100,
+ /obj/item/weapon/lipstick = 100,
+ /obj/item/weapon/lipstick/purple = 100,
+ /obj/item/weapon/lipstick/jade = 100,
+ /obj/item/weapon/lipstick/black = 100,
+ /obj/item/clothing/ears/earmuffs = 100,
+ /obj/item/clothing/ears/earmuffs/headphones = 100,
+ /obj/item/clothing/ears/earring/stud = 100,
+ /obj/item/clothing/ears/earring/dangle = 100,
+ /obj/item/clothing/gloves/ring/mariner = 100,
+ /obj/item/clothing/gloves/ring/engagement = 100,
+ /obj/item/clothing/gloves/ring/seal/signet = 100,
+ /obj/item/clothing/gloves/ring/seal/mason = 100,
+ /obj/item/clothing/gloves/ring/material/plastic = 100,
+ /obj/item/clothing/gloves/ring/material/steel = 100,
+ /obj/item/clothing/gloves/ring/material/gold = 500,
+ /obj/item/clothing/glasses/eyepatch = 100,
+ /obj/item/clothing/glasses/gglasses = 100,
+ /obj/item/clothing/glasses/regular/hipster = 100,
+ /obj/item/clothing/glasses/rimless = 100,
+ /obj/item/clothing/glasses/thin = 100,
+ /obj/item/clothing/glasses/monocle = 100,
+ /obj/item/clothing/glasses/goggles = 100,
+ /obj/item/clothing/glasses/fluff/spiffygogs = 100,
+ /obj/item/clothing/glasses/fakesunglasses = 100,
+ /obj/item/clothing/glasses/fakesunglasses/aviator = 100,
+ /obj/item/clothing/mask/bandana/blue = 100,
+ /obj/item/clothing/mask/bandana/gold = 100,
+ /obj/item/clothing/mask/bandana/green = 100,
+ /obj/item/clothing/mask/bandana/red = 100,
+ /obj/item/clothing/mask/surgical = 200)
+ premium = list(/obj/item/weapon/bedsheet/rainbow = 1)
+ contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1)
+/obj/machinery/vending/loadout/clothing
+ name = "General Jump"
+ desc = "A special vendor using compressed matter cartridges to store large amounts of clothing."
+ product_ads = "Tired of your grey jumpsuit? Spruce yourself up!;We have the outfit for you!;Don't let that grey jumpsuit get you down, get a ROBUST outfit right now!;Using compressed matter catridges and VERY ETHICAL labor practices to bring YOU the clothing you crave!;Are you sure you want to go to work in THAT?;All of our wares have a whole TWO pockets!"
+ icon_state = "clothing"
+ icon_vend = "clothing-purchase"
+ vend_delay = 16
+ products = list(/obj/item/clothing/under/bathrobe = 5,
+ /obj/item/clothing/under/dress/black_corset = 5,
+ /obj/item/clothing/under/blazer = 5,
+ /obj/item/clothing/under/blazer/skirt = 5,
+ /obj/item/clothing/under/cheongsam = 5,
+ /obj/item/clothing/under/cheongsam/red = 5,
+ /obj/item/clothing/under/cheongsam/blue = 5,
+ /obj/item/clothing/under/cheongsam/black = 5,
+ /obj/item/clothing/under/cheongsam/darkred = 5,
+ /obj/item/clothing/under/cheongsam/green = 5,
+ /obj/item/clothing/under/cheongsam/purple = 5,
+ /obj/item/clothing/under/cheongsam/darkblue = 5,
+ /obj/item/clothing/under/croptop = 5,
+ /obj/item/clothing/under/croptop/red = 5,
+ /obj/item/clothing/under/croptop/grey = 5,
+ /obj/item/clothing/under/cuttop = 5,
+ /obj/item/clothing/under/cuttop/red = 5,
+ /obj/item/clothing/under/suit_jacket/female/skirt = 5,
+ /obj/item/clothing/under/dress/dress_fire = 5,
+ /obj/item/clothing/under/dress/flamenco = 5,
+ /obj/item/clothing/under/dress/flower_dress = 5,
+ /obj/item/clothing/under/fluff/gnshorts = 5,
+ /obj/item/clothing/under/color = 5,
+ /obj/item/clothing/under/color/aqua = 5,
+ /obj/item/clothing/under/color/black = 5,
+ /obj/item/clothing/under/color/blackf = 5,
+ /obj/item/clothing/under/color/blackjumpskirt = 5,
+ /obj/item/clothing/under/color/blue = 5,
+ /obj/item/clothing/under/color/brown = 5,
+ /obj/item/clothing/under/color/darkblue = 5,
+ /obj/item/clothing/under/color/darkred = 5,
+ /obj/item/clothing/under/color/green = 5,
+ /obj/item/clothing/under/color/grey = 5,
+ /obj/item/clothing/under/color/lightblue = 5,
+ /obj/item/clothing/under/color/lightbrown = 5,
+ /obj/item/clothing/under/color/lightgreen = 5,
+ /obj/item/clothing/under/color/lightpurple = 5,
+ /obj/item/clothing/under/color/lightred = 5,
+ /obj/item/clothing/under/color/orange = 5,
+ /obj/item/clothing/under/color/pink = 5,
+ /obj/item/clothing/under/color/prison = 5,
+ /obj/item/clothing/under/color/ranger = 5,
+ /obj/item/clothing/under/color/red = 5,
+ /obj/item/clothing/under/color/white = 5,
+ /obj/item/clothing/under/color/yellow = 5,
+ /obj/item/clothing/under/color/yellowgreen = 5,
+ /obj/item/clothing/under/aether = 5,
+ /obj/item/clothing/under/focal = 5,
+ /obj/item/clothing/under/hephaestus = 5,
+ /obj/item/clothing/under/wardt = 5,
+ /obj/item/clothing/under/kilt = 5,
+ /obj/item/clothing/under/fluff/latexmaid = 5,
+ /obj/item/clothing/under/dress/lilacdress = 5,
+ /obj/item/clothing/under/dress/white2 = 5,
+ /obj/item/clothing/under/dress/white4 = 5,
+ /obj/item/clothing/under/dress/maid = 5,
+ /obj/item/clothing/under/dress/maid/sexy = 5,
+ /obj/item/clothing/under/dress/maid/janitor = 5,
+ /obj/item/clothing/under/moderncoat = 5,
+ /obj/item/clothing/under/permit = 5,
+ /obj/item/clothing/under/oldwoman = 5,
+ /obj/item/clothing/under/frontier = 5,
+ /obj/item/clothing/under/mbill = 5,
+ /obj/item/clothing/under/pants/baggy/ = 5,
+ /obj/item/clothing/under/pants/baggy/classicjeans = 5,
+ /obj/item/clothing/under/pants/baggy/mustangjeans = 5,
+ /obj/item/clothing/under/pants/baggy/blackjeans = 5,
+ /obj/item/clothing/under/pants/baggy/greyjeans = 5,
+ /obj/item/clothing/under/pants/baggy/youngfolksjeans = 5,
+ /obj/item/clothing/under/pants/baggy/white = 5,
+ /obj/item/clothing/under/pants/baggy/red = 5,
+ /obj/item/clothing/under/pants/baggy/black = 5,
+ /obj/item/clothing/under/pants/baggy/tan = 5,
+ /obj/item/clothing/under/pants/baggy/track = 5,
+ /obj/item/clothing/under/pants/baggy/khaki = 5,
+ /obj/item/clothing/under/pants/baggy/camo = 5,
+ /obj/item/clothing/under/pants/utility/ = 5,
+ /obj/item/clothing/under/pants/utility/orange = 5,
+ /obj/item/clothing/under/pants/utility/blue = 5,
+ /obj/item/clothing/under/pants/utility/white = 5,
+ /obj/item/clothing/under/pants/utility/red = 5,
+ /obj/item/clothing/under/pants/chaps = 5,
+ /obj/item/clothing/under/pants/chaps/black = 5,
+ /obj/item/clothing/under/pants/track = 5,
+ /obj/item/clothing/under/pants/track/red = 5,
+ /obj/item/clothing/under/pants/track/white = 5,
+ /obj/item/clothing/under/pants/track/green = 5,
+ /obj/item/clothing/under/pants/track/blue = 5,
+ /obj/item/clothing/under/pants/yogapants = 5,
+ /obj/item/clothing/under/ascetic = 5,
+ /obj/item/clothing/under/dress/white3 = 5,
+ /obj/item/clothing/under/skirt/pleated = 5,
+ /obj/item/clothing/under/dress/darkred = 5,
+ /obj/item/clothing/under/dress/redeveninggown = 5,
+ /obj/item/clothing/under/dress/red_swept_dress = 5,
+ /obj/item/clothing/under/dress/sailordress = 5,
+ /obj/item/clothing/under/dress/sari = 5,
+ /obj/item/clothing/under/dress/sari/green = 5,
+ /obj/item/clothing/under/shorts/red = 5,
+ /obj/item/clothing/under/shorts/green = 5,
+ /obj/item/clothing/under/shorts/blue = 5,
+ /obj/item/clothing/under/shorts/black = 5,
+ /obj/item/clothing/under/shorts/grey = 5,
+ /obj/item/clothing/under/shorts/white = 5,
+ /obj/item/clothing/under/shorts/jeans = 5,
+ /obj/item/clothing/under/shorts/jeans/ = 5,
+ /obj/item/clothing/under/shorts/jeans/classic = 5,
+ /obj/item/clothing/under/shorts/jeans/mustang = 5,
+ /obj/item/clothing/under/shorts/jeans/youngfolks = 5,
+ /obj/item/clothing/under/shorts/jeans/black = 5,
+ /obj/item/clothing/under/shorts/jeans/grey = 5,
+ /obj/item/clothing/under/shorts/khaki/ = 5,
+ /obj/item/clothing/under/skirt/loincloth = 5,
+ /obj/item/clothing/under/skirt/khaki = 5,
+ /obj/item/clothing/under/skirt/blue = 5,
+ /obj/item/clothing/under/skirt/red = 5,
+ /obj/item/clothing/under/skirt/denim = 5,
+ /obj/item/clothing/under/skirt/pleated = 5,
+ /obj/item/clothing/under/skirt/outfit/plaid_blue = 5,
+ /obj/item/clothing/under/skirt/outfit/plaid_red = 5,
+ /obj/item/clothing/under/skirt/outfit/plaid_purple = 5,
+ /obj/item/clothing/under/overalls/sleek = 5,
+ /obj/item/clothing/under/sl_suit = 5,
+ /obj/item/clothing/under/gentlesuit = 5,
+ /obj/item/clothing/under/gentlesuit/skirt = 5,
+ /obj/item/clothing/under/suit_jacket = 5,
+ /obj/item/clothing/under/suit_jacket/really_black/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/really_black = 5,
+ /obj/item/clothing/under/suit_jacket/female/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/female/ = 5,
+ /obj/item/clothing/under/suit_jacket/red = 5,
+ /obj/item/clothing/under/suit_jacket/red/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/charcoal = 5,
+ /obj/item/clothing/under/suit_jacket/charcoal/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/navy = 5,
+ /obj/item/clothing/under/suit_jacket/navy/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/burgundy = 5,
+ /obj/item/clothing/under/suit_jacket/burgundy/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/checkered = 5,
+ /obj/item/clothing/under/suit_jacket/checkered/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/tan = 5,
+ /obj/item/clothing/under/suit_jacket/tan/skirt = 5,
+ /obj/item/clothing/under/scratch = 5,
+ /obj/item/clothing/under/scratch/skirt = 5,
+ /obj/item/clothing/under/sundress = 5,
+ /obj/item/clothing/under/sundress_white = 5,
+ /obj/item/clothing/under/rank/psych/turtleneck/sweater = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/blue = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/purple = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/green = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/red = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/white = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/earth = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/engineering = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/science = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/security = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/medical = 5,
+ /obj/item/clothing/under/utility = 5,
+ /obj/item/clothing/under/utility/grey = 5,
+ /obj/item/clothing/under/utility/blue = 5,
+ /obj/item/clothing/under/fluff/v_nanovest = 5,
+ /obj/item/clothing/under/dress/westernbustle = 5,
+ /obj/item/clothing/under/wedding/bride_white = 5,
+ /obj/item/weapon/storage/backpack/ = 5,
+ /obj/item/weapon/storage/backpack/messenger = 5,
+ /obj/item/weapon/storage/backpack/satchel = 5)
+ prices = list(/obj/item/clothing/under/bathrobe = 100,
+ /obj/item/clothing/under/dress/black_corset = 100,
+ /obj/item/clothing/under/blazer = 100,
+ /obj/item/clothing/under/blazer/skirt = 100,
+ /obj/item/clothing/under/cheongsam = 100,
+ /obj/item/clothing/under/cheongsam/red = 100,
+ /obj/item/clothing/under/cheongsam/blue = 100,
+ /obj/item/clothing/under/cheongsam/black = 100,
+ /obj/item/clothing/under/cheongsam/darkred = 100,
+ /obj/item/clothing/under/cheongsam/green = 100,
+ /obj/item/clothing/under/cheongsam/purple = 100,
+ /obj/item/clothing/under/cheongsam/darkblue = 100,
+ /obj/item/clothing/under/croptop = 100,
+ /obj/item/clothing/under/croptop/red = 100,
+ /obj/item/clothing/under/croptop/grey = 100,
+ /obj/item/clothing/under/cuttop = 100,
+ /obj/item/clothing/under/cuttop/red = 100,
+ /obj/item/clothing/under/suit_jacket/female/skirt = 100,
+ /obj/item/clothing/under/dress/dress_fire = 100,
+ /obj/item/clothing/under/dress/flamenco = 100,
+ /obj/item/clothing/under/dress/flower_dress = 100,
+ /obj/item/clothing/under/fluff/gnshorts = 100,
+ /obj/item/clothing/under/color = 100,
+ /obj/item/clothing/under/color/aqua = 100,
+ /obj/item/clothing/under/color/black = 100,
+ /obj/item/clothing/under/color/blackf = 100,
+ /obj/item/clothing/under/color/blackjumpskirt = 100,
+ /obj/item/clothing/under/color/blue = 100,
+ /obj/item/clothing/under/color/brown = 100,
+ /obj/item/clothing/under/color/darkblue = 100,
+ /obj/item/clothing/under/color/darkred = 100,
+ /obj/item/clothing/under/color/green = 100,
+ /obj/item/clothing/under/color/grey = 100,
+ /obj/item/clothing/under/color/lightblue = 100,
+ /obj/item/clothing/under/color/lightbrown = 100,
+ /obj/item/clothing/under/color/lightgreen = 100,
+ /obj/item/clothing/under/color/lightpurple = 100,
+ /obj/item/clothing/under/color/lightred = 100,
+ /obj/item/clothing/under/color/orange = 100,
+ /obj/item/clothing/under/color/pink = 100,
+ /obj/item/clothing/under/color/prison = 100,
+ /obj/item/clothing/under/color/ranger = 100,
+ /obj/item/clothing/under/color/red = 100,
+ /obj/item/clothing/under/color/white = 100,
+ /obj/item/clothing/under/color/yellow = 100,
+ /obj/item/clothing/under/color/yellowgreen = 100,
+ /obj/item/clothing/under/aether = 100,
+ /obj/item/clothing/under/focal = 100,
+ /obj/item/clothing/under/hephaestus = 100,
+ /obj/item/clothing/under/wardt = 100,
+ /obj/item/clothing/under/kilt = 100,
+ /obj/item/clothing/under/fluff/latexmaid = 100,
+ /obj/item/clothing/under/dress/lilacdress = 100,
+ /obj/item/clothing/under/dress/white2 = 100,
+ /obj/item/clothing/under/dress/white4 = 100,
+ /obj/item/clothing/under/dress/maid = 100,
+ /obj/item/clothing/under/dress/maid/sexy = 100,
+ /obj/item/clothing/under/dress/maid/janitor = 100,
+ /obj/item/clothing/under/moderncoat = 100,
+ /obj/item/clothing/under/permit = 100,
+ /obj/item/clothing/under/oldwoman = 100,
+ /obj/item/clothing/under/frontier = 100,
+ /obj/item/clothing/under/mbill = 100,
+ /obj/item/clothing/under/pants/baggy/ = 100,
+ /obj/item/clothing/under/pants/baggy/classicjeans = 100,
+ /obj/item/clothing/under/pants/baggy/mustangjeans = 100,
+ /obj/item/clothing/under/pants/baggy/blackjeans = 100,
+ /obj/item/clothing/under/pants/baggy/greyjeans = 100,
+ /obj/item/clothing/under/pants/baggy/youngfolksjeans = 100,
+ /obj/item/clothing/under/pants/baggy/white = 100,
+ /obj/item/clothing/under/pants/baggy/red = 100,
+ /obj/item/clothing/under/pants/baggy/black = 100,
+ /obj/item/clothing/under/pants/baggy/tan = 100,
+ /obj/item/clothing/under/pants/baggy/track = 100,
+ /obj/item/clothing/under/pants/baggy/khaki = 100,
+ /obj/item/clothing/under/pants/baggy/camo = 100,
+ /obj/item/clothing/under/pants/utility/ = 100,
+ /obj/item/clothing/under/pants/utility/orange = 100,
+ /obj/item/clothing/under/pants/utility/blue = 100,
+ /obj/item/clothing/under/pants/utility/white = 100,
+ /obj/item/clothing/under/pants/utility/red = 100,
+ /obj/item/clothing/under/pants/chaps = 100,
+ /obj/item/clothing/under/pants/chaps/black = 100,
+ /obj/item/clothing/under/pants/track = 100,
+ /obj/item/clothing/under/pants/track/red = 100,
+ /obj/item/clothing/under/pants/track/white = 100,
+ /obj/item/clothing/under/pants/track/green = 100,
+ /obj/item/clothing/under/pants/track/blue = 100,
+ /obj/item/clothing/under/pants/yogapants = 100,
+ /obj/item/clothing/under/ascetic = 100,
+ /obj/item/clothing/under/dress/white3 = 100,
+ /obj/item/clothing/under/skirt/pleated = 100,
+ /obj/item/clothing/under/dress/darkred = 100,
+ /obj/item/clothing/under/dress/redeveninggown = 100,
+ /obj/item/clothing/under/dress/red_swept_dress = 100,
+ /obj/item/clothing/under/dress/sailordress = 100,
+ /obj/item/clothing/under/dress/sari = 100,
+ /obj/item/clothing/under/dress/sari/green = 100,
+ /obj/item/clothing/under/shorts/red = 100,
+ /obj/item/clothing/under/shorts/green = 100,
+ /obj/item/clothing/under/shorts/blue = 100,
+ /obj/item/clothing/under/shorts/black = 100,
+ /obj/item/clothing/under/shorts/grey = 100,
+ /obj/item/clothing/under/shorts/white = 100,
+ /obj/item/clothing/under/shorts/jeans = 100,
+ /obj/item/clothing/under/shorts/jeans/ = 100,
+ /obj/item/clothing/under/shorts/jeans/classic = 100,
+ /obj/item/clothing/under/shorts/jeans/mustang = 100,
+ /obj/item/clothing/under/shorts/jeans/youngfolks = 100,
+ /obj/item/clothing/under/shorts/jeans/black = 100,
+ /obj/item/clothing/under/shorts/jeans/grey = 100,
+ /obj/item/clothing/under/shorts/khaki/ = 100,
+ /obj/item/clothing/under/skirt/loincloth = 100,
+ /obj/item/clothing/under/skirt/khaki = 100,
+ /obj/item/clothing/under/skirt/blue = 100,
+ /obj/item/clothing/under/skirt/red = 100,
+ /obj/item/clothing/under/skirt/denim = 100,
+ /obj/item/clothing/under/skirt/pleated = 100,
+ /obj/item/clothing/under/skirt/outfit/plaid_blue = 100,
+ /obj/item/clothing/under/skirt/outfit/plaid_red = 100,
+ /obj/item/clothing/under/skirt/outfit/plaid_purple = 100,
+ /obj/item/clothing/under/overalls/sleek = 100,
+ /obj/item/clothing/under/sl_suit = 100,
+ /obj/item/clothing/under/gentlesuit = 100,
+ /obj/item/clothing/under/gentlesuit/skirt = 100,
+ /obj/item/clothing/under/suit_jacket = 100,
+ /obj/item/clothing/under/suit_jacket/really_black/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/really_black = 100,
+ /obj/item/clothing/under/suit_jacket/female/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/female/ = 100,
+ /obj/item/clothing/under/suit_jacket/red = 100,
+ /obj/item/clothing/under/suit_jacket/red/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/charcoal = 100,
+ /obj/item/clothing/under/suit_jacket/charcoal/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/navy = 100,
+ /obj/item/clothing/under/suit_jacket/navy/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/burgundy = 100,
+ /obj/item/clothing/under/suit_jacket/burgundy/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/checkered = 100,
+ /obj/item/clothing/under/suit_jacket/checkered/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/tan = 100,
+ /obj/item/clothing/under/suit_jacket/tan/skirt = 100,
+ /obj/item/clothing/under/scratch = 100,
+ /obj/item/clothing/under/scratch/skirt = 100,
+ /obj/item/clothing/under/sundress = 100,
+ /obj/item/clothing/under/sundress_white = 100,
+ /obj/item/clothing/under/rank/psych/turtleneck/sweater = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/blue = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/purple = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/green = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/red = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/white = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/earth = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/engineering = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/science = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/security = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/medical = 100,
+ /obj/item/clothing/under/utility = 100,
+ /obj/item/clothing/under/utility/grey = 100,
+ /obj/item/clothing/under/utility/blue = 100,
+ /obj/item/clothing/under/fluff/v_nanovest = 100,
+ /obj/item/clothing/under/dress/westernbustle = 100,
+ /obj/item/clothing/under/wedding/bride_white = 100,
+ /obj/item/weapon/storage/backpack/ = 100,
+ /obj/item/weapon/storage/backpack/messenger = 100,
+ /obj/item/weapon/storage/backpack/satchel = 100)
+ premium = list(/obj/item/clothing/under/color/rainbow = 1)
+ contraband = list(/obj/item/clothing/under/rank/clown = 1)
+/obj/machinery/vending/loadout/gadget
+ name = "Chips Co."
+ desc = "A special vendor for devices and gadgets."
+ product_ads = "You can't RESIST our great deals!;Feeling disconnected? We have a gadget for you!;You know you have the capacity to buy our capacitors!;FILL THAT HOLE IN YOUR HEART WITH OUR PLASTIC DISTRACTIONS!!!;Devices for everyone! Chips Co.!;ROBUST INVENTORY, GREAT PRICES! ;DON'T FORGET THE oyPAD 13s PRO! ON SALE NOW, ONLY ONE THOUSAND THALERS!"
+ icon_state = "gadgets"
+ icon_vend = "gadgets-purchase"
+ vend_delay = 11
+ products = list(/obj/item/clothing/suit/circuitry = 1,
+ /obj/item/clothing/head/circuitry = 1,
+ /obj/item/clothing/shoes/circuitry = 1,
+ /obj/item/clothing/gloves/circuitry = 1,
+ /obj/item/clothing/under/circuitry = 1,
+ /obj/item/clothing/glasses/circuitry = 1,
+ /obj/item/clothing/ears/circuitry = 1,
+ /obj/item/device/text_to_speech = 5,
+ /obj/item/device/paicard = 5,
+ /obj/item/device/communicator = 10,
+ /obj/item/device/communicator/watch = 10,
+ /obj/item/device/radio = 10,
+ /obj/item/device/camera = 5,
+ /obj/item/device/taperecorder = 5,
+ /obj/item/modular_computer/tablet/preset/custom_loadout/cheap = 5,
+ /obj/item/device/pda = 10,
+ /obj/item/device/radio/headset = 10,
+ /obj/item/device/flashlight = 5,
+ /obj/item/device/laser_pointer = 3,
+ /obj/item/clothing/glasses/omnihud = 10)
+ prices = list(/obj/item/clothing/suit/circuitry = 100,
+ /obj/item/clothing/head/circuitry = 100,
+ /obj/item/clothing/shoes/circuitry = 100,
+ /obj/item/clothing/gloves/circuitry = 100,
+ /obj/item/clothing/under/circuitry = 100,
+ /obj/item/clothing/glasses/circuitry = 100,
+ /obj/item/clothing/ears/circuitry = 100,
+ /obj/item/device/text_to_speech = 300,
+ /obj/item/device/paicard = 100,
+ /obj/item/device/communicator = 100,
+ /obj/item/device/communicator/watch = 100,
+ /obj/item/device/radio = 100,
+ /obj/item/device/camera = 100,
+ /obj/item/device/taperecorder = 100,
+ /obj/item/modular_computer/tablet/preset/custom_loadout/cheap = 1000,
+ /obj/item/device/pda = 50,
+ /obj/item/device/radio/headset = 50,
+ /obj/item/device/flashlight = 100,
+ /obj/item/device/laser_pointer = 200,
+ /obj/item/clothing/glasses/omnihud = 100)
+ premium = list(/obj/item/device/perfect_tele/one_beacon = 1)
+ contraband = list(/obj/item/weapon/disk/nifsoft/compliance = 1)
+/obj/machinery/vending/loadout/loadout_misc
+ name = "Bits and Bobs"
+ desc = "A special vendor for things and also stuff!"
+ product_ads = "You never know when you might need an umbrella.;Hey kid... want some cardemon cards?;Miscellaneous for your miscellaneous heart.;Who's bob? Wouldn't you like to know.;I'm sorry there's no grappling hooks in our umbrellas.;We sell things AND stuff."
+ icon_state = "loadout_misc"
+ products = list(/obj/item/weapon/cane = 5,
+ /obj/item/weapon/pack/cardemon = 25,
+ /obj/item/weapon/deck/holder = 5,
+ /obj/item/weapon/deck/cah = 5,
+ /obj/item/weapon/deck/cah/black = 5,
+ /obj/item/weapon/deck/tarot = 5,
+ /obj/item/weapon/deck/cards = 5,
+ /obj/item/weapon/pack/spaceball = 10,
+ /obj/item/weapon/storage/pill_bottle/dice = 5,
+ /obj/item/weapon/storage/pill_bottle/dice_nerd = 5,
+ /obj/item/weapon/melee/umbrella/random = 10)
+ prices = list(/obj/item/weapon/cane = 100,
+ /obj/item/weapon/pack/cardemon = 100,
+ /obj/item/weapon/deck/holder = 100,
+ /obj/item/weapon/deck/cah = 100,
+ /obj/item/weapon/deck/cah/black = 100,
+ /obj/item/weapon/deck/tarot = 100,
+ /obj/item/weapon/deck/cards = 100,
+ /obj/item/weapon/pack/spaceball = 100,
+ /obj/item/weapon/storage/pill_bottle/dice = 100,
+ /obj/item/weapon/storage/pill_bottle/dice_nerd = 100,
+ /obj/item/weapon/melee/umbrella/random = 100)
+ premium = list(/obj/item/toy/bosunwhistle = 1)
+ contraband = list(/obj/item/toy/katana = 1)
+/obj/machinery/vending/loadout/overwear
+ name = "Big D's Best"
+ desc = "A special vendor using compressed matter cartridges to store large amounts of overwear!"
+ product_ads = "Dress your best! It's what big D would want.;Overwear for all occasions!;Big D has what you need if what you need is some form of jacket!;Need a new hoodie? Bid D has you covered.;Big D says you need a new suit!;Big D smiles when he sees you in one of his coats!"
+ icon_state = "suit"
+ icon_vend = "suit-purchase"
+ vend_delay = 16
+ products = list(/obj/item/clothing/suit/storage/apron = 5,
+ /obj/item/clothing/suit/storage/flannel/aqua = 5,
+ /obj/item/clothing/suit/storage/toggle/bomber = 5,
+ /obj/item/clothing/suit/storage/bomber/alt = 5,
+ /obj/item/clothing/suit/storage/flannel/brown = 5,
+ /obj/item/clothing/suit/storage/toggle/cardigan = 5,
+ /obj/item/clothing/accessory/poncho/roles/cloak/custom = 5,
+ /obj/item/clothing/suit/storage/duster = 5,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket = 5,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen = 5,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless = 5,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless = 5,
+ /obj/item/clothing/suit/storage/fluff/gntop = 5,
+ /obj/item/clothing/suit/greatcoat = 5,
+ /obj/item/clothing/suit/storage/flannel = 5,
+ /obj/item/clothing/suit/storage/greyjacket = 5,
+ /obj/item/clothing/suit/storage/hazardvest = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/black = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/red = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/blue = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/green = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/orange = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/yellow = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/cti = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/mu = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/nt = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/smw = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/nrti = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/field = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/air_cavalry = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/air_force = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/navy = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/special_forces = 5,
+ /obj/item/clothing/suit/kamishimo = 5,
+ /obj/item/clothing/suit/kimono = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/blue = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/green = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/orange = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/pink = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/red = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/yellow = 5,
+ /obj/item/clothing/suit/leathercoat = 5,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket = 5,
+ /obj/item/clothing/suit/storage/leather_jacket_alt = 5,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket = 5,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen = 5,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen = 5,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless = 5,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless = 5,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless = 5,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless = 5,
+ /obj/item/clothing/suit/storage/miljacket = 5,
+ /obj/item/clothing/suit/storage/miljacket/alt = 5,
+ /obj/item/clothing/suit/storage/miljacket/green = 5,
+ /obj/item/clothing/suit/storage/apron/overalls = 5,
+ /obj/item/clothing/suit/storage/toggle/peacoat = 5,
+ /obj/item/clothing/accessory/poncho = 5,
+ /obj/item/clothing/accessory/poncho/green = 5,
+ /obj/item/clothing/accessory/poncho/red = 5,
+ /obj/item/clothing/accessory/poncho/purple = 5,
+ /obj/item/clothing/accessory/poncho/blue = 5,
+ /obj/item/clothing/suit/jacket/puffer = 5,
+ /obj/item/clothing/suit/jacket/puffer/vest = 5,
+ /obj/item/clothing/suit/storage/flannel/red = 5,
+ /obj/item/clothing/suit/unathi/robe = 5,
+ /obj/item/clothing/suit/storage/snowsuit = 5,
+ /obj/item/clothing/suit/storage/toggle/internalaffairs = 5,
+ /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 5,
+ /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5,
+ /obj/item/clothing/suit/suspenders = 5,
+ /obj/item/clothing/suit/storage/toggle/track = 5,
+ /obj/item/clothing/suit/storage/toggle/track/blue = 5,
+ /obj/item/clothing/suit/storage/toggle/track/green = 5,
+ /obj/item/clothing/suit/storage/toggle/track/red = 5,
+ /obj/item/clothing/suit/storage/toggle/track/white = 5,
+ /obj/item/clothing/suit/storage/trench = 5,
+ /obj/item/clothing/suit/storage/trench/grey = 5,
+ /obj/item/clothing/suit/varsity = 5,
+ /obj/item/clothing/suit/varsity/red = 5,
+ /obj/item/clothing/suit/varsity/purple = 5,
+ /obj/item/clothing/suit/varsity/green = 5,
+ /obj/item/clothing/suit/varsity/blue = 5,
+ /obj/item/clothing/suit/varsity/brown = 5,
+ /obj/item/clothing/suit/storage/hooded/wintercoat = 5,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 5)
+ prices = list(/obj/item/clothing/suit/storage/apron = 200,
+ /obj/item/clothing/suit/storage/flannel/aqua = 200,
+ /obj/item/clothing/suit/storage/toggle/bomber = 200,
+ /obj/item/clothing/suit/storage/bomber/alt = 200,
+ /obj/item/clothing/suit/storage/flannel/brown = 200,
+ /obj/item/clothing/suit/storage/toggle/cardigan = 200,
+ /obj/item/clothing/accessory/poncho/roles/cloak/custom = 200,
+ /obj/item/clothing/suit/storage/duster = 200,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket = 200,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen = 200,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless = 200,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless = 200,
+ /obj/item/clothing/suit/storage/fluff/gntop = 200,
+ /obj/item/clothing/suit/greatcoat = 200,
+ /obj/item/clothing/suit/storage/flannel = 200,
+ /obj/item/clothing/suit/storage/greyjacket = 200,
+ /obj/item/clothing/suit/storage/hazardvest = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/black = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/red = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/blue = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/green = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/orange = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/yellow = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/cti = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/mu = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/nt = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/smw = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/nrti = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/field = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/air_cavalry = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/air_force = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/navy = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/special_forces = 200,
+ /obj/item/clothing/suit/kamishimo = 200,
+ /obj/item/clothing/suit/kimono = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/blue = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/green = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/orange = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/pink = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/red = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/yellow = 200,
+ /obj/item/clothing/suit/leathercoat = 200,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket = 200,
+ /obj/item/clothing/suit/storage/leather_jacket_alt = 200,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket = 200,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen = 200,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen = 200,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless = 200,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless = 200,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless = 200,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless = 200,
+ /obj/item/clothing/suit/storage/miljacket = 200,
+ /obj/item/clothing/suit/storage/miljacket/alt = 200,
+ /obj/item/clothing/suit/storage/miljacket/green = 200,
+ /obj/item/clothing/suit/storage/apron/overalls = 100,
+ /obj/item/clothing/suit/storage/toggle/peacoat = 200,
+ /obj/item/clothing/accessory/poncho = 100,
+ /obj/item/clothing/accessory/poncho/green = 100,
+ /obj/item/clothing/accessory/poncho/red = 100,
+ /obj/item/clothing/accessory/poncho/purple = 100,
+ /obj/item/clothing/accessory/poncho/blue = 100,
+ /obj/item/clothing/suit/jacket/puffer = 200,
+ /obj/item/clothing/suit/jacket/puffer/vest = 200,
+ /obj/item/clothing/suit/storage/flannel/red = 200,
+ /obj/item/clothing/suit/unathi/robe = 100,
+ /obj/item/clothing/suit/storage/snowsuit = 200,
+ /obj/item/clothing/suit/storage/toggle/internalaffairs = 200,
+ /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 200,
+ /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 200,
+ /obj/item/clothing/suit/suspenders = 200,
+ /obj/item/clothing/suit/storage/toggle/track = 200,
+ /obj/item/clothing/suit/storage/toggle/track/blue = 200,
+ /obj/item/clothing/suit/storage/toggle/track/green = 200,
+ /obj/item/clothing/suit/storage/toggle/track/red = 200,
+ /obj/item/clothing/suit/storage/toggle/track/white = 200,
+ /obj/item/clothing/suit/storage/trench = 200,
+ /obj/item/clothing/suit/storage/trench/grey = 200,
+ /obj/item/clothing/suit/varsity = 200,
+ /obj/item/clothing/suit/varsity/red = 200,
+ /obj/item/clothing/suit/varsity/purple = 200,
+ /obj/item/clothing/suit/varsity/green = 200,
+ /obj/item/clothing/suit/varsity/blue = 200,
+ /obj/item/clothing/suit/varsity/brown = 200,
+ /obj/item/clothing/suit/storage/hooded/wintercoat = 200,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 200)
+ premium = list(/obj/item/clothing/suit/imperium_monk = 3)
+ contraband = list(/obj/item/toy/katana = 1)
+/obj/machinery/vending/loadout/costume
+ name = "Thespian's Delight"
+ desc = "Sometimes nerds need costumes!"
+ product_ads = "Don't let your art be stifled!;Remember, practice makes perfect!;Break a leg!;Don't make me get the cane!;Thespian's Delight entering stage right!;Costumes for your acting needs!"
+ icon_state = "Theater_b"
+ products = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 3,
+ /obj/item/clothing/suit/storage/hooded/carp_costume = 3,
+ /obj/item/clothing/suit/chickensuit = 3,
+ /obj/item/clothing/head/chicken = 3,
+ /obj/item/clothing/head/helmet/gladiator = 3,
+ /obj/item/clothing/under/gladiator = 3,
+ /obj/item/clothing/suit/storage/toggle/labcoat/mad = 3,
+ /obj/item/clothing/under/gimmick/rank/captain/suit = 3,
+ /obj/item/clothing/glasses/gglasses = 3,
+ /obj/item/clothing/head/flatcap = 3,
+ /obj/item/clothing/shoes/boots/jackboots = 3,
+ /obj/item/clothing/under/schoolgirl = 3,
+ /obj/item/clothing/head/kitty = 3,
+ /obj/item/clothing/glasses/sunglasses/blindfold = 3,
+ /obj/item/clothing/head/beret = 3,
+ /obj/item/clothing/under/skirt = 3,
+ /obj/item/clothing/under/suit_jacket = 3,
+ /obj/item/clothing/head/that = 3,
+ /obj/item/clothing/accessory/wcoat = 3,
+ /obj/item/clothing/under/scratch = 3,
+ /obj/item/clothing/shoes/white = 3,
+ /obj/item/clothing/gloves/white = 3,
+ /obj/item/clothing/under/kilt = 3,
+ /obj/item/clothing/glasses/monocle = 3,
+ /obj/item/clothing/under/sl_suit = 3,
+ /obj/item/clothing/mask/fakemoustache = 3,
+ /obj/item/weapon/cane = 3,
+ /obj/item/clothing/head/bowler = 3,
+ /obj/item/clothing/head/plaguedoctorhat = 3,
+ /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 3,
+ /obj/item/clothing/mask/gas/plaguedoctor/fluff = 3,
+ /obj/item/clothing/under/owl = 3,
+ /obj/item/clothing/mask/gas/owl_mask = 3,
+ /obj/item/clothing/under/waiter = 3,
+ /obj/item/clothing/suit/storage/apron = 3,
+ /obj/item/clothing/under/pirate = 3,
+ /obj/item/clothing/head/pirate = 3,
+ /obj/item/clothing/suit/pirate = 3,
+ /obj/item/clothing/glasses/eyepatch = 3,
+ /obj/item/clothing/head/ushanka = 3,
+ /obj/item/clothing/under/soviet = 3,
+ /obj/item/clothing/suit/imperium_monk = 1,
+ /obj/item/clothing/suit/holidaypriest = 3,
+ /obj/item/clothing/head/witchwig = 3,
+ /obj/item/clothing/under/sundress = 3,
+ /obj/item/weapon/staff/broom = 3,
+ /obj/item/clothing/suit/wizrobe/fake = 3,
+ /obj/item/clothing/head/wizard/fake = 3,
+ /obj/item/weapon/staff = 3,
+ /obj/item/clothing/mask/gas/sexyclown = 3,
+ /obj/item/clothing/under/sexyclown = 3,
+ /obj/item/clothing/mask/gas/sexymime = 3,
+ /obj/item/clothing/under/sexymime = 3)
+ prices = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 200,
+ /obj/item/clothing/suit/storage/hooded/carp_costume = 200,
+ /obj/item/clothing/suit/chickensuit = 200,
+ /obj/item/clothing/head/chicken = 200,
+ /obj/item/clothing/head/helmet/gladiator = 300,
+ /obj/item/clothing/under/gladiator = 500,
+ /obj/item/clothing/suit/storage/toggle/labcoat/mad = 200,
+ /obj/item/clothing/under/gimmick/rank/captain/suit = 200,
+ /obj/item/clothing/glasses/gglasses = 200,
+ /obj/item/clothing/head/flatcap = 200,
+ /obj/item/clothing/shoes/boots/jackboots = 200,
+ /obj/item/clothing/under/schoolgirl = 200,
+ /obj/item/clothing/head/kitty = 200,
+ /obj/item/clothing/glasses/sunglasses/blindfold = 200,
+ /obj/item/clothing/head/beret = 200,
+ /obj/item/clothing/under/skirt = 200,
+ /obj/item/clothing/under/suit_jacket = 200,
+ /obj/item/clothing/head/that = 200,
+ /obj/item/clothing/accessory/wcoat = 200,
+ /obj/item/clothing/under/scratch = 200,
+ /obj/item/clothing/shoes/white = 200,
+ /obj/item/clothing/gloves/white = 200,
+ /obj/item/clothing/under/kilt = 200,
+ /obj/item/clothing/glasses/monocle = 400,
+ /obj/item/clothing/under/sl_suit = 200,
+ /obj/item/clothing/mask/fakemoustache = 200,
+ /obj/item/weapon/cane = 300,
+ /obj/item/clothing/head/bowler = 200,
+ /obj/item/clothing/head/plaguedoctorhat = 300,
+ /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 300,
+ /obj/item/clothing/mask/gas/plaguedoctor/fluff = 600,
+ /obj/item/clothing/under/owl = 400,
+ /obj/item/clothing/mask/gas/owl_mask = 400,
+ /obj/item/clothing/under/waiter = 200,
+ /obj/item/clothing/suit/storage/apron = 200,
+ /obj/item/clothing/under/pirate = 300,
+ /obj/item/clothing/head/pirate = 400,
+ /obj/item/clothing/suit/pirate = 600,
+ /obj/item/clothing/glasses/eyepatch = 200,
+ /obj/item/clothing/head/ushanka = 200,
+ /obj/item/clothing/under/soviet = 200,
+ /obj/item/clothing/suit/imperium_monk = 2000,
+ /obj/item/clothing/suit/holidaypriest = 200,
+ /obj/item/clothing/head/witchwig = 200,
+ /obj/item/clothing/under/sundress = 200,
+ /obj/item/weapon/staff/broom = 400,
+ /obj/item/clothing/suit/wizrobe/fake = 200,
+ /obj/item/clothing/head/wizard/fake = 200,
+ /obj/item/weapon/staff = 400,
+ /obj/item/clothing/mask/gas/sexyclown = 600,
+ /obj/item/clothing/under/sexyclown = 200,
+ /obj/item/clothing/mask/gas/sexymime = 600,
+ /obj/item/clothing/under/sexymime = 200)
+ premium = list(/obj/item/clothing/suit/imperium_monk = 3)
+ contraband = list(/obj/item/clothing/head/syndicatefake = 1,
+ /obj/item/clothing/suit/syndicatefake = 1)
diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm
index 2fc9412fcd..b2af5f3f73 100644
--- a/code/game/magic/archived_book.dm
+++ b/code/game/magic/archived_book.dm
@@ -37,7 +37,7 @@ datum/book_manager/proc/freeid()
set desc = "Permamently deletes a book from the database."
set category = "Admin"
if(!src.holder)
- src << "Only administrators may use this command."
+ to_chat(src, "Only administrators may use this command.")
return
var/isbn = input("ISBN number?", "Delete Book") as num | null
diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm
index f94c8bc78e..a33cd963e2 100644
--- a/code/game/mecha/combat/gorilla.dm
+++ b/code/game/mecha/combat/gorilla.dm
@@ -87,7 +87,7 @@
max_universal_equip = 5
max_special_equip = 2
-/obj/mecha/combat/gorilla/New()
+/obj/mecha/combat/gorilla/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply.
ME.attach(src)
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 19564acba9..d70c8f9e85 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -45,7 +45,7 @@
max_universal_equip = 1
max_special_equip = 2
-/obj/mecha/combat/gygax/dark/New()
+/obj/mecha/combat/gygax/dark/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
ME.attach(src)
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index b8aed16cef..9521147089 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -55,7 +55,7 @@
wreckage = /obj/effect/decal/mecha_wreckage/mauler
mech_faction = MECH_FACTION_SYNDI
-/obj/mecha/combat/marauder/New()
+/obj/mecha/combat/marauder/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
ME.attach(src)
@@ -69,7 +69,7 @@
src.smoke_system.attach(src)
return
-/obj/mecha/combat/marauder/seraph/New()
+/obj/mecha/combat/marauder/seraph/Initialize()
..()//Let it equip whatever is needed.
var/obj/item/mecha_parts/mecha_equipment/ME
if(equipment.len)//Now to remove it and equip anew.
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index 3ada4824f7..8f72de5f51 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -27,7 +27,7 @@
max_universal_equip = 3
max_special_equip = 4
-/obj/mecha/combat/phazon/equipped/New()
+/obj/mecha/combat/phazon/equipped/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd
ME.attach(src)
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index b3b9faa37d..1f90a45d61 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -123,7 +123,7 @@
C.images += holder
*/
-/obj/mecha/medical/odysseus/loaded/New()
+/obj/mecha/medical/odysseus/loaded/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper
ME.attach(src)
diff --git a/code/game/mecha/space/hoverpod.dm b/code/game/mecha/space/hoverpod.dm
index 85fc59d564..31558458d9 100644
--- a/code/game/mecha/space/hoverpod.dm
+++ b/code/game/mecha/space/hoverpod.dm
@@ -105,7 +105,7 @@
max_universal_equip = 1
max_special_equip = 1
-/obj/mecha/working/hoverpod/combatpod/New()
+/obj/mecha/working/hoverpod/combatpod/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
ME.attach(src)
@@ -116,7 +116,7 @@
/obj/mecha/working/hoverpod/shuttlepod
desc = "Who knew a tiny ball could fit three people?"
-/obj/mecha/working/hoverpod/shuttlepod/New()
+/obj/mecha/working/hoverpod/shuttlepod/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger
ME.attach(src)
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index c4813bb0dd..5dd88eb7e7 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -54,7 +54,7 @@
max_universal_equip = 1
max_special_equip = 1
-/obj/mecha/working/ripley/deathripley/New()
+/obj/mecha/working/ripley/deathripley/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/safety_clamp
ME.attach(src)
@@ -64,7 +64,7 @@
desc = "An old, dusty mining ripley."
name = "APLU \"Miner\""
-/obj/mecha/working/ripley/mining/New()
+/obj/mecha/working/ripley/mining/Initialize()
..()
//Attach drill
if(prob(25)) //Possible diamond drill... Feeling lucky?
diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm
index 0de8d332b7..552e8672f8 100644
--- a/code/game/objects/effects/alien/aliens.dm
+++ b/code/game/objects/effects/alien/aliens.dm
@@ -152,6 +152,12 @@
* Weeds
*/
#define NODERANGE 3
+#define WEED_NORTH_EDGING "north"
+#define WEED_SOUTH_EDGING "south"
+#define WEED_EAST_EDGING "east"
+#define WEED_WEST_EDGING "west"
+#define WEED_NODE_GLOW "glow"
+#define WEED_NODE_BASE "nodebase"
/obj/effect/alien/weeds
name = "weeds"
@@ -164,6 +170,18 @@
layer = ABOVE_TURF_LAYER
var/health = 15
var/obj/effect/alien/weeds/node/linked_node = null
+ var/static/list/weedImageCache
+
+/obj/effect/alien/weeds/Destroy()
+ var/turf/T = get_turf(src)
+ // To not mess up the overlay updates.
+ loc = null
+
+ for (var/obj/effect/alien/weeds/W in range(1,T))
+ W.updateWeedOverlays()
+
+ linked_node = null
+ ..()
/obj/effect/alien/weeds/node
icon_state = "weednode"
@@ -173,9 +191,22 @@
light_range = NODERANGE
var/node_range = NODERANGE
+ var/set_color = null
+
/obj/effect/alien/weeds/node/New()
..(src.loc, src)
+/obj/effect/alien/weeds/node/Initialize()
+ ..()
+ START_PROCESSING(SSobj, src)
+
+ spawn(1 SECOND)
+ if(color)
+ set_color = color
+
+/obj/effect/alien/weeds/node/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ ..()
/obj/effect/alien/weeds/New(pos, node)
..()
@@ -184,12 +215,45 @@
return
linked_node = node
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
- spawn(rand(150, 200))
- if(src)
- Life()
+
+ fullUpdateWeedOverlays()
+
+/obj/effect/alien/weeds/proc/updateWeedOverlays()
+
+ overlays.Cut()
+
+ if(!weedImageCache || !weedImageCache.len)
+ weedImageCache = list()
+// weedImageCache.len = 4
+ weedImageCache[WEED_NORTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_n", layer=2.11, pixel_y = -32)
+ weedImageCache[WEED_SOUTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_s", layer=2.11, pixel_y = 32)
+ weedImageCache[WEED_EAST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_e", layer=2.11, pixel_x = -32)
+ weedImageCache[WEED_WEST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_w", layer=2.11, pixel_x = 32)
+
+ var/turf/N = get_step(src, NORTH)
+ var/turf/S = get_step(src, SOUTH)
+ var/turf/E = get_step(src, EAST)
+ var/turf/W = get_step(src, WEST)
+ if(!locate(/obj/effect/alien) in N.contents)
+ if(istype(N, /turf/simulated/floor))
+ overlays += weedImageCache[WEED_SOUTH_EDGING]
+ if(!locate(/obj/effect/alien) in S.contents)
+ if(istype(S, /turf/simulated/floor))
+ overlays += weedImageCache[WEED_NORTH_EDGING]
+ if(!locate(/obj/effect/alien) in E.contents)
+ if(istype(E, /turf/simulated/floor))
+ overlays += weedImageCache[WEED_WEST_EDGING]
+ if(!locate(/obj/effect/alien) in W.contents)
+ if(istype(W, /turf/simulated/floor))
+ overlays += weedImageCache[WEED_EAST_EDGING]
+
+/obj/effect/alien/weeds/proc/fullUpdateWeedOverlays()
+ for (var/obj/effect/alien/weeds/W in range(1,src))
+ W.updateWeedOverlays()
+
return
-/obj/effect/alien/weeds/proc/Life()
+/obj/effect/alien/weeds/process()
set background = 1
var/turf/U = get_turf(src)
/*
@@ -211,6 +275,9 @@ Alien plants should do something if theres a lot of poison
if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) )
return
+ if(linked_node != src)
+ color = linked_node.set_color
+
direction_loop:
for(var/dirn in cardinal)
var/turf/T = get_step(src, dirn)
@@ -222,10 +289,33 @@ Alien plants should do something if theres a lot of poison
// continue
for(var/obj/O in T)
- if(O.density)
+ if(!O.CanZASPass(U))
continue direction_loop
- new /obj/effect/alien/weeds(T, linked_node)
+ var/obj/effect/E = new /obj/effect/alien/weeds(T, linked_node)
+
+ E.color = color
+
+ if(istype(src, /obj/effect/alien/weeds/node))
+ var/obj/effect/alien/weeds/node/N = src
+ var/list/nearby_weeds = list()
+ for(var/obj/effect/alien/weeds/W in range(N.node_range,src))
+ nearby_weeds |= W
+
+ for(var/obj/effect/alien/weeds/W in nearby_weeds)
+ if(!W)
+ continue
+
+ if(!W.linked_node)
+ linked_node = src
+
+ W.color = W.linked_node.set_color
+
+ if(W == src)
+ continue
+
+ if(prob(max(10, 40 - (5 * nearby_weeds.len))))
+ W.process()
/obj/effect/alien/weeds/ex_act(severity)
@@ -282,7 +372,12 @@ Alien plants should do something if theres a lot of poison
healthcheck()
#undef NODERANGE
-
+#undef WEED_NORTH_EDGING
+#undef WEED_SOUTH_EDGING
+#undef WEED_EAST_EDGING
+#undef WEED_WEST_EDGING
+#undef WEED_NODE_GLOW
+#undef WEED_NODE_BASE
/*
* Acid
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 6c50dc69b9..cfde668d5c 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -205,10 +205,10 @@ var/global/list/image/splatter_cache=list()
overlays += giblets
/obj/effect/decal/cleanable/blood/gibs/up
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
+ random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1")
/obj/effect/decal/cleanable/blood/gibs/down
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
+ random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
/obj/effect/decal/cleanable/blood/gibs/body
random_icon_states = list("gibhead", "gibtorso")
diff --git a/code/game/objects/effects/spiders_vr.dm b/code/game/objects/effects/spiders_vr.dm
new file mode 100644
index 0000000000..65829b95ac
--- /dev/null
+++ b/code/game/objects/effects/spiders_vr.dm
@@ -0,0 +1,2 @@
+/obj/effect/spider/spiderling/virgo
+ grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)
diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm
index 71a37ac0d7..a82e694d0e 100644
--- a/code/game/objects/items/devices/radio/headset_vr.dm
+++ b/code/game/objects/items/devices/radio/headset_vr.dm
@@ -19,4 +19,28 @@
/obj/item/device/radio/headset
sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi',
- SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi')
\ No newline at end of file
+ SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi')
+
+/obj/item/device/radio/headset/mob_headset //Adminbus headset for simplemob shenanigans.
+ name = "nonhuman radio implant"
+ desc = "An updated, modular intercom that requires no hands to operate. Takes encryption keys"
+
+/obj/item/device/radio/headset/mob_headset/receive_range(freq, level)
+ if(ismob(src.loc))
+ return ..(freq, level)
+ return -1
+
+/obj/item/device/radio/headset/mob_headset/afterattack(var/atom/movable/target, mob/living/user, proximity)
+ if(!proximity)
+ return
+ if(istype(target,/mob/living/simple_mob))
+ var/mob/living/simple_mob/M = target
+ if(!M.mob_radio)
+ forceMove(M)
+ M.mob_radio = src
+ return
+ if(M.mob_radio)
+ M.mob_radio.forceMove(M.loc)
+ M.mob_radio = null
+ return
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index c00d396e4d..ff4146b8a0 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -66,8 +66,7 @@
/obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H)
if(H)
- var/obj/item/organ/external/affected = H.organs_by_name[initialize_loc]
- if(handle_implant(H, affected))
+ if(handle_implant(H, initialize_loc))
invisibility = initial(invisibility)
post_implant(H)
diff --git a/code/game/objects/items/weapons/implants/implantdud.dm b/code/game/objects/items/weapons/implants/implantdud.dm
index 896ea2358a..110051e58d 100644
--- a/code/game/objects/items/weapons/implants/implantdud.dm
+++ b/code/game/objects/items/weapons/implants/implantdud.dm
@@ -19,12 +19,3 @@
icon = 'icons/obj/device.dmi'
icon_state = "implant"
roundstart = FALSE
-
-/obj/item/weapon/implant/dud/Initialize()
- ..()
- if(roundstart)
- invisibility = 100
- ..()
- spawn(3)
- if(!ishuman(loc) && !QDELETED(src))
- qdel(src)
diff --git a/code/game/objects/items/weapons/implants/neuralbasic.dm b/code/game/objects/items/weapons/implants/neuralbasic.dm
index 0c5fe2b3da..18d472154b 100644
--- a/code/game/objects/items/weapons/implants/neuralbasic.dm
+++ b/code/game/objects/items/weapons/implants/neuralbasic.dm
@@ -105,10 +105,3 @@ Implant Specifics:
"}
my_brain.take_damage(15)
my_brain = null
return
-
-/obj/item/weapon/implant/neural/roundstart/Initialize()
- invisibility = 100
- ..()
- spawn(3)
- if(!ishuman(loc) && !QDELETED(src))
- qdel(src)
diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm
index a911d1e137..3f2b1978d3 100644
--- a/code/game/objects/items/weapons/material/material_weapons.dm
+++ b/code/game/objects/items/weapons/material/material_weapons.dm
@@ -86,10 +86,13 @@
health--
check_health()
-/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user as mob)
+/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/whetstone))
var/obj/item/weapon/whetstone/whet = W
repair(whet.repair_amount, whet.repair_time, user)
+ if(istype(W, /obj/item/weapon/material/sharpeningkit))
+ var/obj/item/weapon/material/sharpeningkit/SK = W
+ repair(SK.repair_amount, SK.repair_time, user)
..()
/obj/item/weapon/material/proc/check_health(var/consumed)
@@ -134,7 +137,19 @@
to_chat(user, "You can't repair \the [src].")
return
-
+/obj/item/weapon/material/proc/sharpen(var/material, var/sharpen_time, var/kit, mob/living/M)
+ if(!fragile)
+ if(health < initial(health))
+ to_chat(M, "You should repair [src] first. Try using [kit] on it.")
+ return FALSE
+ M.visible_message("[M] begins to replace parts of [src] with [kit].", "You begin to replace parts of [src] with [kit].")
+ if(do_after(usr, sharpen_time))
+ M.visible_message("[M] has finished replacing parts of [src].", "You finish replacing parts of [src].")
+ src.set_material(material)
+ return TRUE
+ else
+ to_chat(M, "You can't sharpen and re-edge [src].")
+ return FALSE
/*
Commenting this out pending rebalancing of radiation based on small objects.
@@ -162,4 +177,4 @@ Commenting this out pending rebalancing of radiation based on small objects.
TemperatureAct(150)
else
return ..()
-*/
\ No newline at end of file
+*/
diff --git a/code/game/objects/items/weapons/material/whetstone.dm b/code/game/objects/items/weapons/material/whetstone.dm
index e312680d1b..628f450e3d 100644
--- a/code/game/objects/items/weapons/material/whetstone.dm
+++ b/code/game/objects/items/weapons/material/whetstone.dm
@@ -8,4 +8,69 @@
force = 3
w_class = ITEMSIZE_SMALL
var/repair_amount = 5
- var/repair_time = 40
\ No newline at end of file
+ var/repair_time = 40
+
+/obj/item/weapon/whetstone/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/stack/material))
+ var/obj/item/stack/material/M = I
+ if(M.amount >= 5)
+ to_chat(user, "You begin to refine the [src] with [M]...")
+ if(do_after(user, 70))
+ M.use(5)
+ var/obj/item/SK
+ SK = new /obj/item/weapon/material/sharpeningkit(get_turf(user), M.material.name)
+ to_chat(user, "You sharpen and refine the [src] into \a [SK].")
+ qdel(src)
+ if(SK)
+ user.put_in_hands(SK)
+ else
+ to_chat(user, "You need 5 [src] to refine it into a sharpening kit.")
+
+/obj/item/weapon/material/sharpeningkit
+ name = "sharpening kit"
+ desc = "A refined, fine grit whetstone, useful for sharpening dull edges, polishing out dents, and, with extra material, replacing an edge."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "sharpener"
+ hitsound = 'sound/weapons/genhit3.ogg'
+ force_divisor = 0.7
+ thrown_force_divisor = 1
+ var/repair_amount = 5
+ var/repair_time = 40
+ var/sharpen_time = 100
+ var/uses = 0
+
+/obj/item/weapon/material/sharpeningkit/examine(mob/user, distance)
+ . = ..()
+ to_chat(user, "There [uses == 1 ? "is" : "are"] [uses] [material] [uses == 1 ? src.material.sheet_singular_name : src.material.sheet_plural_name] left for use.")
+/obj/item/weapon/material/sharpeningkit/Initialize()
+ . = ..()
+ setrepair()
+
+/obj/item/weapon/material/sharpeningkit/proc/setrepair()
+ repair_amount = material.hardness * 0.1
+ repair_time = material.weight * 0.5
+ sharpen_time = material.weight * 3
+
+/obj/item/weapon/material/sharpeningkit/attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, /obj/item/stack/material))
+ var/obj/item/stack/material/S = W
+ if(S.material == material)
+ S.use(1)
+ uses += 1
+ to_chat(user, "You add a [S.material.name] [S.material.sheet_singular_name] to [src].")
+ return
+
+ if(istype(W, /obj/item/weapon/material))
+ if(istype(W, /obj/item/weapon/material/sharpeningkit))
+ to_chat(user, "Really? Sharpening a [W] with [src]? You goofball.")
+ return
+ var/obj/item/weapon/material/M = W
+ if(uses >= M.w_class*2)
+ if(M.sharpen(src.material.name, sharpen_time, src, user))
+ uses -= M.w_class*2
+ return
+ else
+ to_chat(user, "Not enough material to sharpen [M]. You need [M.w_class*2] [M.material.sheet_plural_name].")
+ return
+ else
+ to_chat(user, "You can't sharpen [W] with [src]!")
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index d935d4eaa2..2c4fd9949b 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -11,17 +11,26 @@
var/lrange = 2
var/lpower = 2
var/lcolor = "#0099FF"
-
+ var/colorable = FALSE
+ var/rainbow = FALSE
// If it uses energy.
var/use_cell = FALSE
var/hitcost = 120
var/obj/item/weapon/cell/bcell = null
var/cell_type = /obj/item/weapon/cell/device
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
+ )
/obj/item/weapon/melee/energy/proc/activate(mob/living/user)
if(active)
return
active = 1
+ if(rainbow)
+ item_state = "[icon_state]_blade_rainbow"
+ else
+ item_state = "[icon_state]_blade"
embed_chance = active_embed_chance
force = active_force
throwforce = active_throwforce
@@ -29,12 +38,14 @@
edge = 1
w_class = active_w_class
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
+ update_icon()
set_light(lrange, lpower, lcolor)
/obj/item/weapon/melee/energy/proc/deactivate(mob/living/user)
if(!active)
return
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
+ item_state = "[icon_state]"
active = 0
embed_chance = initial(embed_chance)
force = initial(force)
@@ -42,6 +53,7 @@
sharp = initial(sharp)
edge = initial(edge)
w_class = initial(w_class)
+ update_icon()
set_light(0,0)
/obj/item/weapon/melee/energy/proc/use_charge(var/cost)
@@ -102,6 +114,13 @@
return ..()
/obj/item/weapon/melee/energy/attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, /obj/item/device/multitool) && colorable && !active)
+ if(!rainbow)
+ rainbow = TRUE
+ else
+ rainbow = FALSE
+ to_chat(user, "You manipulate the color controller in [src].")
+ update_icon()
if(use_cell)
if(istype(W, cell_type))
if(!bcell)
@@ -125,13 +144,52 @@
/obj/item/weapon/melee/energy/get_cell()
return bcell
+/obj/item/weapon/melee/energy/update_icon()
+ . = ..()
+ var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
+ if(colorable)
+ blade_overlay.color = lcolor
+ if(rainbow || !colorable)
+ blade_overlay = mutable_appearance(icon, "[icon_state]_blade_rainbow")
+ blade_overlay.color = "FFFFFF"
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+ if(active)
+ add_overlay(blade_overlay)
+ if(istype(usr,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = usr
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
+
+
+
+
+/obj/item/weapon/melee/energy/AltClick(mob/living/user)
+ if(!colorable) //checks if is not colorable
+ return
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+
+ if(alert("Are you sure you want to recolor your blade?", "Confirm Recolor", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null
+ if(energy_color_input)
+ lcolor = sanitize_hexcolor(energy_color_input)
+ update_icon()
+
+/obj/item/weapon/melee/energy/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it.")
+
/*
* Energy Axe
*/
/obj/item/weapon/melee/energy/axe
name = "energy axe"
desc = "An energised battle axe."
- icon_state = "axe0"
+ icon_state = "eaxe"
+ item_state = "eaxe"
//active_force = 150 //holy...
active_force = 60
active_throwforce = 35
@@ -152,13 +210,11 @@
/obj/item/weapon/melee/energy/axe/activate(mob/living/user)
..()
damtype = SEARING
- icon_state = "axe1"
to_chat(user, "\The [src] is now energised.")
/obj/item/weapon/melee/energy/axe/deactivate(mob/living/user)
..()
damtype = BRUTE
- icon_state = initial(icon_state)
to_chat(user, "\The [src] is de-energised. It's just a regular axe now.")
/obj/item/weapon/melee/energy/axe/suicide_act(mob/user)
@@ -187,7 +243,8 @@
color
name = "energy sword"
desc = "May the force be within you."
- icon_state = "sword0"
+ icon_state = "esword"
+ item_state = "esword"
active_force = 30
active_throwforce = 20
active_w_class = ITEMSIZE_LARGE
@@ -200,9 +257,8 @@
origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
sharp = 1
edge = 1
- var/blade_color
- var/random_color = TRUE
- var/active_state = "sword"
+ colorable = TRUE
+
projectile_parry_chance = 65
@@ -211,30 +267,6 @@
if(!istype(loc,/mob))
deactivate(user)
-/obj/item/weapon/melee/energy/sword/New()
- if(random_color)
- blade_color = pick("red","blue","green","purple","white")
- lcolor = blade_color
-
-/obj/item/weapon/melee/energy/sword/green/New()
- blade_color = "green"
- lcolor = "#008000"
-
-/obj/item/weapon/melee/energy/sword/red/New()
- blade_color = "red"
- lcolor = "#FF0000"
-
-/obj/item/weapon/melee/energy/sword/blue/New()
- blade_color = "blue"
- lcolor = "#0000FF"
-
-/obj/item/weapon/melee/energy/sword/purple/New()
- blade_color = "purple"
- lcolor = "#800080"
-
-/obj/item/weapon/melee/energy/sword/white/New()
- blade_color = "white"
- lcolor = "#FFFFFF"
/obj/item/weapon/melee/energy/sword/activate(mob/living/user)
if(!active)
@@ -242,14 +274,13 @@
..()
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- icon_state = "[active_state][blade_color]"
+
/obj/item/weapon/melee/energy/sword/deactivate(mob/living/user)
if(active)
to_chat(user, "\The [src] deactivates!")
..()
attack_verb = list()
- icon_state = initial(icon_state)
/obj/item/weapon/melee/energy/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(active && default_parry_check(user, attacker, damage_source) && prob(60))
@@ -284,11 +315,10 @@
/obj/item/weapon/melee/energy/sword/pirate
name = "energy cutlass"
desc = "Arrrr matey."
- icon_state = "cutlass0"
+ icon_state = "cutlass"
+ item_state = "cutlass"
+ colorable = TRUE
-/obj/item/weapon/melee/energy/sword/pirate/activate(mob/living/user)
- ..()
- icon_state = "cutlass1"
/*
*Ionic Rapier
@@ -300,8 +330,8 @@
description_info = "This is a dangerous melee weapon that will deliver a moderately powerful electromagnetic pulse to whatever it strikes. \
Striking a lesser robotic entity will compel it to attack you, as well. It also does extra burn damage to robotic entities, but it does \
very little damage to purely organic targets."
- icon_state = "ionic_rapier0"
- random_color = FALSE
+ icon_state = "ionrapier"
+ item_state = "ionrapier"
active_force = 5
active_throwforce = 3
active_embed_chance = 0
@@ -312,7 +342,6 @@
lrange = 2
lpower = 2
lcolor = "#0000FF"
- active_state = "ionic_rapier"
projectile_parry_chance = 30 // It's not specifically designed for cutting and slashing, but it can still, maybe, save your life.
/obj/item/weapon/melee/energy/sword/ionic_rapier/afterattack(var/atom/movable/AM, var/mob/living/user, var/proximity)
@@ -350,6 +379,7 @@
active_force = 25
armor_penetration = 25
projectile_parry_chance = 40
+ colorable = TRUE
hitcost = 75
@@ -357,15 +387,14 @@
..()
bcell = new/obj/item/weapon/cell/device/weapon(src)
-/*
- *Energy Blade
- */
+//Energy Blade (ninja uses this)
//Can't be activated or deactivated, so no reason to be a subtype of energy
/obj/item/weapon/melee/energy/blade
name = "energy blade"
desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal."
icon_state = "blade"
+ item_state = "blade"
force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe
armor_penetration = 100
sharp = 1
@@ -448,49 +477,27 @@
return 1
-/*
- *Energy Spear
- */
+//Energy Spear
/obj/item/weapon/melee/energy/spear
- name = "energy spear"
- desc = "Concentrated energy forming a sharp tip at the end of a long rod."
- icon_state = "espear0"
- armor_penetration = 75
- sharp = 1
- edge = 1
- force = 5
- throwforce = 10
- throw_speed = 7
- throw_range = 11
- reach = 2
- w_class = ITEMSIZE_LARGE
- active_force = 25
- active_throwforce = 30
- active_w_class = ITEMSIZE_HUGE
- var/random_color = TRUE
- var/tip_color = ""
- var/active_state = "espear"
+ name = "energy spear"
+ desc = "Concentrated energy forming a sharp tip at the end of a long rod."
+ icon_state = "espear"
+ armor_penetration = 75
+ sharp = 1
+ edge = 1
+ force = 5
+ throwforce = 10
+ throw_speed = 7
+ throw_range = 11
+ reach = 2
+ w_class = ITEMSIZE_LARGE
+ active_force = 25
+ active_throwforce = 30
+ active_w_class = ITEMSIZE_HUGE
+ colorable = TRUE
-/obj/item/weapon/melee/energy/spear/New()
- if(random_color)
- tip_color = pick("red","blue","green","purple")
- lcolor = tip_color
-/obj/item/weapon/melee/energy/spear/green/New()
- tip_color = "green"
- lcolor = "#008000"
-
-/obj/item/weapon/melee/energy/spear/red/New()
- tip_color = "red"
- lcolor = "#FF0000"
-
-/obj/item/weapon/melee/energy/spear/blue/New()
- tip_color = "blue"
- lcolor = "#0000FF"
-
-/obj/item/weapon/melee/energy/spear/purple/New()
- tip_color = "purple"
lcolor = "#800080"
/obj/item/weapon/melee/energy/spear/activate(mob/living/user)
@@ -498,7 +505,6 @@
to_chat(user, "\The [src] is now energised.")
..()
attack_verb = list("jabbed", "stabbed", "impaled")
- icon_state = "[active_state]-[tip_color]"
/obj/item/weapon/melee/energy/spear/deactivate(mob/living/user)
@@ -506,7 +512,6 @@
to_chat(user, "\The [src] deactivates!")
..()
attack_verb = list("whacked", "beat", "slapped", "thonked")
- icon_state = "espear0"
/obj/item/weapon/melee/energy/spear/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(active && default_parry_check(user, attacker, damage_source) && prob(50))
@@ -516,4 +521,4 @@
spark_system.start()
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
return 1
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 5ea586f43d..6d3310cdc4 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -115,7 +115,8 @@
name = "energy combat shield"
desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere."
icon = 'icons/obj/weapons.dmi'
- icon_state = "eshield0" // eshield1 for expanded
+ icon_state = "eshield"
+ item_state = "eshield"
slot_flags = SLOT_EARS
flags = NOCONDUCT
force = 3.0
@@ -123,9 +124,16 @@
throw_speed = 1
throw_range = 4
w_class = ITEMSIZE_SMALL
+ var/lrange = 1.5
+ var/lpower = 1.5
+ var/lcolor = "#006AFF"
origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
attack_verb = list("shoved", "bashed")
var/active = 0
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
+ )
/obj/item/weapon/shield/energy/handle_shield(mob/user)
if(!active)
@@ -175,11 +183,33 @@
return
/obj/item/weapon/shield/energy/update_icon()
- icon_state = "eshield[active]"
+ var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
+ if(lcolor)
+ blade_overlay.color = lcolor
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
if(active)
- set_light(1.5, 1.5, "#006AFF")
+ add_overlay(blade_overlay)
+ item_state = "[icon_state]_blade"
+ set_light(lrange, lpower, lcolor)
else
set_light(0)
+ item_state = "[icon_state]"
+
+/obj/item/weapon/shield/energy/AltClick(mob/living/user)
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(alert("Are you sure you want to recolor your shield?", "Confirm Recolor", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null
+ if(energy_color_input)
+ lcolor = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+/obj/item/weapon/shield/energy/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it.")
/obj/item/weapon/shield/riot/tele
name = "telescopic shield"
@@ -226,4 +256,4 @@
H.update_inv_r_hand()
add_fingerprint(user)
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/weapons/storage/boxes_vr.dm b/code/game/objects/items/weapons/storage/boxes_vr.dm
index f2cbd06aed..8feee76bdd 100644
--- a/code/game/objects/items/weapons/storage/boxes_vr.dm
+++ b/code/game/objects/items/weapons/storage/boxes_vr.dm
@@ -33,7 +33,7 @@
starts_with = list(/obj/item/device/encryptionkey/headset_com = 7)
/obj/item/weapon/storage/box/servicekeys
- name = "box of command keys"
+ name = "box of service keys"
desc = "A box full of service keys, for the HoP to give out as necessary."
starts_with = list(/obj/item/device/encryptionkey/headset_service = 7)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 2648723385..aab0ecf7f0 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -62,7 +62,7 @@
/obj/structure/girder/update_icon()
if(anchored)
- icon_state = "girder"
+ icon_state = initial(icon_state)
else
icon_state = "displaced"
@@ -320,6 +320,7 @@
name = "column"
icon= 'icons/obj/cult.dmi'
icon_state= "cultgirder"
+ max_health = 250
health = 250
cover = 70
girder_material = "cult"
@@ -354,6 +355,13 @@
new /obj/effect/decal/remains/human(get_turf(src))
dismantle()
+/obj/structure/girder/resin
+ name = "soft girder"
+ icon_state = "girder_resin"
+ max_health = 225
+ health = 225
+ cover = 60
+ girder_material = "resin"
/obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
var/turf/simulated/T = get_turf(src)
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index 8599def4a5..676ad392f0 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -93,8 +93,9 @@
if(..()) return 1
if(!can_open)
- to_chat(user, "You push the wall, but nothing happens.")
- playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
+ if(!material.wall_touch_special(src, user))
+ to_chat(user, "You push the wall, but nothing happens.")
+ playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
else
toggle_open(user)
return 0
diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm
index 37bf0d7541..bff82d6e0e 100644
--- a/code/game/turfs/simulated/wall_types.dm
+++ b/code/game/turfs/simulated/wall_types.dm
@@ -59,6 +59,9 @@
/turf/simulated/wall/snowbrick/New(var/newloc)
..(newloc,"packed snow")
+/turf/simulated/wall/resin/New(var/newloc)
+ ..(newloc,"resin",null,"resin")
+
// Kind of wondering if this is going to bite me in the butt.
/turf/simulated/wall/skipjack/New(var/newloc)
..(newloc,"alienalloy")
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 0c6fa0fed7..b75de6685e 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -9,28 +9,28 @@
if(!mob) return
if(IsGuestKey(key))
- src << "Guests may not use OOC."
+ to_chat(src, "Guests may not use OOC.")
return
msg = sanitize(msg)
if(!msg) return
if(!is_preference_enabled(/datum/client_preference/show_ooc))
- src << "You have OOC muted."
+ to_chat(src, "You have OOC muted.")
return
if(!holder)
if(!config.ooc_allowed)
- src << "OOC is globally muted."
+ to_chat(src, "OOC is globally muted.")
return
if(!config.dooc_allowed && (mob.stat == DEAD))
usr << "OOC for dead mobs has been turned off."
return
if(prefs.muted & MUTE_OOC)
- src << "You cannot use OOC (muted)."
+ to_chat(src, "You cannot use OOC (muted).")
return
if(findtext(msg, "byond://"))
- src << "Advertising other servers is not allowed."
+ to_chat(src, "Advertising other servers is not allowed.")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
@@ -86,7 +86,7 @@
return
if(IsGuestKey(key))
- src << "Guests may not use OOC."
+ to_chat(src, "Guests may not use OOC.")
return
msg = sanitize(msg)
@@ -94,21 +94,21 @@
return
if(!is_preference_enabled(/datum/client_preference/show_looc))
- src << "You have LOOC muted."
+ to_chat(src, "You have LOOC muted.")
return
if(!holder)
if(!config.looc_allowed)
- src << "LOOC is globally muted."
+ to_chat(src, "LOOC is globally muted.")
return
if(!config.dooc_allowed && (mob.stat == DEAD))
usr << "OOC for dead mobs has been turned off."
return
if(prefs.muted & MUTE_OOC)
- src << "You cannot use OOC (muted)."
+ to_chat(src, "You cannot use OOC (muted).")
return
if(findtext(msg, "byond://"))
- src << "Advertising other servers is not allowed."
+ to_chat(src, "Advertising other servers is not allowed.")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 4a40ea97cb..5a6bfefdb4 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -4,27 +4,27 @@
set hidden = 1
if (stat == DEAD)
- src << "You're already dead!"
+ to_chat(src, "You're already dead!")
return
if (!ticker)
- src << "You can't commit suicide before the game starts!"
+ to_chat(src, "You can't commit suicide before the game starts!")
return
if(!player_is_antag(mind))
message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
- src << "No. Adminhelp if there is a legitimate reason."
+ to_chat(src, "No. Adminhelp if there is a legitimate reason.")
return
if (suiciding)
- src << "You're already committing suicide! Be patient!"
+ to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(confirm == "Yes")
if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
- src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))"
+ to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))")
return
suiciding = 15
does_not_breathe = 0 //Prevents ling-suicide zombies, or something
@@ -92,15 +92,15 @@
set hidden = 1
if (stat == 2)
- src << "You're already dead!"
+ to_chat(src, "You're already dead!")
return
if (!ticker)
- src << "You can't commit suicide before the game starts!"
+ to_chat(src, "You can't commit suicide before the game starts!")
return
if (suiciding)
- src << "You're already committing suicide! Be patient!"
+ to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
@@ -116,11 +116,11 @@
set hidden = 1
if (stat == 2)
- src << "You're already dead!"
+ to_chat(src, "You're already dead!")
return
if (suiciding)
- src << "You're already committing suicide! Be patient!"
+ to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
@@ -136,11 +136,11 @@
set hidden = 1
if (stat == 2)
- src << "You're already dead!"
+ to_chat(src, "You're already dead!")
return
if (suiciding)
- src << "You're already committing suicide! Be patient!"
+ to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
@@ -165,4 +165,4 @@
M.show_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "[src] bleeps electronically.", 2)
death(0)
else
- src << "Aborting suicide attempt."
+ to_chat(src, "Aborting suicide attempt.")
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index c030e25649..a8100038a8 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -171,7 +171,7 @@
num_event_managers_online++
if(config.admin_irc)
- src << "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond."
+ to_chat(src, "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond.")
msg = "Current Admins ([num_admins_online]):\n" + msg
if(config.show_mods)
diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm
index d127bfe6f4..f4ddd3e3f2 100644
--- a/code/modules/admin/ToRban.dm
+++ b/code/modules/admin/ToRban.dm
@@ -72,16 +72,16 @@
var/choice = input(src,"Please select an IP address to remove from the ToR banlist:","Remove ToR ban",null) as null|anything in F.dir
if(choice)
F.dir.Remove(choice)
- src << "Address removed"
+ to_chat(src, "Address removed")
if("remove all")
- src << "[TORFILE] was [fdel(TORFILE)?"":"not "]removed."
+ to_chat(src, "[TORFILE] was [fdel(TORFILE)?"":"not "]removed.")
if("find")
var/input = input(src,"Please input an IP address to search for:","Find ToR ban",null) as null|text
if(input)
if(ToRban_isbanned(input))
- src << "Address is a known ToR address"
+ to_chat(src, "Address is a known ToR address")
else
- src << "Address is not a known ToR address"
+ to_chat(src, "Address is not a known ToR address")
return
#undef TORFILE
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 8daa899692..671520fbf8 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1305,7 +1305,7 @@ var/datum/announcement/minor/admin_min_announcer = new
set desc = "Should fix any mob sprite update errors."
if (!holder)
- src << "Only administrators may use this command."
+ to_chat(src, "Only administrators may use this command.")
return
if(istype(H))
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index 1c90383f40..12a84346b3 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -34,7 +34,7 @@
if("singulo", "telesci") //general one-round-only stuff
var/F = investigate_subject2file(subject)
if(!F)
- src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed."
+ to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.")
return
src << browse(F,"window=investigate[subject];size=800x300")
@@ -43,8 +43,8 @@
if(href_logfile)
src << browse(href_logfile,"window=investigate[subject];size=800x300")
else
- src << "Error: admin_investigate: No href logfile found."
+ to_chat(src, "Error: admin_investigate: No href logfile found.")
return
else
- src << "Error: admin_investigate: Href Logging is not on."
+ to_chat(src, "Error: admin_investigate: Href Logging is not on.")
return
diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm
index 4bcaf10d9c..24ecba7c01 100644
--- a/code/modules/admin/admin_memo.dm
+++ b/code/modules/admin/admin_memo.dm
@@ -22,7 +22,7 @@
return
if("")
F.dir.Remove(ckey)
- src << "Memo removed"
+ to_chat(src, "Memo removed")
return
if( findtext(memo,"