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 c3cfb19514..57a7d21036 100644
--- a/code/ZAS/Phoron.dm
+++ b/code/ZAS/Phoron.dm
@@ -140,7 +140,7 @@ obj/var/contaminated = 0
/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))
+ if(prob(20))
to_chat(src, "Your eyes burn!")
E.damage += 2.5
eye_blurry = min(eye_blurry+1.5,50)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 6cde264566..299ccf6ec2 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -183,7 +183,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)
@@ -316,7 +316,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 d29ef9dd96..fc06f8e0cc 100644
--- a/code/_onclick/hud/ability_screen_objects.dm
+++ b/code/_onclick/hud/ability_screen_objects.dm
@@ -282,7 +282,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/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index 8b927b3a54..4795f63687 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 = 10
+ end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg'
+ volume = 20
+ 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/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/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/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/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/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 8b8bba5a9d..7a773c733e 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -199,10 +199,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/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/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/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,"