diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm
index 9aa16f91b5..79b3aa6540 100644
--- a/code/_helpers/game.dm
+++ b/code/_helpers/game.dm
@@ -175,10 +175,12 @@
L |= I
else if(istype(I,/obj/))
- if(!sight_check || isInSight(I, O))
- L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
- if(include_objects)
- L |= I
+ var/obj/check_obj = I
+ if(check_obj.show_messages)
+ if(!sight_check || isInSight(I, O))
+ L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
+ if(include_objects)
+ L |= I
return L
@@ -203,7 +205,8 @@
hear += M
else if(istype(I,/obj/))
hear |= recursive_content_check(I, hear, 3, 1, 0, include_mobs, include_objects)
- if(include_objects)
+ var/obj/O = I
+ if(O.show_messages && include_objects)
hear += I
return hear
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index d2cd41a940..4b4b129278 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -57,7 +57,7 @@ var/global/list/undershirt_t = list(
"White tank top" = "u1", "Black tank top" = "u2", "Black shirt" = "u3",
"White shirt" = "u4", "White shirt 2" = "shirt_white_s", "White tank top 2" = "tank_white_s",
"Black shirt 2" = "shirt_black_s", "Grey shirt" = "shirt_grey_s", "Heart shirt" = "lover_s",
- "I love NT shirt" = "ilovent_s", "White shortsleeve shirt" = "whiteshortsleeve_s", "Purple shirtsleeve shirt" = "purpleshortsleeve_s",
+ "I love NT shirt" = "ilovent_s", "White shortsleeve shirt" = "whiteshortsleeve_s", "Purple shortsleeve shirt" = "purpleshortsleeve_s",
"Blue shortsleeve shirt" = "blueshortsleeve_s", "Green shortsleeve shirt" = "greenshortsleeve_s", "Black shortsleeve shirt" = "blackshortsleeve_s",
"Blue shirt" = "blueshirt_s", "Red shirt" = "redshirt_s", "Yellow shirt" = "yellowshirt_s", "Green shirt" = "greenshirt_s",
"Blue polo shirt" = "bluepolo_s", "Red polo shirt" = "redpolo_s", "White polo shirt" = "whitepolo_s",
@@ -76,6 +76,7 @@ var/global/list/socks_t = list(
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
+var/global/list/pdachoicelist = list("Default", "Slim", "Old")
var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg)
// Visual nets
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 5d9a364871..c058e2ff5d 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -61,6 +61,9 @@
//put this here for easier tracking ingame
var/datum/money_account/initial_account
+
+ //used for antag tcrystal trading, more info in code\game\objects\items\telecrystals.dm
+ var/accept_tcrystals = 0
/datum/mind/New(var/key)
src.key = key
diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm
index 55d865b9fa..4c071130ad 100644
--- a/code/game/antagonist/outsider/mercenary.dm
+++ b/code/game/antagonist/outsider/mercenary.dm
@@ -44,9 +44,10 @@ var/datum/antagonist/mercenary/mercs
player.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(player.back), slot_in_backpack)
player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack)
player.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT
+ player.mind.accept_tcrystals = 1
if (player.mind == leader)
- var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, 40)
+ var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT)
player.put_in_hands(U)
player.update_icons()
diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm
index 1eb372d118..dcc7fa9df9 100644
--- a/code/game/antagonist/station/traitor.dm
+++ b/code/game/antagonist/station/traitor.dm
@@ -82,6 +82,7 @@ var/datum/antagonist/traitor/traitors
spawn_uplink(traitor_mob)
traitor_mob.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT
+ traitor_mob.mind.accept_tcrystals = 1
// Tell them about people they might want to contact.
var/mob/living/carbon/human/M = get_nt_opposed()
if(M && M != traitor_mob)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 9f8fe69202..109eeaf501 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -437,7 +437,7 @@ its easier to just keep the beam vertical.
return 0
/atom/proc/checkpass(passflag)
- return pass_flags&passflag
+ return (pass_flags&passflag)
/atom/proc/isinspace()
if(istype(get_turf(src), /turf/space))
@@ -455,10 +455,10 @@ its easier to just keep the beam vertical.
for(var/I in see)
if(isobj(I))
- spawn(0)
- if(I) //It's possible that it could be deleted in the meantime.
- var/obj/O = I
- O.show_message( message, 1, blind_message, 2)
+ //spawn(0)
+ //if(I) //It's possible that it could be deleted in the meantime.
+ var/obj/O = I
+ O.show_message( message, 1, blind_message, 2)
else if(ismob(I))
var/mob/M = I
if(M.see_invisible >= invisibility) // Cannot view the invisible
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 501ec06629..d34acd5d2d 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -35,6 +35,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED
name = "\improper AI holopad"
desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely."
icon_state = "holopad0"
+ show_messages = 1
layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them.
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 240aa6783e..3aa221400b 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -206,7 +206,7 @@
else if(success)
user << "You put some things in [S]."
else
- user << "You fail to pick anything up with [S]."
+ user << "You fail to pick anything up with \the [S]."
else if(S.can_be_inserted(src))
S.handle_item_insertion(src)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 1935455f94..766a8cb2a9 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -13,6 +13,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
slot_flags = SLOT_ID | SLOT_BELT
//Main variables
+ var/pdachoice = 3
var/owner = null
var/default_cartridge = 0 // Access level defined by cartridge
var/obj/item/weapon/cartridge/cartridge = null //current cartridge
@@ -309,13 +310,22 @@ var/global/list/obj/item/device/pda/PDAs = list()
* The Actual PDA
*/
-/obj/item/device/pda/New()
+/obj/item/device/pda/New(var/mob/living/carbon/human/H)
..()
PDAs += src
PDAs = sortAtom(PDAs)
if(default_cartridge)
cartridge = new default_cartridge(src)
new /obj/item/weapon/pen(src)
+ pdachoice = isnull(H) ? 1 : (ishuman(H) ? H.pdachoice : 1)
+ switch(pdachoice)
+ if(1) icon = 'icons/obj/pda.dmi'
+ if(2) icon = 'icons/obj/pda_slim.dmi'
+ if(3) icon = 'icons/obj/pda_old.dmi'
+ else
+ icon = 'icons/obj/pda_old.dmi'
+ log_debug("Invalid switch for PDA, defaulting to old PDA icons. [pdachoice] chosen.")
+
/obj/item/device/pda/proc/can_use()
@@ -869,7 +879,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
overlays.Cut()
if(new_message || new_news)
- overlays += image('icons/obj/pda.dmi', "pda-r")
+ overlays += image(icon, "pda-r")
/obj/item/device/pda/proc/detonate_act(var/obj/item/device/pda/P)
//TODO: sometimes these attacks show up on the message server
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 356ee87f60..29c8377d43 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -5,6 +5,8 @@
item_state = "electronic"
w_class = 2.0
slot_flags = SLOT_BELT
+ show_messages = 1
+
var/flush = null
origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index 58457d55bd..11cc3a58a8 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -12,6 +12,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
icon_state = "communicator"
w_class = 2.0
slot_flags = SLOT_ID | SLOT_BELT
+ show_messages = 1
origin_tech = list(TECH_ENGINEERING = 2, TECH_MAGNET = 2, TECH_BLUESPACE = 2, TECH_DATA = 2)
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm
index 1b087f1791..92515407d0 100644
--- a/code/game/objects/items/devices/floor_painter.dm
+++ b/code/game/objects/items/devices/floor_painter.dm
@@ -6,7 +6,7 @@
var/decal = "remove all decals"
var/paint_dir = "precise"
- var/paint_colour = "white"
+ var/paint_colour = "#FFFFFF"
var/list/decals = list(
"quarter-turf" = list("path" = /obj/effect/floor_decal/corner, "precise" = 1, "coloured" = 1),
@@ -39,37 +39,6 @@
"northeast" = NORTHEAST,
"precise" = 0
)
- var/list/paint_colours = list(
- "white" = COLOR_WHITE,
- "light gray" = COLOR_SILVER,
- "dark gray" = COLOR_GRAY,
- "blue-gray" = COLOR_BLUE_GRAY,
- "pale blue-gray" = COLOR_PALE_BLUE_GRAY,
- "green-gray" = COLOR_GREEN_GRAY,
- "pale green-gray" = COLOR_PALE_GREEN_GRAY,
- "red-gray" = COLOR_RED_GRAY,
- "pale red-gray" = COLOR_PALE_RED_GRAY,
- "purple-gray" = COLOR_PURPLE_GRAY,
- "pale purple-gray" = COLOR_PALE_PURPLE_GRAY,
- "black" = COLOR_BLACK,
- "red" = COLOR_RED,
- "dark red" = COLOR_MAROON,
- "yellow" = COLOR_YELLOW,
- "dark yellow" = COLOR_OLIVE,
- "green" = COLOR_LIME,
- "dark green" = COLOR_GREEN,
- "cyan" = COLOR_CYAN,
- "teal" = COLOR_TEAL,
- "blue" = COLOR_BLUE,
- "dark blue" = COLOR_NAVY,
- "magenta" = COLOR_PINK,
- "purple" = COLOR_PURPLE,
- "orange" = COLOR_ORANGE,
- "dark orange" = COLOR_DARK_ORANGE,
- "dark brown" = COLOR_DARK_BROWN,
- "brown" = COLOR_BROWN,
- "pale brown" = COLOR_BEIGE
- )
/obj/item/device/floor_painter/afterattack(var/atom/A, var/mob/user, proximity, params)
if(!proximity)
@@ -127,36 +96,25 @@
painting_dir = paint_dirs[paint_dir]
var/painting_colour
- if(paint_colour && !isnull(paint_colours[paint_colour]) && decal_data["coloured"])
- painting_colour = paint_colours[paint_colour]
+ if(decal_data["coloured"] && paint_colour)
+ painting_colour = paint_colour
new painting_decal(F, painting_dir, painting_colour)
-/obj/item/device/floor_painter/attack_self(mob/user as mob)
-
+/obj/item/device/floor_painter/attack_self(var/mob/user)
var/choice = input("Do you wish to change the decal type, paint direction, or paint colour?") as null|anything in list("Decal","Direction", "Colour")
-
if(choice == "Decal")
- var/new_decal = input("Select a decal.") as null|anything in decals
- if(new_decal && !isnull(decals[new_decal]))
- decal = new_decal
- user << "You set \the [src] decal to '[decal]'."
+ choose_decal()
else if(choice == "Direction")
- var/new_dir = input("Select a direction.") as null|anything in paint_dirs
- if(new_dir && !isnull(paint_dirs[new_dir]))
- paint_dir = new_dir
- user << "You set \the [src] direction to '[paint_dir]'."
+ choose_direction()
else if(choice == "Colour")
- var/new_colour = input("Select a colour.") as null|anything in paint_colours
- if(new_colour && !isnull(paint_colours[new_colour]))
- paint_colour = new_colour
- user << "You set \the [src] colour to '[paint_colour]'."
+ choose_colour()
/obj/item/device/floor_painter/examine(mob/user)
..(user)
user << "It is configured to produce the '[decal]' decal with a direction of '[paint_dir]' using [paint_colour] paint."
-/obj/item/device/floor_painter/verb/choose_colour(new_colour in paint_colours)
+/obj/item/device/floor_painter/verb/choose_colour()
set name = "Choose Colour"
set desc = "Choose a floor painter colour."
set category = "Object"
@@ -164,12 +122,12 @@
if(usr.incapacitated())
return
-
- if(new_colour && !isnull(paint_colours[new_colour]))
+ var/new_colour = input(usr, "Choose a colour.", "Floor painter", paint_colour) as color|null
+ if(new_colour && new_colour != paint_colour)
paint_colour = new_colour
- usr << "You set \the [src] colour to '[paint_colour]'."
+ usr << "You set \the [src] to paint with a new colour."
-/obj/item/device/floor_painter/verb/choose_decal(new_decal in decals)
+/obj/item/device/floor_painter/verb/choose_decal()
set name = "Choose Decal"
set desc = "Choose a floor painter decal."
set category = "Object"
@@ -178,11 +136,12 @@
if(usr.incapacitated())
return
+ var/new_decal = input("Select a decal.") as null|anything in decals
if(new_decal && !isnull(decals[new_decal]))
decal = new_decal
usr << "You set \the [src] decal to '[decal]'."
-/obj/item/device/floor_painter/verb/choose_direction(new_dir in paint_dirs)
+/obj/item/device/floor_painter/verb/choose_direction()
set name = "Choose Direction"
set desc = "Choose a floor painter direction."
set category = "Object"
@@ -191,6 +150,7 @@
if(usr.incapacitated())
return
+ var/new_dir = input("Select a direction.") as null|anything in paint_dirs
if(new_dir && !isnull(paint_dirs[new_dir]))
paint_dir = new_dir
usr << "You set \the [src] direction to '[paint_dir]'."
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 67516404fd..fa2a8d4864 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -6,6 +6,8 @@
w_class = 2.0
slot_flags = SLOT_BELT
origin_tech = list(TECH_DATA = 2)
+ show_messages = 1
+
var/obj/item/device/radio/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 16c810a8a0..da19137043 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -44,6 +44,7 @@ var/global/list/default_medbay_channels = list(
throw_speed = 2
throw_range = 9
w_class = 2
+ show_messages = 1
matter = list("glass" = 25,DEFAULT_WALL_MATERIAL = 75)
var/const/FREQ_LISTENING = 1
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 25276b3c87..a4644e274f 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -133,7 +133,7 @@ REAGENT SCANNER
else if (M.getBrainLoss() >= 100 || !M.has_brain())
user.show_message("Subject is brain dead.")
else if (M.getBrainLoss() >= 60)
- user.show_message("Severe brain damage detected. Subject likely to have mental retardation.")
+ user.show_message("Severe brain damage detected. Subject likely to have a traumatic brain injury!.")
else if (M.getBrainLoss() >= 10)
user.show_message("Significant brain damage detected. Subject may have had a concussion.")
if(ishuman(M))
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index e59d3e993b..2740831046 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -15,10 +15,12 @@
var/list/storedinfo = new/list()
var/list/timestamp = new/list()
var/canprint = 1
+
flags = CONDUCT
throwforce = 2
throw_speed = 4
throw_range = 20
+ show_messages = 1
/obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg, var/verb="says", datum/language/speaking=null)
if(recording)
diff --git a/code/game/objects/items/devices/telecrystal.dm b/code/game/objects/items/devices/telecrystal.dm
new file mode 100644
index 0000000000..089f0677ae
--- /dev/null
+++ b/code/game/objects/items/devices/telecrystal.dm
@@ -0,0 +1,20 @@
+/*
+Telecrystal item
+Does nothing if not suitable antag type, checks for accept_tcrystals = 1 in a mob's mind.
+For new antags, make sure to add "player.mind.accept_tcrystals = 1" if you want tradable tcrystals.
+*/
+/obj/item/device/telecrystal
+ name = "red crystal"
+ desc = "A strange, red, glowing crystal."
+ icon = 'icons/obj/stock_parts.dmi'
+ icon_state = "telecrystal"
+ item_state = "telecrystal"
+ force = 5
+
+/obj/item/device/telecrystal/attack_self(mob/user as mob)
+ if(user.mind.accept_tcrystals) //Checks to see if antag type allows for tcrystals
+ user.mind.tcrystals += 1
+ user.drop_from_inventory(src)
+ qdel(src)
+ return
+
\ No newline at end of file
diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm
index 377dad5f17..38811833cd 100644
--- a/code/game/objects/items/devices/uplink_items.dm
+++ b/code/game/objects/items/devices/uplink_items.dm
@@ -385,6 +385,12 @@ datum/uplink_item/dd_SortValue()
item_cost = 3
path = /obj/item/weapon/storage/secure/briefcase/money
desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
+
+/datum/uplink_item/item/tools/crystal
+ name = "Tradable Crystal"
+ item_cost = 1
+ path = /obj/item/device/telecrystal
+ desc = "A telecrystal that can be transferred from one user to another. Be sure not to give it to just anyone."
/***********
* Implants *
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 22d12f9fd8..e2ec23be7c 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -14,9 +14,9 @@
matter = list(DEFAULT_WALL_MATERIAL = 90)
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
- var/spray_particles = 6
- var/spray_amount = 2 //units of liquid per particle
- var/max_water = 240
+ var/spray_particles = 3
+ var/spray_amount = 10 //units of liquid per particle
+ var/max_water = 300
var/last_use = 1.0
var/safety = 1
var/sprite_name = "fire_extinguisher"
@@ -30,8 +30,8 @@
throwforce = 2
w_class = 2.0
force = 3.0
- max_water = 120
- spray_particles = 5
+ max_water = 150
+ spray_particles = 3
sprite_name = "miniFE"
/obj/item/weapon/extinguisher/New()
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 78665633cf..3cb92b0a3c 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -9,6 +9,8 @@
name = "storage"
icon = 'icons/obj/storage.dmi'
w_class = 3
+ show_messages = 1
+
var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else)
var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set)
var/list/is_seeing = new/list() //List of mobs which are currently seeing the contents of this item's storage
@@ -225,7 +227,7 @@
/obj/item/weapon/storage/proc/can_be_inserted(obj/item/W as obj, stop_messages = 0)
if(!istype(W)) return //Not an item
- if(!usr.canUnEquip(W))
+ if(usr.isEquipped(W) && !usr.canUnEquip(W))
return 0
if(src.loc == W)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 8b4e93ec4d..f94f2d5313 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -14,6 +14,7 @@
var/damtype = "brute"
var/force = 0
var/armor_penetration = 0
+ var/show_messages
/obj/Destroy()
processing_objects -= src
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 6fdf367d5d..8c0b7aaa25 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -138,7 +138,7 @@
/obj/structure/sign/kiddieplaque
name = "\improper AI developers plaque"
- desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be retarded. Beneath the image, someone has scratched the word \"PACKETS\""
+ desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be developmentally disabled. Beneath the image, someone has scratched the word \"PACKETS\""
icon_state = "kiddieplaque"
/obj/structure/sign/atmosplaque
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 19302f8d30..256eef4e05 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -195,7 +195,8 @@ var/list/admin_verbs_debug = list(
/client/proc/Jump,
/client/proc/jumptomob,
/client/proc/jumptocoord,
- /client/proc/dsay
+ /client/proc/dsay,
+ /client/proc/admin_ghost /*allows us to ghost/reenter body at will*/
)
var/list/admin_verbs_paranoid_debug = list(
@@ -305,7 +306,9 @@ var/list/admin_verbs_mod = list(
/client/proc/check_antagonists,
/client/proc/jobbans,
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
- /datum/admins/proc/paralyze_mob
+ /datum/admins/proc/paralyze_mob,
+ /client/proc/cmd_admin_direct_narrate,
+ /client/proc/allow_character_respawn /* Allows a ghost to respawn */
)
var/list/admin_verbs_mentor = list(
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 9d9919e4ed..83a2f3b370 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -290,7 +290,7 @@
- [M_name] - [M_rname] - [M_key] ([M_job])
+ [M_name] - [M_rname] - [M_key] ([M_job])
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index e9772fe907..014cd8988f 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -123,7 +123,7 @@
set name = "Direct Narrate"
if(!holder)
- src << "Only administrators may use this command."
+ src << "Only administrators and moderators may use this command."
return
if(!M)
@@ -256,9 +256,9 @@ Ccomp's first proc.
/client/proc/allow_character_respawn()
set category = "Special Verbs"
set name = "Allow player to respawn"
- set desc = "Let's the player bypass the 30 minute wait to respawn or allow them to re-enter their corpse."
+ set desc = "Let's the player bypass the 15 minute wait to respawn or allow them to re-enter their corpse."
if(!holder)
- src << "Only administrators may use this command."
+ src << "Only administrators and moderators may use this command."
var/list/ghosts= get_ghosts(1,1)
var/target = input("Please, select a ghost!", "COME BACK TO LIFE!", null, null) as null|anything in ghosts
diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm
index 6139f30a1b..e4a0eba8e1 100644
--- a/code/modules/client/preference_setup/general/04_equipment.dm
+++ b/code/modules/client/preference_setup/general/04_equipment.dm
@@ -7,6 +7,7 @@
S["undershirt"] >> pref.undershirt
S["socks"] >> pref.socks
S["backbag"] >> pref.backbag
+ S["pdachoice"] >> pref.pdachoice
S["gear"] >> pref.gear
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
@@ -14,10 +15,12 @@
S["undershirt"] << pref.undershirt
S["socks"] << pref.socks
S["backbag"] << pref.backbag
+ S["pdachoice"] << pref.pdachoice
S["gear"] << pref.gear
/datum/category_item/player_setup_item/general/equipment/sanitize_character()
pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag))
+ pref.pdachoice = sanitize_integer(pref.pdachoice, 1, pdachoicelist.len, initial(pref.pdachoice))
if(!islist(pref.gear)) pref.gear = list()
@@ -48,6 +51,7 @@
. += "Undershirt: [get_key_by_value(undershirt_t,pref.undershirt)]
"
. += "Socks: [get_key_by_value(socks_t,pref.socks)]
"
. += "Backpack Type: [backbaglist[pref.backbag]]
"
+ . += "PDA Type: [pdachoicelist[pref.pdachoice]]
"
. += "
Custom Loadout:
"
var/total_cost = 0
@@ -109,6 +113,12 @@
pref.backbag = backbaglist.Find(new_backbag)
return TOPIC_REFRESH
+ else if(href_list["change_pda"])
+ var/new_pdachoice = input(user, "Choose your character's style of PDA:", "Character Preference", pdachoicelist[pref.pdachoice]) as null|anything in pdachoicelist
+ if(!isnull(new_pdachoice) && CanUseTopic(user))
+ pref.pdachoice = pdachoicelist.Find(new_pdachoice)
+ return TOPIC_REFRESH
+
else if(href_list["add_loadout"])
var/total_cost = 0
for(var/gear_name in pref.gear)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index ab3778b828..e019291adc 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -34,6 +34,7 @@ datum/preferences
var/undershirt //undershirt type
var/socks //socks type
var/backbag = 2 //backpack type
+ var/pdachoice = 3 //PDA type
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
var/g_hair = 0 //Hair color
@@ -340,6 +341,10 @@ datum/preferences
backbag = 1 //Same as above
character.backbag = backbag
+ if(pdachoice > 3 || pdachoice < 1)
+ pdachoice = 1
+ character.pdachoice = pdachoice
+
character.update_body()
/datum/preferences/proc/open_load_dialog(mob/user)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index feb9ee8d01..d2f11e27a8 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -516,6 +516,8 @@ BLIND // can't see anything
slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
w_class = 3
+ show_messages = 1
+
var/has_sensor = 1 //For the crew computer 2 = unable to change mode
var/sensor_mode = 0
/*
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index a4877bb65d..2342010ce6 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -3,6 +3,8 @@
desc = "Used to hold things when you don't have enough hands."
icon_state = "webbing"
slot = "utility"
+ show_messages = 1
+
var/slots = 3
var/obj/item/weapon/storage/internal/hold
w_class = 3.0
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index b870b49d59..4ad336aa26 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -68,8 +68,8 @@
/obj/item/clothing/under/shorts/jeans/black
name = "black jeans shorts"
- icon_state = "black_shorts"
- worn_state = "black_shorts"
+ icon_state = "blackpants_shorts"
+ worn_state = "blackpants_shorts"
/obj/item/clothing/under/shorts/jeans/black/female
icon_state = "black_shorts_f"
@@ -78,9 +78,9 @@
/obj/item/clothing/under/shorts/khaki
name = "khaki shorts"
desc = "For that island getaway. It's five o'clock somewhere, right?"
- icon_state = "khaki_shorts"
- worn_state = "khaki_shorts"
+ icon_state = "tanpants_shorts"
+ worn_state = "tanpants_shorts"
/obj/item/clothing/under/shorts/khaki/female
icon_state = "khaki_shorts_f"
- worn_state = "khaki_shorts_f"
\ No newline at end of file
+ worn_state = "khaki_shorts_f"
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 3e8592e9d0..d5f65385bf 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -27,16 +27,20 @@ var/list/holder_mob_icon_cache = list()
..()
/obj/item/weapon/holder/process()
+ update_state()
+/obj/item/weapon/holder/dropped()
+ ..()
+ spawn(1)
+ update_state()
+
+/obj/item/weapon/proc/update_state()
if(istype(loc,/turf) || !(contents.len))
-
for(var/mob/M in contents)
-
var/atom/movable/mob_container
mob_container = M
mob_container.forceMove(get_turf(src))
M.reset_view()
-
qdel(src)
/obj/item/weapon/holder/proc/sync(var/mob/living/M)
@@ -79,17 +83,23 @@ var/list/holder_mob_icon_cache = list()
//Mob procs and vars for scooping up
/mob/living/var/holder_type
-/mob/living/proc/get_scooped(var/mob/living/carbon/grabber)
+/mob/living/proc/get_scooped(var/mob/living/carbon/grabber, var/self_grab)
+
if(!holder_type || buckled || pinned.len)
return
- var/obj/item/weapon/holder/H = new holder_type(loc)
- src.loc = H
- H.name = loc.name
- H.attack_hand(grabber)
+ var/obj/item/weapon/holder/H = new holder_type(get_turf(src))
+ src.forceMove(H)
+ grabber.put_in_hands(H)
+
+ if(self_grab)
+ grabber << "\The [src] clambers onto you!"
+ src << "You climb up onto \the [grabber]!"
+ grabber.equip_to_slot_if_possible(H, slot_back, 0, 1)
+ else
+ grabber << "You scoop up \the [src]!"
+ src << "\The [grabber] scoops you up!"
- grabber << "You scoop up [src]."
- src << "[grabber] scoops you up."
grabber.status_flags |= PASSEMOTES
H.sync(src)
return H
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index b2e8c3ca0e..c998ad1bd0 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -216,19 +216,20 @@ var/list/slot_equipment_priority = list( \
wear_mask = null
update_inv_wear_mask(0)
return
+
+/mob/proc/isEquipped(obj/item/I)
+ if(!I)
+ return 0
+ return get_inventory_slot(I) != 0
/mob/proc/canUnEquip(obj/item/I)
if(!I) //If there's nothing to drop, the drop is automatically successful.
return 1
var/slot = get_inventory_slot(I)
- if(slot && !I.mob_can_unequip(src, slot))
- return 0
-
- drop_from_inventory(I)
- return 1
+ return slot && I.mob_can_unequip(src, slot)
/mob/proc/get_inventory_slot(obj/item/I)
- var/slot
+ var/slot = 0
for(var/s in slot_back to slot_tie) //kind of worries me
if(get_equipped_item(s) == I)
slot = s
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a45f378ab4..50e0418766 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -235,8 +235,8 @@
M.visible_message("[M] tries to pat out [src]'s flames!",
"You try to pat out [src]'s flames! Hot!")
if(do_mob(M, src, 15))
+ src.fire_stacks -= 0.5
if (prob(10) && (M.fire_stacks <= 0))
- src.fire_stacks -= 0.5
M.fire_stacks += 1
M.IgniteMob()
if (M.on_fire)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 4495ed4175..17fe2df713 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1372,8 +1372,8 @@
/mob/living/carbon/human/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
- if(holder_type && a_intent == "help" && istype(H) && H.a_intent == "help" && !issmall(H) && Adjacent(H))
- get_scooped(H)
+ if(holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H))
+ get_scooped(H, (usr == src))
return
return ..()
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 78dbee0552..22acad9445 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -36,6 +36,7 @@
var/undershirt = 0 //Which undershirt the player wants.
var/socks = 0 //Which socks the player wants.
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
+ var/pdachoice = 1 //Which PDA type the player has chosen. Default, Slim, or Old.
// General information
var/home_system = ""
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index e19795b641..5b79cde5de 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -274,9 +274,6 @@
O.owner = H
/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target)
- if (target.holder_type && target.a_intent == "help" && H.a_intent == "help")
- target.get_scooped(H)
- return
var/t_him = "them"
switch(target.gender)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 579ec2e6d6..f2974d8a16 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -413,8 +413,8 @@
return 0
// Handle being picked up.
-/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber)
- var/obj/item/weapon/holder/H = ..()
+/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber, var/self_drop)
+ var/obj/item/weapon/holder/H = ..(grabber, self_drop)
if(!istype(H))
return
H.icon_state = "pai-[icon_state]"
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 302b8eb101..a23d328bd3 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -313,6 +313,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/device/pipe_painter(src)
+ src.modules += new /obj/item/device/floor_painter(src)
var/datum/matter_synth/metal = new /datum/matter_synth/metal()
var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel()
@@ -353,6 +354,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/analyzer(src)
src.modules += new /obj/item/taperoll/engineering(src)
src.modules += new /obj/item/weapon/gripper(src)
+ src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.emag = new /obj/item/borg/stun(src)
@@ -676,6 +678,8 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/soap(src)
src.modules += new /obj/item/weapon/extinguisher(src)
+ src.modules += new /obj/item/device/pipe_painter(src)
+ src.modules += new /obj/item/device/floor_painter(src)
robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += robot.internals
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 7c25296a5e..c55939e6ae 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -135,11 +135,6 @@
else
return ..()
-/mob/living/simple_animal/cat/get_scooped(var/mob/living/carbon/grabber)
- if (stat >= DEAD)
- return //since the holder icon looks like a living cat
- ..()
-
//Basic friend AI
/mob/living/simple_animal/cat/fluff
var/mob/living/carbon/human/friend
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 0ea2a05dd4..37630abdb6 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -89,11 +89,6 @@
else
return ..()
-/mob/living/simple_animal/mouse/get_scooped(var/mob/living/carbon/grabber)
- if (stat >= DEAD)
- return
- ..()
-
/mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things
src << "You are too small to pull anything."
return
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index e6a0b277f6..6facb98164 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -88,10 +88,10 @@
for(var/I in see)
if(isobj(I))
- spawn(0)
- if(I) //It's possible that it could be deleted in the meantime.
- var/obj/O = I
- O.show_message( message, 1, blind_message, 2)
+ //spawn(0)
+ //if(I) //It's possible that it could be deleted in the meantime.
+ var/obj/O = I
+ O.show_message( message, 1, blind_message, 2)
else if(ismob(I))
var/mob/M = I
if(self_message && M==src)
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 6621e0f102..575ded6138 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -216,7 +216,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Transfers blood from reagents to vessel, respecting blood types compatability.
/mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount)
- if(should_have_organ(O_HEART))
+ if(!should_have_organ(O_HEART))
reagents.add_reagent("blood", amount, injected.data)
reagents.update_total()
return
diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt
deleted file mode 100644
index 24ccd10bf0..0000000000
--- a/config/admin_ranks.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-########################################################################################
-# ADMIN RANK DEFINES #
-# The format of this is very simple. Rank name goes first. #
-# Rank is CASE-SENSITIVE, all punctuation will be stripped so spaces don't matter. #
-# Each rank is then followed by keywords with the prefix "+". #
-# These keywords represent groups of verbs and abilities which are given to that rank. #
-# +@ (or +prev) is a special shorthand which adds all the rights of the rank above it. #
-# Ranks with no keywords will just be given the most basic verbs and abilities ~Carn #
-########################################################################################
-# PLEASE NOTE: depending on config options, some abilities will be unavailable regardless if you have permission to use them!
-# ALSO NOTE: this is a WorkInProgress at the moment. Most of this is just arbitrarily thrown in whatever group because LoadsaWork2Do+LittleTime.
-# I'll be doing more moving around as feedback comes in. So be sure to check the notes after updates.
-
-# KEYWORDS:
-# +ADMIN = general admin tools, verbs etc
-# +FUN = events, other event-orientated actions. Access to the fun secrets in the secrets panel.
-# +BAN = the ability to ban, jobban and fullban
-# +STEALTH = the ability to stealthmin (make yourself appear with a fake name to everyone but other admins
-# +POSSESS = the ability to possess objects
-# +REJUV (or +REJUVINATE) = the ability to heal, respawn, modify damage and use godmode
-# +BUILD (or +BUILDMODE) = the ability to use buildmode
-# +SERVER = higher-risk admin verbs and abilities, such as those which affect the server configuration.
-# +DEBUG = debug tools used for diagnosing and fixing problems. It's useful to give this to coders so they can investigate problems on a live server.
-# +VAREDIT = everyone may view viewvars/debugvars/whatever you call it. This keyword allows you to actually EDIT those variables.
-# +RIGHTS (or +PERMISSIONS) = allows you to promote and/or demote people.
-# +SOUND (or +SOUNDS) = allows you to upload and play sounds
-# +SPAWN (or +CREATE) = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too)
-# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag
-
-Moderator +MOD
-Admin Candidate +ADMIN
-Trial Admin +@ +SPAWN +REJUV +VAREDIT +BAN #left for readability
-Badmin +@ +POSSESS +BUILDMODE +SERVER +FUN #left for readability
-Game Admin +@ +STEALTH +SOUNDS +DEBUG
-Retired Admin +ADMIN +STEALTH
-
-Host +EVERYTHING
-Head Admin +EVERYTHING
-Head Developer +EVERYTHING
-
-Developer +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE
-Dev Mod +@ +MOD
-
diff --git a/html/changelog.html b/html/changelog.html
index 38baf19051..ee8d18875d 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -1,7 +1,7 @@