diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm
index 114f9b7c11..2e14fb96eb 100644
--- a/code/__defines/damage_organs.dm
+++ b/code/__defines/damage_organs.dm
@@ -57,3 +57,4 @@
#define INFECTION_LEVEL_ONE 100
#define INFECTION_LEVEL_TWO 500
#define INFECTION_LEVEL_THREE 1000
+#define INFECTION_LEVEL_MAX 1500
\ No newline at end of file
diff --git a/code/datums/supplypacks/contraband.dm b/code/datums/supplypacks/contraband.dm
index cbe52301df..d600c2969c 100644
--- a/code/datums/supplypacks/contraband.dm
+++ b/code/datums/supplypacks/contraband.dm
@@ -63,11 +63,13 @@
/obj/item/clothing/suit/storage/vest/heavy/merc,
/obj/item/clothing/glasses/night,
/obj/item/weapon/storage/box/anti_photons,
- /obj/item/ammo_magazine/clip/c12g/pellet, /obj/item/ammo_magazine/clip/c12g
+ /obj/item/ammo_magazine/clip/c12g/pellet,
+ /obj/item/ammo_magazine/clip/c12g
),
list( //the doc,
/obj/item/weapon/storage/firstaid/combat,
- /obj/item/weapon/gun/projectile/dartgun, /obj/item/weapon/reagent_containers/hypospray,
+ /obj/item/weapon/gun/projectile/dartgun,
+ /obj/item/weapon/reagent_containers/hypospray,
/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate,
/obj/item/weapon/reagent_containers/glass/bottle/cyanide,
/obj/item/ammo_magazine/chemdart
diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm
index b4d51ed1b5..fef3f3e350 100644
--- a/code/datums/supplypacks/medical.dm
+++ b/code/datums/supplypacks/medical.dm
@@ -119,7 +119,7 @@
/obj/item/weapon/storage/belt/medical,
/obj/item/device/radio/headset/heads/cmo,
/obj/item/clothing/under/rank/chief_medical_officer,
- /obj/item/weapon/reagent_containers/hypospray,
+ /obj/item/weapon/reagent_containers/hypospray/vial,
/obj/item/clothing/accessory/stethoscope,
/obj/item/clothing/glasses/hud/health,
/obj/item/clothing/suit/storage/toggle/labcoat/cmo,
diff --git a/code/datums/supplypacks/voidsuits.dm b/code/datums/supplypacks/voidsuits.dm
index 658ed5562f..dda9aa4ed4 100644
--- a/code/datums/supplypacks/voidsuits.dm
+++ b/code/datums/supplypacks/voidsuits.dm
@@ -142,7 +142,7 @@
/obj/item/clothing/shoes/magboots = 2,
/obj/item/weapon/tank/oxygen = 2
)
- cost = 50
+ cost = 60
containertype = "/obj/structure/closet/crate/secure"
containername = "Vey-Med Medical voidsuit crate"
access = access_medical_equip
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index b7210f22a3..e4bd3b85ea 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1,6 +1,6 @@
/atom/movable
layer = 3
- appearance_flags = TILE_BOUND
+ appearance_flags = TILE_BOUND|PIXEL_SCALE
var/last_move = null
var/anchored = 0
// var/elevation = 2 - not used anywhere
@@ -15,7 +15,7 @@
var/moved_recently = 0
var/mob/pulledby = null
var/item_state = null // Used to specify the item state for the on-mob overlays.
-
+ var/icon_scale = 1 // Used to scale icons up or down in update_transform().
var/auto_init = 1
/atom/movable/New()
@@ -296,3 +296,12 @@
return null
return text2num(pickweight(candidates))
+/atom/movable/proc/update_transform()
+ var/matrix/M = matrix()
+ M.Scale(icon_scale)
+ src.transform = M
+
+// Use this to set the object's scale.
+/atom/movable/proc/adjust_scale(new_scale)
+ icon_scale = new_scale
+ update_transform()
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 7c6a9cc7af..022366c865 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -4,6 +4,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/list/datum/absorbed_dna/absorbed_dna = list()
var/list/absorbed_languages = list() // Necessary because of set_species stuff
var/absorbedcount = 0
+ var/lingabsorbedcount = 1 //Starts at one, because that's us
var/chem_charges = 20
var/chem_recharge_rate = 0.5
var/chem_storage = 50
@@ -11,8 +12,8 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/changelingID = "Changeling"
var/geneticdamage = 0
var/isabsorbing = 0
- var/geneticpoints = 5
- var/max_geneticpoints = 5
+ var/geneticpoints = 7
+ var/max_geneticpoints = 7
var/readapts = 1
var/max_readapts = 2
var/list/purchased_powers = list()
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 396e6faf34..0af67b22ed 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -90,16 +90,23 @@
continue
absorbDNA(dna_data)
changeling.absorbedcount++
+
T.mind.changeling.absorbed_dna.len = 1
- changeling.geneticpoints += 5
- changeling.max_geneticpoints += 5
+ // This is where lings get boosts from eating eachother
+ if(T.mind.changeling.lingabsorbedcount)
+ for(var/a = 1 to T.mind.changeling.lingabsorbedcount)
+ changeling.lingabsorbedcount++
+ changeling.geneticpoints += 4
+ changeling.max_geneticpoints += 4
+
src << "We absorbed another changeling, and we grow stronger. Our genomes increase."
T.mind.changeling.chem_charges = 0
T.mind.changeling.geneticpoints = -1
T.mind.changeling.max_geneticpoints = -1 //To prevent revival.
T.mind.changeling.absorbedcount = 0
+ T.mind.changeling.lingabsorbedcount = 0
changeling.absorbedcount++
changeling.isabsorbing = 0
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 48f0f02bfc..65ad3d7f01 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -7,8 +7,8 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
/datum/game_mode/heist
name = "Heist"
config_tag = "heist"
- required_players = 9
- required_players_secret = 9
+ required_players = 12
+ required_players_secret = 12
required_enemies = 3
round_description = "An unidentified bluespace signature is approaching the station!"
extended_round_description = "The Company's majority control of phoron in the system has marked the \
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index e85af7e82b..f7233c1266 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -12,8 +12,8 @@ var/list/nuke_disks = list()
colony of sizable population and considerable wealth causes it to often be the target of various \
attempts of robbery, fraud and other malicious actions."
config_tag = "mercenary"
- required_players = 9
- required_players_secret = 9
+ required_players = 12
+ required_players_secret = 12
required_enemies = 3
end_on_antag_death = 0
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 39d3f739d7..850f061250 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -440,7 +440,7 @@ datum/objective/steal
"a chief medical officer's jumpsuit" = /obj/item/clothing/under/rank/chief_medical_officer,
"a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security,
"a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel,
- "the hypospray" = /obj/item/weapon/reagent_containers/hypospray,
+ "the hypospray" = /obj/item/weapon/reagent_containers/hypospray/vial,
"the colony director's pinpointer" = /obj/item/weapon/pinpointer,
"an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof,
)
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index 16e27006b4..a23abb5b06 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -59,7 +59,7 @@
//..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri
return
else if(istype(W, /obj/item/weapon/wirecutters))
- user << "You cut the tag off the bodybag"
+ to_chat(user, "You cut the tag off the bodybag")
src.name = "body bag"
src.overlays.Cut()
return
@@ -160,7 +160,7 @@
O.name = "used stasis bag"
O.icon = src.icon
O.icon_state = "bodybag_used"
- O.desc = "Pretty useless now.."
+ O.desc = "Pretty useless now..."
qdel(src)
/obj/structure/closet/body_bag/cryobag/MouseDrop(over_object, src_location, over_location)
@@ -211,9 +211,9 @@
/obj/structure/closet/body_bag/cryobag/examine(mob/user)
..()
if(Adjacent(user)) //The bag's rather thick and opaque from a distance.
- user << "You peer into \the [src]."
+ to_chat(user, "You peer into \the [src].")
if(syringe)
- user << "It has a syringe added to it."
+ to_chat(user, "It has a syringe added to it.")
for(var/mob/living/L in contents)
L.examine(user)
diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm
index 62cb9d9862..dbac918609 100644
--- a/code/game/objects/items/devices/geiger.dm
+++ b/code/game/objects/items/devices/geiger.dm
@@ -1,7 +1,7 @@
-#define RAD_LEVEL_LOW 5 //10 // Around the level at which radiation starts to become harmful
-#define RAD_LEVEL_MODERATE 15 //15
-#define RAD_LEVEL_HIGH 50 //50
-#define RAD_LEVEL_VERY_HIGH 100 //100
+#define RAD_LEVEL_LOW 0.01 // Around the level at which radiation starts to become harmful
+#define RAD_LEVEL_MODERATE 10
+#define RAD_LEVEL_HIGH 25
+#define RAD_LEVEL_VERY_HIGH 50
//Geiger counter
//Rewritten version of TG's geiger counter
@@ -19,7 +19,14 @@
/obj/item/device/geiger/New()
processing_objects |= src
+/obj/item/device/geiger/Destroy()
+ processing_objects -= src
+ return ..()
+
/obj/item/device/geiger/process()
+ get_radiation()
+
+/obj/item/device/geiger/proc/get_radiation()
if(!scanning)
return
radiation_count = radiation_repository.get_rads_at_turf(get_turf(src))
@@ -27,12 +34,29 @@
/obj/item/device/geiger/examine(mob/user)
..(user)
- to_chat(user, "[scanning ? "ambient" : "stored"] radiation level: [radiation_count ? radiation_count : "0"]Bq.")
+ get_radiation()
+ to_chat(user, "[scanning ? "Ambient" : "Stored"] radiation level: [radiation_count ? radiation_count : "0"]Bq.")
+
+/obj/item/device/geiger/rad_act(amount)
+ if(!amount || !scanning)
+ return FALSE
+
+ if(amount > radiation_count)
+ radiation_count = amount
+
+ var/sound = "geiger"
+ if(amount < 5)
+ sound = "geiger_weak"
+ playsound(src, sound, between(10, 10 + (radiation_count * 4), 100), 0)
+ if(sound == "geiger_weak") // A weak geiger sound every two seconds sounds too infrequent.
+ spawn(1 SECOND)
+ playsound(src, sound, between(10, 10 + (radiation_count * 4), 100), 0)
+ update_icon()
/obj/item/device/geiger/attack_self(var/mob/user)
scanning = !scanning
update_icon()
- to_chat(user, "\icon[src] You switch [scanning ? "on" : "off"] [src].")
+ to_chat(user, "\icon[src] You switch [scanning ? "on" : "off"] \the [src].")
/obj/item/device/geiger/update_icon()
if(!scanning)
@@ -40,12 +64,18 @@
return 1
switch(radiation_count)
- if(null) icon_state = "geiger_on_1"
- if(-INFINITY to RAD_LEVEL_LOW) icon_state = "geiger_on_1"
- if(RAD_LEVEL_LOW + 1 to RAD_LEVEL_MODERATE) icon_state = "geiger_on_2"
- if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH) icon_state = "geiger_on_3"
- if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH) icon_state = "geiger_on_4"
- if(RAD_LEVEL_VERY_HIGH + 1 to INFINITY) icon_state = "geiger_on_5"
+ if(null)
+ icon_state = "geiger_on_1"
+ if(-INFINITY to RAD_LEVEL_LOW)
+ icon_state = "geiger_on_1"
+ if(RAD_LEVEL_LOW to RAD_LEVEL_MODERATE)
+ icon_state = "geiger_on_2"
+ if(RAD_LEVEL_MODERATE to RAD_LEVEL_HIGH)
+ icon_state = "geiger_on_3"
+ if(RAD_LEVEL_HIGH to RAD_LEVEL_VERY_HIGH)
+ icon_state = "geiger_on_4"
+ if(RAD_LEVEL_VERY_HIGH to INFINITY)
+ icon_state = "geiger_on_5"
#undef RAD_LEVEL_LOW
#undef RAD_LEVEL_MODERATE
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index dde2f168b0..d878dd74fe 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -75,11 +75,11 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
- user << "The [affecting.name] is cut open, you'll need more than a bandage!"
+ to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!")
return
if(affecting.is_bandaged())
- user << "The wounds on [M]'s [affecting.name] have already been bandaged."
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.")
return 1
else
user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \
@@ -93,9 +93,13 @@
if(used == amount)
break
if(!do_mob(user, M, W.damage/5))
- user << "You must stand still to bandage wounds."
+ to_chat(user, "You must stand still to bandage wounds.")
break
+ if(affecting.is_bandaged()) // We do a second check after the delay, in case it was bandaged after the first check.
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.")
+ return 1
+
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \
"You bandage \a [W.desc] on [M]'s [affecting.name]." )
@@ -111,9 +115,9 @@
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
- user << "\The [src] is used up."
+ to_chat(user, "\The [src] is used up.")
else
- user << "\The [src] is used up, but there are more wounds to treat on \the [affecting.name]."
+ to_chat(user, "\The [src] is used up, but there are more wounds to treat on \the [affecting.name].")
use(used)
/obj/item/stack/medical/ointment
@@ -135,17 +139,20 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
- user << "The [affecting.name] is cut open, you'll need more than a bandage!"
+ to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!")
return
if(affecting.is_salved())
- user << "The wounds on [M]'s [affecting.name] have already been salved."
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been salved.")
return 1
else
user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \
"You start salving the wounds on [M]'s [affecting.name]." )
if(!do_mob(user, M, 10))
- user << "You must stand still to salve wounds."
+ to_chat(user, "You must stand still to salve wounds.")
+ return 1
+ if(affecting.is_salved()) // We do a second check after the delay, in case it was bandaged after the first check.
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been salved.")
return 1
user.visible_message("[user] salved wounds on [M]'s [affecting.name].", \
"You salved wounds on [M]'s [affecting.name]." )
@@ -169,11 +176,11 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
- user << "The [affecting.name] is cut open, you'll need more than a bandage!"
+ to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!")
return
if(affecting.is_bandaged() && affecting.is_disinfected())
- user << "The wounds on [M]'s [affecting.name] have already been treated."
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been treated.")
return 1
else
user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \
@@ -187,8 +194,11 @@
if(used == amount)
break
if(!do_mob(user, M, W.damage/5))
- user << "You must stand still to bandage wounds."
+ to_chat(user, "You must stand still to bandage wounds.")
break
+ if(affecting.is_bandaged() && affecting.is_disinfected()) // We do a second check after the delay, in case it was bandaged after the first check.
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.")
+ return 1
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \
"You clean and seal \a [W.desc] on [M]'s [affecting.name]." )
@@ -205,9 +215,9 @@
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
- user << "\The [src] is used up."
+ to_chat(user, "\The [src] is used up.")
else
- user << "\The [src] is used up, but there are more wounds to treat on \the [affecting.name]."
+ to_chat(user, "\The [src] is used up, but there are more wounds to treat on \the [affecting.name].")
use(used)
/obj/item/stack/medical/advanced/ointment
@@ -228,16 +238,19 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
- user << "The [affecting.name] is cut open, you'll need more than a bandage!"
+ to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!")
if(affecting.is_salved())
- user << "The wounds on [M]'s [affecting.name] have already been salved."
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been salved.")
return 1
else
user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \
"You start salving the wounds on [M]'s [affecting.name]." )
if(!do_mob(user, M, 10))
- user << "You must stand still to salve wounds."
+ to_chat(user, "You must stand still to salve wounds.")
+ return 1
+ if(affecting.is_salved()) // We do a second check after the delay, in case it was bandaged after the first check.
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been salved.")
return 1
user.visible_message( "[user] covers wounds on [M]'s [affecting.name] with regenerative membrane.", \
"You cover wounds on [M]'s [affecting.name] with regenerative membrane." )
@@ -264,20 +277,23 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
var/limb = affecting.name
if(!(affecting.organ_tag in splintable_organs))
- user << "You can't use \the [src] to apply a splint there!"
+ to_chat(user, "You can't use \the [src] to apply a splint there!")
return
if(affecting.splinted)
- user << "[M]'s [limb] is already splinted!"
+ to_chat(user, "[M]'s [limb] is already splinted!")
return
if (M != user)
user.visible_message("[user] starts to apply \the [src] to [M]'s [limb].", "You start to apply \the [src] to [M]'s [limb].", "You hear something being wrapped.")
else
if(( !user.hand && (affecting.organ_tag in list(BP_R_ARM, BP_R_HAND)) || \
user.hand && (affecting.organ_tag in list(BP_L_ARM, BP_L_HAND)) ))
- user << "You can't apply a splint to the arm you're using!"
+ to_chat(user, "You can't apply a splint to the arm you're using!")
return
user.visible_message("[user] starts to apply \the [src] to their [limb].", "You start to apply \the [src] to your [limb].", "You hear something being wrapped.")
if(do_after(user, 50, M))
+ if(affecting.splinted)
+ to_chat(user, "[M]'s [limb] is already splinted!")
+ return
if(M == user && prob(75))
user.visible_message("\The [user] fumbles [src].", "You fumble [src].", "You hear something being wrapped.")
return
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index fe838a5291..0af7913df8 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -36,7 +36,7 @@
playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
if(do_after(user, 20 * O.toolspeed))
src.locked = 0
- user << " You disable the locking modules."
+ to_chat(user, " You disable the locking modules.")
update_icon()
return
else if(istype(O, /obj/item/weapon))
@@ -50,7 +50,7 @@
else
playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
if(W.force < 15)
- user << "The cabinet's protective glass glances off the hit."
+ to_chat(user, "The cabinet's protective glass glances off the hit.")
else
src.hitstaken++
if(src.hitstaken == 4)
@@ -63,12 +63,14 @@
if (istype(O, /obj/item/weapon/material/twohanded/fireaxe) && src.localopened)
if(!fireaxe)
if(O:wielded)
- user << "Unwield the axe first."
- return
+ O:wielded = 0
+ O.update_icon()
+ //to_chat(user, "Unwield the axe first.")
+ //return
fireaxe = O
user.remove_from_mob(O)
src.contents += O
- user << "You place the fire axe back in the [src.name]."
+ to_chat(user, "You place the fire axe back in the [src.name].")
update_icon()
else
if(src.smashed)
@@ -91,11 +93,11 @@
spawn(10) update_icon()
return
else
- user << "Resetting circuitry..."
+ to_chat(user, "Resetting circuitry...")
playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
if(do_after(user,20 * O.toolspeed))
src.locked = 1
- user << " You re-enable the locking modules."
+ to_chat(user, " You re-enable the locking modules.")
return
else
localopened = !localopened
@@ -116,13 +118,13 @@
hasaxe = 1
if(src.locked)
- user <<"The cabinet won't budge!"
+ to_chat(user, "The cabinet won't budge!")
return
if(localopened)
if(fireaxe)
user.put_in_hands(fireaxe)
fireaxe = null
- user << "You take the fire axe from the [name]."
+ to_chat (user, "You take the fire axe from the [name].")
src.add_fingerprint(user)
update_icon()
else
@@ -149,7 +151,7 @@
attack_tk(mob/user as mob)
if(localopened && fireaxe)
fireaxe.forceMove(loc)
- user << "You telekinetically remove the fire axe."
+ to_chat(user, "You telekinetically remove the fire axe.")
fireaxe = null
update_icon()
return
@@ -161,9 +163,9 @@
if (isrobot(usr) || src.locked || src.smashed)
if(src.locked)
- usr << "The cabinet won't budge!"
+ to_chat(usr, "The cabinet won't budge!")
else if(src.smashed)
- usr << "The protective glass is broken!"
+ to_chat(usr, "The protective glass is broken!")
return
localopened = !localopened
@@ -180,23 +182,23 @@
if(fireaxe)
usr.put_in_hands(fireaxe)
fireaxe = null
- usr << "You take the Fire axe from the [name]."
+ to_chat(usr, "You take the Fire axe from the [name].")
else
- usr << "The [src.name] is empty."
+ to_chat(usr, "The [src.name] is empty.")
else
- usr << "The [src.name] is closed."
+ to_chat(usr, "The [src.name] is closed.")
update_icon()
attack_ai(mob/user as mob)
if(src.smashed)
- user << "The security of the cabinet is compromised."
+ to_chat(user, "The security of the cabinet is compromised.")
return
else
locked = !locked
if(locked)
- user << "Cabinet locked."
+ to_chat(user, "Cabinet locked.")
else
- user << "Cabinet unlocked."
+ to_chat(user, "Cabinet unlocked.")
return
update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm
new file mode 100644
index 0000000000..3bb158a576
--- /dev/null
+++ b/code/game/objects/structures/fitness.dm
@@ -0,0 +1,65 @@
+/obj/structure/fitness
+ icon = 'icons/obj/stationobjs.dmi'
+ anchored = 1
+ var/being_used = 0
+
+/obj/structure/fitness/punchingbag
+ name = "punching bag"
+ desc = "A punching bag."
+ icon_state = "punchingbag"
+ density = 1
+ var/list/hit_message = list("hit", "punch", "kick", "robust")
+
+/obj/structure/fitness/punchingbag/attack_hand(var/mob/living/carbon/human/user)
+ if(!istype(user))
+ ..()
+ return
+ if(user.nutrition < 20)
+ to_chat(user, "You need more energy to use the punching bag. Go eat something.")
+ else
+ if(user.a_intent == I_HURT)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ flick("[icon_state]_hit", src)
+ playsound(src.loc, 'sound/effects/woodhit.ogg', 25, 1, -1)
+ user.do_attack_animation(src)
+ user.nutrition = user.nutrition - 5
+ to_chat(user, "You [pick(hit_message)] \the [src].")
+
+/obj/structure/fitness/weightlifter
+ name = "weightlifting machine"
+ desc = "A machine used to lift weights."
+ icon_state = "weightlifter"
+ var/weight = 1
+ var/list/qualifiers = list("with ease", "without any trouble", "with great effort")
+
+/obj/structure/fitness/weightlifter/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/wrench))
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
+ weight = ((weight) % qualifiers.len) + 1
+ to_chat(user, "You set the machine's weight level to [weight].")
+
+/obj/structure/fitness/weightlifter/attack_hand(var/mob/living/carbon/human/user)
+ if(!istype(user))
+ return
+ if(user.loc != src.loc)
+ to_chat(user, "You must be on the weight machine to use it.")
+ return
+ if(user.nutrition < 50)
+ to_chat(user, "You need more energy to lift weights. Go eat something.")
+ return
+ if(being_used)
+ to_chat(user, "The weight machine is already in use by somebody else.")
+ return
+ else
+ being_used = 1
+ playsound(src.loc, 'sound/effects/weightlifter.ogg', 50, 1)
+ user.set_dir(SOUTH)
+ flick("[icon_state]_[weight]", src)
+ if(do_after(user, 20 + (weight * 10)))
+ playsound(src.loc, 'sound/effects/weightdrop.ogg', 25, 1)
+ user.nutrition -= weight * 10
+ to_chat(user, "You lift the weights [qualifiers[weight]].")
+ being_used = 0
+ else
+ to_chat(user, "Against your previous judgement, perhaps working out is not for you.")
+ being_used = 0
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 89398fca9e..0a440db1c4 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -51,6 +51,8 @@ var/list/keyboard_sound = list ('sound/effects/keyboard/keyboard1.ogg','sound/ef
var/list/mechstep_sound = list('sound/mecha/mechstep1.ogg', 'sound/mecha/mechstep2.ogg')
var/list/bodyfall_sound = list('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg')
var/list/can_sound = list('sound/effects/can_open1.ogg','sound/effects/can_open2.ogg','sound/effects/can_open3.ogg','sound/effects/can_open4.ogg')
+var/list/geiger_sound = list('sound/items/geiger1.ogg', 'sound/items/geiger2.ogg', 'sound/items/geiger3.ogg', 'sound/items/geiger4.ogg', 'sound/items/geiger5.ogg')
+var/list/geiger_weak_sound = list('sound/items/geiger_weak1.ogg', 'sound/items/geiger_weak2.ogg', 'sound/items/geiger_weak3.ogg', 'sound/items/geiger_weak4.ogg')
//var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
@@ -188,4 +190,6 @@ var/const/FALLOFF_SOUNDS = 0.5
if ("canopen") soundin = pick(can_sound)
if ("mechstep") soundin = pick(mechstep_sound)
//if ("gunshot") soundin = pick(gun_sound)
+ if("geiger") soundin = pick(geiger_sound)
+ if("geiger_weak") soundin = pick(geiger_weak_sound)
return soundin
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 4dda05ce09..6d6ac626a1 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -46,6 +46,8 @@
var/ooc_style = "everyone"
if(holder && !holder.fakekey)
ooc_style = "elevated"
+ if(holder.rights & R_EVENT)
+ ooc_style = "event_manager"
if(holder.rights & R_MOD)
ooc_style = "moderator"
if(holder.rights & R_DEBUG)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 9d3e492698..7e607f4b34 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -779,7 +779,7 @@ var/list/admin_verbs_event_manager = list(
set category = "Admin"
if(holder)
- if(alert("Confirm self-deadmin for the round? You can't re-admin yourself without someont promoting you.",,"Yes","No") == "Yes")
+ if(alert("Confirm self-deadmin for the round? You can't re-admin yourself without someone promoting you.",,"Yes","No") == "Yes")
log_admin("[src] deadmined themself.")
message_admins("[src] deadmined themself.", 1)
deadmin()
diff --git a/code/modules/client/preference_setup/traits/trait_defines.dm b/code/modules/client/preference_setup/traits/trait_defines.dm
index db948177f1..48375621ee 100644
--- a/code/modules/client/preference_setup/traits/trait_defines.dm
+++ b/code/modules/client/preference_setup/traits/trait_defines.dm
@@ -72,6 +72,25 @@
Regardless, you find it quite difficult to land shots where you wanted them to go."
modifier_type = /datum/modifier/trait/inaccurate
+/datum/trait/modifier/physical/smaller
+ name = "Smaller"
+ modifier_type = /datum/modifier/trait/smaller
+ mutually_exclusive = list(/datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger)
+
+/datum/trait/modifier/physical/small
+ name = "Small"
+ modifier_type = /datum/modifier/trait/small
+ mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger)
+
+/datum/trait/modifier/physical/large
+ name = "Large"
+ modifier_type = /datum/modifier/trait/large
+ mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/larger)
+
+/datum/trait/modifier/physical/larger
+ name = "Larger"
+ modifier_type = /datum/modifier/trait/larger
+ mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large)
// These two traits might be borderline, feel free to remove if they get abused.
/datum/trait/modifier/physical/high_metabolism
diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm
index 31830fb275..3c5dc32e68 100644
--- a/code/modules/clothing/spacesuits/void/station.dm
+++ b/code/modules/clothing/spacesuits/void/station.dm
@@ -150,20 +150,20 @@
item_state_slots = list(slot_r_hand_str = "medical_voidsuit_bio", slot_l_hand_str = "medical_voidsuit_bio")
armor = list(melee = 45, bullet = 5, laser = 20, energy = 5, bomb = 15, bio = 100, rad = 75)
-//Medical Surplus Voidsuit
+//Medical Streamlined Voidsuit
/obj/item/clothing/head/helmet/space/void/medical/alt
name = "streamlined medical voidsuit helmet"
desc = "A trendy, lightly radiation-shielded voidsuit helmet trimmed in a fetching green."
icon_state = "rig0-medicalalt"
- armor = list(melee = 30, bullet = 5, laser = 10,energy = 5, bomb = 5, bio = 100, rad = 60)
+ armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
light_overlay = "helmet_light_dual_green"
/obj/item/clothing/suit/space/void/medical/alt
icon_state = "rig-medicalalt"
name = "streamlined medical voidsuit"
desc = "A more recent model of Vey-Med voidsuit, featuring the latest in radiation shielding technology, without sacrificing comfort or style."
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
- armor = list(melee = 30, bullet = 5, laser = 10,energy = 5, bomb = 5, bio = 100, rad = 60)
+ slowdown = 0
+ armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
//Security
/obj/item/clothing/head/helmet/space/void/security
diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm
index c22d65e421..8621e2b7ed 100644
--- a/code/modules/integrated_electronics/core/pins.dm
+++ b/code/modules/integrated_electronics/core/pins.dm
@@ -112,6 +112,8 @@ list[](
/datum/integrated_io/proc/write_data_to_pin(var/new_data)
if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want.
+ if(istext(new_data))
+ new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
data = new_data
holder.on_data_written()
diff --git a/code/modules/integrated_electronics/core/special_pins/string_pin.dm b/code/modules/integrated_electronics/core/special_pins/string_pin.dm
index 6128418c1f..595a205318 100644
--- a/code/modules/integrated_electronics/core/special_pins/string_pin.dm
+++ b/code/modules/integrated_electronics/core/special_pins/string_pin.dm
@@ -4,11 +4,14 @@
/datum/integrated_io/string/ask_for_pin_data(mob/user)
var/new_data = input("Please type in a string.","[src] string writing") as null|text
- if(holder.check_interactivity(user) )
+ new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
+
+ if(new_data && holder.check_interactivity(user) )
to_chat(user, "You input [new_data ? "new_data" : "NULL"] into the pin.")
write_data_to_pin(new_data)
/datum/integrated_io/string/write_data_to_pin(var/new_data)
+ new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(isnull(new_data) || istext(new_data))
data = new_data
holder.on_data_written()
diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm
index 08765b94e5..0f702be3de 100644
--- a/code/modules/integrated_electronics/core/tools.dm
+++ b/code/modules/integrated_electronics/core/tools.dm
@@ -125,6 +125,7 @@
if("string")
accepting_refs = 0
new_data = input("Now type in a string.","[src] string writing") as null|text
+ new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(istext(new_data) && CanInteract(user, physical_state))
data_to_write = new_data
to_chat(user, "You set \the [src]'s memory to \"[new_data]\".")
diff --git a/code/modules/mob/_modifiers/modifiers.dm b/code/modules/mob/_modifiers/modifiers.dm
index ee6d914fa6..3facabe6f9 100644
--- a/code/modules/mob/_modifiers/modifiers.dm
+++ b/code/modules/mob/_modifiers/modifiers.dm
@@ -41,6 +41,7 @@
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Each point makes it 15% easier or harder, just like evasion.
var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
+ var/icon_scale_percent // Makes the holder's icon get scaled up or down.
/datum/modifier/New(var/new_holder, var/new_origin)
holder = new_holder
@@ -62,6 +63,8 @@
holder.modifiers.Remove(src)
if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain.
holder.update_modifier_visuals()
+ if(icon_scale_percent) // Correct the scaling.
+ holder.update_transform()
qdel(src)
// Override this for special effects when it gets removed.
@@ -117,6 +120,8 @@
modifiers.Add(mod)
if(mod.mob_overlay_state)
update_modifier_visuals()
+ if(mod.icon_scale_percent)
+ update_transform()
return mod
@@ -198,6 +203,8 @@
effects += "Your metabolism is [metabolism_percent > 1.0 ? "faster" : "slower"], \
causing reagents in your body to process, and hunger to occur [multipler_to_percentage(metabolism_percent, TRUE)] [metabolism_percent > 1.0 ? "faster" : "slower"]."
+ if(!isnull(icon_scale_percent))
+ effects += "Your appearance is [multipler_to_percentage(icon_scale_percent, TRUE)] [icon_scale_percent > 1 ? "larger" : "smaller"]."
return jointext(effects, "
")
diff --git a/code/modules/mob/_modifiers/traits.dm b/code/modules/mob/_modifiers/traits.dm
index 824343c41c..3e9e8278e4 100644
--- a/code/modules/mob/_modifiers/traits.dm
+++ b/code/modules/mob/_modifiers/traits.dm
@@ -58,4 +58,28 @@
desc = "Your body's metabolism is slower than average."
metabolism_percent = 0.5
- incoming_healing_percent = 0.6
\ No newline at end of file
+ incoming_healing_percent = 0.6
+
+/datum/modifier/trait/larger
+ name = "Larger"
+ desc = "Your body is larger than average."
+
+ icon_scale_percent = 1.2
+
+/datum/modifier/trait/large
+ name = "Large"
+ desc = "Your body is a bit larger than average."
+
+ icon_scale_percent = 1.1
+
+/datum/modifier/trait/small
+ name = "Small"
+ desc = "Your body is a bit smaller than average."
+
+ icon_scale_percent = 0.95
+
+/datum/modifier/trait/smaller
+ name = "Smaller"
+ desc = "Your body is smaller than average."
+
+ icon_scale_percent = 0.9
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm
index e201e85116..c120b9deef 100644
--- a/code/modules/mob/living/carbon/alien/alien_attacks.dm
+++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm
@@ -15,7 +15,7 @@
if (I_GRAB)
if (M == src)
return
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, M, src )
+ var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, src )
M.put_in_active_hand(G)
@@ -56,4 +56,4 @@
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("[] has attempted to punch []!", M, src), 1)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 1a45c1f459..404612af28 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -18,17 +18,9 @@
var/skiparms = 0
var/skipfeet = 0
-
- var/cloaked = 0 // 0 for normal, 1 for cloaked close
-
- if(mind && mind.changeling && mind.changeling.cloaked && !istype(user, /mob/observer))
- var/distance = get_dist(user, src)
- if(distance > 2)
- src.loc.examine(user)
- return
- else
- cloaked = 1
-
+ if(alpha <= 50)
+ src.loc.examine(user)
+ return
var/looks_synth = looksSynthetic()
@@ -97,8 +89,6 @@
if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
T = gender_datums[PLURAL]
- if(cloaked)
- T = gender_datums[NEUTER]
else if(species && species.ambiguous_genders)
var/can_detect_gender = FALSE
@@ -474,7 +464,7 @@
msg += "Medical records: \[View\] \[Add comment\]\n"
- if(print_flavor_text() && !cloaked)
+ if(print_flavor_text())
msg += "[print_flavor_text()]\n"
// VOREStation Start
@@ -483,20 +473,13 @@
// VOREStation End
msg += "*---------*
"
msg += applying_pressure
- if (pose && !cloaked)
+ if (pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "[T.He] [pose]"
user << jointext(msg, null)
-
-/mob/living/carbon/human/get_description_fluff()
- if(mind && mind.changeling && mind.changeling.cloaked)
- return ""
- else
- return ..()
-
//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records.
/proc/hasHUD(mob/M as mob, hudtype)
if(istype(M, /mob/living/carbon/human))
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 162f603b47..3d9893cfaa 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -30,6 +30,8 @@
var/tail_animation // If set, the icon to obtain tail animation states from.
var/tail_hair
+ var/icon_scale = 1 // Makes the icon larger/smaller.
+
var/race_key = 0 // Used for mob icon cache string.
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
var/mob_size = MOB_MEDIUM
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 1f01aaa3b4..57670bddc3 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -39,6 +39,8 @@
burn_mod = 0.85
metabolic_rate = 0.85
item_slowdown_mod = 0.5
+ mob_size = MOB_LARGE
+ blood_volume = 840
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_UNATHI)
name_language = LANGUAGE_UNATHI
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 524cc7d4b6..963df38c3f 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -160,16 +160,29 @@ Please contact me on #coderbus IRC. ~Carn x
for(var/inner_entry in entry)
overlays += inner_entry
+ update_transform()
+
+/mob/living/carbon/human/update_transform()
+ // First, get the correct size.
+ var/desired_scale = icon_scale
+
+ desired_scale *= species.icon_scale
+
+ for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.icon_scale_percent))
+ desired_scale *= M.icon_scale_percent
+
+ // Regular stuff again.
if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
var/matrix/M = matrix()
M.Turn(90)
- M.Scale(size_multiplier)
+ M.Scale(desired_scale)
M.Translate(1,-6)
src.transform = M
else
var/matrix/M = matrix()
- M.Scale(size_multiplier)
- M.Translate(0, 16*(size_multiplier-1))
+ M.Scale(desired_scale)
+ M.Translate(0, 16*(desired_scale-1))
src.transform = M
var/global/list/damage_icon_parts = list()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index fc85f32ede..8c5a000918 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1046,3 +1046,17 @@ default behaviour is:
// Called by job_controller.
/mob/living/proc/equip_post_job()
return
+
+
+/mob/living/update_transform()
+ // First, get the correct size.
+ var/desired_scale = icon_scale
+ for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.icon_scale_percent))
+ desired_scale *= M.icon_scale_percent
+
+ // Now for the regular stuff.
+ var/matrix/M = matrix()
+ M.Scale(desired_scale)
+ M.Translate(0, 16*(desired_scale-1))
+ src.transform = M
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 4e7fa35f32..77811b255d 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -17,10 +17,6 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/show_laws_verb,
/mob/living/silicon/ai/proc/toggle_acceleration,
/mob/living/silicon/ai/proc/toggle_hologram_movement,
- /mob/living/silicon/ai/proc/toggle_hidden_verbs,
-)
-
-var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.com/1172/,
/mob/living/silicon/ai/proc/ai_announcement,
/mob/living/silicon/ai/proc/ai_call_shuttle,
/mob/living/silicon/ai/proc/ai_camera_track,
@@ -808,16 +804,5 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
if(rig)
rig.force_rest(src)
-/mob/living/silicon/ai/proc/toggle_hidden_verbs()
- set name = "Toggle Hidden Verbs"
- set category = "AI Settings"
-
- if(/mob/living/silicon/ai/proc/ai_announcement in verbs)
- src << "Extra verbs toggled off."
- verbs -= ai_verbs_hidden
- else
- src << "Extra verbs toggled on."
- verbs |= ai_verbs_hidden
-
#undef AI_CHECK_WIRELESS
#undef AI_CHECK_RADIO
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e6929e59ae..9333984c30 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -399,6 +399,11 @@
C.toggled = 1
src << "You enable [C.name]."
+/mob/living/silicon/robot/verb/spark_plug() //So you can still sparkle on demand without violence.
+ set category = "Robot Commands"
+ set name = "Emit Sparks"
+ spark_system.start()
+
// this function displays jetpack pressure in the stat panel
/mob/living/silicon/robot/proc/show_jetpack_pressure()
// if you have a jetpack, show the internal tank pressure
@@ -642,7 +647,8 @@
else
if( !(istype(W, /obj/item/device/robotanalyzer) || istype(W, /obj/item/device/healthanalyzer)) )
- spark_system.start()
+ if(W.force > 0)
+ spark_system.start()
return ..()
/mob/living/silicon/robot/attack_hand(mob/user)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 25b7f94dae..f6cc30df93 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -90,6 +90,7 @@
var/assist_distance = 25 // Radius in which I'll ask my comrades for help.
var/supernatural = 0 // If the mob is supernatural (used in null-rod stuff for banishing?)
var/grab_resist = 75 // Chance of me resisting a grab attempt.
+ var/taser_kill = 1 // Is the mob weak to tasers
//Attack ranged settings
var/ranged = 0 // Do I attack at range?
@@ -1446,16 +1447,17 @@
//Shot with taser/stunvolver
/mob/living/simple_animal/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon=null)
- var/stunDam = 0
- var/agonyDam = 0
+ if(taser_kill)
+ var/stunDam = 0
+ var/agonyDam = 0
- if(stun_amount)
- stunDam += stun_amount * 0.5
- adjustFireLoss(stunDam)
+ if(stun_amount)
+ stunDam += stun_amount * 0.5
+ adjustFireLoss(stunDam)
- if(agony_amount)
- agonyDam += agony_amount * 0.5
- adjustFireLoss(agonyDam)
+ if(agony_amount)
+ agonyDam += agony_amount * 0.5
+ adjustFireLoss(agonyDam)
/mob/living/simple_animal/emp_act(severity)
if(!isSynthetic())
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 185e472666..db36755e32 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -535,6 +535,7 @@
if(M != usr) return
if(usr == src) return
if(!Adjacent(usr)) return
+ if(usr.incapacitated(INCAPACITATION_STUNNED | INCAPACITATION_FORCELYING | INCAPACITATION_KNOCKOUT | INCAPACITATION_RESTRAINED)) return //Incapacitated.
if(istype(M,/mob/living/silicon/ai)) return
show_inv(usr)
diff --git a/code/modules/organs/internal/appendix.dm b/code/modules/organs/internal/appendix.dm
index f756b71efa..01d7008a09 100644
--- a/code/modules/organs/internal/appendix.dm
+++ b/code/modules/organs/internal/appendix.dm
@@ -18,6 +18,8 @@
return 0
/obj/item/organ/internal/appendix/process()
+ ..()
+
if(!inflamed || !owner)
return
diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm
index 28fbf62f1e..7dd2bd948e 100644
--- a/code/modules/organs/internal/brain.dm
+++ b/code/modules/organs/internal/brain.dm
@@ -44,21 +44,6 @@
tmp_owner.internal_organs_by_name[organ_tag] = new replace_path(tmp_owner, 1)
tmp_owner = null
-/obj/item/organ/internal/pariah_brain
- name = "brain remnants"
- desc = "Did someone tread on this? It looks useless for cloning or cyborgification."
- organ_tag = "brain"
- parent_organ = BP_HEAD
- icon = 'icons/mob/alien.dmi'
- icon_state = "chitin"
- vital = 1
-
-/obj/item/organ/internal/brain/xeno
- name = "thinkpan"
- desc = "It looks kind of like an enormous wad of purple bubblegum."
- icon = 'icons/mob/alien.dmi'
- icon_state = "chitin"
-
/obj/item/organ/internal/brain/New()
..()
health = config.default_brain_health
@@ -127,6 +112,21 @@
target.key = brainmob.key
..()
+/obj/item/organ/internal/pariah_brain
+ name = "brain remnants"
+ desc = "Did someone tread on this? It looks useless for cloning or cyborgification."
+ organ_tag = "brain"
+ parent_organ = BP_HEAD
+ icon = 'icons/mob/alien.dmi'
+ icon_state = "chitin"
+ vital = 1
+
+/obj/item/organ/internal/brain/xeno
+ name = "thinkpan"
+ desc = "It looks kind of like an enormous wad of purple bubblegum."
+ icon = 'icons/mob/alien.dmi'
+ icon_state = "chitin"
+
/obj/item/organ/internal/brain/slime
name = "slime core"
desc = "A complex, organic knot of jelly and crystalline particles."
diff --git a/code/modules/organs/internal/kidneys.dm b/code/modules/organs/internal/kidneys.dm
index a547a2539f..19652a6376 100644
--- a/code/modules/organs/internal/kidneys.dm
+++ b/code/modules/organs/internal/kidneys.dm
@@ -9,6 +9,7 @@
/obj/item/organ/internal/kidneys/process()
..()
+
if(!owner) return
// Coffee is really bad for you with busted kidneys.
diff --git a/code/modules/organs/internal/organ_internal.dm b/code/modules/organs/internal/organ_internal.dm
index a3fdc511fc..43b3a4c4d7 100644
--- a/code/modules/organs/internal/organ_internal.dm
+++ b/code/modules/organs/internal/organ_internal.dm
@@ -58,5 +58,7 @@
if (prob(3))
take_damage(1,silent=prob(30))
- //if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE, others are handled on each specific organ
- //Nothing that generic internal organs do for this
+ if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE
+ if (prob(50))
+ take_damage(1,silent=prob(15))
+
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index d066a8e802..7e09c5c375 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -91,6 +91,9 @@ var/list/organ_cache = list()
if(owner && vital)
owner.death()
+/obj/item/organ/proc/adjust_germ_level(var/amount) // Unless you're setting germ level directly to 0, use this proc instead
+ germ_level = Clamp(germ_level + amount, 0, INFECTION_LEVEL_MAX)
+
/obj/item/organ/process()
if(loc != owner)
@@ -117,9 +120,9 @@ var/list/organ_cache = list()
if(config.organs_decay) damage += rand(1,3)
if(damage >= max_damage)
damage = max_damage
- germ_level += rand(2,6)
+ adjust_germ_level(rand(2,6))
if(germ_level >= INFECTION_LEVEL_TWO)
- germ_level += rand(2,6)
+ adjust_germ_level(rand(2,6))
if(germ_level >= INFECTION_LEVEL_THREE)
die()
@@ -158,12 +161,12 @@ var/list/organ_cache = list()
owner.adjustToxLoss(infection_damage)
if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
- germ_level--
+ adjust_germ_level(-1)
if (germ_level >= INFECTION_LEVEL_ONE/2)
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
if(antibiotics < 5 && prob(round(germ_level/6)))
- germ_level++
+ adjust_germ_level(1)
if(germ_level >= INFECTION_LEVEL_ONE)
. = 1 //Organ qualifies for effect-specific processing
@@ -179,7 +182,7 @@ var/list/organ_cache = list()
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30)
. = 3 //Organ qualifies for effect-specific processing
- germ_level++ //Germ_level increases without overdose of antibiotics
+ adjust_germ_level(rand(5,10)) //Germ_level increases without overdose of antibiotics
/obj/item/organ/proc/handle_rejection()
// Process unsuitable transplants. TODO: consider some kind of
@@ -193,13 +196,13 @@ var/list/organ_cache = list()
if(rejecting % 10 == 0) //Only fire every ten rejection ticks.
switch(rejecting)
if(1 to 50)
- germ_level++
+ adjust_germ_level(1)
if(51 to 200)
- germ_level += rand(1,2)
+ adjust_germ_level(rand(1,2))
if(201 to 500)
- germ_level += rand(2,3)
+ adjust_germ_level(rand(2,3))
if(501 to INFINITY)
- germ_level += rand(3,5)
+ adjust_germ_level(rand(3,5))
owner.reagents.add_reagent("toxin", rand(1,2))
/obj/item/organ/proc/receive_chem(chemical as obj)
@@ -238,9 +241,11 @@ var/list/organ_cache = list()
if (germ_level < INFECTION_LEVEL_ONE)
germ_level = 0 //cure instantly
else if (germ_level < INFECTION_LEVEL_TWO)
- germ_level -= 6 //at germ_level == 500, this should cure the infection in a minute
+ adjust_germ_level(-6) //at germ_level < 500, this should cure the infection in a minute
+ else if (germ_level < INFECTION_LEVEL_THREE)
+ adjust_germ_level(-2) //at germ_level < 1000, this will cure the infection in 5 minutes
else
- germ_level -= 2 //at germ_level == 1000, this will cure the infection in 5 minutes
+ adjust_germ_level(-1) // You waited this long to get treated, you don't really deserve this organ
//Adds autopsy data for used_weapon.
/obj/item/organ/proc/add_autopsy_data(var/used_weapon, var/damage)
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 990c97b1c2..1de92fe743 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -119,8 +119,8 @@
/obj/item/weapon/pen/reagent/paralysis/New()
..()
- reagents.add_reagent("zombiepowder", 10)
- reagents.add_reagent("cryptobiolin", 15)
+ reagents.add_reagent("zombiepowder", 5)
+ reagents.add_reagent("cryptobiolin", 10)
/*
* Chameleon pen
diff --git a/code/modules/power/grid_checker.dm b/code/modules/power/grid_checker.dm
index b8a123e02f..8127383651 100644
--- a/code/modules/power/grid_checker.dm
+++ b/code/modules/power/grid_checker.dm
@@ -4,6 +4,8 @@
than the alternative."
icon_state = "gridchecker_on"
circuit = /obj/item/weapon/circuitboard/grid_checker
+ density = 1
+ anchored = 1
var/power_failing = FALSE // Turns to TRUE when the grid check event is fired by the Game Master, or perhaps a cheeky antag.
// Wire stuff below.
var/datum/wires/grid_checker/wires
diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm
index fd8e3bf0ca..6100dda029 100644
--- a/code/modules/shieldgen/shield_gen.dm
+++ b/code/modules/shieldgen/shield_gen.dm
@@ -5,7 +5,7 @@
icon_state = "generator0"
var/active = 0
var/field_radius = 3
- var/max_field_radius = 100
+ var/max_field_radius = 150
var/list/field = list()
density = 1
var/locked = 0
@@ -323,4 +323,4 @@
T = locate(gen_turf.x + field_radius, gen_turf.y + y_offset, gen_turf.z)
if (T) out += T
- return out
\ No newline at end of file
+ return out
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 351d2b99a1..c893f77cf1 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -24,6 +24,7 @@ em {font-style: normal;font-weight: bold;}
.ooc .moderator {color: #184880;}
.ooc .developer {color: #1b521f;}
.ooc .admin {color: #b82e00;}
+.ooc .event_manager {color: #660033;}
.ooc .aooc {color: #960018;}
/* Admin: Private Messages */
@@ -36,7 +37,7 @@ em {font-style: normal;font-weight: bold;}
.mod_channel {color: #735638; font-weight: bold;}
.mod_channel .admin {color: #b82e00; font-weight: bold;}
.admin_channel {color: #9611D4; font-weight: bold;}
-.event_channel {color: #009933; font-weight: bold;}
+.event_channel {color: #cc3399; font-weight: bold;}
/* Radio: Misc */
.deadsay {color: #530FAD;}
diff --git a/html/changelogs/Atermonera-AI_verbs.yml b/html/changelogs/Atermonera-AI_verbs.yml
new file mode 100644
index 0000000000..8d2cdeebf8
--- /dev/null
+++ b/html/changelogs/Atermonera-AI_verbs.yml
@@ -0,0 +1,4 @@
+author: Atermonera
+delete-after: True
+changes:
+ - bugfix: "AI verbs are no longer hidden on the tabs."
diff --git a/html/changelogs/Atermonera-incap_inv.yml b/html/changelogs/Atermonera-incap_inv.yml
new file mode 100644
index 0000000000..1b4bc674e8
--- /dev/null
+++ b/html/changelogs/Atermonera-incap_inv.yml
@@ -0,0 +1,4 @@
+author: Atermonera
+delete-after: True
+changes:
+ - bugfix: "Incapacitated mobs can no longer open your inventory and steal your gubbins."
diff --git a/icons/chattags.dmi b/icons/chattags.dmi
index c84c86f6e8..d9e1c62a30 100644
Binary files a/icons/chattags.dmi and b/icons/chattags.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 6d114f1b05..f8bfcf621a 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/turf/flooring/carpet.dmi b/icons/turf/flooring/carpet.dmi
index c917665201..9db7acc72f 100644
Binary files a/icons/turf/flooring/carpet.dmi and b/icons/turf/flooring/carpet.dmi differ
diff --git a/icons/turf/flooring/carpet_old.dmi b/icons/turf/flooring/carpet_old.dmi
new file mode 100644
index 0000000000..c917665201
Binary files /dev/null and b/icons/turf/flooring/carpet_old.dmi differ
diff --git a/icons/turf/flooring/decals.dmi b/icons/turf/flooring/decals.dmi
index c3441b5714..8c8946d7d8 100644
Binary files a/icons/turf/flooring/decals.dmi and b/icons/turf/flooring/decals.dmi differ
diff --git a/icons/turf/flooring/decals_old.dmi b/icons/turf/flooring/decals_old.dmi
new file mode 100644
index 0000000000..c3441b5714
Binary files /dev/null and b/icons/turf/flooring/decals_old.dmi differ
diff --git a/icons/turf/flooring/plating.dmi b/icons/turf/flooring/plating.dmi
index dde6ebfaed..c93b1efbfd 100644
Binary files a/icons/turf/flooring/plating.dmi and b/icons/turf/flooring/plating.dmi differ
diff --git a/icons/turf/flooring/plating_old.dmi b/icons/turf/flooring/plating_old.dmi
new file mode 100644
index 0000000000..dde6ebfaed
Binary files /dev/null and b/icons/turf/flooring/plating_old.dmi differ
diff --git a/icons/turf/flooring/tiles.dmi b/icons/turf/flooring/tiles.dmi
index ed41d5cbfd..0961221efb 100644
Binary files a/icons/turf/flooring/tiles.dmi and b/icons/turf/flooring/tiles.dmi differ
diff --git a/icons/turf/flooring/tiles_old.dmi b/icons/turf/flooring/tiles_old.dmi
new file mode 100644
index 0000000000..ed41d5cbfd
Binary files /dev/null and b/icons/turf/flooring/tiles_old.dmi differ
diff --git a/maps/northern_star/northern_star_shuttles.dm b/maps/northern_star/northern_star_shuttles.dm
index 44a5e1a5bd..5a13baf071 100644
--- a/maps/northern_star/northern_star_shuttles.dm
+++ b/maps/northern_star/northern_star_shuttles.dm
@@ -213,6 +213,8 @@
warmup_time = 0
origin = /area/syndicate_station/start
interim = /area/syndicate_station/transit
+ can_cloak = TRUE
+ cloaked = TRUE
start_location = "Mercenary Base"
destinations = list(
"Northwest of the station" = /area/syndicate_station/northwest,
@@ -243,6 +245,8 @@
warmup_time = 0
origin = /area/skipjack_station/start
interim = /area/skipjack_station/transit
+ can_cloak = TRUE
+ cloaked = TRUE
destinations = list(
"Fore Starboard Solars" = /area/skipjack_station/northeast_solars,
"Fore Port Solars" = /area/skipjack_station/northwest_solars,
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index 9204eb5c68..fa4de7c3ce 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -6300,7 +6300,7 @@
"crh" = (/obj/structure/table/rack{dir = 4},/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
"cri" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
"crj" = (/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
-"crk" = (/obj/structure/closet/crate,/obj/item/stack/material/gold,/obj/item/weapon/storage/belt/champion,/turf/simulated/floor/tiled/dark,/area/security/nuke_storage)
+"crk" = (/obj/structure/closet/crate,/obj/item/stack/material/silver,/obj/item/stack/material/silver,/obj/item/stack/material/silver,/obj/item/stack/material/gold,/obj/item/stack/material/gold,/obj/item/stack/material/gold,/obj/item/weapon/storage/belt/champion,/turf/simulated/floor/tiled/dark,/area/security/nuke_storage)
"crl" = (/obj/structure/closet/secure_closet/freezer/money,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/item/weapon/storage/secure/briefcase/money{desc = "An sleek tidy briefcase."; name = "secure briefcase"},/obj/structure/cable,/turf/simulated/floor/tiled/dark,/area/security/nuke_storage)
"crm" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/tiled/dark,/area/security/nuke_storage)
"crn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/maintenance/medbay_aft)
diff --git a/maps/southern_cross/southern_cross-2.dmm b/maps/southern_cross/southern_cross-2.dmm
index 6b220e6596..4620ebe7ae 100644
--- a/maps/southern_cross/southern_cross-2.dmm
+++ b/maps/southern_cross/southern_cross-2.dmm
@@ -258,3 +258,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/maps/southern_cross/structures/closets/medical.dm b/maps/southern_cross/structures/closets/medical.dm
index 07b647df84..258a724ac1 100644
--- a/maps/southern_cross/structures/closets/medical.dm
+++ b/maps/southern_cross/structures/closets/medical.dm
@@ -25,7 +25,7 @@
new /obj/item/clothing/gloves/sterile/latex(src)
new /obj/item/device/radio/headset/heads/cmo/alt(src)
new /obj/item/device/flash(src)
- new /obj/item/weapon/reagent_containers/hypospray(src)
+ new /obj/item/weapon/reagent_containers/hypospray/vial(src)
new /obj/item/weapon/storage/box/freezer(src)
new /obj/item/clothing/mask/gas(src)
return
diff --git a/nano/templates/atmos_control.tmpl b/nano/templates/atmos_control.tmpl
index 3d2a1203f7..ac50e3fbdf 100644
--- a/nano/templates/atmos_control.tmpl
+++ b/nano/templates/atmos_control.tmpl
@@ -1,10 +1,10 @@
{{if data.map_levels.length}}