diff --git a/baystation12.dme b/baystation12.dme
index dd4bf19366c..fd245c3b782 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -487,6 +487,7 @@
#include "code\game\machinery\magnet.dm"
#include "code\game\machinery\morgue.dm"
#include "code\game\machinery\navbeacon.dm"
+#include "code\game\machinery\newscaster.dm"
#include "code\game\machinery\OpTable.dm"
#include "code\game\machinery\overview.dm"
#include "code\game\machinery\portable_turret.dm"
@@ -776,6 +777,7 @@
#include "code\modules\admin\verbs\deadsay.dm"
#include "code\modules\admin\verbs\debug.dm"
#include "code\modules\admin\verbs\diagnostics.dm"
+#include "code\modules\admin\verbs\getruntimelog.dm"
#include "code\modules\admin\verbs\gimmicks.dm"
#include "code\modules\admin\verbs\mapping.dm"
#include "code\modules\admin\verbs\massmodvar.dm"
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index 624b83569e0..e2ee0dc56b3 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -54,6 +54,8 @@ var/global/datum/getrev/revdata = new("config/svndir.txt")
if(svndirpath && fexists(svndirpath) && fexists("[svndirpath]/entries") && isfile(file("[svndirpath]/entries")))
var/list/filelist = dd_file2list("[svndirpath]/entries",null)
+ if(filelist.len < 4)
+ return abort()
revision = filelist[4]
commiter = filelist[12]
diary << "Revision info loaded succesfully"
diff --git a/code/defines/global.dm b/code/defines/global.dm
index 63a9ea07674..1c52793d5e9 100644
--- a/code/defines/global.dm
+++ b/code/defines/global.dm
@@ -220,10 +220,14 @@ var
// These are all default values that will load should the forumdbconfig.txt
// file fail to read for whatever reason.
- /*forumsqladdress = "localhost"
+/* forumsqladdress = "localhost"
forumsqlport = "3306"
forumsqldb = "tgstation"
forumsqllogin = "root"
forumsqlpass = ""
forum_activated_group = "2"
forum_authenticated_group = "10"*/
+
+ // For FTP requests. (i.e. downloading runtime logs.)
+ // However it'd be ok to use for accessing attack logs and such too, which are even laggier.
+ fileaccess_timer = 600 //Cannot access files by ftp until the game is finished setting up and stuff.
\ No newline at end of file
diff --git a/code/defines/obj/decal.dm b/code/defines/obj/decal.dm
index 03bf518d7b4..3f5eebc7ebc 100644
--- a/code/defines/obj/decal.dm
+++ b/code/defines/obj/decal.dm
@@ -1,6 +1,7 @@
/obj/effect/decal/ash
- name = "Ashes"
+ name = "ashes"
desc = "Ashes to ashes, dust to dust, and into space."
+ gender = PLURAL
icon = 'objects.dmi'
icon_state = "ash"
anchored = 1
@@ -12,27 +13,31 @@
/obj/effect/decal/remains/human
name = "remains"
- desc = "These remains have a strange sense about them..."
+ desc = "They look like human remains. They have a strange aura about them."
+ gender = PLURAL
icon = 'blood.dmi'
icon_state = "remains"
anchored = 1
/obj/effect/decal/remains/xeno
name = "remains"
- desc = "These remains have a strange sense about them..."
+ desc = "They look like the remains of something... alien. They have a strange aura about them."
+ gender = PLURAL
icon = 'blood.dmi'
icon_state = "remainsxeno"
anchored = 1
/obj/effect/decal/remains/robot
name = "remains"
- desc = "These remains have a strange sense about them..."
+ desc = "They look like the remains of something mechanical. They have a strange aura about them."
+ gender = PLURAL
icon = 'robots.dmi'
icon_state = "remainsrobot"
anchored = 1
/obj/effect/decal/point
- name = "point"
+ name = "arrow"
+ desc = "It's an arrow hanging in mid-air. There may be a wizard about."
icon = 'screen1.dmi'
icon_state = "arrow"
layer = 16.0
@@ -44,8 +49,9 @@
//HUMANS
/obj/effect/decal/cleanable/blood
- name = "Blood"
+ name = "blood"
desc = "It's red and disgusting."
+ gender = PLURAL
density = 0
anchored = 1
layer = 2
@@ -65,6 +71,7 @@
/obj/effect/decal/cleanable/blood/drip
name = "drips of blood"
desc = "It's red."
+ gender = PLURAL
density = 0
anchored = 1
layer = 2
@@ -73,8 +80,9 @@
track_amt = 0
/obj/effect/decal/cleanable/mucus
- name = "Mucus"
+ name = "mucus"
desc = "Disgusting mucus."
+ gender = PLURAL
density = 0
anchored = 1
layer = 2
@@ -87,12 +95,15 @@
random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
/obj/effect/decal/cleanable/blood/tracks
- icon_state = "tracks"
+ icon_state = "blood"
+ desc = "They look like tracks left by wheels."
+ gender = PLURAL
random_icon_states = null
/obj/effect/decal/cleanable/blood/gibs
name = "gibs"
- desc = "Grisly...and not the good kind neither."
+ desc = "They look bloody and gruesome."
+ gender = PLURAL
density = 0
anchored = 0
layer = 2
@@ -119,7 +130,8 @@
/obj/effect/decal/cleanable/xenoblood
name = "xeno blood"
- desc = "It's green blood. What the hell?"
+ desc = "It's green and acidic. It looks like... blood?"
+ gender = PLURAL
density = 0
anchored = 1
layer = 2
@@ -139,6 +151,7 @@
/obj/effect/decal/cleanable/xenoblood/xgibs
name = "xeno gibs"
desc = "Gnarly..."
+ gender = PLURAL
icon = 'blood.dmi'
icon_state = "xgib1"
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
@@ -166,7 +179,8 @@
/obj/effect/decal/cleanable/robot_debris
name = "robot debris"
- desc = "Useless heap of junk...or is it..."
+ desc = "It's a useless heap of junk... or is it?"
+ gender = PLURAL
density = 0
anchored = 0
layer = 2
@@ -185,7 +199,8 @@
/obj/effect/decal/cleanable/oil
name = "motor oil"
- desc = "It's black oil."
+ desc = "It's black and greasy. Looks like Beepsky made another mess."
+ gender = PLURAL
density = 0
anchored = 1
layer = 2
@@ -207,6 +222,7 @@
/obj/effect/decal/cleanable/generic
name = "clutter"
desc = "Someone should clean that up."
+ gender = PLURAL
density = 0
anchored = 1
layer = 2
@@ -216,6 +232,7 @@
/obj/effect/decal/cleanable/dirt
name = "dirt"
desc = "Someone should clean that up."
+ gender = PLURAL
density = 0
anchored = 1
layer = 2
@@ -223,8 +240,9 @@
icon_state = "dirt"
/obj/effect/decal/cleanable/greenglow
- name = "green glow"
+ name = "glowing goo"
desc = "Eerie. This makes you feel creepy."
+ gender = PLURAL
density = 0
anchored = 1
layer = 2
@@ -233,7 +251,7 @@
/obj/effect/decal/cleanable/cobweb
name = "cobweb"
- desc = "Someone should remove that."
+ desc = "Somebody should remove that."
density = 0
anchored = 1
layer = 3
@@ -242,7 +260,7 @@
/obj/effect/decal/cleanable/molten_item
name = "gooey grey mass"
- desc = "Huh. Creepy..."
+ desc = "It looks like a melted... something."
density = 0
anchored = 1
layer = 3
@@ -251,7 +269,7 @@
/obj/effect/decal/cleanable/cobweb2
name = "cobweb"
- desc = "Someone should remove that."
+ desc = "Somebody should remove that."
density = 0
anchored = 1
layer = 3
@@ -266,8 +284,9 @@
//Vomit (sorry)
/obj/effect/decal/cleanable/vomit
- name = "Vomit"
- desc = "Unpleasant."
+ name = "vomit"
+ desc = "Gosh, how unpleasant."
+ gender = PLURAL
density = 0
anchored = 1
layer = 2
@@ -282,8 +301,8 @@
..()
/obj/effect/decal/cleanable/tomato_smudge
- name = "Tomato smooth"
- desc = "It looks sort of like blood, but it's not that dark."
+ name = "tomato smudge"
+ desc = "It's red."
density = 0
anchored = 1
layer = 2
@@ -291,7 +310,7 @@
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
/obj/effect/decal/cleanable/egg_smudge
- name = "Smashed egg"
+ name = "smashed egg"
desc = "Seems like this one won't hatch."
density = 0
anchored = 1
@@ -300,8 +319,8 @@
random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3")
/obj/effect/decal/cleanable/pie_smudge //honk
- name = "Smashed pie"
- desc = "Pie cream from a cream pie."
+ name = "smashed pie"
+ desc = "It's pie cream from a cream pie."
density = 0
anchored = 1
layer = 2
diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm
index 88af344c6a4..0d617c0f471 100644
--- a/code/defines/obj/machinery.dm
+++ b/code/defines/obj/machinery.dm
@@ -19,8 +19,8 @@
gl_uid = 1
/obj/machinery/autolathe
- name = "Autolathe"
- desc = "Produces items with metal and glass."
+ name = "\improper Autolathe"
+ desc = "It produces items using metal and glass."
icon_state = "autolathe"
density = 1
var/m_amount = 0.0
@@ -42,7 +42,7 @@
active_power_usage = 100
/obj/machinery/camera
- name = "Security Camera"
+ name = "security camera"
desc = "This is used to monitor rooms."
icon = 'monitors.dmi'
icon_state = "camera"
@@ -60,8 +60,8 @@
active_power_usage = 10
/obj/machinery/dispenser
- desc = "A simple yet bulky one-way storage device for gas tanks. Holds plasma and oxygen tanks."
- name = "Tank Storage Unit"
+ name = "tank storage unit"
+ desc = "A simple yet bulky one-way storage device for gas tanks. Holds 10 plasma and 10 oxygen tanks."
icon = 'objects.dmi'
icon_state = "dispenser"
density = 1
@@ -73,8 +73,8 @@
active_power_usage = 10
/obj/machinery/dna_scanner
- name = "DNA Scanner/Implanter"
- desc = "Scans DNA."
+ name = "\improper DNA scanner/implanter"
+ desc = "It scans DNA structures."
icon = 'Cryogenic2.dmi'
icon_state = "scanner_0"
density = 1
@@ -86,8 +86,8 @@
active_power_usage = 300
/obj/machinery/dna_scannernew
- name = "DNA Modifier"
- desc = "Scans DNA better."
+ name = "\improper DNA modifier"
+ desc = "It scans DNA structures."
icon = 'Cryogenic2.dmi'
icon_state = "scanner_0"
density = 1
@@ -99,7 +99,7 @@
active_power_usage = 300
/obj/machinery/firealarm
- name = "Fire Alarm"
+ name = "fire alarm"
desc = "Pull this in case of emergency."
icon = 'monitors.dmi'
icon_state = "fire0"
@@ -114,8 +114,15 @@
active_power_usage = 6
power_channel = ENVIRON
+ New()
+ if(z == 1)
+ if(security_level)
+ src.overlays += image('monitors.dmi', "overlay_[get_security_level()]")
+ else
+ src.overlays += image('monitors.dmi', "overlay_green")
+
/obj/machinery/partyalarm
- name = "Party Button"
+ name = "\improper Party Button"
desc = "Cuban Pete is in the house!"
icon = 'monitors.dmi'
icon_state = "fire0"
@@ -132,7 +139,7 @@
/obj/machinery/igniter
name = "igniter"
- desc = "Might as well make that detonator, right?"
+ desc = "It's useful for igniting plasma."
icon = 'stationobjs.dmi'
icon_state = "igniter1"
var/id = null
@@ -144,7 +151,7 @@
/obj/machinery/injector
name = "injector"
- desc = "Injects gas into a chamber."
+ desc = "It injects gas into a chamber."
icon = 'stationobjs.dmi'
icon_state = "injector"
density = 1
@@ -183,8 +190,8 @@
active_power_usage = 4
/obj/machinery/restruct
- name = "DNA Physical Restructurization Accelerator"
- desc = "This looks complex."
+ name = "\improper DNA physical restructurization accelerator"
+ desc = "It looks ridiculously complex."
icon = 'Cryogenic2.dmi'
icon_state = "restruct_0"
density = 1
@@ -196,8 +203,8 @@
active_power_usage = 600
/obj/machinery/scan_console
- name = "DNA Scanner Access Console"
- desc = "Scans DNA."
+ name = "\improper DNA Scanner Access Console"
+ desc = "It scans DNA structures."
icon = 'computer.dmi'
icon_state = "scanner"
density = 1
@@ -275,13 +282,22 @@
16= door safties
*/
+
+ var/exposedwires = 0
+ var/wires = 3
+ /*
+ Bitflag, 1=checkID
+ 2=Network Access
+ */
+
anchored = 1.0
use_power = 1
idle_power_usage = 2
active_power_usage = 4
/obj/machinery/driver_button
- name = "Mass Driver Button"
+ name = "mass driver button"
+ desc = "FIRE AWAY!"
icon = 'objects.dmi'
icon_state = "launcherbtt"
desc = "A remote control switch for a Mass Driver."
@@ -293,7 +309,8 @@
active_power_usage = 4
/obj/machinery/ignition_switch
- name = "Ignition Switch"
+ name = "ignition switch"
+ desc = "It activates an igniter."
icon = 'objects.dmi'
icon_state = "launcherbtt"
desc = "A remote control switch for a mounted igniter."
@@ -312,8 +329,8 @@
var/lockeddown = 0
/obj/machinery/teleport/hub
- name = "hub"
- desc = "A hub of a teleporting machine."
+ name = "teleporter hub"
+ desc = "It's the hub of a teleporting machine."
icon_state = "tele0"
var/accurate = 0
use_power = 1
@@ -352,7 +369,7 @@
/obj/machinery/power/terminal
name = "terminal"
icon_state = "term"
- desc = "An underfloor wiring terminal for power equipment"
+ desc = "It's an underfloor wiring terminal for power equipment."
level = 1
layer = TURF_LAYER
var/obj/machinery/power/master = null
@@ -361,8 +378,8 @@
layer = 2.6 // a bit above wires
/obj/machinery/power/generator
- name = "generator"
- desc = "A high efficiency thermoelectric generator."
+ name = "thermoelectric generator"
+ desc = "It's a high efficiency thermoelectric generator."
icon_state = "teg"
anchored = 1
density = 1
@@ -374,8 +391,8 @@
var/lastgenlev = -1
/obj/machinery/power/generator_type2
- name = "generator"
- desc = "A high efficiency thermoelectric generator."
+ name = "thermoelectric generator"
+ desc = "It's a high efficiency thermoelectric generator."
icon_state = "teg"
anchored = 1
density = 1
@@ -386,19 +403,18 @@
var/lastgen = 0
var/lastgenlev = -1
-
/obj/machinery/power/monitor
- name = "Power Monitoring Computer"
- desc = "Used to monitor the power, and remotely toggle main breakers."
- icon = 'computer.dmi'
- icon_state = "power"
- density = 1
- anchored = 1
- use_power = 2
- idle_power_usage = 20
- active_power_usage = 80
- var/control = 0
- req_access = list(access_engine_equip)
+ name = "power monitoring computer"
+ desc = "It monitors power levels across the station, and can remotely toggle main breakers."
+ icon = 'computer.dmi'
+ icon_state = "power"
+ density = 1
+ anchored = 1
+ use_power = 2
+ idle_power_usage = 20
+ active_power_usage = 80
+ var/control = 0
+ req_access = list(access_engine_equip)
/obj/machinery/cell_charger
name = "cell charger"
@@ -413,8 +429,8 @@
active_power_usage = 60
/obj/machinery/light_switch
- desc = "A light switch"
- name = null
+ name = "light switch"
+ desc = "It turns lights on and off. What are you, simple?"
icon = 'power.dmi'
icon_state = "light1"
anchored = 1.0
@@ -449,16 +465,17 @@
icon_state = "holopad0"
var
mob/living/silicon/ai/master//Which AI, if any, is controlling the object? Only one AI may control a hologram at any time.
+ last_request = 0 //to prevent request spam. ~Carn
/obj/machinery/hologram/projector
- name = "Hologram Projector"
- desc = "Makes a hologram appear...somehow..."
+ name = "hologram projector"
+ desc = "It makes a hologram appear...with magnets or something..."
icon = 'stationobjs.dmi'
icon_state = "hologram0"
/obj/machinery/hologram/proj_ai
- name = "Hologram Projector Platform"
- desc = "Used for the fun of the diabolical AI."
+ name = "hologram projector platform"
+ desc = "It's used by the AI for fooling around."
icon = 'stationobjs.dmi'
icon_state = "hologram0"
var
diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm
index c3475fa28f8..50bcc68c1cc 100644
--- a/code/defines/obj/storage.dm
+++ b/code/defines/obj/storage.dm
@@ -8,13 +8,13 @@
max_combined_w_class = 21
/obj/item/weapon/storage/backpack/cultpack
- name = "Trophy Rack"
- desc = "A backpack and trophy rack, useful for both carrying extra gear and proudly declaring your insanity "
+ name = "trophy rack"
+ desc = "It's useful for both carrying extra gear and proudly declaring your insanity."
icon_state = "cultpack"
/obj/item/weapon/storage/trashbag
name = "trash bag"
- desc = "For picking up all that trash."
+ desc = "It's the heavy-duty black polymer kind. Time to take out the trash!"
icon_state = "trashbag"
item_state = "trashbag"
w_class = 4.0
@@ -31,16 +31,17 @@
*/
/obj/item/weapon/storage/pill_bottle
name = "pill bottle"
- desc = "A reasonable place to put your pills."
+ desc = "It's an airtight container for storing medication."
icon_state = "pill_canister"
icon = 'chemical.dmi'
item_state = "contsolid"
w_class = 2.0
can_hold = list("/obj/item/weapon/reagent_containers/pill")
+ var/mode = 1 // pickup mode
/obj/item/weapon/storage/dice
- name = "dice pack"
- desc = "Apparently this has dice in them."
+ name = "pack of dice"
+ desc = "It's a small container with dice inside."
icon_state = "pill_canister"
icon = 'chemical.dmi'
item_state = "contsolid"
@@ -66,6 +67,7 @@
desc = "Full of goodness."
icon_state = "implant"
item_state = "syringe_kit"
+
/obj/item/weapon/storage/cupbox
name = "box of paper cups"
desc = "It has pictures of paper cups on the front."
@@ -304,10 +306,11 @@
icon_state = "firstaid"
/obj/item/weapon/storage/syringes
- name = "Syringes"
+ name = "syringes"
desc = "A box full of syringes."
desc = "A biohazard alert warning is printed on the box"
icon_state = "syringe"
+ foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
/obj/item/weapon/storage/firstaid/toxin
name = "Toxin First Aid"
@@ -543,6 +546,76 @@
icon_state = "box"
item_state = "syringe_kit"
+
+
+
+/obj/structure/closet/syndicate/resources/
+ desc = "It's an emergency storage closet for repairs."
+
+/obj/structure/closet/syndicate/resources/New()
+ ..()
+
+ var/list/resources_common = list(
+
+ /obj/item/stack/sheet/metal,
+ /obj/item/stack/sheet/glass,
+ /obj/item/stack/sheet/plasteel,
+ /obj/item/stack/rods
+ )
+
+ var/list/resources_rare = list(
+
+ /obj/item/stack/sheet/gold,
+ /obj/item/stack/sheet/silver,
+ /obj/item/stack/sheet/plasma,
+ /obj/item/stack/sheet/uranium,
+ /obj/item/stack/sheet/diamond
+
+ )
+
+ sleep(2)
+
+ for(var/i = 0, i<2, i++)
+ for(var/res in resources_common)
+ var/obj/item/stack/R = new res(src)
+ R.amount = rand(40,R.max_amount)
+
+ for(var/res in resources_rare)
+ var/obj/item/stack/R = new res(src)
+ R.amount = rand(10,25)
+
+ return
+
+/obj/structure/closet/syndicate/resources/everything
+ desc = "It's an emergency storage closet for repairs."
+
+/obj/structure/closet/syndicate/resources/everything/New()
+
+
+ var/list/resources = list(
+
+ /obj/item/stack/sheet/metal,
+ /obj/item/stack/sheet/glass,
+ /obj/item/stack/sheet/gold,
+ /obj/item/stack/sheet/silver,
+ /obj/item/stack/sheet/plasma,
+ /obj/item/stack/sheet/uranium,
+ /obj/item/stack/sheet/diamond,
+ /obj/item/stack/sheet/clown,
+ /obj/item/stack/sheet/plasteel,
+ /obj/item/stack/rods
+
+ )
+
+ sleep(2)
+
+ for(var/i = 0, i<2, i++)
+ for(var/res in resources)
+ var/obj/item/stack/R = new res(src)
+ R.amount = R.max_amount
+
+ return
+
// Belt Bags/Satchels
/obj/item/weapon/storage/backpack/satchel_norm
diff --git a/code/defines/procs/forum_activation.dm b/code/defines/procs/forum_activation.dm
index b87127ae4cf..88e9705e5ed 100644
--- a/code/defines/procs/forum_activation.dm
+++ b/code/defines/procs/forum_activation.dm
@@ -35,12 +35,8 @@
return
// Sanitize inputs to avoid SQL injection attacks
- accname = dd_replacetext(accname, "'", "''")
- accname = dd_replacetext(accname, ";", "")
- accname = dd_replacetext(accname, "&", "")
- playerkey = dd_replacetext(playerkey, "'", "''")
- playerkey = dd_replacetext(playerkey, ";", "")
- playerkey = dd_replacetext(playerkey, "&", "")
+ accname = sanitizeSQL(accname)
+ playerkey = sanitizeSQL(playerkey)
var/DBQuery/query = dbcon.NewQuery("SELECT user_id FROM [forumsqldb].phpbb_users WHERE username = '[accname]'")
@@ -52,7 +48,7 @@
dbcon.Disconnect()
return
- query = dbcon.NewQuery("SELECT pf_byondkey FROM [forumsqldb].phpbb_profile_fields_data WHERE user_id = [uid]")
+ query = dbcon.NewQuery("SELECT pf_byondkey FROM [forumsqldb].phpbb_profile_fields_data WHERE user_id = '[uid]'")
if(!query.Execute())
src << "Unable to verify whether account is already associated with a BYOND key or not. This error shouldn't occur, please contact an administrator."
dbcon.Disconnect()
@@ -65,7 +61,7 @@
dbcon.Disconnect()
return
- query = dbcon.NewQuery("SELECT * FROM [forumsqldb].phpbb_user_group WHERE user_id = [uid] AND group_id = [forum_authenticated_group]")
+ query = dbcon.NewQuery("SELECT * FROM [forumsqldb].phpbb_user_group WHERE user_id = '[uid]' AND group_id = '[forum_authenticated_group]'")
if(!query.Execute())
src << "Unable to verify whether account is already part of the authenticated group or not. This error should not occur, please contact an administrator."
dbcon.Disconnect()
@@ -75,19 +71,19 @@
dbcon.Disconnect()
return
- query = dbcon.NewQuery("INSERT INTO [forumsqldb].phpbb_profile_fields_data (user_id, pf_byondkey) VALUES ([uid], '[playerkey]')") // Remember which key is associated with the account
+ query = dbcon.NewQuery("INSERT INTO [forumsqldb].phpbb_profile_fields_data (user_id, pf_byondkey) VALUES ('[uid]', '[playerkey]')") // Remember which key is associated with the account
if(!query.Execute())
src << "Unable to associate key with account. Authentication failed."
dbcon.Disconnect()
return
- query = dbcon.NewQuery("UPDATE [forumsqldb].phpbb_user_group SET group_id = [forum_authenticated_group] WHERE user_id = [uid] AND group_id = [forum_activated_group]") // Replace 'Registered Users' group with 'Activated Users'
+ query = dbcon.NewQuery("UPDATE [forumsqldb].phpbb_user_group SET group_id = '[forum_authenticated_group]' WHERE user_id = '[uid]' AND group_id = '[forum_activated_group]'") // Replace 'Registered Users' group with 'Activated Users'
if(!query.Execute())
src << "Unable to move account into authenticated group. This error shouldn't occur, contact an administrator for help. Authentication failed."
dbcon.Disconnect()
return
- query = dbcon.NewQuery("UPDATE [forumsqldb].phpbb_users SET group_id = [forum_authenticated_group] WHERE user_id = [uid]") // Change 'default group' the the authenticated group. Not doing so was causing many authenticated accounts to retain their unauthenticated permissions, despite being succesfully authenticated.
+ query = dbcon.NewQuery("UPDATE [forumsqldb].phpbb_users SET group_id = '[forum_authenticated_group]' WHERE user_id = '[uid]'") // Change 'default group' the the authenticated group. Not doing so was causing many authenticated accounts to retain their unauthenticated permissions, despite being succesfully authenticated.
if(!query.Execute())
src << "Unable to modify default group for account. This error should never occur, contact an administrator for help. Authentication failed."
else
@@ -95,8 +91,12 @@
dbcon.Disconnect()
+// This actually opens up a bunch of security holes to the forum DB. Given that it's not used much in the first place,
+// I'm going to keep this commented out until we're sure everything's secure. -- TLE
+/*
/client/verb/activate_forum_account(var/a as text)
set name = "Activate Forum Account"
set category = "Special Verbs"
set desc = "Associate a tgstation forum account with your BYOND key to enable posting."
- associate_key_with_forum(a, src.key)
\ No newline at end of file
+ associate_key_with_forum(a, src.key)
+*/
\ No newline at end of file
diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm
index 4f043aaa959..dd97fea6c59 100644
--- a/code/defines/procs/gamehelpers.dm
+++ b/code/defines/procs/gamehelpers.dm
@@ -19,7 +19,7 @@
return null
return 0
-/proc/get_area_name(N) //get area by it's name
+/proc/get_area_name(N) //get area by its name
for(var/area/A in world)
if(A.name == N)
return A
diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm
index 5cb93676266..08183aaf17f 100644
--- a/code/defines/procs/statistics.dm
+++ b/code/defines/procs/statistics.dm
@@ -55,19 +55,19 @@ proc/sql_report_death(var/mob/living/carbon/human/H)
return
var/turf/T = H.loc
- var/area/placeofdeath = T.loc
+ var/area/placeofdeath = get_area(T.loc)
var/podname = placeofdeath.name
- var/sqlname = dd_replacetext(H.real_name, "'", "''")
- var/sqlkey = dd_replacetext(H.key, "'", "''")
- var/sqlpod = dd_replacetext(podname, "'", "''")
- var/sqlspecial = dd_replacetext(H.mind.special_role, "'", "''")
- var/sqljob = dd_replacetext(H.mind.assigned_role, "'", "''")
+ var/sqlname = sanitizeSQL(H.real_name)
+ var/sqlkey = sanitizeSQL(H.key)
+ var/sqlpod = sanitizeSQL(podname)
+ var/sqlspecial = sanitizeSQL(H.mind.special_role)
+ var/sqljob = sanitizeSQL(H.mind.assigned_role)
var/laname
var/lakey
if(H.lastattacker)
- laname = dd_replacetext(H.lastattacker:real_name, "'", "''")
- lakey = dd_replacetext(H.lastattacker:key, "'", "''")
+ laname = sanitizeSQL(H.lastattacker:real_name)
+ lakey = sanitizeSQL(H.lastattacker:key)
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
var/coord = "[H.x], [H.y], [H.z]"
//world << "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])"
@@ -92,19 +92,19 @@ proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H)
return
var/turf/T = H.loc
- var/area/placeofdeath = T.loc
+ var/area/placeofdeath = get_area(T.loc)
var/podname = placeofdeath.name
- var/sqlname = dd_replacetext(H.real_name, "'", "''")
- var/sqlkey = dd_replacetext(H.key, "'", "''")
- var/sqlpod = dd_replacetext(podname, "'", "''")
- var/sqlspecial = dd_replacetext(H.mind.special_role, "'", "''")
- var/sqljob = dd_replacetext(H.mind.assigned_role, "'", "''")
+ var/sqlname = sanitizeSQL(H.real_name)
+ var/sqlkey = sanitizeSQL(H.key)
+ var/sqlpod = sanitizeSQL(podname)
+ var/sqlspecial = sanitizeSQL(H.mind.special_role)
+ var/sqljob = sanitizeSQL(H.mind.assigned_role)
var/laname
var/lakey
if(H.lastattacker)
- laname = dd_replacetext(H.lastattacker:real_name, "'", "''")
- lakey = dd_replacetext(H.lastattacker:key, "'", "''")
+ laname = sanitizeSQL(H.lastattacker:real_name)
+ lakey = sanitizeSQL(H.lastattacker:key)
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
var/coord = "[H.x], [H.y], [H.z]"
//world << "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])"
diff --git a/code/defines/turf.dm b/code/defines/turf.dm
index 133e82e63a5..ccaeb00b604 100644
--- a/code/defines/turf.dm
+++ b/code/defines/turf.dm
@@ -37,7 +37,7 @@
/turf/space
icon = 'space.dmi'
- name = "space"
+ name = "\proper space"
icon_state = "placeholder"
temperature = TCMB
diff --git a/code/game/chemistry.dm b/code/game/chemistry.dm
index c399fc8fc08..2b3f5beecad 100644
--- a/code/game/chemistry.dm
+++ b/code/game/chemistry.dm
@@ -182,6 +182,7 @@
name = "Beaker Box"
icon_state = "beaker"
item_state = "syringe_kit"
+ foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
/obj/item/weapon/storage/beakerbox/New()
..()
diff --git a/code/game/events/EventProcs/ninja_equipment.dm b/code/game/events/EventProcs/ninja_equipment.dm
index 288e3073dc5..d0bc9efdaac 100644
--- a/code/game/events/EventProcs/ninja_equipment.dm
+++ b/code/game/events/EventProcs/ninja_equipment.dm
@@ -1121,7 +1121,7 @@ ________________________________________________________________________________
else break
U << "\blue Gained [totaldrain] energy from [src]."
else
- U << "\red The exosuit's battery has run dry of power. You must find another source."
+ U << "\red The exosuit's battery has run dry. You must find another source of power."
if("CYBORG")
var/mob/living/silicon/robot/A = target
diff --git a/code/game/events/EventsMain.dm b/code/game/events/EventsMain.dm
index 9de8b5f56bd..0516d473668 100644
--- a/code/game/events/EventsMain.dm
+++ b/code/game/events/EventsMain.dm
@@ -14,7 +14,7 @@ var/datum/event/LongTermEvent = null
var/is_ninjad_yet = 0
/proc/SpawnEvent()
- if(!EventsOn || ActiveEvent)
+ if(!EventsOn || ActiveEvent || !config.allow_random_events)
return
if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station && !is_ninjad_yet)
EventTypes |= /datum/event/spaceninja
diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm
index 8c49bd3e3a7..48de9254036 100644
--- a/code/game/gamemodes/intercept_report.dm
+++ b/code/game/gamemodes/intercept_report.dm
@@ -207,14 +207,14 @@
src.text += "
The evil Space Wizards Federation have recently broke their most feared wizard, known only as \"[SWF_desc]\" out of space jail. "
src.text += "He is on the run, last spotted in a system near your present location. If anybody suspicious is located aboard, please "
- src.text += "approach with EXTREME caution. Cent. Com also recommends that it would be wise to not inform the crew of this, due to it's fearful nature."
+ src.text += "approach with EXTREME caution. Cent. Com also recommends that it would be wise to not inform the crew of this, due to their fearful nature."
src.text += "Known attributes include: Brown sandals, a large blue hat, a voluptous white beard, and an inclination to cast spells."
/datum/intercept_text/proc/build_nuke(datum/mind/correct_person)
src.text += "
Cent. Com recently recieved a report of a plot to destory one of our stations in your area. We believe the Nuclear Authentication Disc "
- src.text += "that is standard issue aboard your vessel may be a target, and reccommend removal of this object, and it's storage in a safe "
+ src.text += "that is standard issue aboard your vessel may be a target. We recommend removal of this object, and it's storage in a safe "
src.text += "environment. As this may cause panic among the crew, all efforts should be made to keep this information a secret from all but "
- src.text += "the most trusted members."
+ src.text += "the most trusted crew-members."
/datum/intercept_text/proc/build_malf(datum/mind/correct_person)
var/a_name = pick(src.anomalies)
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 17c970363de..57dea7fc0aa 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -137,8 +137,8 @@
T.loc = C //put shade in stone
T.nodamage = 1
T.canmove = 0
- T.health = T.max_health
+ T.health = T.maxHealth
C.icon_state = "soulstone2"
- T << "Your soul has been recaptured by the soul stone, it's arcane energies reknitting your ethereal form"
+ T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form"
U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone."
return
\ No newline at end of file
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index d7cb81bf739..6676196cece 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -135,7 +135,6 @@
// if ("3")
// usr.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(usr)
// src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown."
- src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown."
if ("4")
feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(usr)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 085541b16cb..c3ee3118ef2 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -205,6 +205,8 @@
if(orient == "RIGHT")
icon_state = "syndipod_1-r"
+ M << "\blue You feel cool air surround you. You go numb as your senses turn inward."
+
for(var/obj/O in src)
O.loc = src.loc
src.add_fingerprint(user)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index c5992128899..726bc8a9899 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -781,6 +781,7 @@
name = "Diskette Box"
icon_state = "disk_kit"
item_state = "syringe_kit"
+ foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
/obj/item/weapon/storage/diskbox/New()
..()
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index a0d3cfbc414..704169b151f 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -88,7 +88,7 @@
"\blue [user] has cleaned the microwave.", \
"\blue You have cleaned the microwave." \
)
- src.dirty = 0 // It's cleaned!
+ src.dirty = 0 // It's clean!
src.broken = 0 // just to be sure
src.icon_state = "mw"
src.flags = OPENCONTAINER
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
new file mode 100644
index 00000000000..dd9176d0476
--- /dev/null
+++ b/code/game/machinery/newscaster.dm
@@ -0,0 +1,846 @@
+//##############################################
+//################### NEWSCASTERS BE HERE! ####
+//###-Agouri###################################
+
+/datum/feed_message
+ var/author=""
+ var/body=""
+ //var/parent_channel
+ var/backup_body=""
+ var/backup_author=""
+
+/datum/feed_channel
+ var/channel_name=""
+ var/list/datum/feed_message/messages = list()
+ //var/message_count = 0
+ var/locked=0
+ var/author=""
+ var/backup_author=""
+ var/censored=0
+ //var/page = null //For newspapers
+
+var/list/obj/machinery/newscaster/allCasters = list() //list that will contain reference to all newscasters in existence.
+
+
+/obj/machinery/newscaster
+ name = "Newscaster"
+ desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
+ icon = 'terminals.dmi'
+ icon_state = "newscaster_normal"
+ var/isbroken = 0 //1 if someone banged it with something heavy
+ var/ispowered = 1 //starts powered, changes with power_change()
+ var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored.
+ var/screen = 0 //Or maybe I'll make it into a list within a list afterwards... whichever I prefer, go fuck yourselves :3
+ // 0 = welcome screen - main menu
+ // 1 = view feed channels
+ // 2 = create feed channel
+ // 3 = create feed story
+ // 4 = feed story submited sucessfully
+ // 5 = feed channel created successfully
+ // 6 = ERROR: Cannot create feed story
+ // 7 = ERROR: Cannot create feed channel
+ // 8 = print newspaper
+ // 9 = viewing channel feeds
+ // 10 = censor feed story
+ // 11 = censor feed channel
+ //Holy shit this is outdated, made this when I was still starting newscasters :3
+ var/paper_remaining = 0
+ var/securityCaster = 0
+ var/unit_no = 0 //Each newscaster has a unit_no
+ // 0 = Caster cannot be used to issue wanted posters
+ // 1 = the opposite
+ var/datum/feed_message/wanted //We're gonna use a feed_message to store data of the wanted person because fields are similar
+ var/wanted_issue = 0
+ // 0 = there's no WANTED issued, we don't need a special icon_state
+ // 1 = Guess what.
+ var/alert = 0
+ // 0 = there hasn't been a news/wanted update in the last minutes
+ // 1 = there has
+ var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster
+ var/msg = ""; //Feed message
+ var/channel_name = ""; //the feed channel which will be receiving the feed, or being created
+ var/c_locked=0;
+ var/hitstaken = 0 //Death at 3 hits from an item with force>=15
+ var/datum/feed_channel/viewing_channel = null
+ luminosity = 0
+ anchored = 1
+
+
+/obj/machinery/newscaster/security_unit
+ name = "Security Newscaster"
+ securityCaster = 1
+
+
+/obj/machinery/newscaster/New() //Right, apparently it's good to have a New() for machinery for some sort of global machine list...
+ allCasters += src
+ src.paper_remaining = 15 // Will probably change this to something better
+ for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) // Let's give it an appropriate unit number
+ src.unit_no++
+ src.update_icon() //for any custom ones on the map...
+
+/obj/machinery/newscaster/Del()
+ allCasters -= src
+ ..()
+
+/obj/machinery/newscaster/update_icon()
+ if(!ispowered || isbroken)
+ icon_state = "newscaster_off"
+ if(isbroken) //If the thing is smashed, add crack overlay on top of the unpowered sprite.
+ src.overlays = null
+ src.overlays += image(src.icon, "crack3")
+ return
+
+ src.overlays = null //reset overlays
+ if(alert) //new message alert overlay
+ src.overlays += "newscaster_alert"
+ if(hitstaken > 0) //Cosmetic damage overlay
+ src.overlays += image(src.icon, "crack[hitstaken]")
+
+ if(wanted_issue) //wanted icon state
+ icon_state = "newscaster_wanted"
+ return
+
+ icon_state = "newscaster_normal"
+ return
+
+/obj/machinery/newscaster/power_change()
+ if(isbroken) //Broken shit can't be powered.
+ return
+ if( src.powered() )
+ src.ispowered = 1
+ stat &= ~NOPOWER
+ src.update_icon()
+ else
+ spawn(rand(0, 15))
+ src.ispowered = 0
+ stat |= NOPOWER
+ src.update_icon()
+
+
+/obj/machinery/newscaster/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
+ src.isbroken=1
+ if(prob(50))
+ del(src)
+ else
+ src.update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in.
+ return
+ else
+ if(prob(50))
+ src.isbroken=1
+ src.update_icon()
+ return
+ return
+
+/obj/machinery/newscaster/attack_ai(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/machinery/newscaster/attack_hand(mob/user as mob)
+ if(!src.ispowered || src.isbroken)
+ return
+ if(istype(user, /mob/living/carbon/human) )
+ var/mob/living/carbon/human/human_user = user
+ var/dat
+ dat = text("