diff --git a/.gitignore b/.gitignore
index 355a363b..12d7d356 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,4 @@ data/investigate/gravity.html
data/investigate/gravity.html
data/investigate/gravity.html
data/investigate/gravity.html
+data/investigate/gravity.html
diff --git a/code/WorkInProgress/Sigyn/Department Sec/jobs.dm b/code/WorkInProgress/Sigyn/Department Sec/jobs.dm
index d658c51c..6b25abdc 100644
--- a/code/WorkInProgress/Sigyn/Department Sec/jobs.dm
+++ b/code/WorkInProgress/Sigyn/Department Sec/jobs.dm
@@ -111,16 +111,16 @@ proc/assign_sec_to_department(var/mob/living/carbon/human/H)
/obj/item/clothing/under/rank/security/cargo/New()
var/obj/item/clothing/tie/armband/cargo/A = new /obj/item/clothing/tie/armband/cargo
- hastie = A
+ aband = A
/obj/item/clothing/under/rank/security/engine/New()
var/obj/item/clothing/tie/armband/engine/A = new /obj/item/clothing/tie/armband/engine
- hastie = A
+ aband = A
/obj/item/clothing/under/rank/security/science/New()
var/obj/item/clothing/tie/armband/science/A = new /obj/item/clothing/tie/armband/science
- hastie = A
+ aband = A
/obj/item/clothing/under/rank/security/med/New()
var/obj/item/clothing/tie/armband/medgreen/A = new /obj/item/clothing/tie/armband/medgreen
- hastie = A
\ No newline at end of file
+ aband = A
\ No newline at end of file
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 18acc2cf..e2c1b007 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -142,7 +142,7 @@
//checks text for html tags
//if tag is not in whitelist (var/list/paper_tag_whitelist in global.dm)
//relpaces < with <
-proc/checkhtml(var/t)
+proc/checkhtml(var/t, var/whitelist = paper_tag_whitelist)
t = sanitize_simple(t, list(""="."))
var/p = findtext(t,"<",1)
while (p) //going through all the tags
@@ -153,8 +153,10 @@ proc/checkhtml(var/t)
tag = copytext(t,start, p)
p++
tag = copytext(t,start+1, p)
- if (!(tag in paper_tag_whitelist)) //if it's unkown tag, disarming it
+ if (!(tag in whitelist)) //if it's unkown tag, disarming it
t = copytext(t,1,start-1) + "<" + copytext(t,start+1)
+ if(whitelist == signature_tag_whitelist)
+ return null
p = findtext(t,"<",p)
return t
/*
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index ce70d501..0d7dea4f 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -86,6 +86,7 @@
var/wikiurl
var/forumurl
var/aurorawikiurl
+ var/githuburl
//Alert level description
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
@@ -339,6 +340,9 @@
if ("aurorawikiurl")
config.aurorawikiurl = value
+ if ("githuburl")
+ config.githuburl = value
+
if ("guest_jobban")
config.guest_jobban = 1
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index ed055334..e0dbd4b2 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -49,7 +49,7 @@
msg_scopes("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
return
-/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data", "Delta Level"))
+/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data", "Delta Level", "NanoUI"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -107,5 +107,9 @@
if("Gas Data")
debug_variables(gas_data)
feedback_add_details("admin_verv","DGasdata")
+ if("NanoUI")
+ debug_variables(nanomanager)
+ feedback_add_details("admin_verv","DNanoUI")
+
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
return
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index 23bac99c..7bef7ada 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -318,9 +318,9 @@ datum/controller/vote
if(C.holder)
if(C.holder.rights & R_ADMIN)
trialmin = 1
- else if(C.holder.rights & R_FUN)
+ if(C.holder.rights & R_FUN)
funmin = 1
- else if(C.holder.rights & R_MOD)
+ if(C.holder.rights & R_MOD)
modmin = 1
voting |= C
@@ -380,7 +380,7 @@ datum/controller/vote
usr << browse(null, "window=vote")
return
if("cancel")
- if(usr.client.holder & (R_ADMIN|R_MOD))
+ if(usr.client.holder)
reset()
if("toggle_restart")
if(usr.client.holder)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index e9ddd5eb..b0c224e1 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -62,6 +62,10 @@ datum/mind
// the world.time since the mob has been brigged, or -1 if not at all
var/brigged_since = -1
+ // The custom signature holder
+ var/signature
+ var/signature_font
+
New(var/key)
src.key = key
@@ -1288,6 +1292,8 @@ datum/mind
else
world.log << "## DEBUG: mind_initialize(): No ticker ready yet! Please inform Carn"
if(!mind.name) mind.name = real_name
+ if(client.prefs.signature) mind.signature = client.prefs.signature
+ if(client.prefs.signature_font) mind.signature_font = client.prefs.signature_font
mind.current = src
//HUMAN
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index ee19a0ca..69bd86b5 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -193,7 +193,8 @@
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1)
if(cult_mind in cult)
cult -= cult_mind
- cult_mind.current << "\red An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it."
+ cult_mind.current << "\red An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it."
+ cult_mind.current << "\blue OOC information: Being removed from the clutches of Nar'sie would rip most memories of your service to him. At most you would remember one individual who assisted in converting you. Maybe not even that."
cult_mind.memory = ""
update_cult_icons_removed(cult_mind)
if(show_message)
diff --git a/code/game/gamemodes/factions.dm b/code/game/gamemodes/factions.dm
index dd1f3ba7..4f778dea 100644
--- a/code/game/gamemodes/factions.dm
+++ b/code/game/gamemodes/factions.dm
@@ -131,7 +131,7 @@ Stealthy and Inconspicuous Weapons;
/obj/item/weapon/pen/paralysis:3:Paralysis Pen;
/obj/item/weapon/soap/syndie:1:Syndicate Soap;
/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge;
-/obj/item/weapon/storage/box/walkingcane:5:Disguised Sword;
+/obj/item/weapon/cane/syndie:5:Disguised Sword;
Whitespace:Seperator;
Stealth and Camouflage Items;
/obj/item/weapon/storage/box/syndie_kit/masks:1:Disguised Breathe Mask;
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index b4f69084..936039dc 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -41,7 +41,7 @@
/obj/item/weapon/melee/baton/stunrod/loaded:4:Stunrod;
Whitespace:Seperator;
Stealthy and Inconspicuous Weapons;
-/obj/item/weapon/storage/box/walkingcane:5:Disguised Sword;
+/obj/item/weapon/cane/syndie:5:Disguised Sword;
/obj/item/weapon/pen/paralysis:3:Paralysis Pen;
/obj/item/weapon/soap/syndie:1:Syndicate Soap;
/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge;
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 55cb460e..ecda510f 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -36,38 +36,6 @@
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
-/datum/job/emt
- title = "Emergency Medical Technician"
- flag = EMT
- department_flag = MEDSCI
- faction = "Station"
- total_positions = 2
- spawn_positions = 2
- supervisors = "the chief medical officer"
- selection_color = "#ffeef0"
- access = list(access_medical, access_morgue, access_chemistry, access_genetics,access_maint_tunnels, access_external_airlocks)
- minimal_access = list(access_medical, access_morgue, access_maint_tunnels, access_external_airlocks)
- alt_titles = list("Paramedic")
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/emt(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/emt(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/emt(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/fr_jacket(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
- return 1
-
/datum/job/doctor
title = "Medical Doctor"
flag = DOCTOR
@@ -79,7 +47,7 @@
selection_color = "#ffeef0"
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_morgue, access_surgery, access_virology)
- alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
+ alt_titles = list("Surgeon","Nurse","Virologist")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -90,9 +58,6 @@
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if (H.mind.role_alt_title)
switch(H.mind.role_alt_title)
- if("Emergency Physician")
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/fr_jacket(H), slot_wear_suit)
if("Surgeon")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
@@ -132,7 +97,37 @@
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
+/datum/job/emt
+ title = "Emergency Medical Tech"
+ flag = EMT
+ department_flag = MEDSCI
+ faction = "Station"
+ total_positions = 2
+ spawn_positions = 2
+ supervisors = "the chief medical officer"
+ selection_color = "#ffeef0"
+ access = list(access_medical, access_morgue, access_chemistry, access_genetics,access_maint_tunnels, access_external_airlocks)
+ minimal_access = list(access_medical, access_morgue, access_maint_tunnels, access_external_airlocks)
+ alt_titles = list("Paramedic")
+ equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/emt(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/emt(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/emt(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/fr_jacket(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
+ H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
+ if(H.backbag == 1)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ return 1
//Chemist is a medical job damnit //YEAH FUCK YOU SCIENCE -Pete //Guys, behave -Erro
/datum/job/chemist
diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm
index dc980f84..221149cc 100644
--- a/code/game/jobs/jobs.dm
+++ b/code/game/jobs/jobs.dm
@@ -80,7 +80,7 @@ var/list/medical_positions = list(
"Geneticist",
"Psychiatrist",
"Chemist",
- "Emergency Medical Technician",
+ "Emergency Medical Tech",
"Nursing Intern"
)
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 6fd90317..8f35e3b9 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -402,7 +402,15 @@
return
// HOLOFLOOR DOES NOT GIVE A FUCK
+/turf/simulated/floor/holofloor/desert
+ name = "desert sand"
+ desc = "Uncomfortably gritty for a hologram."
+ icon_state = "asteroid"
+/turf/simulated/floor/holofloor/desert/New()
+ ..()
+ if(prob(10))
+ overlays += "asteroid[rand(0,9)]"
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 9bdb6538..4751e052 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -36,6 +36,8 @@
..()
/obj/machinery/door/window/Bumped(atom/movable/AM as mob|obj)
+ if(ispAI(AM)) //So that pAIs can't open all of the windoors forever.
+ return
if (!( ismob(AM) ))
var/obj/machinery/bot/bot = AM
if(istype(bot))
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index 31441da6..d582713a 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -41,6 +41,24 @@
icon_on = "seeds"
icon_off = "seeds-off"
+/obj/machinery/smartfridge/resources
+ name = "\improper Resource Vender"
+ desc = "For various resources!"
+ icon = 'icons/obj/vending.dmi'
+
+/obj/machinery/smartfridge/resources/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/stack/sheet/metal/))
+ return 1
+ if(istype(O,/obj/item/stack/sheet/glass/))
+ return 1
+ if(istype(O,/obj/item/stack/sheet/mineral/diamond/))
+ return 1
+ if(istype(O,/obj/item/stack/sheet/mineral/uranium/))
+ return 1
+ if(istype(O,/obj/item/stack/sheet/mineral/plasma/))
+ return 1
+ return 0
+
/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj)
if(istype(O,/obj/item/seeds/))
return 1
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index f052f111..65d77c54 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -141,7 +141,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
if(uses > 4)
randomItems.Add("/obj/item/weapon/gun/energy/crossbow") //Energy Crossbow
randomItems.Add("/obj/item/device/powersink") //Powersink
- randomItems.Add("/obj/item/weapon/storage/box/walkingcane")
+ randomItems.Add("/obj/item/weapon/cane/syndie")
if(uses > 3)
randomItems.Add("/obj/item/weapon/melee/energy/sword") //Energy Sword
@@ -196,7 +196,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
uses -= 7
if("/obj/item/weapon/gun/projectile")
uses -= 6
- if("/obj/item/weapon/gun/energy/crossbow" , "/obj/item/device/powersink" , "/obj/item/weapon/storage/box/walkingcane")
+ if("/obj/item/weapon/gun/energy/crossbow" , "/obj/item/device/powersink" , "/obj/item/weapon/cane/syndie")
uses -= 5
if("/obj/item/weapon/melee/energy/sword" , "/obj/item/clothing/mask/gas/voice" , "/obj/item/device/chameleon" , "/obj/item/weapon/melee/baton/stunrod/loaded")
uses -= 4
@@ -270,7 +270,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
feedback_add_details("traitor_uplink_items_bought","SP")
if("/obj/item/weapon/storage/toolbox/syndicate")
feedback_add_details("traitor_uplink_items_bought","ST")
- if("/obj/item/weapon/storage/box/walkingcane")
+ if("/obj/item/weapon/cane/syndie")
feedback_add_details("traitor_uplink_items_bought","WC")
if("/obj/item/weapon/storage/box/syndie_kit/masks_gas")
feedback_add_details("traitor_uplink_items_bought","GM")
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 69ec4708..75fd39b8 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -52,6 +52,9 @@
liquidfood
name = "\improper \"LiquidFood\" ration"
icon_state = "liquidfood"
+ chocolatebox
+ name = "box of chocolates"
+ icon_state = "chocolatebox"
/obj/item/trash/attack(mob/M as mob, mob/living/user as mob)
return
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 164197d5..110a94b7 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -92,7 +92,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else if(istype(W, /obj/item/weapon/lighter/zippo))
var/obj/item/weapon/lighter/zippo/Z = W
if(Z.lit)
- light("With a flick of their wrist, [user] lights their [name] with their [W].")
+ light("With a flick of their wrist, [user] lights [name] with [W].")
else if(istype(W, /obj/item/weapon/lighter))
var/obj/item/weapon/lighter/L = W
@@ -102,7 +102,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else if(istype(W, /obj/item/weapon/match))
var/obj/item/weapon/match/M = W
if(M.lit)
- light("[user] lights their [name] with their [W].")
+ light("[user] lights their [name] with [W].")
else if(istype(W, /obj/item/weapon/melee/energy/sword))
var/obj/item/weapon/melee/energy/sword/S = W
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index cd7e9394..ffc6d8ac 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -50,8 +50,8 @@
log_str += " Last touched by: [src.fingerprintslast][last_touch_info]"
bombers += log_str
- message_admins("C4 Explosion: Last touched by: [src.fingerprintslast][last_touch_info]([user.ckey])(JMP)")
- message_admins("C4 Explosion: Last touched by: [src.fingerprintslast][last_touch_info]([user.ckey])(JMP)")
+ message_admins("C4 Explosion: Last touched by: [src.fingerprintslast][last_touch_info]([user.ckey])(JMP)")
+ message_mods("C4 Explosion: Last touched by: [src.fingerprintslast][last_touch_info]([user.ckey])(JMP)")
explosion(location, -1, -1, 2, 3)
if (istype(target, /turf/simulated/wall)) target:dismantle_wall(1)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index ee629779..ffb4da40 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -517,26 +517,4 @@
for(var/i = 0; i < 14; i++)
new /obj/item/weapon/light/tube(src)
for(var/i = 0; i < 7; i++)
- new /obj/item/weapon/light/bulb(src)
-
-/obj/item/weapon/storage/box/walkingcane
- name = "cane"
- desc = "A cane used by a true gentlemen. Or a clown."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "cane"
- item_state = "stick"
- flags = FPRINT | TABLEPASS| CONDUCT
- force = 5.0
- throwforce = 7.0
- w_class = 2.0
- matter = list("metal" = 50)
- attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed")
- can_hold = list(
- "/obj/item/weapon/canesword")
- storage_slots = 1
- max_w_class = 4
- max_combined_w_class = 4
-
- New()
- ..()
- new /obj/item/weapon/canesword(src)
\ No newline at end of file
+ new /obj/item/weapon/light/bulb(src)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 8ee18f9c..c37e6ce2 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -49,37 +49,40 @@
user.Paralyse(20)
return
- if (M.stat !=2)
- if((M.mind in ticker.mode.cult) && prob(33))
- M << "\red The power of [src] clears your mind of the cult's influence!"
- user << "\red You wave [src] over [M]'s head and see their eyes become clear, their mind returning to normal."
- ticker.mode.remove_cultist(M.mind)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] waves [] over []'s head.", user, src, M), 1)
-/* else if(prob(10)) //Fail chance is kind of dumb for something so rarely used.
- user << "\red The rod slips in your hand."
- ..()*/
- else if(M.mind)
- if(M.mind.vampire)
- if(ishuman(M))
- if(!(VAMP_FULL in M.mind.vampire.powers))
- user << "\red The rod burns cold in your hand, filling you with grim determination. You feel the creature's power weaken."
- M << "The nullrod's power interferes with your own! They are on to you!"
- M.mind.vampire.nullified = max(8, M.mind.vampire.nullified + 8)
+ if(M.stat !=2 && ishuman(M))
+ var/mob/living/K = M
+ if(K.mind in ticker.mode.cult)
+ if(K == user) //Because apparently Doomberg deconverted himself. Wtf.
+ return
+ user.visible_message("\blue [user] starts trying to captivate [K]'s attention with the [src].", "\blue You begin trying to shed light into [K]'s mind.")
+ K.take_overall_damage(0, 10)
+ if(do_after(user, 15))
+ K.visible_message("\red [user] waves the [src] over [K]'s head, [K]'s look captivated by it.", "\red [user] wave's the [src] over your head. You see a foreign light, asking you to follow it. Its presence burns and blinds.")
+ var/choice = alert(K,"Do you want to give up your goal?","Become cleansed","Resist","Give in")
+ switch(choice)
+ if("Resist")
+ K.visible_message("\red The gaze in [K]'s eyes remains determined.", "\blue You turn away from the light, remaining true to your dark lord. The light burns you due to rejection!")
+ K.say("*scream")
+ K.take_overall_damage(5, 15)
+ if("Give in")
+ K.visible_message("\blue [K]'s eyes become clearer, the evil gone, but not without leaving scars.")
+ K.take_overall_damage(15, 30) //Nur'sie ain't a kind host to turn away from. Suffer.
+ ticker.mode.remove_cultist(K.mind, 0)
+ else
+ user.visible_message("\red [user]'s concentration is broken!", "\red Your concentration is broken! You and your target need to stay uninterrupted for longer!")
+ return
+ else if(M.mind && M.mind.vampire)
+ if(!(VAMP_FULL in M.mind.vampire.powers))
+ user << "\red The rod burns cold in your hand, filling you with grim determination. You feel the creature's power weaken."
+ M << "The nullrod's power interferes with your own! They are on to you!"
+ M.mind.vampire.nullified = max(8, M.mind.vampire.nullified + 8)
//..() Ported from readapted vamp null code. Original seen down there. This doesn't need to be here since it's in the loops now.
else
user << "\red The rod appears to do nothing."
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [] waves [] over []'s head.", user, src, M), 1)
return
-/* if(M.mind)
- if(M.mind.vampire)
- if(ishuman(M))
- if(!(VAMP_FULL in M.mind.vampire.powers))
- M << "The nullrod's power interferes with your own!"
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
- ..()
-*/
+
/obj/item/weapon/nullrod/afterattack(atom/A, mob/user as mob)
if (istype(A, /turf/simulated/floor))
user << "\blue You hit the floor with the [src]."
@@ -178,9 +181,64 @@
item_state = "canesword"
force = 20
throwforce = 10
- w_class = 4 //there ain't no way in fuck you're shuving this inside your rucksack. No way.
+ w_class = 4 //there ain't no way in fuck you're shoving this inside your rucksack. No way.
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] brings the blade up to \his throat, and in one rapid motion slits \his throat open!"
+ return(BRUTELOSS)
+
+//Using a modified cane, with a storage var, instead of a box. Because the box idea is meh, in terms of the interface.
+/obj/item/weapon/cane/syndie
+ var/sword //For holding the blade
+ var/locked //A small lock, so that you can't accidentally unsheathe it
+
+ New()
+ sword = new /obj/item/weapon/canesword()
+ locked = 1
+ ..()
+
+ proc/unsheathe(mob/user as mob)
+ if(sword)
+ user.put_in_hands(sword)
+ user.visible_message("[user] takes the handle and draws a sword from inside the [src].", "You take the [src] by the handle and draw out a sharp blade from it.")
+ sword = null
+ icon_state = "cane_empty"
+ update_icon()
+
+ proc/toggle_lock(mob/user as mob)
+ if(sword)
+ switch(locked)
+ if(1)
+ locked = 0
+ user << "You twist and unlock the sword handle from the [src]."
+ if(0)
+ locked = 1
+ user << "You twist and lock the sword handle to the [src]."
+
+ attack_self(mob/user as mob)
+ if(iscarbon(user))
+ toggle_lock(user)
+
+ attack_hand(mob/user as mob)
+ if(!locked)
+ unsheathe(user)
+ else
+ ..()
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/canesword) && !sword)
+ user.u_equip(W)
+ W.loc = src
+ sword = W
+ W.dropped(user)
+ W.add_fingerprint(user)
+ add_fingerprint(user)
+ icon_state = "cane"
+ user << "You sheathe the sword, and lock its handle to the [src]."
+ locked = 1
+ update_icon()
+
/obj/item/weapon/metal_bat
desc = "The quality is a swing and a miss."
name = "Metal Bat"
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index d3ebf9d8..11d00ff2 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -13,6 +13,7 @@
var/health = 100
var/lastbang
var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate
+ var/mob_capacity = 2
//then open it in a populated area to crash clients.
/obj/structure/closet/New()
@@ -80,6 +81,7 @@
return 0
var/itemcount = 0
+ var/mobcount = 0
//Cham Projector Exception
for(var/obj/effect/dummy/chameleon/AD in src.loc)
@@ -103,6 +105,11 @@
if(M.buckled || M.pinned.len)
continue
+ if(istype(M, /mob/living/carbon/human))
+ if(mobcount >= mob_capacity)
+ continue
+ mobcount++
+
if(M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 30d43393..c960b576 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -206,4 +206,30 @@
else
icon_state = icon_closed
else
- icon_state = icon_opened
\ No newline at end of file
+ icon_state = icon_opened
+
+/obj/structure/closet/secure_closet/robotics_surgery
+ name = "surgical equipment"
+ desc = "Used to hold surgical equipment, anesthesia and MMIs."
+ icon_state = "medical1"
+ icon_closed = "medical"
+ icon_locked = "medical1"
+ icon_opened = "medicalopen"
+ icon_broken = "medicalbroken"
+ icon_off = "medicaloff"
+ req_access = list(access_robotics)
+
+ New()
+ ..()
+ sleep(2)
+ new /obj/item/weapon/circular_saw(src)
+ new /obj/item/weapon/retractor(src)
+ new /obj/item/weapon/scalpel(src)
+ new /obj/item/weapon/cautery(src)
+ new /obj/item/weapon/hemostat(src)
+ new /obj/item/device/mmi(src)
+ new /obj/item/device/mmi(src)
+ new /obj/item/device/mmi(src)
+ new /obj/item/weapon/tank/anesthetic(src)
+ new /obj/item/clothing/mask/breath/medical(src)
+ return
\ No newline at end of file
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 3fe441f5..2c080492 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -63,13 +63,13 @@ var/global/normal_ooc_colour = "#002eb8"
var/display_colour = normal_ooc_colour
if(holder && !holder.fakekey)
- display_colour = "#0099cc" //light blue
+// display_colour = "#0099cc" //light blue //We decided they didn't need to be known
if(holder.rights & R_MOD && !(holder.rights & R_ADMIN))
display_colour = "#1b521f" //dark green
- if(holder.rights & R_DEBUG && !(holder.rights & R_ADMIN))
- display_colour = "#184880" //dark blue
if(holder.rights & R_DEV && !(holder.rights & R_ADMIN))
display_colour = "#184880" //dark blue
+ if(holder.rights & R_DEBUG && !(holder.rights & R_ADMIN)) //This is actually a higher rank
+ display_colour = "#0099cc" //light blue
else if(holder.rights & R_ADMIN)
if(config.allow_admin_ooccolor)
display_colour = src.prefs.ooccolor
@@ -81,7 +81,7 @@ var/global/normal_ooc_colour = "#002eb8"
var/display_name = src.key
if(holder)
if(holder.fakekey)
- if(C.holder & (holder.rights & (R_ADMIN|R_MOD)))
+ if(C.holder && C.holder.rights & (R_ADMIN|R_MOD))
display_name = "[holder.fakekey]/([src.key])"
else
display_name = holder.fakekey
@@ -197,10 +197,9 @@ var/global/normal_ooc_colour = "#002eb8"
display_name = holder.fakekey
C << "LOOC: [display_name]: [msg]"
for(var/client/C in admins)
- if(!C.holder.rights & (R_ADMIN|R_MOD|R_DEV))
- continue
- if(C.prefs.toggles & CHAT_LOOC)
- var/prefix = "(R)LOOC"
- if (C.mob in heard)
- prefix = "LOOC"
- C << "[prefix]: [src.key]: [msg]"
\ No newline at end of file
+ if(C.holder.rights & (R_ADMIN|R_MOD|R_DEV))
+ if(C.prefs.toggles & CHAT_LOOC)
+ var/prefix = "(R)LOOC"
+ if (C.mob in heard)
+ prefix = "LOOC"
+ C << "[prefix]: [src.key]: [msg]"
\ No newline at end of file
diff --git a/code/global.dm b/code/global.dm
index 57b90a85..90c139f7 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -37,6 +37,7 @@ var/list/paper_tag_whitelist = list("center","p","div","span","h1","h2","h3","h4
var/list/paper_blacklist = list("java","onblur","onchange","onclick","ondblclick","onfocus","onkeydown", \
"onkeypress","onkeyup","onload","onmousedown","onmousemove","onmouseout","onmouseover", \
"onmouseup","onreset","onselect","onsubmit","onunload")
+var/list/signature_tag_whitelist = list("i","u","b","small","big")
var/BLINDBLOCK = 0
var/DEAFBLOCK = 0
diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm
index 133f6d10..84c502ba 100644
--- a/code/modules/admin/admin_memo.dm
+++ b/code/modules/admin/admin_memo.dm
@@ -1,9 +1,10 @@
#define MEMOFILE "data/memo.sav" //where the memos are saved
+#define PLAYERMEMOFILE "data/pmemo.sav" //where the player memos are saved
#define ENABLE_MEMOS 1 //using a define because screw making a config variable for it. This is more efficient and purty.
//switch verb so we don't spam up the verb lists with like, 3 verbs for this feature.
/client/proc/admin_memo(task in list("write","show","delete"))
- set name = "Memo"
+ set name = "Admin Memo"
set category = "Server"
if(!ENABLE_MEMOS) return
if(!check_rights(0)) return
@@ -50,5 +51,62 @@
F.dir.Remove(ckey)
src << "Removed Memo created by [ckey]."
+//switch verb so we don't spam up the verb lists with like, 3 verbs for this feature.
+/client/verb/memo_player()
+ set name = "Player Memo"
+ set category = "OOC"
+ if(!ENABLE_MEMOS) return
+ admin_memo_player_show()
+
+/client/proc/admin_memo_player(task in list("write","show","delete"))
+ set name = "Player Memo"
+ set category = "Server"
+
+ if(!ENABLE_MEMOS) return
+ if(!check_rights(0)) return
+ switch(task)
+ if("write") admin_memo_player_write()
+ if("show") admin_memo_player_show()
+ if("delete") admin_memo_player_delete()
+
+//write a message
+/client/proc/admin_memo_player_write()
+ var/savefile/F = new(PLAYERMEMOFILE)
+ if(F)
+ var/memo = input(src,"Type your memo\n(Leaving it blank will delete your current memo):","Write Memo",null) as null|message
+ switch(memo)
+ if(null)
+ return
+ if("")
+ F.dir.Remove(ckey)
+ src << "Memo removed"
+ return
+ if( findtext(memo,"