diff --git a/code/defines/area/Space Station 13 areas.dm b/code/defines/area/Space Station 13 areas.dm
index 2ab83f40f9..87265ddeb5 100644
--- a/code/defines/area/Space Station 13 areas.dm
+++ b/code/defines/area/Space Station 13 areas.dm
@@ -381,6 +381,24 @@ proc/process_ghost_teleport_locs()
icon_state = "cave"
requires_power = 0
+/area/asteroid/artifactroom
+ name = "Asteroid - Artifact"
+ icon_state = "cave"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/area/planet/clown
name = "Clown Planet"
icon_state = "honk"
diff --git a/code/defines/mob/living/silicon/robot.dm b/code/defines/mob/living/silicon/robot.dm
index ace55afebf..e438acbed3 100644
--- a/code/defines/mob/living/silicon/robot.dm
+++ b/code/defines/mob/living/silicon/robot.dm
@@ -36,6 +36,7 @@
var/wiresexposed = 0
var/locked = 1
var/list/req_access = list(access_robotics)
+ var/ident = 0
//var/list/laws = list()
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list())
var/viewalerts = 0
diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm
index 021dc61a5c..900f900deb 100644
--- a/code/defines/obj/storage.dm
+++ b/code/defines/obj/storage.dm
@@ -407,3 +407,35 @@
desc = "It has a picture of drinking glasses on it."
icon_state = "box"
item_state = "syringe_kit"
+
+
+
+
+/obj/structure/closet/syndicate/resources/
+ desc = "It's an emergancy storage closet for repairs."
+
+/obj/structure/closet/syndicate/resources/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
diff --git a/code/game/asteroid/artifacts.dm b/code/game/asteroid/artifacts.dm
new file mode 100644
index 0000000000..38b48e9a02
--- /dev/null
+++ b/code/game/asteroid/artifacts.dm
@@ -0,0 +1,93 @@
+var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger,
+ /obj/effect/critter/spesscarp,
+ // /obj/effect/critter/spesscarp/elite,
+ // /obj/creature,
+ // /obj/item/weapon/rcd,
+ // /obj/item/weapon/rcd_ammo,
+ // /obj/item/weapon/spacecash,
+ /obj/item/weapon/cloaking_device,
+ // /obj/item/weapon/gun/energy/teleport_gun,
+ // /obj/item/weapon/rubber_chicken,
+ /obj/item/weapon/melee/energy/sword/pirate,
+ /obj/structure/closet/syndicate/resources,
+ /obj/machinery/wish_granter
+
+ )
+
+var/global/list/spawned_surprises = list()
+
+
+
+
+
+
+
+/obj/machinery/wish_granter
+ name = "Wish Granter"
+ desc = "You're not so sure about this, anymore..."
+ icon = 'device.dmi'
+ icon_state = "syndbeacon"
+
+ anchored = 1
+ density = 1
+
+ var
+ charges = 1
+ insisting = 0
+
+/obj/machinery/wish_granter/attack_hand(var/mob/user as mob)
+ usr.machine = src
+
+ if(charges <= 0)
+ user << "The Wish Granter lies silent."
+ return
+
+ else if(!istype(user, /mob/living/carbon/human))
+ user << "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's."
+ return
+
+ else if(is_special_character(user))
+ user << "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away."
+
+ else if (!insisting)
+ user << "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?"
+ insisting++
+
+ else
+ user << "You speak. [pick("I want the station to disappear","Humanity is corrupt, mankind must be destroyed","I want to be rich", "I want to rule the world","I want immortality.")]. The Wish Granter answers."
+ user << "Your head pounds for a moment, before your vision clears. You are the avatar of the Wish Granter, and your power is LIMITLESS! And it's all yours. You need to make sure no one can take it from you. No one can know, first."
+
+ charges--
+ insisting = 0
+
+ if (!(user.mutations & HULK))
+ user.mutations |= HULK
+
+ if (!(user.mutations & LASER))
+ user.mutations |= LASER
+
+ if (!(user.mutations & XRAY))
+ user.mutations |= XRAY
+ user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
+ user.see_in_dark = 8
+ user.see_invisible = 2
+
+ if (!(user.mutations & COLD_RESISTANCE))
+ user.mutations |= COLD_RESISTANCE
+
+ if (!(user.mutations & TK))
+ user.mutations |= TK
+
+ var/datum/objective/silence/silence = new
+ silence.owner = user.mind
+ user.mind.objectives += silence
+
+ var/obj_count = 1
+ for(var/datum/objective/OBJ in user.mind.objectives)
+ user << "Objective #[obj_count]: [OBJ.explanation_text]"
+ obj_count++
+
+ return
+
+
+
diff --git a/code/game/asteroid/asteroid.dm b/code/game/asteroid/asteroid.dm
index 15e7dabf67..ea549c4d3a 100644
--- a/code/game/asteroid/asteroid.dm
+++ b/code/game/asteroid/asteroid.dm
@@ -1,3 +1,8 @@
+var/global/max_secret_rooms = 6
+
+
+
+
proc/spawn_asteroid(var/turf/start_loc,var/type,var/size,var/richness)//type: 0 or null - random, 1 - nothing, 2 - iron, 3 - silicon
if(!size)
size = pick(100;2,50;3,35;4,25;6,10;12)
@@ -97,7 +102,7 @@ proc/spawn_asteroid(var/turf/start_loc,var/type,var/size,var/richness)//type: 0
return
-proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor)
+proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor , var/clean = 0 , var/name)
var/list/room_turfs = list("walls"=list(),"floors"=list())
//world << "Room spawned at [start_loc.x],[start_loc.y],[start_loc.z]"
@@ -110,24 +115,45 @@ proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor)
for(var/y = 0,y 100)
+ return 0
+
+
+ T=pick(get_area_turfs(/area/mine/unexplored))
+ if(!T)
+ return 0
+
+ var/list/surroundings = list()
+
+ surroundings += range(7, locate(T.x,T.y,T.z))
+ surroundings += range(7, locate(T.x+size,T.y,T.z))
+ surroundings += range(7, locate(T.x,T.y+size,T.z))
+ surroundings += range(7, locate(T.x+size,T.y+size,T.z))
+
+ if(locate(/area/mine/explored) in surroundings) // +5s are for view range
+ valid = 0
+ continue
+
+ if(locate(/turf/space) in surroundings)
+ valid = 0
+ continue
+
+ if(locate(/area/asteroid/artifactroom) in surroundings)
+ valid = 0
+ continue
+
+ if(!T)
+ return 0
+
+ room = spawn_room(T,size,size,,,1)
+
+ if(room)
+ T = pick(room["floors"])
+ if(T)
+ var/surprise = null
+ valid = 0
+ while(!valid)
+ surprise = pick(space_surprises)
+ if(surprise in spawned_surprises)
+ if(prob(20))
+ valid++
+ else
+ continue
+ else
+ valid++
+
+ spawned_surprises.Add(surprise)
+ new surprise(T)
+
+ return 1
+
+
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index a6d809b13f..123ebc78e6 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -201,6 +201,35 @@ datum/objective/block
return 0
return 1
+datum/objective/silence
+ explanation_text = "Do not allow anyone to escape the station. Only allow the shuttle to be called when everyone is dead and your story is the only one left."
+
+ check_completion()
+ if(emergency_shuttle.location<2)
+ return 0
+
+ var/area/shuttle = locate(/area/shuttle/escape/centcom)
+ var/area/pod1 = locate(/area/shuttle/escape_pod1/centcom)
+ var/area/pod2 = locate(/area/shuttle/escape_pod2/centcom)
+ var/area/pod3 = locate(/area/shuttle/escape_pod3/centcom)
+ var/area/pod4 = locate(/area/shuttle/escape_pod5/centcom)
+
+ for(var/mob/living/player in world)
+ if (player == owner)
+ continue
+ if (player.mind)
+ if (player.stat != 2)
+ if (get_turf(player) in shuttle)
+ return 0
+ if (get_turf(player) in pod1)
+ return 0
+ if (get_turf(player) in pod2)
+ return 0
+ if (get_turf(player) in pod3)
+ return 0
+ if (get_turf(player) in pod4)
+ return 0
+ return 1
datum/objective/escape
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 8e240470ef..aa29cef3ab 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -70,12 +70,18 @@
continue
if (istype(O, /mob/living/carbon/human))
var/mob/living/carbon/human/H = O
- if (istype(H.glasses, /obj/item/clothing/glasses/sunglasses)) continue
+ if (istype(H.glasses, /obj/item/clothing/glasses/sunglasses))
+ continue
if (istype(H.head, /obj/item/clothing/head/helmet/welding))
- if(!H.head:up) continue
- if (istype(H.wear_mask, /obj/item/clothing/mask/gas/voice)) continue
+ if(!H.head:up)
+ continue
+ if (istype(H.wear_mask, /obj/item/clothing/mask/gas/voice))
+ continue
if (istype(O, /mob/living/carbon/alien))//So aliens don't get flashed (they have no external eyes)/N
continue
+ if (istype(O, /mob/living/silicon/robot))
+ if(O:flashproof())
+ continue
O.Weaken(strength)
if ((O.eye_stat > 15 && prob(O.eye_stat + 50)))
diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm
index 379b9fc37c..0a794daaed 100644
--- a/code/game/master_controller.dm
+++ b/code/game/master_controller.dm
@@ -34,6 +34,9 @@ datum/controller/game_controller
setupgenetics()
+ for(var/i = 0, i < max_secret_rooms, i++)
+ make_mining_asteroid_secret()
+
syndicate_code_phrase = generate_code_phrase()//Sets up code phrase for traitors, for the round.
syndicate_code_response = generate_code_phrase()
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index f0f47032ba..3587b3c66f 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -111,8 +111,24 @@
/obj/item/mecha_parts/mecha_equipment/weapon/honker
),
+ "Cyborg Upgrade Modules" = list(
+ /obj/item/borg/upgrade/reset
+ ///obj/item/borg/upgrade/flashproof
+
+
+ ),
+
+
+
+
+
+
"Misc"=list(/obj/item/mecha_parts/mecha_tracking)
)
+
+
+
+
New()
..()
component_parts = list()
@@ -124,6 +140,8 @@
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
RefreshParts()
+ // part_sets["Cyborg Upgrade Modules"] = typesof(/obj/item/borg/upgrade/) - /obj/item/borg/upgrade/ // Eh. This does it dymaically, but to support having the items referenced otherwhere in the code but not being constructable, going to do it manaully.
+
for(var/part_set in part_sets)
convert_part_set(part_set)
files = new /datum/research(src) //Setup the research data holder.
@@ -295,7 +313,7 @@
return
proc/check_resources(var/obj/item/mecha_parts/part)
- if(istype(part, /obj/item/robot_parts) || istype(part, /obj/item/mecha_parts))
+ if(istype(part, /obj/item/robot_parts) || istype(part, /obj/item/mecha_parts) || istype(part,/obj/item/borg/upgrade))
for(var/resource in part.construction_cost)
if(resource in src.resources)
if(src.resources[resource] < get_resource_cost_w_coeff(part,resource))
diff --git a/code/game/objects/devices/flash.dm b/code/game/objects/devices/flash.dm
index ec0c00583c..2540b93ee7 100644
--- a/code/game/objects/devices/flash.dm
+++ b/code/game/objects/devices/flash.dm
@@ -85,7 +85,10 @@
flashfail = 1
else if(issilicon(M))
- M.Weaken(rand(5,10))
+ if(!M:flashproof())
+ M.Weaken(rand(5,10))
+ else
+ flashfail++
if(isrobot(user))
spawn(0)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index f0998d2769..d916303457 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1273,11 +1273,19 @@ var/global/BSACooldown = 0
else
alert("You are not a high enough administrator! Sorry!!!!")
+ if (href_list["quick_create_object"])
+ if (src.rank in list("Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master"))
+ return quick_create_object(usr)
+ else
+ alert("You are not a high enough administrator! Sorry!!!!")
+
+
if (href_list["create_turf"])
if (src.rank in list("Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master"))
return create_turf(usr)
else
alert("You are not a high enough administrator! Sorry!!!!")
+
if (href_list["create_mob"])
if (src.rank in list("Badmin", "Game Admin", "Game Master"))
return create_mob(usr)
@@ -2309,6 +2317,7 @@ var/global/BSACooldown = 0
if(lvl >= 3 )
dat += "Create Object
"
+ dat += "Quick Create Object
"
dat += "Create Turf
"
if(lvl >= 5)
dat += "Create Mob
"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 3942c2e720..d82dc0b8d4 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -235,6 +235,7 @@
verbs += /client/proc/drop_bomb
verbs += /client/proc/cmd_admin_grantfullaccess
verbs += /client/proc/jump_to_dead_group
+ verbs += /client/proc/kill_airgroup
verbs += /client/proc/cmd_admin_drop_everything
verbs += /client/proc/make_sound
verbs += /client/proc/play_local_sound
@@ -411,6 +412,7 @@
//verbs -= /obj/admins/proc/unprison --Merged with player panel
//verbs -= /client/proc/cmd_switch_radio --removed because tcommsat is staying
//verbs -= /client/proc/togglebuildmodeself --removed due to runtimes
+ verbs -= /client/proc/kill_airgroup
return
diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm
index 944ab89c7a..248eebb5ab 100644
--- a/code/modules/admin/create_object.dm
+++ b/code/modules/admin/create_object.dm
@@ -1,4 +1,5 @@
/var/create_object_html = null
+
/obj/admins/proc/create_object(var/mob/user)
if (!create_object_html)
var/objectjs = null
@@ -7,3 +8,21 @@
create_object_html = dd_replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"")
user << browse(dd_replacetext(create_object_html, "/* ref src */", "\ref[src]"), "window=create_object;size=425x475")
+
+
+/obj/admins/proc/quick_create_object(var/mob/user)
+
+ var/quick_create_object_html = null
+ var/pathtext = null
+
+ pathtext = input("Select the path of the object you wish to create.", "Path", "/obj") in list("/obj","/obj/structure","/obj/item","/obj/machinery")
+
+ var path = text2path(pathtext)
+
+ if (!quick_create_object_html)
+ var/objectjs = null
+ objectjs = dd_list2text(typesof(path), ";")
+ quick_create_object_html = file2text('create_object.html')
+ quick_create_object_html = dd_replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"")
+
+ user << browse(dd_replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "window=quick_create_object;size=425x475")
\ No newline at end of file
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 9bc6da3455..b317bd9966 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -195,6 +195,27 @@
usr.loc = pick(dest_group.members)
return
+ kill_airgroup()
+ set name = "Kill Local Airgroup"
+ set desc = "Use this to allow manual manupliation of atmospherics."
+ set category = "Debug"
+ if(!authenticated || !holder)
+ src << "Only administrators may use this command."
+ return
+
+ if(!air_master)
+ usr << "Cannot find air_system"
+ return
+
+ var/turf/T = get_turf(usr)
+ if(istype(T, /turf/simulated))
+ var/datum/air_group/AG = T:parent
+ AG.next_check = 30
+ AG.group_processing = 0
+ else
+ usr << "Local airgroup is unsimulated!"
+
+
tension_report()
set category = "Debug"
set name = "Show Tension Report"
diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm
index 428e78d6c2..9e2b24457d 100644
--- a/code/modules/mob/living/silicon/robot/login.dm
+++ b/code/modules/mob/living/silicon/robot/login.dm
@@ -9,8 +9,9 @@
if (src.stat == 2)
src.verbs += /mob/proc/ghost
if(src.real_name == "Cyborg")
+ src.ident = rand(1, 999)
src.real_name += " "
- src.real_name += "-[rand(1, 999)]"
+ src.real_name += "-[ident]"
src.name = src.real_name
if(!src.connected_ai)
for(var/mob/living/silicon/ai/A in world)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 1714154a71..d1baf64b5f 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -10,7 +10,8 @@
updateicon()
// syndicate = syndie
if(real_name == "Cyborg")
- real_name += " [pick(rand(1, 999))]"
+ ident = rand(1, 999)
+ real_name += "-[ident]"
name = real_name
spawn (4)
@@ -487,10 +488,61 @@
if(prob(25))
src << "Hack attempt detected."
return
+
+ else if(istype(W, /obj/item/borg/upgrade/))
+ var/obj/item/borg/upgrade/U = W
+ if(!opened)
+ usr << "You must access the borgs internals!"
+ else if(!src.module)
+ usr << "The borg must choose a module before he can be upgraded!"
+ else if(U.locked)
+ usr << "The upgrade is locked and cannot be used yet!"
+ else
+ usr << "You apply the upgrade to [src]!"
+ usr.drop_item()
+ U.loc = src
+ U.action(src)
+
+
else
spark_system.start()
return ..()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
@@ -1025,4 +1077,12 @@ Frequency:
if(R)
R.UnlinkSelf()
R << "Buffers flushed and reset. All systems operational."
- src.verbs -= /mob/living/silicon/robot/proc/ResetSecurityCodes
\ No newline at end of file
+ src.verbs -= /mob/living/silicon/robot/proc/ResetSecurityCodes
+
+
+/mob/living/silicon/robot/proc/flashproof()
+ if(module)
+ for(var/obj/item/borg/upgrade/flashproof/F in module.modules)
+ return 1
+
+ return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot_upgrades.dm b/code/modules/mob/living/silicon/robot/robot_upgrades.dm
new file mode 100644
index 0000000000..3c2eaee234
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/robot_upgrades.dm
@@ -0,0 +1,47 @@
+// robot_upgrades.dm
+// Contains various borg upgrades.
+
+/obj/item/borg/upgrade/
+ name = "A borg upgrade module."
+ desc = "Protected by FRM."
+ icon = 'module.dmi'
+ icon_state = "id_mod"
+ var/construction_time = 120
+ var/construction_cost = list("metal"=10000)
+ var/locked = 0
+
+/obj/item/borg/upgrade/proc/action()
+ return
+
+
+/obj/item/borg/upgrade/reset/
+ name = "Borg module reset board"
+ desc = "Used to reset a borg's module. Destroys any other upgrades applied to the borg."
+
+/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R)
+ R.uneq_all()
+ R.hands.icon_state = "nomod"
+ R.icon_state = "robot"
+ del(R.module)
+ R.module = null
+ R.modtype = "robot"
+ R.real_name = "Cyborg [R.ident]"
+ R.name = R.real_name
+ R.nopush = 0
+ R.updateicon()
+ return
+
+
+
+/obj/item/borg/upgrade/flashproof/
+ name = "Borg Flash-Supression"
+ desc = "A highly advanced, complicated system for supressing incoming flashes directed at the borg's optical processing system."
+ construction_cost = list("metal"=10000,"gold"=2000,"silver"=3000,"glass"=2000, "diamond"=5000)
+
+
+/obj/item/borg/upgrade/flashproof/New() // Why the fuck does the fabricator make a new instance of all the items?
+ //desc = "Sunglasses with duct tape." // Why? D:
+
+/obj/item/borg/upgrade/flashproof/action(var/mob/living/silicon/robot/R)
+ if(R.module)
+ R.module += src
diff --git a/tgstation.dme b/tgstation.dme
index 278bd24921..8b24a743d0 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -178,6 +178,7 @@
#define FILE_DIR "icons/vending_icons"
#define FILE_DIR "interface"
#define FILE_DIR "maps"
+#define FILE_DIR "maps/backup"
#define FILE_DIR "sound"
#define FILE_DIR "sound/AI"
#define FILE_DIR "sound/ambience"
@@ -371,6 +372,7 @@
#include "code\game\vote.dm"
#include "code\game\area\ai_monitored.dm"
#include "code\game\area\areas.dm"
+#include "code\game\asteroid\artifacts.dm"
#include "code\game\asteroid\asteroid.dm"
#include "code\game\asteroid\device.dm"
#include "code\game\asteroid\turf.dm"
@@ -934,6 +936,7 @@
#include "code\modules\mob\living\silicon\robot\robot_defense.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
+#include "code\modules\mob\living\silicon\robot\robot_upgrades.dm"
#include "code\modules\mob\living\silicon\robot\say.dm"
#include "code\modules\mob\living\silicon\robot\wires.dm"
#include "code\modules\mob\new_player\hud.dm"