diff --git a/baystation12.dme b/baystation12.dme
index 8b391a9e3ea..85fa3843773 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -157,11 +157,6 @@
#include "code\datums\spells\trigger.dm"
#include "code\datums\spells\turf_teleport.dm"
#include "code\datums\spells\wizard.dm"
-#include "code\datums\visibility_networks\chunk.dm"
-#include "code\datums\visibility_networks\dictionary.dm"
-#include "code\datums\visibility_networks\update_triggers.dm"
-#include "code\datums\visibility_networks\visibility_interface.dm"
-#include "code\datums\visibility_networks\visibility_network.dm"
#include "code\defines\obj.dm"
#include "code\defines\obj\hydro.dm"
#include "code\defines\obj\weapon.dm"
@@ -340,7 +335,6 @@
#include "code\game\machinery\bots\bots.dm"
#include "code\game\machinery\bots\cleanbot.dm"
#include "code\game\machinery\bots\ed209bot.dm"
-#include "code\game\machinery\bots\farmbot.dm"
#include "code\game\machinery\bots\floorbot.dm"
#include "code\game\machinery\bots\medbot.dm"
#include "code\game\machinery\bots\mulebot.dm"
@@ -995,7 +989,6 @@
#include "code\modules\mob\living\silicon\ai\freelook\eye.dm"
#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm"
#include "code\modules\mob\living\silicon\ai\freelook\update_triggers.dm"
-#include "code\modules\mob\living\silicon\ai\freelook\visibility_interface.dm"
#include "code\modules\mob\living\silicon\decoy\death.dm"
#include "code\modules\mob\living\silicon\decoy\decoy.dm"
#include "code\modules\mob\living\silicon\decoy\life.dm"
@@ -1069,12 +1062,6 @@
#include "code\modules\mob\new_player\preferences_setup.dm"
#include "code\modules\mob\new_player\skill.dm"
#include "code\modules\mob\new_player\sprite_accessories.dm"
-#include "code\modules\mob\spirit\cultnet.dm"
-#include "code\modules\mob\spirit\movement.dm"
-#include "code\modules\mob\spirit\spirit.dm"
-#include "code\modules\mob\spirit\viewpoint.dm"
-#include "code\modules\mob\spirit\mask\mask.dm"
-#include "code\modules\mob\spirit\mask\respawn.dm"
#include "code\modules\nano\_JSON.dm"
#include "code\modules\nano\JSON Reader.dm"
#include "code\modules\nano\JSON Writer.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
index 2cdccda1b7a..e6f206a21ea 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
+++ b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
@@ -281,8 +281,6 @@
/obj/machinery/shield_gen/proc/get_shielded_turfs()
var/list/out = list()
for(var/turf/T in range(field_radius, src))
- world << "turf dist:[get_dist(src,T)]"
if(get_dist(src,T) == field_radius)
out.Add(T)
- world << " added"
return out
diff --git a/code/WorkInProgress/kilakk/fax.dm b/code/WorkInProgress/kilakk/fax.dm
index 0d8f4cdde1f..2934d2ed746 100644
--- a/code/WorkInProgress/kilakk/fax.dm
+++ b/code/WorkInProgress/kilakk/fax.dm
@@ -136,7 +136,9 @@ var/list/alldepartments = list("Central Command")
authenticated = 0
if(href_list["dept"])
+ var/lastdpt = dpt
dpt = input(usr, "Which department?", "Choose a department", "") as null|anything in alldepartments
+ if(!dpt) dpt = lastdpt
if(href_list["auth"])
if ( (!( authenticated ) && (scan)) )
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 9db6e92075e..63854ca1b51 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -7,7 +7,6 @@ var/list/directory = list() //list of all ckeys with associated client
var/global/list/player_list = list() //List of all mobs **with clients attached**. Excludes /mob/new_player
var/global/list/mob_list = list() //List of all mobs, including clientless
-var/global/list/spirits = list() //List of all the spirits, including Masks
var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player
var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 71fd57697a4..9c3b69676e3 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -443,29 +443,36 @@ Turf and target are seperate in case you want to teleport some distance from a t
return creatures
-var/list/sortMobsOrder = list( "/mob/living/silicon/ai",
- "/mob/living/silicon/pai",
- "/mob/living/silicon/robot",
- "/mob/living/carbon/human",
- "/mob/spirit/mask",
- "/mob/living/carbon/brain",
- "/mob/living/carbon/alien",
- "/mob/dead/observer",
- "/mob/new_player",
- "/mob/living/carbon/monkey",
- "/mob/living/carbon/slime",
- "/mob/living/simple_animal",
- "/mob/living/silicon/hivebot",
- "/mob/living/silicon/hive_mainframe" )
-
//Orders mobs by type then by name
/proc/sortmobs()
var/list/moblist = list()
var/list/sortmob = sortAtom(mob_list)
- for (var/path in sortMobsOrder)
- for (var/mob/sorting in sortmob)
- if (istype(sorting,text2path(path)))
- moblist.Add(sorting)
+ for(var/mob/living/silicon/ai/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/living/silicon/pai/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/living/silicon/robot/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/living/carbon/human/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/living/carbon/brain/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/living/carbon/alien/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/dead/observer/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/new_player/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/living/carbon/monkey/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/living/carbon/slime/M in sortmob)
+ moblist.Add(M)
+ for(var/mob/living/simple_animal/M in sortmob)
+ moblist.Add(M)
+// for(var/mob/living/silicon/hivebot/M in world)
+// mob_list.Add(M)
+// for(var/mob/living/silicon/hive_mainframe/M in world)
+// mob_list.Add(M)
return moblist
//E = MC^2
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index b513a6cd06b..4c01933dbe6 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -245,7 +245,8 @@ client
if(ismob(D))
body += ""
- body += ""
+ body += ""
+ body += ""
body += ""
body += ""
@@ -268,7 +269,6 @@ client
body += ""
body += ""
body += ""
- body += ""
body += ""
body += ""
body += ""
@@ -495,6 +495,17 @@ client
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
+
+ else if(href_list["give_disease2"])
+ if(!check_rights(R_ADMIN|R_FUN)) return
+
+ var/mob/M = locate(href_list["give_disease2"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ src.give_disease2(M)
+ href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["ninja"])
if(!check_rights(R_SPAWN)) return
@@ -730,18 +741,7 @@ client
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makeai"=href_list["makeai"]))
-
-
- else if(href_list["makemask"])
- if(!check_rights(R_SPAWN)) return
- var/mob/currentMob = locate(href_list["makemask"])
- if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
- if(!currentMob)
- usr << "Mob doesn't exist anymore"
- return
- holder.Topic(href, list("makemask"=href_list["makemask"]))
-
-
+
else if(href_list["setmutantrace"])
if(!check_rights(R_SPAWN)) return
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 32ebbed57ef..733c3e4e93f 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -642,11 +642,20 @@ datum/mind
switch(href_list["cult"])
if("clear")
if(src in ticker.mode.cult)
- ticker.mode.remove_cultist(src)
+ ticker.mode.cult -= src
+ ticker.mode.update_cult_icons_removed(src)
+ special_role = null
+ var/datum/game_mode/cult/cult = ticker.mode
+ if (istype(cult))
+ if(!config.objectives_disabled)
+ cult.memoize_cult_objectives(src)
+ current << "\red You have been brainwashed! You are no longer a cultist!"
+ memory = ""
log_admin("[key_name_admin(usr)] has de-cult'ed [current].")
if("cultist")
if(!(src in ticker.mode.cult))
- ticker.mode.add_cultist(src)
+ ticker.mode.cult += src
+ ticker.mode.update_cult_icons_added(src)
special_role = "Cultist"
current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie."
current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index 2ec9a723678..1b1646ffa43 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -17,6 +17,11 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
for(var/mob/living/target in targets)
spawn(0)
+
+ if(target.buckled)
+ var/obj/structure/stool/bed/buckled_to = target.buckled.
+ buckled_to.unbuckle()
+
var/mobloc = get_turf(target.loc)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc )
var/atom/movable/overlay/animation = new /atom/movable/overlay( mobloc )
diff --git a/code/datums/visibility_networks/chunk.dm b/code/datums/visibility_networks/chunk.dm
deleted file mode 100644
index 4abc1340b0f..00000000000
--- a/code/datums/visibility_networks/chunk.dm
+++ /dev/null
@@ -1,179 +0,0 @@
-#define UPDATE_BUFFER 25 // 2.5 seconds
-
-// CAMERA CHUNK
-//
-// A 16x16 grid of the map with a list of turfs that can be seen, are visible and are dimmed.
-// Allows the mob using this chunk to stream these chunks and know what it can and cannot see.
-
-/datum/visibility_chunk
- var/obscured_image = 'icons/effects/cameravis.dmi'
- var/obscured_sub = "black"
- var/list/obscuredTurfs = list()
- var/list/visibleTurfs = list()
- var/list/obscured = list()
- var/list/viewpoints = list()
- var/list/turfs = list()
- var/list/seenby = list()
- var/visible = 0
- var/changed = 0
- var/updating = 0
- var/x = 0
- var/y = 0
- var/z = 0
-
-/datum/visibility_chunk/proc/add(mob/new_mob)
-
- // if this thing doesn't use one of these visibility systems, kick it out
- if (!new_mob.visibility_interface)
- return
-
- // if the mob being added isn't a valid form of that mob, kick it out
- if (!new_mob.visibility_interface:canBeAddedToChunk(src))
- return
-
- // add this chunk to the list of visible chunks
- new_mob.visibility_interface:addChunk(src)
-
- visible++
- seenby += new_mob
- if(changed && !updating)
- update()
-
-/datum/visibility_chunk/proc/remove(mob/new_mob)
- // if this thing doesn't use one of these visibility systems, kick it out
- if (!new_mob.visibility_interface)
- return
-
- // if the mob being added isn't a valid form of that mob, kick it out
- if (!new_mob.visibility_interface:canBeAddedToChunk(src))
- return
-
- // remove the chunk
- new_mob.visibility_interface:removeChunk(src)
-
- // remove the mob from out lists
- seenby -= new_mob
- if(visible > 0)
- visible--
-
-/datum/visibility_chunk/proc/visibilityChanged(turf/loc)
- if(!visibleTurfs[loc])
- return
- hasChanged()
-
-/datum/visibility_chunk/proc/hasChanged(var/update_now = 0)
- if(visible || update_now)
- if(!updating)
- updating = 1
- spawn(UPDATE_BUFFER) // Batch large changes, such as many doors opening or closing at once
- update()
- updating = 0
- else
- changed = 1
-
-
-/*
-This function needs to be overwritten to return True if the viewpoint object is valid, and false if it is not.
-*/
-/datum/visibility_chunk/proc/validViewpoint(var/viewpoint)
- return FALSE
-
-/*
-This function needs to be overwritten to return a list of visible turfs for that viewpoint
-*/
-/datum/visibility_chunk/proc/getVisibleTurfsForViewpoint(var/viewpoint)
- return list()
-
-// returns a list of turfs which can be seen in by the chunks viewpoints
-/datum/visibility_chunk/proc/getVisibleTurfs()
- var/list/newVisibleTurfs = list()
- for(var/viewpoint in viewpoints)
- if (validViewpoint(viewpoint))
- for (var/turf/t in getVisibleTurfsForViewpoint(viewpoint))
- newVisibleTurfs[t]=t
- return newVisibleTurfs
-
-/*
-This function needs to be overwritten to find nearby viewpoint objects to the chunk center.
-*/
-/datum/visibility_chunk/proc/findNearbyViewpoints()
- return FALSE
-
-/*
-This function can be overwritten to change or randomize the obscuring images
-*/
-/datum/visibility_chunk/proc/setObscuredImage(var/turf/target_turf)
- if(!target_turf.obscured)
- target_turf.obscured = image(obscured_image, target_turf, obscured_sub, 15)
-
-/datum/visibility_chunk/proc/update()
-
- set background = 1
-
- // get a list of all the turfs that our viewpoints can see
- var/list/newVisibleTurfs = getVisibleTurfs()
-
- // Removes turf that isn't in turfs.
- newVisibleTurfs &= turfs
-
- var/list/visAdded = newVisibleTurfs - visibleTurfs
- var/list/visRemoved = visibleTurfs - newVisibleTurfs
-
- visibleTurfs = newVisibleTurfs
- obscuredTurfs = turfs - newVisibleTurfs
-
- // update the visibility overlays
- for(var/turf in visAdded)
- var/turf/t = turf
- if(t.obscured)
- obscured -= t.obscured
- for(var/mob/current_mob in seenby)
- if (current_mob.visibility_interface)
- current_mob.visibility_interface:removeObscuredTurf(t)
-
- for(var/turf in visRemoved)
- var/turf/t = turf
- if(obscuredTurfs[t])
- setObscuredImage(t)
- obscured += t.obscured
- for(var/mob/current_mob in seenby)
- if (current_mob.visibility_interface)
- current_mob.visibility_interface:addObscuredTurf(t)
- else
- seenby -= current_mob
-
-
-// Create a new chunk, since the chunks are made as they are needed.
-/datum/visibility_chunk/New(loc, x, y, z)
-
- // 0xf = 15
- x &= ~0xf
- y &= ~0xf
-
- src.x = x
- src.y = y
- src.z = z
-
- for(var/turf/t in range(10, locate(x + 8, y + 8, z)))
- if(t.x >= x && t.y >= y && t.x < x + 16 && t.y < y + 16)
- turfs[t] = t
-
- // locate all nearby viewpoints
- findNearbyViewpoints()
-
- // get the turfs that are visible to those viewpoints
- visibleTurfs = getVisibleTurfs()
-
- // Removes turf that isn't in turfs.
- visibleTurfs &= turfs
-
- // create the list of turfs we can't see
- obscuredTurfs = turfs - visibleTurfs
-
- // create the list of obscuring images to add to viewing clients
- for(var/turf in obscuredTurfs)
- var/turf/t = turf
- setObscuredImage(t)
- obscured += t.obscured
-
-#undef UPDATE_BUFFER
\ No newline at end of file
diff --git a/code/datums/visibility_networks/dictionary.dm b/code/datums/visibility_networks/dictionary.dm
deleted file mode 100644
index 5f57ddd7a17..00000000000
--- a/code/datums/visibility_networks/dictionary.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-var/datum/visibility_network/cameras/cameranet = new()
-var/datum/visibility_network/cult/cultNetwork = new()
-var/datum/visibility_network/list/visibility_networks = list("ALL_CAMERAS"=cameranet, "CULT" = cultNetwork)
-
-
-// used by turfs and objects to update all visibility networks
-/proc/updateVisibilityNetworks(atom/A, var/opacity_check = 1)
- var/datum/visibility_network/currentNetwork
- for (var/networkName in visibility_networks)
- currentNetwork = visibility_networks[networkName]
- currentNetwork.updateVisibility(A, opacity_check)
\ No newline at end of file
diff --git a/code/datums/visibility_networks/update_triggers.dm b/code/datums/visibility_networks/update_triggers.dm
deleted file mode 100644
index 97ed2db3a6c..00000000000
--- a/code/datums/visibility_networks/update_triggers.dm
+++ /dev/null
@@ -1,94 +0,0 @@
-//UPDATE TRIGGERS, when the chunk (and the surrounding chunks) should update.
-
-// TURFS
-
-/turf
- var/image/obscured
-
-/turf/proc/visibilityChanged()
- if(ticker)
- updateVisibilityNetworks(src)
-
-/turf/simulated/Del()
- visibilityChanged()
- ..()
-
-/turf/simulated/New()
- ..()
- visibilityChanged()
-
-
-
-// STRUCTURES
-
-/obj/structure/Del()
- if(ticker)
- updateVisibilityNetworks(src)
- ..()
-
-/obj/structure/New()
- ..()
- if(ticker)
- updateVisibilityNetworks(src)
-
-// EFFECTS
-
-/obj/effect/Del()
- if(ticker)
- updateVisibilityNetworks(src)
- ..()
-
-/obj/effect/New()
- ..()
- if(ticker)
- updateVisibilityNetworks(src)
-
-
-// DOORS
-
-// Simply updates the visibility of the area when it opens/closes/destroyed.
-/obj/machinery/door/proc/update_nearby_tiles(need_rebuild)
-
- if(!glass)
- updateVisibilityNetworks(src,0)
-
- if(!air_master)
- return 0
-
- for(var/turf/simulated/turf in locs)
- update_heat_protection(turf)
- air_master.mark_for_update(turf)
-
- return 1
-
-
-
-#define UPDATE_VISIBILITY_NETWORK_BUFFER 30
-
-/mob
- var/datum/visibility_network/list/visibilityNetworks=list()
- var/updatingVisibilityNetworks=FALSE
-
-/mob/Move(n,direct)
- var/oldLoc = src.loc
- //. = ..()
- if(..(n,direct))
- if(src.visibilityNetworks.len)
- if(!src.updatingVisibilityNetworks)
- src.updatingVisibilityNetworks = 1
- spawn(UPDATE_VISIBILITY_NETWORK_BUFFER)
- if(oldLoc != src.loc)
- for (var/datum/visibility_network/currentNetwork in src.visibilityNetworks)
- currentNetwork.updateMob(src)
- src.updatingVisibilityNetworks = 0
- return .
-
-/mob/proc/addToVisibilityNetwork(var/datum/visibility_network/network)
- if(network)
- src.visibilityNetworks+=network
-
-/mob/proc/removeFromVisibilityNetwork(var/datum/visibility_network/network)
- if(network)
- src.visibilityNetworks|=network
-
-#undef UPDATE_VISIBILITY_NETWORK_BUFFER
\ No newline at end of file
diff --git a/code/datums/visibility_networks/visibility_interface.dm b/code/datums/visibility_networks/visibility_interface.dm
deleted file mode 100644
index 7d8efba41d3..00000000000
--- a/code/datums/visibility_networks/visibility_interface.dm
+++ /dev/null
@@ -1,46 +0,0 @@
-/datum/visibility_interface
- var/chunk_type = null
- var/mob/controller = null
- var/list/visible_chunks = list()
-
-
-/datum/visibility_interface/New(var/mob/controller)
- src.controller = controller
-
-
-/datum/visibility_interface/proc/validMob()
- return getClient()
-
-/datum/visibility_interface/proc/getClient()
- return controller.client
-
-/datum/visibility_interface/proc/canBeAddedToChunk(var/datum/visibility_chunk/test_chunk)
- return istype(test_chunk,chunk_type)
-
-
-/datum/visibility_interface/proc/addChunk(var/datum/visibility_chunk/test_chunk)
- visible_chunks+=test_chunk
- var/client/currentClient = getClient()
- if(currentClient)
- currentClient.images += test_chunk.obscured
-
-
-/datum/visibility_interface/proc/removeChunk(var/datum/visibility_chunk/test_chunk)
- visible_chunks-=test_chunk
- var/client/currentClient = getClient()
- if(currentClient)
- currentClient.images -= test_chunk.obscured
-
-
-/datum/visibility_interface/proc/removeObscuredTurf(var/turf/target_turf)
- if(validMob())
- var/client/currentClient = getClient()
- if(currentClient)
- currentClient.images -= target_turf.obscured
-
-
-/datum/visibility_interface/proc/addObscuredTurf(var/turf/target_turf)
- if(validMob())
- var/client/currentClient = getClient()
- if(currentClient)
- currentClient.images -= target_turf.obscured
\ No newline at end of file
diff --git a/code/datums/visibility_networks/visibility_network.dm b/code/datums/visibility_networks/visibility_network.dm
deleted file mode 100644
index 225b6e3def6..00000000000
--- a/code/datums/visibility_networks/visibility_network.dm
+++ /dev/null
@@ -1,141 +0,0 @@
-/datum/visibility_network
- var/list/viewpoints = list()
-
- // the type of chunk used by this network
- var/datum/visibility_chunk/ChunkType = /datum/visibility_chunk
-
- // The chunks of the map, mapping the areas that the viewpoints can see.
- var/list/chunks = list()
-
- var/ready = 0
-
-
-// Creates a chunk key string from x,y,z coordinates
-/datum/visibility_network/proc/createChunkKey(x,y,z)
- x &= ~0xf
- y &= ~0xf
- return "[x],[y],[z]"
-
-
-// Checks if a chunk has been Generated in x, y, z.
-/datum/visibility_network/proc/chunkGenerated(x, y, z)
- return (chunks[createChunkKey(x, y, z)])
-
-
-// Returns the chunk in the x, y, z.
-// If there is no chunk, it creates a new chunk and returns that.
-/datum/visibility_network/proc/getChunk(x, y, z)
- var/key = createChunkKey(x, y, z)
- if(!chunks[key])
- chunks[key] = new ChunkType(null, x, y, z)
- return chunks[key]
-
-
-/datum/visibility_network/proc/visibility(var/mob/targetMob)
-
- // if we've got not visibility interface on the mob, we canot do this
- if (!targetMob.visibility_interface)
- return
-
- // 0xf = 15
- var/x1 = max(0, targetMob.x - 16) & ~0xf
- var/y1 = max(0, targetMob.y - 16) & ~0xf
- var/x2 = min(world.maxx, targetMob.x + 16) & ~0xf
- var/y2 = min(world.maxy, targetMob.y + 16) & ~0xf
-
- var/list/visibleChunks = list()
-
- for(var/x = x1; x <= x2; x += 16)
- for(var/y = y1; y <= y2; y += 16)
- visibleChunks += getChunk(x, y, targetMob.z)
-
- var/list/remove = targetMob.visibility_interface:visible_chunks - visibleChunks
- var/list/add = visibleChunks - targetMob.visibility_interface:visible_chunks
-
- for(var/datum/visibility_chunk/chunk in remove)
- chunk.remove(targetMob)
-
- for(var/datum/visibility_chunk/chunk in add)
- chunk.add(targetMob)
-
-
-// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open.
-/datum/visibility_network/proc/updateVisibility(atom/A, var/opacity_check = 1)
- if(!ticker || (opacity_check && !A.opacity))
- return
- majorChunkChange(A, 2)
-
-
-/datum/visibility_network/proc/updateChunk(x, y, z)
- if(!chunkGenerated(x, y, z))
- return
- var/datum/visibility_chunk/chunk = getChunk(x, y, z)
- chunk.hasChanged()
-
-
-/datum/visibility_network/proc/validViewpoint(var/viewpoint)
- return FALSE
-
-
-/datum/visibility_network/proc/addViewpoint(var/viewpoint)
- if(validViewpoint(viewpoint))
- majorChunkChange(viewpoint, 1)
-
-
-/datum/visibility_network/proc/removeViewpoint(var/viewpoint)
- if(validViewpoint(viewpoint))
- majorChunkChange(viewpoint, 0)
-
-/datum/visibility_network/proc/getViewpointFromMob(var/mob/currentMob)
- return FALSE
-
-/datum/visibility_network/proc/updateMob(var/mob/currentMob)
- var/viewpoint = getViewpointFromMob(currentMob)
- if(viewpoint)
- updateViewpoint(viewpoint)
-
-
-/datum/visibility_network/proc/updateViewpoint(var/viewpoint)
- if(validViewpoint(viewpoint))
- majorChunkChange(viewpoint, 1)
-
-
-// Never access this proc directly!!!!
-// This will update the chunk and all the surrounding chunks.
-// It will also add the atom to the cameras list if you set the choice to 1.
-// Setting the choice to 0 will remove the viewpoint from the chunks.
-// If you want to update the chunks around an object, without adding/removing a viewpoint, use choice 2.
-/datum/visibility_network/proc/majorChunkChange(atom/c, var/choice)
- // 0xf = 15
- if(!c)
- return
-
- var/turf/T = get_turf(c)
- if(T)
- var/x1 = max(0, T.x - 8) & ~0xf
- var/y1 = max(0, T.y - 8) & ~0xf
- var/x2 = min(world.maxx, T.x + 8) & ~0xf
- var/y2 = min(world.maxy, T.y + 8) & ~0xf
-
- for(var/x = x1; x <= x2; x += 16)
- for(var/y = y1; y <= y2; y += 16)
- if(chunkGenerated(x, y, T.z))
- var/datum/visibility_chunk/chunk = getChunk(x, y, T.z)
- if(choice == 0)
- // Remove the viewpoint.
- chunk.viewpoints -= c
- else if(choice == 1)
- // You can't have the same viewpoint in the list twice.
- chunk.viewpoints |= c
- chunk.hasChanged()
-
-// checks if the network can see a particular atom
-/datum/visibility_network/proc/checkCanSee(var/atom/target)
- var/turf/position = get_turf(target)
- var/datum/visibility_chunk/chunk = getChunk(position.x, position.y, position.z)
- if(chunk)
- if(chunk.changed)
- chunk.hasChanged(1) // Update now, no matter if it's visible or not.
- if(chunk.visibleTurfs[position])
- return 1
- return 0
\ No newline at end of file
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index f16d2810b0a..e11a950eee3 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -431,7 +431,7 @@
/obj/item/weapon/camera_bug/attack_self(mob/usr as mob)
var/list/cameras = new/list()
- for (var/obj/machinery/camera/C in cameranet.viewpoints)
+ for (var/obj/machinery/camera/C in cameranet.cameras)
if (C.bugged && C.status)
cameras.Add(C)
if (length(cameras) == 0)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index eadbfb06e14..3e19f0bfc1a 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -16,6 +16,7 @@
var/implant=null
var/ckey=null
var/mind=null
+ var/languages=null
/datum/dna2/record/proc/GetData()
var/list/ser=list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0)
@@ -220,6 +221,7 @@
icon = 'icons/obj/computer.dmi'
icon_state = "scanner"
density = 1
+ circuit = /obj/item/weapon/circuitboard/scan_consolenew
var/selected_ui_block = 1.0
var/selected_ui_subblock = 1.0
var/selected_se_block = 1.0
@@ -241,32 +243,6 @@
var/waiting_for_user_input=0 // Fix for #274 (Mash create block injector without answering dialog to make unlimited injectors) - N3X
/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME diskS
if (!src.disk)
user.drop_item()
@@ -276,7 +252,7 @@
nanomanager.update_uis(src) // update all UIs attached to src
return
else
- src.attack_hand(user)
+ ..()
return
/obj/machinery/computer/scan_consolenew/ex_act(severity)
@@ -339,13 +315,6 @@
I.buf = buffer
return 1
-/obj/machinery/computer/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob)
- if ((istype(W, /obj/item/weapon/disk/data)) && (!src.disk))
- user.drop_item()
- W.loc = src
- src.disk = W
- user << "You insert [W]."
- nanomanager.update_uis(src) // update all UIs attached to src
/*
/obj/machinery/computer/scan_consolenew/process() //not really used right now
if(stat & (NOPOWER|BROKEN))
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index b1e3442d343..45452a95e1c 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -8,7 +8,6 @@
/proc/iscultist(mob/living/M as mob)
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult)
-
/proc/is_convertable_to_cult(datum/mind/mind)
if(!istype(mind)) return 0
if(istype(mind.current, /mob/living/carbon/human) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0
@@ -138,8 +137,7 @@
mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
mob.mutations.Remove(CLUMSY)
- add_cult_viewpoint(mob) // give them a viewpoint
-
+
var/obj/item/weapon/paper/talisman/supply/T = new(mob)
var/list/slots = list (
"backpack" = slot_in_backpack,
@@ -175,20 +173,11 @@
cult_mob.mind.store_memory("You remember that [wordexp]", 0, 0)
-/datum/game_mode/proc/add_cult_viewpoint(var/mob/target)
- for(var/obj/cult_viewpoint/viewpoint in target)
- return
- var/obj/cult_viewpoint/viewpoint = new(target)
- viewpoint.loc = target
- return viewpoint
-
-
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
if (!istype(cult_mind))
return 0
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
cult += cult_mind
- add_cult_viewpoint(cult_mind.current)
update_cult_icons_added(cult_mind)
return 1
@@ -205,133 +194,57 @@
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.memory = ""
-
- // remove the cult viewpoint object
- var/obj/viewpoint = getCultViewpoint(cult_mind.current)
- del(viewpoint)
-
update_cult_icons_removed(cult_mind)
if(show_message)
for(var/mob/M in viewers(cult_mind.current))
M << "[cult_mind.current] looks like they just reverted to their old faith!"
-
/datum/game_mode/proc/update_all_cult_icons()
spawn(0)
- // reset the cult
- for(var/datum/mind/cultist in cult)
- reset_cult_icons_for_cultist(cultist)
- // reset the spirits
- for(var/mob/spirit/currentSpirit in spirits)
- reset_cult_icons_for_spirit(currentSpirit)
-
-
-/datum/game_mode/proc/reset_cult_icons_for_cultist(var/datum/mind/target)
- if(target.current)
- if(target.current.client)
- remove_all_cult_icons(target)
- for(var/datum/mind/cultist in cult)
- if(cultist.current)
- add_cult_icon(target.current.client,cultist.current)
-
-
-/datum/game_mode/proc/reset_cult_icons_for_spirit(mob/spirit/target)
- if (target.client)
- remove_all_cult_icons(target)
for(var/datum/mind/cultist in cult)
if(cultist.current)
- add_cult_icon(target.client,cultist.current)
-
-
-/datum/game_mode/proc/add_cult_icon(client/target_client,mob/target_mob)
- var/I = image('icons/mob/mob.dmi', loc = target_mob, icon_state = "cult")
- target_client.images += I
+ if(cultist.current.client)
+ for(var/image/I in cultist.current.client.images)
+ if(I.icon_state == "cult")
+ del(I)
-
-/datum/game_mode/proc/remove_cult_icon(client/target_client,mob/target_mob)
- for(var/image/I in target_client.images)
- if(I.icon_state == "cult" && I.loc == target_mob)
- del(I)
-
-
-/datum/game_mode/proc/remove_all_cult_icons_from_client(client/target)
- for(var/image/I in target.images)
- if(I.icon_state == "cult")
- del(I)
-
-
-/datum/game_mode/proc/remove_all_cult_icons(target)
- var/datum/mind/cultist = target
- if(istype(cultist))
- if(cultist.current)
- if(cultist.current.client)
- remove_all_cult_icons_from_client(cultist.current.client)
- return TRUE
- var/mob/spirit/currentSpirit = target
- if(istype(currentSpirit))
- if (currentSpirit.client)
- remove_all_cult_icons_from_client(currentSpirit.client)
- return TRUE
- return FALSE
-
-
-/datum/game_mode/proc/add_cult_icon_to_spirit(mob/spirit/currentSpirit,datum/mind/cultist)
- if(!istype(currentSpirit) || !istype(cultist))
- return FALSE
- if (currentSpirit.client)
- if (cultist.current)
- add_cult_icon(currentSpirit.client,cultist.current)
-
-
-/datum/game_mode/proc/add_cult_icon_to_cultist(datum/mind/first_cultist,datum/mind/second_cultist)
- if(first_cultist.current && second_cultist.current)
- if(first_cultist.current.client)
- add_cult_icon(first_cultist.current.client, second_cultist.current)
-
-
-/datum/game_mode/proc/remove_cult_icon_from_cultist(datum/mind/first_cultist,datum/mind/second_cultist)
- if(first_cultist.current && second_cultist.current)
- if(first_cultist.current.client)
- remove_cult_icon(first_cultist.current.client,second_cultist.current)
+ for(var/datum/mind/cultist in cult)
+ if(cultist.current)
+ if(cultist.current.client)
+ for(var/datum/mind/cultist_1 in cult)
+ if(cultist_1.current)
+ var/I = image('icons/mob/mob.dmi', loc = cultist_1.current, icon_state = "cult")
+ cultist.current.client.images += I
-
-/datum/game_mode/proc/remove_cult_icon_from_spirit(mob/spirit/currentSpirit,datum/mind/cultist)
- if(!istype(currentSpirit) || !istype(cultist))
- return FALSE
- if (currentSpirit.client)
- if (cultist.current)
- remove_cult_icon(currentSpirit.client,cultist.current)
-
-
-/datum/game_mode/proc/cult_icon_pair_link(datum/mind/first_cultist,datum/mind/second_cultist)
- if (!istype(first_cultist) || !istype(second_cultist))
- return 0
- add_cult_icon_to_cultist(first_cultist,second_cultist)
- add_cult_icon_to_cultist(second_cultist,first_cultist)
-
-/datum/game_mode/proc/cult_icon_pair_unlink(datum/mind/first_cultist,datum/mind/second_cultist)
- if (!istype(first_cultist) || !istype(second_cultist))
- return 0
- remove_cult_icon(first_cultist,second_cultist)
- remove_cult_icon(second_cultist,first_cultist)
-
-
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
spawn(0)
for(var/datum/mind/cultist in cult)
- cult_icon_pair_link(cultist,cult_mind)
- for(var/mob/spirit/currentSpirit in spirits)
- add_cult_icon_to_spirit(currentSpirit,cult_mind)
-
-
+ if(cultist.current)
+ if(cultist.current.client)
+ var/I = image('icons/mob/mob.dmi', loc = cult_mind.current, icon_state = "cult")
+ cultist.current.client.images += I
+ if(cult_mind.current)
+ if(cult_mind.current.client)
+ var/image/J = image('icons/mob/mob.dmi', loc = cultist.current, icon_state = "cult")
+ cult_mind.current.client.images += J
+
+
/datum/game_mode/proc/update_cult_icons_removed(datum/mind/cult_mind)
spawn(0)
for(var/datum/mind/cultist in cult)
- cult_icon_pair_unlink(cultist,cult_mind)
- for(var/mob/spirit/currentSpirit in spirits)
- remove_cult_icon_from_spirit(currentSpirit,cult_mind)
-
+ if(cultist.current)
+ if(cultist.current.client)
+ for(var/image/I in cultist.current.client.images)
+ if(I.icon_state == "cult" && I.loc == cult_mind.current)
+ del(I)
+
+ if(cult_mind.current)
+ if(cult_mind.current.client)
+ for(var/image/I in cult_mind.current.client.images)
+ if(I.icon_state == "cult")
+ del(I)
+
/datum/game_mode/cult/proc/get_unconvertables()
var/list/ucs = list()
@@ -367,10 +280,6 @@
return 1
-/atom/proc/cult_log(var/message)
- investigate_log(message, "cult")
-
-
/datum/game_mode/cult/declare_completion()
if(config.objectives_disabled)
return 1
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 33a7b905d80..ac89f046472 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -1,7 +1,6 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
var/cultwords = list()
-var/rune_to_english = list()
var/runedec = 0
var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", "self", "see", "other", "hide")
@@ -17,22 +16,19 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
/proc/runerandom() //randomizes word meaning
var/list/runewords=list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") ///"orkan" and "allaq" removed.
for (var/word in engwords)
- var/runeword = pick(runewords)
- cultwords[word] = runeword
- rune_to_english[runeword] = word
+ cultwords[word] = pick(runewords)
runewords-=cultwords[word]
-
/obj/effect/rune
desc = ""
anchored = 1
icon = 'icons/obj/rune.dmi'
icon_state = "1"
var/visibility = 0
- var/view_range = 7
unacidable = 1
layer = TURF_LAYER
+
var/word1
var/word2
var/word3
@@ -65,112 +61,122 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
// self other technology - Communication rune //was other hear blood
// join hide technology - stun rune. Rune color: bright pink.
+ New()
+ ..()
+ var/image/blood = image(loc = src)
+ blood.override = 1
+ for(var/mob/living/silicon/ai/AI in player_list)
+ AI.client.images += blood
-/obj/effect/rune/New()
- ..()
- var/image/blood = image(loc = src)
- blood.override = 1
- for(var/mob/living/silicon/ai/AI in player_list)
- AI.client.images += blood
- cultNetwork.viewpoints+=src
- cultNetwork.addViewpoint(src)
+ examine()
+ set src in view(2)
-/obj/effect/rune/Del()
- ..()
- cultNetwork.viewpoints-=src
- cultNetwork.removeViewpoint(src)
+ if(!iscultist(usr))
+ usr << "A strange collection of symbols drawn in blood."
+ return
+ /* Explosions... really?
+ if(desc && !usr.stat)
+ usr << "It reads: [desc]."
+ sleep(30)
+ explosion(src.loc, 0, 2, 5, 5)
+ if(src)
+ del(src)
+ */
+ if(!desc)
+ usr << "A spell circle drawn in blood. It reads: [word1] [word2] [word3]."
+ else
+ usr << "Explosive Runes inscription in blood. It reads: [desc]."
-/obj/effect/rune/examine()
- set src in view(2)
-
- if(!iscultist(usr) && !isSpirit(usr))
- usr << "A strange collection of symbols drawn in blood."
return
- if(!desc)
- usr << "A spell circle drawn in blood. It reads: [word1] [word2] [word3]."
- else
- usr << "Explosive Runes inscription in blood. It reads: [desc]."
-
- return
-/obj/effect/rune/attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/tome) && iscultist(user))
- user << "You retrace your steps, carefully undoing the lines of the rune."
- del(src)
+ attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/tome) && iscultist(user))
+ user << "You retrace your steps, carefully undoing the lines of the rune."
+ del(src)
+ return
+ else if(istype(I, /obj/item/weapon/nullrod))
+ user << "\blue You disrupt the vile magic with the deadening field of the null rod!"
+ del(src)
+ return
return
- else if(istype(I, /obj/item/weapon/nullrod))
- user << "\blue You disrupt the vile magic with the deadening field of the null rod!"
- del(src)
- return
- return
-/obj/effect/rune/proc/get_word_string()
- if (word1 == cultwords["travel"])
- if (word2 == cultwords["self"])
- return "teleport"
- if (word2 == cultwords["other"])
- return "itemport"
- return "[rune_to_english[word1]]_[rune_to_english[word2]]_[rune_to_english[word3]]"
-
-
-/obj/effect/rune
- var/list/effect_dictionary = list( "teleport"=/obj/effect/rune/proc/teleportRune,
- "itemport"=/obj/effect/rune/proc/itemportRune,
- "see_blood_hell"=/obj/effect/rune/proc/tomesummon,
- "hell_destroy_other"=/obj/effect/rune/proc/armor,
- "join_blood_self"=/obj/effect/rune/proc/convert,
- "hell_join_self"=/obj/effect/rune/proc/tearreality,
- "destroy_see_technology"=/obj/effect/rune/proc/empRune,
- "travel_blood_self"=/obj/effect/rune/proc/drain,
- "see_hell_join"=/obj/effect/rune/proc/seer,
- "blood_join_hell"=/obj/effect/rune/proc/raise,
- "hide_see_blood"=/obj/effect/rune/proc/obscureRune,
- "hell_travel_self"=/obj/effect/rune/proc/ajourney,
- "blood_see_travel"=/obj/effect/rune/proc/manifest,
- "hell_technology_join"=/obj/effect/rune/proc/talisman,
- "hell_blood_join"=/obj/effect/rune/proc/sacrifice,
- "blood_see_hide"=/obj/effect/rune/proc/revealrunesrune,
- "destroy_travel_self"=/obj/effect/rune/proc/wall,
- "travel_technology_other"=/obj/effect/rune/proc/freedom,
- "join_other_self"=/obj/effect/rune/proc/cultsummon,
- "hide_other_see"=/obj/effect/rune/proc/deafen,
- "destroy_see_other"=/obj/effect/rune/proc/blind,
- "destroy_see_blood"=/obj/effect/rune/proc/bloodboil,
- "self_other_technology"=/obj/effect/rune/proc/communicate,
- "join_hide_technology"=/obj/effect/rune/proc/runestun )
-
-/obj/effect/rune/attack_hand(mob/living/user as mob)
- if(!iscultist(user))
- user << "You can't mouth the arcane scratchings without fumbling over them."
- return
- if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
- user << "You are unable to speak the words of the rune."
- return
- if(user.silent) // checking if we've been muted somehow
- user << "You are unable to speak at all! You cannot say the words of the rune."
- if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
- return fizzle()
-
- var/word_string = get_word_string()
- if (word_string in effect_dictionary)
- cult_log("of type [effect_dictionary[word_string]] activated by [key_name_admin(user)].")
- return call(src,effect_dictionary[word_string])()
- return fizzle()
+ attack_hand(mob/living/user as mob)
+ if(!iscultist(user))
+ user << "You can't mouth the arcane scratchings without fumbling over them."
+ return
+ if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
+ user << "You are unable to speak the words of the rune."
+ return
+ if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
+ return fizzle()
+// if(!src.visibility)
+// src.visibility=1
+ if(word1 == cultwords["travel"] && word2 == cultwords["self"])
+ return teleport(src.word3)
+ if(word1 == cultwords["see"] && word2 == cultwords["blood"] && word3 == cultwords["hell"])
+ return tomesummon()
+ if(word1 == cultwords["hell"] && word2 == cultwords["destroy"] && word3 == cultwords["other"])
+ return armor()
+ if(word1 == cultwords["join"] && word2 == cultwords["blood"] && word3 == cultwords["self"])
+ return convert()
+ if(word1 == cultwords["hell"] && word2 == cultwords["join"] && word3 == cultwords["self"])
+ return tearreality()
+ if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["technology"])
+ return emp(src.loc,3)
+ if(word1 == cultwords["travel"] && word2 == cultwords["blood"] && word3 == cultwords["self"])
+ return drain()
+ if(word1 == cultwords["see"] && word2 == cultwords["hell"] && word3 == cultwords["join"])
+ return seer()
+ if(word1 == cultwords["blood"] && word2 == cultwords["join"] && word3 == cultwords["hell"])
+ return raise()
+ if(word1 == cultwords["hide"] && word2 == cultwords["see"] && word3 == cultwords["blood"])
+ return obscure(4)
+ if(word1 == cultwords["hell"] && word2 == cultwords["travel"] && word3 == cultwords["self"])
+ return ajourney()
+ if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["travel"])
+ return manifest()
+ if(word1 == cultwords["hell"] && word2 == cultwords["technology"] && word3 == cultwords["join"])
+ return talisman()
+ if(word1 == cultwords["hell"] && word2 == cultwords["blood"] && word3 == cultwords["join"])
+ return sacrifice()
+ if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["hide"])
+ return revealrunes(src)
+ if(word1 == cultwords["destroy"] && word2 == cultwords["travel"] && word3 == cultwords["self"])
+ return wall()
+ if(word1 == cultwords["travel"] && word2 == cultwords["technology"] && word3 == cultwords["other"])
+ return freedom()
+ if(word1 == cultwords["join"] && word2 == cultwords["other"] && word3 == cultwords["self"])
+ return cultsummon()
+ if(word1 == cultwords["hide"] && word2 == cultwords["other"] && word3 == cultwords["see"])
+ return deafen()
+ if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["other"])
+ return blind()
+ if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["blood"])
+ return bloodboil()
+ if(word1 == cultwords["self"] && word2 == cultwords["other"] && word3 == cultwords["technology"])
+ return communicate()
+ if(word1 == cultwords["travel"] && word2 == cultwords["other"])
+ return itemport(src.word3)
+ if(word1 == cultwords["join"] && word2 == cultwords["hide"] && word3 == cultwords["technology"])
+ return runestun()
+ else
+ return fizzle()
-/obj/effect/rune/proc/fizzle()
- if(istype(src,/obj/effect/rune))
- usr.say(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
- else
- usr.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
- for (var/mob/V in viewers(src))
- V.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2)
- return
+ proc
+ fizzle()
+ if(istype(src,/obj/effect/rune))
+ usr.say(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
+ else
+ usr.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
+ for (var/mob/V in viewers(src))
+ V.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2)
+ return
-/obj/effect/rune/proc/check_icon()
- icon = get_uristrune_cult(word1, word2, word3)
+ check_icon()
+ icon = get_uristrune_cult(word1, word2, word3)
/obj/item/weapon/tome
name = "arcane tome"
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index d78c3333ea4..a9217cd00f1 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -1,205 +1,197 @@
var/list/sacrificed = list()
-
+/obj/effect/rune
/////////////////////////////////////////FIRST RUNE
-/obj/effect/rune/proc/teleportRune()
- return teleport(src.word3)
-
-/obj/effect/rune/proc/teleport(var/key)
- var/mob/living/user = usr
- var/allrunesloc[]
- allrunesloc = new/list()
- var/index = 0
-// var/tempnum = 0
- for(var/obj/effect/rune/R in world)
- if(R == src)
- continue
- if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && R.z != 2)
- index++
- allrunesloc.len = index
- allrunesloc[index] = R.loc
- if(index >= 5)
- user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
- if (istype(user, /mob/living))
- user.take_overall_damage(5, 0)
- del(src)
- if(allrunesloc && index != 0)
- if(istype(src,/obj/effect/rune))
- user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting
- else
- user.whisper("Sas[pick("'","`")]so c'arta forbici!")
- user.visible_message("\red [user] disappears in a flash of red light!", \
- "\red You feel as your body gets dragged through the dimension of Nar-Sie!", \
- "\red You hear a sickening crunch and sloshing of viscera.")
- user.loc = allrunesloc[rand(1,index)]
- return
- if(istype(src,/obj/effect/rune))
- return fizzle() //Use friggin manuals, Dorf, your list was of zero length.
- else
- call(/obj/effect/rune/proc/fizzle)()
- return
+ proc
+ teleport(var/key)
+ var/mob/living/user = usr
+ var/allrunesloc[]
+ allrunesloc = new/list()
+ var/index = 0
+ // var/tempnum = 0
+ for(var/obj/effect/rune/R in world)
+ if(R == src)
+ continue
+ if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && R.z != 2)
+ index++
+ allrunesloc.len = index
+ allrunesloc[index] = R.loc
+ if(index >= 5)
+ user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
+ if (istype(user, /mob/living))
+ user.take_overall_damage(5, 0)
+ del(src)
+ if(allrunesloc && index != 0)
+ if(istype(src,/obj/effect/rune))
+ user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting
+ else
+ user.whisper("Sas[pick("'","`")]so c'arta forbici!")
+ user.visible_message("\red [user] disappears in a flash of red light!", \
+ "\red You feel as your body gets dragged through the dimension of Nar-Sie!", \
+ "\red You hear a sickening crunch and sloshing of viscera.")
+ user.loc = allrunesloc[rand(1,index)]
+ return
+ if(istype(src,/obj/effect/rune))
+ return fizzle() //Use friggin manuals, Dorf, your list was of zero length.
+ else
+ call(/obj/effect/rune/proc/fizzle)()
+ return
-/obj/effect/rune/proc/itemportRune()
- return itemport(src.word3)
-/obj/effect/rune/proc/itemport(var/key)
+
+ itemport(var/key)
// var/allrunesloc[]
// allrunesloc = new/list()
// var/index = 0
-// var/tempnum = 0
- var/culcount = 0
- var/runecount = 0
- var/obj/effect/rune/IP = null
- var/mob/living/user = usr
- for(var/obj/effect/rune/R in world)
- if(R == src)
- continue
- if(R.word1 == cultwords["travel"] && R.word2 == cultwords["other"] && R.word3 == key)
- IP = R
- runecount++
- if(runecount >= 2)
- user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
- if (istype(user, /mob/living))
- user.take_overall_damage(5, 0)
- del(src)
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- culcount++
- if(culcount>=3)
- user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
- user.visible_message("\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
- "\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
- "\red You smell ozone.")
- for(var/obj/O in src.loc)
- if(!O.anchored)
- O.loc = IP.loc
- for(var/mob/M in src.loc)
- M.loc = IP.loc
- return
+ // var/tempnum = 0
+ var/culcount = 0
+ var/runecount = 0
+ var/obj/effect/rune/IP = null
+ var/mob/living/user = usr
+ for(var/obj/effect/rune/R in world)
+ if(R == src)
+ continue
+ if(R.word1 == cultwords["travel"] && R.word2 == cultwords["other"] && R.word3 == key)
+ IP = R
+ runecount++
+ if(runecount >= 2)
+ user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
+ if (istype(user, /mob/living))
+ user.take_overall_damage(5, 0)
+ del(src)
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ culcount++
+ if(culcount>=3)
+ user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
+ user.visible_message("\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
+ "\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
+ "\red You smell ozone.")
+ for(var/obj/O in src.loc)
+ if(!O.anchored)
+ O.loc = IP.loc
+ for(var/mob/M in src.loc)
+ M.loc = IP.loc
+ return
- return fizzle()
+ return fizzle()
/////////////////////////////////////////SECOND RUNE
-/obj/effect/rune/proc/tomesummon()
- if(istype(src,/obj/effect/rune))
- usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
- else
- usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
- usr.visible_message("\red Rune disappears with a flash of red light, and in its place now a book lies.", \
- "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \
- "\red You hear a pop and smell ozone.")
- if(istype(src,/obj/effect/rune))
- new /obj/item/weapon/tome(src.loc)
- else
- new /obj/item/weapon/tome(usr.loc)
- del(src)
- return
+ tomesummon()
+ if(istype(src,/obj/effect/rune))
+ usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
+ else
+ usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
+ usr.visible_message("\red Rune disappears with a flash of red light, and in its place now a book lies.", \
+ "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \
+ "\red You hear a pop and smell ozone.")
+ if(istype(src,/obj/effect/rune))
+ new /obj/item/weapon/tome(src.loc)
+ else
+ new /obj/item/weapon/tome(usr.loc)
+ del(src)
+ return
/////////////////////////////////////////THIRD RUNE
-/obj/effect/rune/proc/convert()
- for(var/mob/living/carbon/M in src.loc)
- if(iscultist(M))
- continue
- if(M.stat==2)
- continue
- usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
- M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
- "\red AAAAAAHHHH!.", \
- "\red You hear an anguished scream.")
- cult_log("[key_name_admin(usr)] tried to convert [key_name_admin(M)]")
- if(is_convertable_to_cult(M.mind) && !jobban_isbanned(M, "cultist"))//putting jobban check here because is_convertable uses mind as argument
- ticker.mode.add_cultist(M.mind)
- M.mind.special_role = "Cultist"
- M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
- M << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
- return 1
- else
- M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
- M << "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs."
- return 0
+ convert()
+ for(var/mob/living/carbon/M in src.loc)
+ if(iscultist(M))
+ continue
+ if(M.stat==2)
+ continue
+ usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
+ M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
+ "\red AAAAAAHHHH!.", \
+ "\red You hear an anguished scream.")
+ if(is_convertable_to_cult(M.mind) && !jobban_isbanned(M, "cultist"))//putting jobban check here because is_convertable uses mind as argument
+ ticker.mode.add_cultist(M.mind)
+ M.mind.special_role = "Cultist"
+ M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
+ M << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
+ return 1
+ else
+ M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
+ M << "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs."
+ return 0
- return fizzle()
+ return fizzle()
/////////////////////////////////////////FOURTH RUNE
-/obj/effect/rune/proc/tearreality()
- var/cultist_count = 0
- for(var/mob/M in range(1,src))
- if(iscultist(M) && !M.stat)
- M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
- cultist_count += 1
- if(cultist_count >= 9)
- cult_log("THE CULT HAS SUMMONED NAR'SIE. GGNORE")
- new /obj/machinery/singularity/narsie/large(src.loc)
- if(ticker.mode.name == "cult")
- ticker.mode:eldergod = 0
- return
- else
- return fizzle()
+ tearreality()
+ var/cultist_count = 0
+ for(var/mob/M in range(1,src))
+ if(iscultist(M) && !M.stat)
+ M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
+ cultist_count += 1
+ if(cultist_count >= 9)
+ new /obj/machinery/singularity/narsie/large(src.loc)
+ if(ticker.mode.name == "cult")
+ ticker.mode:eldergod = 0
+ return
+ else
+ return fizzle()
/////////////////////////////////////////FIFTH RUNE
-/obj/effect/rune/proc/empRune()
- emp(src.loc,3)
-
-/obj/effect/rune/proc/emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist
- if(istype(src,/obj/effect/rune))
- usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
- else
- usr.whisper("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
- playsound(U, 'sound/items/Welder2.ogg', 25, 1)
- var/turf/T = get_turf(U)
- if(T)
- T.hotspot_expose(700,125)
- var/rune = src // detaching the proc - in theory
- empulse(U, (range_red - 2), range_red)
- del(rune)
- return
+
+ emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist
+ if(istype(src,/obj/effect/rune))
+ usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
+ else
+ usr.whisper("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
+ playsound(U, 'sound/items/Welder2.ogg', 25, 1)
+ var/turf/T = get_turf(U)
+ if(T)
+ T.hotspot_expose(700,125)
+ var/rune = src // detaching the proc - in theory
+ empulse(U, (range_red - 2), range_red)
+ del(rune)
+ return
/////////////////////////////////////////SIXTH RUNE
-/obj/effect/rune/proc/drain()
- var/drain = 0
- for(var/obj/effect/rune/R in world)
- if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"])
- for(var/mob/living/carbon/D in R.loc)
- if(D.stat!=2)
- cult_log("[key_name_admin(usr)] has drained blood from [key_name_admin(D)]")
- var/bdrain = rand(1,25)
- D << "\red You feel weakened."
- D.take_overall_damage(bdrain, 0)
- drain += bdrain
- if(!drain)
- return fizzle()
- usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")
- usr.visible_message("\red Blood flows from the rune into [usr]!", \
- "\red The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \
- "\red You hear a liquid flowing.")
- var/mob/living/user = usr
- if(user.bhunger)
- user.bhunger = max(user.bhunger-2*drain,0)
- if(drain>=50)
- user.visible_message("\red [user]'s eyes give off eerie red glow!", \
- "\red ...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \
- "\red You hear a heartbeat.")
- user.bhunger += drain
- src = user
- spawn()
- for (,user.bhunger>0,user.bhunger--)
- sleep(50)
- user.take_overall_damage(3, 0)
- return
- user.heal_organ_damage(drain%5, 0)
- drain-=drain%5
- for (,drain>0,drain-=5)
- sleep(2)
- user.heal_organ_damage(5, 0)
- return
+ drain()
+ var/drain = 0
+ for(var/obj/effect/rune/R in world)
+ if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"])
+ for(var/mob/living/carbon/D in R.loc)
+ if(D.stat!=2)
+ var/bdrain = rand(1,25)
+ D << "\red You feel weakened."
+ D.take_overall_damage(bdrain, 0)
+ drain += bdrain
+ if(!drain)
+ return fizzle()
+ usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")
+ usr.visible_message("\red Blood flows from the rune into [usr]!", \
+ "\red The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \
+ "\red You hear a liquid flowing.")
+ var/mob/living/user = usr
+ if(user.bhunger)
+ user.bhunger = max(user.bhunger-2*drain,0)
+ if(drain>=50)
+ user.visible_message("\red [user]'s eyes give off eerie red glow!", \
+ "\red ...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \
+ "\red You hear a heartbeat.")
+ user.bhunger += drain
+ src = user
+ spawn()
+ for (,user.bhunger>0,user.bhunger--)
+ sleep(50)
+ user.take_overall_damage(3, 0)
+ return
+ user.heal_organ_damage(drain%5, 0)
+ drain-=drain%5
+ for (,drain>0,drain-=5)
+ sleep(2)
+ user.heal_organ_damage(5, 0)
+ return
@@ -208,98 +200,98 @@ var/list/sacrificed = list()
/////////////////////////////////////////SEVENTH RUNE
-/obj/effect/rune/proc/seer()
- if(usr.loc==src.loc)
- if(usr.seer==1)
- usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.")
- usr << "\red The world beyond fades from your vision."
- usr.see_invisible = SEE_INVISIBLE_LIVING
- usr.seer = 0
- else if(usr.see_invisible!=SEE_INVISIBLE_LIVING)
- usr << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
- usr.see_invisible = SEE_INVISIBLE_OBSERVER
- usr.seer = 0
- else
- usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
- usr << "\red The world beyond opens to your eyes."
- usr.see_invisible = SEE_INVISIBLE_OBSERVER
- usr.seer = 1
- return
- return fizzle()
+ seer()
+ if(usr.loc==src.loc)
+ if(usr.seer==1)
+ usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.")
+ usr << "\red The world beyond fades from your vision."
+ usr.see_invisible = SEE_INVISIBLE_LIVING
+ usr.seer = 0
+ else if(usr.see_invisible!=SEE_INVISIBLE_LIVING)
+ usr << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
+ usr.see_invisible = SEE_INVISIBLE_OBSERVER
+ usr.seer = 0
+ else
+ usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
+ usr << "\red The world beyond opens to your eyes."
+ usr.see_invisible = SEE_INVISIBLE_OBSERVER
+ usr.seer = 1
+ return
+ return fizzle()
/////////////////////////////////////////EIGHTH RUNE
-/obj/effect/rune/proc/raise()
- var/mob/living/carbon/human/corpse_to_raise
- var/mob/living/carbon/human/body_to_sacrifice
+ raise()
+ var/mob/living/carbon/human/corpse_to_raise
+ var/mob/living/carbon/human/body_to_sacrifice
- var/is_sacrifice_target = 0
- for(var/mob/living/carbon/human/M in src.loc)
- if(M.stat == DEAD)
- if(ticker.mode.name == "cult" && M.mind == ticker.mode:sacrifice_target)
- is_sacrifice_target = 1
- else
- corpse_to_raise = M
- if(M.key)
- M.ghostize(1) //kick them out of their body
- break
- if(!corpse_to_raise)
- if(is_sacrifice_target)
- usr << "\red The Geometer of blood wants this mortal for himself."
- return fizzle()
-
-
- is_sacrifice_target = 0
- find_sacrifice:
- for(var/obj/effect/rune/R in world)
- if(R.word1==cultwords["blood"] && R.word2==cultwords["join"] && R.word3==cultwords["hell"])
- for(var/mob/living/carbon/human/N in R.loc)
- if(ticker.mode.name == "cult" && N.mind && N.mind == ticker.mode:sacrifice_target)
+ var/is_sacrifice_target = 0
+ for(var/mob/living/carbon/human/M in src.loc)
+ if(M.stat == DEAD)
+ if(ticker.mode.name == "cult" && M.mind == ticker.mode:sacrifice_target)
is_sacrifice_target = 1
else
- if(N.stat!= DEAD)
- body_to_sacrifice = N
- break find_sacrifice
+ corpse_to_raise = M
+ if(M.key)
+ M.ghostize(1) //kick them out of their body
+ break
+ if(!corpse_to_raise)
+ if(is_sacrifice_target)
+ usr << "\red The Geometer of blood wants this mortal for himself."
+ return fizzle()
- if(!body_to_sacrifice)
- if (is_sacrifice_target)
- usr << "\red The Geometer of blood wants that corpse for himself."
- else
- usr << "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."
- return fizzle()
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
+ is_sacrifice_target = 0
+ find_sacrifice:
+ for(var/obj/effect/rune/R in world)
+ if(R.word1==cultwords["blood"] && R.word2==cultwords["join"] && R.word3==cultwords["hell"])
+ for(var/mob/living/carbon/human/N in R.loc)
+ if(ticker.mode.name == "cult" && N.mind && N.mind == ticker.mode:sacrifice_target)
+ is_sacrifice_target = 1
+ else
+ if(N.stat!= DEAD)
+ body_to_sacrifice = N
+ break find_sacrifice
- if(!ghost)
- usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
- return fizzle()
+ if(!body_to_sacrifice)
+ if (is_sacrifice_target)
+ usr << "\red The Geometer of blood wants that corpse for himself."
+ else
+ usr << "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."
+ return fizzle()
- corpse_to_raise.revive()
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in loc)
+ if(!O.client) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
- corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed)
- //This means, should that player leave the body, the original may re-enter
- usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
- corpse_to_raise.visible_message("\red [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \
- "\red Life... I'm alive again...", \
- "\red You hear a faint, slightly familiar whisper.")
- body_to_sacrifice.visible_message("\red [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \
- "\red You feel as your blood boils, tearing you apart.", \
- "\red You hear a thousand voices, all crying in pain.")
- body_to_sacrifice.gib()
+ if(!ghost)
+ usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
+ return fizzle()
+
+ corpse_to_raise.revive()
+
+ corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed)
+ //This means, should that player leave the body, the original may re-enter
+ usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
+ corpse_to_raise.visible_message("\red [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \
+ "\red Life... I'm alive again...", \
+ "\red You hear a faint, slightly familiar whisper.")
+ body_to_sacrifice.visible_message("\red [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \
+ "\red You feel as your blood boils, tearing you apart.", \
+ "\red You hear a thousand voices, all crying in pain.")
+ body_to_sacrifice.gib()
// if(ticker.mode.name == "cult")
// ticker.mode:add_cultist(corpse_to_raise.mind)
// else
// ticker.mode.cult |= corpse_to_raise.mind
- corpse_to_raise << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
- corpse_to_raise << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
- return
+ corpse_to_raise << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
+ corpse_to_raise << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
+ return
@@ -307,118 +299,116 @@ var/list/sacrificed = list()
/////////////////////////////////////////NINETH RUNE
-/obj/effect/rune/proc/obscureRune()
- return obscure(4)
-/obj/effect/rune/proc/obscure(var/rad)
- var/S=0
- for(var/obj/effect/rune/R in orange(rad,src))
- if(R!=src)
- R.invisibility=INVISIBILITY_OBSERVER
- S=1
- if(S)
- if(istype(src,/obj/effect/rune))
- usr.say("Kla[pick("'","`")]atu barada nikt'o!")
- for (var/mob/V in viewers(src))
- V.show_message("\red The rune turns into gray dust, veiling the surrounding runes.", 3)
- del(src)
- else
- usr.whisper("Kla[pick("'","`")]atu barada nikt'o!")
- usr << "\red Your talisman turns into gray dust, veiling the surrounding runes."
- for (var/mob/V in orange(1,src))
- if(V!=usr)
- V.show_message("\red Dust emanates from [usr]'s hands for a moment.", 3)
+ obscure(var/rad)
+ var/S=0
+ for(var/obj/effect/rune/R in orange(rad,src))
+ if(R!=src)
+ R.invisibility=INVISIBILITY_OBSERVER
+ S=1
+ if(S)
+ if(istype(src,/obj/effect/rune))
+ usr.say("Kla[pick("'","`")]atu barada nikt'o!")
+ for (var/mob/V in viewers(src))
+ V.show_message("\red The rune turns into gray dust, veiling the surrounding runes.", 3)
+ del(src)
+ else
+ usr.whisper("Kla[pick("'","`")]atu barada nikt'o!")
+ usr << "\red Your talisman turns into gray dust, veiling the surrounding runes."
+ for (var/mob/V in orange(1,src))
+ if(V!=usr)
+ V.show_message("\red Dust emanates from [usr]'s hands for a moment.", 3)
- return
- if(istype(src,/obj/effect/rune))
- return fizzle()
- else
- call(/obj/effect/rune/proc/fizzle)()
- return
+ return
+ if(istype(src,/obj/effect/rune))
+ return fizzle()
+ else
+ call(/obj/effect/rune/proc/fizzle)()
+ return
/////////////////////////////////////////TENTH RUNE
-/obj/effect/rune/proc/ajourney() //some bits copypastaed from admin tools - Urist
- if(usr.loc==src.loc)
- var/mob/living/carbon/human/L = usr
- usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!")
- usr.visible_message("\red [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \
- "\red The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \
- "\red You hear only complete silence for a moment.")
- usr.ghostize(1)
- L.ajourn = 1
- while(L)
- if(L.key)
- L.ajourn=0
- return
- else
- L.take_organ_damage(10, 0)
- sleep(100)
- return fizzle()
+ ajourney() //some bits copypastaed from admin tools - Urist
+ if(usr.loc==src.loc)
+ var/mob/living/carbon/human/L = usr
+ usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!")
+ usr.visible_message("\red [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \
+ "\red The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \
+ "\red You hear only complete silence for a moment.")
+ usr.ghostize(1)
+ L.ajourn = 1
+ while(L)
+ if(L.key)
+ L.ajourn=0
+ return
+ else
+ L.take_organ_damage(10, 0)
+ sleep(100)
+ return fizzle()
/////////////////////////////////////////ELEVENTH RUNE
-/obj/effect/rune/proc/manifest()
- var/obj/effect/rune/this_rune = src
- src = null
- if(usr.loc!=this_rune.loc)
- return this_rune.fizzle()
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in this_rune.loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
- if(!ghost)
- return this_rune.fizzle()
- if(jobban_isbanned(ghost, "cultist"))
- return this_rune.fizzle()
+ manifest()
+ var/obj/effect/rune/this_rune = src
+ src = null
+ if(usr.loc!=this_rune.loc)
+ return this_rune.fizzle()
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in this_rune.loc)
+ if(!O.client) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
+ if(!ghost)
+ return this_rune.fizzle()
+ if(jobban_isbanned(ghost, "cultist"))
+ return this_rune.fizzle()
- usr.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!")
- var/mob/living/carbon/human/dummy/D = new(this_rune.loc)
- usr.visible_message("\red A shape forms in the center of the rune. A shape of... a man.", \
- "\red A shape forms in the center of the rune. A shape of... a man.", \
- "\red You hear liquid flowing.")
- D.real_name = "Unknown"
- var/chose_name = 0
- for(var/obj/item/weapon/paper/P in this_rune.loc)
- if(P.info)
- D.real_name = copytext(P.info, findtext(P.info,">")+1, findtext(P.info,"<",2) )
- chose_name = 1
- break
- if(!chose_name)
- D.real_name = "[pick(first_names_male)] [pick(last_names)]"
- D.universal_speak = 1
- D.status_flags &= ~GODMODE
- D.s_tone = 35
- D.b_eyes = 200
- D.r_eyes = 200
- D.g_eyes = 200
- D.underwear = 0
+ usr.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!")
+ var/mob/living/carbon/human/dummy/D = new(this_rune.loc)
+ usr.visible_message("\red A shape forms in the center of the rune. A shape of... a man.", \
+ "\red A shape forms in the center of the rune. A shape of... a man.", \
+ "\red You hear liquid flowing.")
+ D.real_name = "Unknown"
+ var/chose_name = 0
+ for(var/obj/item/weapon/paper/P in this_rune.loc)
+ if(P.info)
+ D.real_name = copytext(P.info, findtext(P.info,">")+1, findtext(P.info,"<",2) )
+ chose_name = 1
+ break
+ if(!chose_name)
+ D.real_name = "[pick(first_names_male)] [pick(last_names)]"
+ D.universal_speak = 1
+ D.status_flags &= ~GODMODE
+ D.s_tone = 35
+ D.b_eyes = 200
+ D.r_eyes = 200
+ D.g_eyes = 200
+ D.underwear = 0
- D.key = ghost.key
+ D.key = ghost.key
- if(ticker.mode.name == "cult")
- ticker.mode:add_cultist(D.mind)
- else
- ticker.mode.cult+=D.mind
+ if(ticker.mode.name == "cult")
+ ticker.mode:add_cultist(D.mind)
+ else
+ ticker.mode.cult+=D.mind
- D.mind.special_role = "Cultist"
- D << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
- D << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
+ D.mind.special_role = "Cultist"
+ D << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
+ D << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
- var/mob/living/user = usr
- while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
- user.take_organ_damage(1, 0)
- sleep(30)
- if(D)
- D.visible_message("\red [D] slowly dissipates into dust and bones.", \
- "\red You feel pain, as bonds formed between your soul and this homunculus break.", \
- "\red You hear faint rustle.")
- D.dust()
- return
+ var/mob/living/user = usr
+ while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
+ user.take_organ_damage(1, 0)
+ sleep(30)
+ if(D)
+ D.visible_message("\red [D] slowly dissipates into dust and bones.", \
+ "\red You feel pain, as bonds formed between your soul and this homunculus break.", \
+ "\red You hear faint rustle.")
+ D.dust()
+ return
@@ -426,649 +416,625 @@ var/list/sacrificed = list()
/////////////////////////////////////////TWELFTH RUNE
-/obj/effect/rune/proc/talisman()//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm
- var/obj/item/weapon/paper/newtalisman
- var/unsuitable_newtalisman = 0
- for(var/obj/item/weapon/paper/P in src.loc)
- if(!P.info)
- newtalisman = P
- break
- else
- unsuitable_newtalisman = 1
- if (!newtalisman)
- if (unsuitable_newtalisman)
- usr << "\red The blank is tainted. It is unsuitable."
- return fizzle()
+ talisman()//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm
+ var/obj/item/weapon/paper/newtalisman
+ var/unsuitable_newtalisman = 0
+ for(var/obj/item/weapon/paper/P in src.loc)
+ if(!P.info)
+ newtalisman = P
+ break
+ else
+ unsuitable_newtalisman = 1
+ if (!newtalisman)
+ if (unsuitable_newtalisman)
+ usr << "\red The blank is tainted. It is unsuitable."
+ return fizzle()
- var/obj/effect/rune/imbued_from
- var/obj/item/weapon/paper/talisman/T
- for(var/obj/effect/rune/R in orange(1,src))
- if(R==src)
- continue
- if(R.word1==cultwords["travel"] && R.word2==cultwords["self"]) //teleport
- T = new(src.loc)
- T.imbue = "[R.word3]"
- T.info = "[R.word3]"
- imbued_from = R
- break
- if(R.word1==cultwords["see"] && R.word2==cultwords["blood"] && R.word3==cultwords["hell"]) //tome
- T = new(src.loc)
- T.imbue = "newtome"
- imbued_from = R
- break
- if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["technology"]) //emp
- T = new(src.loc)
- T.imbue = "emp"
- imbued_from = R
- break
- if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["destroy"]) //conceal
- T = new(src.loc)
- T.imbue = "conceal"
- imbued_from = R
- break
- if(R.word1==cultwords["hell"] && R.word2==cultwords["destroy"] && R.word3==cultwords["other"]) //armor
- T = new(src.loc)
- T.imbue = "armor"
- imbued_from = R
- break
- if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["hide"]) //reveal
- T = new(src.loc)
- T.imbue = "revealrunes"
- imbued_from = R
- break
- if(R.word1==cultwords["hide"] && R.word2==cultwords["other"] && R.word3==cultwords["see"]) //deafen
- T = new(src.loc)
- T.imbue = "deafen"
- imbued_from = R
- break
- if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["other"]) //blind
- T = new(src.loc)
- T.imbue = "blind"
- imbued_from = R
- break
- if(R.word1==cultwords["self"] && R.word2==cultwords["other"] && R.word3==cultwords["technology"]) //communicat
- T = new(src.loc)
- T.imbue = "communicate"
- imbued_from = R
- break
- if(R.word1==cultwords["join"] && R.word2==cultwords["hide"] && R.word3==cultwords["technology"]) //communicat
- T = new(src.loc)
- T.imbue = "runestun"
- imbued_from = R
- break
- if (imbued_from)
- for (var/mob/V in viewers(src))
- V.show_message("\red The runes turn into dust, which then forms into an arcane image on the paper.", 3)
- usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!")
- del(imbued_from)
- del(newtalisman)
- else
- return fizzle()
+ var/obj/effect/rune/imbued_from
+ var/obj/item/weapon/paper/talisman/T
+ for(var/obj/effect/rune/R in orange(1,src))
+ if(R==src)
+ continue
+ if(R.word1==cultwords["travel"] && R.word2==cultwords["self"]) //teleport
+ T = new(src.loc)
+ T.imbue = "[R.word3]"
+ T.info = "[R.word3]"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["see"] && R.word2==cultwords["blood"] && R.word3==cultwords["hell"]) //tome
+ T = new(src.loc)
+ T.imbue = "newtome"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["technology"]) //emp
+ T = new(src.loc)
+ T.imbue = "emp"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["destroy"]) //conceal
+ T = new(src.loc)
+ T.imbue = "conceal"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["hell"] && R.word2==cultwords["destroy"] && R.word3==cultwords["other"]) //armor
+ T = new(src.loc)
+ T.imbue = "armor"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["hide"]) //reveal
+ T = new(src.loc)
+ T.imbue = "revealrunes"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["hide"] && R.word2==cultwords["other"] && R.word3==cultwords["see"]) //deafen
+ T = new(src.loc)
+ T.imbue = "deafen"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["other"]) //blind
+ T = new(src.loc)
+ T.imbue = "blind"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["self"] && R.word2==cultwords["other"] && R.word3==cultwords["technology"]) //communicat
+ T = new(src.loc)
+ T.imbue = "communicate"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["join"] && R.word2==cultwords["hide"] && R.word3==cultwords["technology"]) //communicat
+ T = new(src.loc)
+ T.imbue = "runestun"
+ imbued_from = R
+ break
+ if (imbued_from)
+ for (var/mob/V in viewers(src))
+ V.show_message("\red The runes turn into dust, which then forms into an arcane image on the paper.", 3)
+ usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!")
+ del(imbued_from)
+ del(newtalisman)
+ else
+ return fizzle()
/////////////////////////////////////////THIRTEENTH RUNE
-/obj/effect/rune/proc/mend()
- var/mob/living/user = usr
- src = null
- user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!")
- user.take_overall_damage(200, 0)
- runedec+=10
- user.visible_message("\red [user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \
- "\red In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \
- "\red You hear faint rustle.")
- for(,user.stat==2)
- sleep(600)
- if (!user)
+ mend()
+ var/mob/living/user = usr
+ src = null
+ user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!")
+ user.take_overall_damage(200, 0)
+ runedec+=10
+ user.visible_message("\red [user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \
+ "\red In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \
+ "\red You hear faint rustle.")
+ for(,user.stat==2)
+ sleep(600)
+ if (!user)
+ return
+ runedec-=10
return
- runedec-=10
- return
/////////////////////////////////////////FOURTEETH RUNE
-// returns 0 if the rune is not used. returns 1 if the rune is used.
-/obj/effect/rune/proc/communicate()
- . = 1 // Default output is 1. If the rune is deleted it will return 1
- var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")
- if(!input)
- if (istype(src))
- fizzle()
- return 0
- else
- return 0
-
- // record this
- cult_log("[key_name(usr,0)] says : [input]")
+ // returns 0 if the rune is not used. returns 1 if the rune is used.
+ communicate()
+ . = 1 // Default output is 1. If the rune is deleted it will return 1
+ var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")
+ if(!input)
+ if (istype(src))
+ fizzle()
+ return 0
+ else
+ return 0
+ if(istype(src,/obj/effect/rune))
+ usr.say("O bidai nabora se[pick("'","`")]sma!")
+ else
+ usr.whisper("O bidai nabora se[pick("'","`")]sma!")
- var/obj/cult_viewpoint/vp = getCultViewpoint(usr)
- if (!vp)
- return 0
-
- var/displayName = vp.get_display_name()
- var/cultName = vp.get_cult_name()
-
- if(istype(src,/obj/effect/rune))
- usr.say("O bidai nabora se[pick("'","`")]sma!")
- else
- usr.whisper("O bidai nabora se[pick("'","`")]sma!")
-
- if(istype(src,/obj/effect/rune))
- usr.say("[input]")
- else
- usr.whisper("[input]")
-
- for(var/datum/mind/H in ticker.mode.cult)
- if (H.current)
- H.current << "[cultName]: [input]"
-
- for(var/mob/spirit/spirit in spirits)
- spirit << "[displayName]: [input]"
-
- del(src)
- return 1
+ if(istype(src,/obj/effect/rune))
+ usr.say("[input]")
+ else
+ usr.whisper("[input]")
+ for(var/datum/mind/H in ticker.mode.cult)
+ if (H.current)
+ H.current << "\red \b [input]"
+ del(src)
+ return 1
/////////////////////////////////////////FIFTEENTH RUNE
-/obj/effect/rune/proc/sacrifice()
- var/list/mob/living/carbon/human/cultsinrange = list()
- var/list/mob/living/carbon/human/victims = list()
- for(var/mob/living/carbon/human/V in src.loc)//Checks for non-cultist humans to sacrifice
- if(ishuman(V))
- if(!(iscultist(V)))
- victims += V//Checks for cult status and mob type
- for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards
- if(istype(I,/obj/item/brain))
- var/obj/item/brain/B = I
- victims += B.brainmob
- else if(istype(I,/obj/item/device/mmi))
- var/obj/item/device/mmi/B = I
- victims += B.brainmob
- else if(istype(I,/obj/item/device/aicard))
- for(var/mob/living/silicon/ai/A in I)
- victims += A
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- cultsinrange += C
- C.say("Barhah hra zar[pick("'","`")]garis!")
- for(var/mob/H in victims)
- if (ticker.mode.name == "cult")
- if(H.mind == ticker.mode:sacrifice_target)
- if(cultsinrange.len >= 3)
- sacrificed += H.mind
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
+ sacrifice()
+ var/list/mob/living/carbon/human/cultsinrange = list()
+ var/list/mob/living/carbon/human/victims = list()
+ for(var/mob/living/carbon/human/V in src.loc)//Checks for non-cultist humans to sacrifice
+ if(ishuman(V))
+ if(!(iscultist(V)))
+ victims += V//Checks for cult status and mob type
+ for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards
+ if(istype(I,/obj/item/brain))
+ var/obj/item/brain/B = I
+ victims += B.brainmob
+ else if(istype(I,/obj/item/device/mmi))
+ var/obj/item/device/mmi/B = I
+ victims += B.brainmob
+ else if(istype(I,/obj/item/device/aicard))
+ for(var/mob/living/silicon/ai/A in I)
+ victims += A
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ cultsinrange += C
+ C.say("Barhah hra zar[pick("'","`")]garis!")
+ for(var/mob/H in victims)
+ if (ticker.mode.name == "cult")
+ if(H.mind == ticker.mode:sacrifice_target)
+ if(cultsinrange.len >= 3)
+ sacrificed += H.mind
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
+ else
+ usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
else
- H.gib()
- usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
+ if(cultsinrange.len >= 3)
+ if(H.stat !=2)
+ if(prob(80))
+ usr << "\red The Geometer of Blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, this soul was not enough to gain His favor."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(H.stat !=2)
+ usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
+ else
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
else
- usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
- else
- if(cultsinrange.len >= 3)
- if(H.stat !=2)
- if(prob(80))
- usr << "\red The Geometer of Blood accepts this sacrifice."
+ if(cultsinrange.len >= 3)
+ if(H.stat !=2)
+ if(prob(80))
+ usr << "\red The Geometer of Blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, this soul was not enough to gain His favor."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(H.stat !=2)
+ usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
+ else
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ for(var/mob/living/carbon/monkey/M in src.loc)
+ if (ticker.mode.name == "cult")
+ if(M.mind == ticker.mode:sacrifice_target)
+ if(cultsinrange.len >= 3)
+ sacrificed += M.mind
+ usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
+ else
+ usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
+ continue
+ else
+ if(prob(20))
+ usr << "\red The Geometer of Blood accepts your meager sacrifice."
ticker.mode:grant_runeword(usr)
else
usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, this soul was not enough to gain His favor."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(prob(40))
- usr << "\red The Geometer of blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
+ usr << "\red However, a mere monkey is not enough to satisfy Him."
else
- if(H.stat !=2)
- usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
- else
- if(prob(40))
- usr << "\red The Geometer of blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(cultsinrange.len >= 3)
- if(H.stat !=2)
- if(prob(80))
- usr << "\red The Geometer of Blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, this soul was not enough to gain His favor."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(prob(40))
- usr << "\red The Geometer of blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(H.stat !=2)
- usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
- else
- if(prob(40))
- usr << "\red The Geometer of blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- for(var/mob/living/carbon/monkey/M in src.loc)
- if (ticker.mode.name == "cult")
- if(M.mind == ticker.mode:sacrifice_target)
- if(cultsinrange.len >= 3)
- sacrificed += M.mind
- usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
- else
- usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
- continue
- else
- if(prob(20))
usr << "\red The Geometer of Blood accepts your meager sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere monkey is not enough to satisfy Him."
- else
- usr << "\red The Geometer of Blood accepts your meager sacrifice."
- if(prob(20))
- ticker.mode.grant_runeword(usr)
- M.gib()
+ if(prob(20))
+ ticker.mode.grant_runeword(usr)
+ M.gib()
/* for(var/mob/living/carbon/alien/A)
- for(var/mob/K in cultsinrange)
- K.say("Barhah hra zar'garis!")
- A.dust() /// A.gib() doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need.
- if (ticker.mode.name == "cult")
- if(prob(75))
- usr << "\red The Geometer of Blood accepts your exotic sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of Blood accepts your exotic sacrifice."
- usr << "\red However, this alien is not enough to gain His favor."
- else
- usr << "\red The Geometer of Blood accepts your exotic sacrifice."
- return
- return fizzle() */
+ for(var/mob/K in cultsinrange)
+ K.say("Barhah hra zar'garis!")
+ A.dust() /// A.gib() doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need.
+ if (ticker.mode.name == "cult")
+ if(prob(75))
+ usr << "\red The Geometer of Blood accepts your exotic sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of Blood accepts your exotic sacrifice."
+ usr << "\red However, this alien is not enough to gain His favor."
+ else
+ usr << "\red The Geometer of Blood accepts your exotic sacrifice."
+ return
+ return fizzle() */
/////////////////////////////////////////SIXTEENTH RUNE
-/obj/effect/rune/proc/revealrunesrune()
- revealrunes(src)
-
-/obj/effect/rune/proc/revealrunes(var/obj/W as obj)
- var/go=0
- var/rad
- var/S=0
- if(istype(W,/obj/effect/rune))
- rad = 6
- go = 1
- if (istype(W,/obj/item/weapon/paper/talisman))
- rad = 4
- go = 1
- if (istype(W,/obj/item/weapon/nullrod))
- rad = 1
- go = 1
- if(go)
- for(var/obj/effect/rune/R in orange(rad,src))
- if(R!=src)
- R:visibility=15
- S=1
- if(S)
- if(istype(W,/obj/item/weapon/nullrod))
- usr << "\red Arcane markings suddenly glow from underneath a thin layer of dust!"
- return
- if(istype(W,/obj/effect/rune))
- usr.say("Nikt[pick("'","`")]o barada kla'atu!")
- for (var/mob/V in viewers(src))
- V.show_message("\red The rune turns into red dust, reveaing the surrounding runes.", 3)
- del(src)
- return
- if(istype(W,/obj/item/weapon/paper/talisman))
- usr.whisper("Nikt[pick("'","`")]o barada kla'atu!")
- usr << "\red Your talisman turns into red dust, revealing the surrounding runes."
- for (var/mob/V in orange(1,usr.loc))
- if(V!=usr)
- V.show_message("\red Red dust emanates from [usr]'s hands for a moment.", 3)
- return
- return
- if(istype(W,/obj/effect/rune))
- return fizzle()
- if(istype(W,/obj/item/weapon/paper/talisman))
- call(/obj/effect/rune/proc/fizzle)()
- return
+ revealrunes(var/obj/W as obj)
+ var/go=0
+ var/rad
+ var/S=0
+ if(istype(W,/obj/effect/rune))
+ rad = 6
+ go = 1
+ if (istype(W,/obj/item/weapon/paper/talisman))
+ rad = 4
+ go = 1
+ if (istype(W,/obj/item/weapon/nullrod))
+ rad = 1
+ go = 1
+ if(go)
+ for(var/obj/effect/rune/R in orange(rad,src))
+ if(R!=src)
+ R:visibility=15
+ S=1
+ if(S)
+ if(istype(W,/obj/item/weapon/nullrod))
+ usr << "\red Arcane markings suddenly glow from underneath a thin layer of dust!"
+ return
+ if(istype(W,/obj/effect/rune))
+ usr.say("Nikt[pick("'","`")]o barada kla'atu!")
+ for (var/mob/V in viewers(src))
+ V.show_message("\red The rune turns into red dust, reveaing the surrounding runes.", 3)
+ del(src)
+ return
+ if(istype(W,/obj/item/weapon/paper/talisman))
+ usr.whisper("Nikt[pick("'","`")]o barada kla'atu!")
+ usr << "\red Your talisman turns into red dust, revealing the surrounding runes."
+ for (var/mob/V in orange(1,usr.loc))
+ if(V!=usr)
+ V.show_message("\red Red dust emanates from [usr]'s hands for a moment.", 3)
+ return
+ return
+ if(istype(W,/obj/effect/rune))
+ return fizzle()
+ if(istype(W,/obj/item/weapon/paper/talisman))
+ call(/obj/effect/rune/proc/fizzle)()
+ return
/////////////////////////////////////////SEVENTEENTH RUNE
-/obj/effect/rune/proc/wall()
- usr.say("Khari[pick("'","`")]d! Eske'te tannin!")
- src.density = !src.density
- var/mob/living/user = usr
- user.take_organ_damage(2, 0)
- if(src.density)
- usr << "\red Your blood flows into the rune, and you feel that the very space over the rune thickens."
- else
- usr << "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space."
- return
+ wall()
+ usr.say("Khari[pick("'","`")]d! Eske'te tannin!")
+ src.density = !src.density
+ var/mob/living/user = usr
+ user.take_organ_damage(2, 0)
+ if(src.density)
+ usr << "\red Your blood flows into the rune, and you feel that the very space over the rune thickens."
+ else
+ usr << "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space."
+ return
/////////////////////////////////////////EIGHTTEENTH RUNE
-/obj/effect/rune/proc/freedom()
- var/mob/living/user = usr
- var/list/mob/living/carbon/cultists = new
- for(var/datum/mind/H in ticker.mode.cult)
- if (istype(H.current,/mob/living/carbon))
- cultists+=H.current
- var/list/mob/living/carbon/users = new
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- users+=C
- if(users.len>=3)
- var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users)
- if(!cultist)
+ freedom()
+ var/mob/living/user = usr
+ var/list/mob/living/carbon/cultists = new
+ for(var/datum/mind/H in ticker.mode.cult)
+ if (istype(H.current,/mob/living/carbon))
+ cultists+=H.current
+ var/list/mob/living/carbon/users = new
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ users+=C
+ if(users.len>=3)
+ var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users)
+ if(!cultist)
+ return fizzle()
+ if (cultist == user) //just to be sure.
+ return
+ if(!(cultist.buckled || \
+ cultist.handcuffed || \
+ istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \
+ (istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \
+ (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \
+ (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \
+ ))
+ user << "\red The [cultist] is already free."
+ return
+ cultist.buckled = null
+ if (cultist.handcuffed)
+ cultist.drop_from_inventory(cultist.handcuffed)
+ if (cultist.legcuffed)
+ cultist.drop_from_inventory(cultist.legcuffed)
+ if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle))
+ cultist.u_equip(cultist.wear_mask)
+ if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded)
+ cultist.loc:welded = 0
+ if(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked)
+ cultist.loc:locked = 0
+ if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked)
+ cultist.loc:locked = 0
+ for(var/mob/living/carbon/C in users)
+ user.take_overall_damage(15, 0)
+ C.say("Khari[pick("'","`")]d! Gual'te nikka!")
+ del(src)
return fizzle()
- if (cultist == user) //just to be sure.
- return
- if(!(cultist.buckled || \
- cultist.handcuffed || \
- istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \
- (istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \
- (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \
- (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \
- ))
- user << "\red The [cultist] is already free."
- return
- cultist.buckled = null
- if (cultist.handcuffed)
- cultist.handcuffed.loc = cultist.loc
- cultist.handcuffed = null
- cultist.update_inv_handcuffed()
- if (cultist.legcuffed)
- cultist.legcuffed.loc = cultist.loc
- cultist.legcuffed = null
- cultist.update_inv_legcuffed()
- if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle))
- cultist.u_equip(cultist.wear_mask)
- if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded)
- cultist.loc:welded = 0
- if(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked)
- cultist.loc:locked = 0
- if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked)
- cultist.loc:locked = 0
- for(var/mob/living/carbon/C in users)
- user.take_overall_damage(15, 0)
- C.say("Khari[pick("'","`")]d! Gual'te nikka!")
- del(src)
- return fizzle()
/////////////////////////////////////////NINETEENTH RUNE
-/obj/effect/rune/proc/cultsummon()
- var/mob/living/user = usr
- var/list/mob/living/carbon/cultists = new
- for(var/datum/mind/H in ticker.mode.cult)
- if (istype(H.current,/mob/living/carbon))
- cultists+=H.current
- var/list/mob/living/carbon/users = new
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- users+=C
- if(users.len>=3)
- var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user)
- if(!cultist)
+ cultsummon()
+ var/mob/living/user = usr
+ var/list/mob/living/carbon/cultists = new
+ for(var/datum/mind/H in ticker.mode.cult)
+ if (istype(H.current,/mob/living/carbon))
+ cultists+=H.current
+ var/list/mob/living/carbon/users = new
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ users+=C
+ if(users.len>=3)
+ var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user)
+ if(!cultist)
+ return fizzle()
+ if (cultist == user) //just to be sure.
+ return
+ if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
+ user << "\red You cannot summon \the [cultist], for his shackles of blood are strong."
+ return fizzle()
+ cultist.loc = src.loc
+ cultist.lying = 1
+ cultist.regenerate_icons()
+ for(var/mob/living/carbon/human/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!")
+ C.take_overall_damage(25, 0)
+ user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \
+ "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \
+ "\red You hear a pop and smell ozone.")
+ del(src)
return fizzle()
- if (cultist == user) //just to be sure.
- return
- if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
- user << "\red You cannot summon \the [cultist], for his shackles of blood are strong."
- return fizzle()
- cultist.loc = src.loc
- cultist.lying = 1
- cultist.regenerate_icons()
- for(var/mob/living/carbon/human/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!")
- C.take_overall_damage(25, 0)
- user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \
- "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \
- "\red You hear a pop and smell ozone.")
- del(src)
- return fizzle()
/////////////////////////////////////////TWENTIETH RUNES
-/obj/effect/rune/proc/deafen()
- if(istype(src,/obj/effect/rune))
- var/affected = 0
- for(var/mob/living/carbon/C in range(7,src))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.ear_deaf += 50
- C.show_message("\red The world around you suddenly becomes quiet.", 3)
- affected++
- if(prob(1))
- C.sdisabilities |= DEAF
- if(affected)
- usr.say("Sti[pick("'","`")] kaliedir!")
- usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust."
- del(src)
- else
- return fizzle()
- else
- var/affected = 0
- for(var/mob/living/carbon/C in range(7,usr))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.ear_deaf += 30
- //talismans is weaker.
- C.show_message("\red The world around you suddenly becomes quiet.", 3)
- affected++
- if(affected)
- usr.whisper("Sti[pick("'","`")] kaliedir!")
- usr << "\red Your talisman turns into gray dust, deafening everyone around."
- for (var/mob/V in orange(1,src))
- if(!(iscultist(V)))
- V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3)
- return
+ deafen()
+ if(istype(src,/obj/effect/rune))
+ var/affected = 0
+ for(var/mob/living/carbon/C in range(7,src))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.ear_deaf += 50
+ C.show_message("\red The world around you suddenly becomes quiet.", 3)
+ affected++
+ if(prob(1))
+ C.sdisabilities |= DEAF
+ if(affected)
+ usr.say("Sti[pick("'","`")] kaliedir!")
+ usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust."
+ del(src)
+ else
+ return fizzle()
+ else
+ var/affected = 0
+ for(var/mob/living/carbon/C in range(7,usr))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.ear_deaf += 30
+ //talismans is weaker.
+ C.show_message("\red The world around you suddenly becomes quiet.", 3)
+ affected++
+ if(affected)
+ usr.whisper("Sti[pick("'","`")] kaliedir!")
+ usr << "\red Your talisman turns into gray dust, deafening everyone around."
+ for (var/mob/V in orange(1,src))
+ if(!(iscultist(V)))
+ V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3)
+ return
-/obj/effect/rune/proc/blind()
- if(istype(src,/obj/effect/rune))
- var/affected = 0
- for(var/mob/living/carbon/C in viewers(src))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.eye_blurry += 50
- C.eye_blind += 20
- if(prob(5))
- C.disabilities |= NEARSIGHTED
- if(prob(10))
- C.sdisabilities |= BLIND
- C.show_message("\red Suddenly you see red flash that blinds you.", 3)
- affected++
- if(affected)
- usr.say("Sti[pick("'","`")] kaliesin!")
- usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."
- del(src)
- else
- return fizzle()
- else
- var/affected = 0
- for(var/mob/living/carbon/C in view(2,usr))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.eye_blurry += 30
- C.eye_blind += 10
- //talismans is weaker.
- affected++
- C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3)
- if(affected)
- usr.whisper("Sti[pick("'","`")] kaliesin!")
- usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie."
- return
+ blind()
+ if(istype(src,/obj/effect/rune))
+ var/affected = 0
+ for(var/mob/living/carbon/C in viewers(src))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.eye_blurry += 50
+ C.eye_blind += 20
+ if(prob(5))
+ C.disabilities |= NEARSIGHTED
+ if(prob(10))
+ C.sdisabilities |= BLIND
+ C.show_message("\red Suddenly you see red flash that blinds you.", 3)
+ affected++
+ if(affected)
+ usr.say("Sti[pick("'","`")] kaliesin!")
+ usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."
+ del(src)
+ else
+ return fizzle()
+ else
+ var/affected = 0
+ for(var/mob/living/carbon/C in view(2,usr))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.eye_blurry += 30
+ C.eye_blind += 10
+ //talismans is weaker.
+ affected++
+ C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3)
+ if(affected)
+ usr.whisper("Sti[pick("'","`")] kaliesin!")
+ usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie."
+ return
-/obj/effect/rune/proc/bloodboil() //cultists need at least one DANGEROUS rune. Even if they're all stealthy.
+ bloodboil() //cultists need at least one DANGEROUS rune. Even if they're all stealthy.
/*
- var/list/mob/living/carbon/cultists = new
- for(var/datum/mind/H in ticker.mode.cult)
- if (istype(H.current,/mob/living/carbon))
- cultists+=H.current
+ var/list/mob/living/carbon/cultists = new
+ for(var/datum/mind/H in ticker.mode.cult)
+ if (istype(H.current,/mob/living/carbon))
+ cultists+=H.current
*/
- var/culcount = 0 //also, wording for it is old wording for obscure rune, which is now hide-see-blood.
+ var/culcount = 0 //also, wording for it is old wording for obscure rune, which is now hide-see-blood.
// var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood.
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- culcount++
- if(culcount>=3)
- for(var/mob/living/carbon/M in viewers(usr))
- if(iscultist(M))
- continue
- var/obj/item/weapon/nullrod/N = locate() in M
- if(N)
- continue
- cult_log(": Blood Boil damaged [key_name_admin(M)].")
- M.take_overall_damage(51,51)
- M << "\red Your blood boils!"
- if(prob(5))
- spawn(5)
- M.gib()
- for(var/obj/effect/rune/R in view(src))
- if(prob(10))
- explosion(R.loc, -1, 0, 1, 5)
- for(var/mob/living/carbon/human/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- C.say("Dedo ol[pick("'","`")]btoh!")
- C.take_overall_damage(15, 0)
- del(src)
- else
- return fizzle()
- return
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ culcount++
+ if(culcount>=3)
+ for(var/mob/living/carbon/M in viewers(usr))
+ if(iscultist(M))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in M
+ if(N)
+ continue
+ M.take_overall_damage(51,51)
+ M << "\red Your blood boils!"
+ if(prob(5))
+ spawn(5)
+ M.gib()
+ for(var/obj/effect/rune/R in view(src))
+ if(prob(10))
+ explosion(R.loc, -1, 0, 1, 5)
+ for(var/mob/living/carbon/human/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ C.say("Dedo ol[pick("'","`")]btoh!")
+ C.take_overall_damage(15, 0)
+ del(src)
+ else
+ return fizzle()
+ return
// WIP rune, I'll wait for Rastaf0 to add limited blood.
-/obj/effect/rune/proc/burningblood()
- var/culcount = 0
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- culcount++
- if(culcount >= 5)
- for(var/obj/effect/rune/R in world)
- if(R.blood_DNA == src.blood_DNA)
- for(var/mob/living/M in orange(2,R))
- M.take_overall_damage(0,15)
- if (R.invisibility>M.see_invisible)
- M << "\red Aargh it burns!"
- else
- M << "\red Rune suddenly ignites, burning you!"
- var/turf/T = get_turf(R)
- T.hotspot_expose(700,125)
- for(var/obj/effect/decal/cleanable/blood/B in world)
- if(B.blood_DNA == src.blood_DNA)
- for(var/mob/living/M in orange(1,B))
- M.take_overall_damage(0,5)
- M << "\red Blood suddenly ignites, burning you!"
- var/turf/T = get_turf(B)
- T.hotspot_expose(700,125)
- del(B)
- del(src)
+ burningblood()
+ var/culcount = 0
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ culcount++
+ if(culcount >= 5)
+ for(var/obj/effect/rune/R in world)
+ if(R.blood_DNA == src.blood_DNA)
+ for(var/mob/living/M in orange(2,R))
+ M.take_overall_damage(0,15)
+ if (R.invisibility>M.see_invisible)
+ M << "\red Aargh it burns!"
+ else
+ M << "\red Rune suddenly ignites, burning you!"
+ var/turf/T = get_turf(R)
+ T.hotspot_expose(700,125)
+ for(var/obj/effect/decal/cleanable/blood/B in world)
+ if(B.blood_DNA == src.blood_DNA)
+ for(var/mob/living/M in orange(1,B))
+ M.take_overall_damage(0,5)
+ M << "\red Blood suddenly ignites, burning you!"
+ var/turf/T = get_turf(B)
+ T.hotspot_expose(700,125)
+ del(B)
+ del(src)
////////// Rune 24 (counting burningblood, which kinda doesnt work yet.)
-/obj/effect/rune/proc/runestun(var/mob/living/T as mob)
- if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around.
- usr.say("Fuu ma[pick("'","`")]jin!")
- for(var/mob/living/L in viewers(src))
+ runestun(var/mob/living/T as mob)
+ if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around.
+ usr.say("Fuu ma[pick("'","`")]jin!")
+ for(var/mob/living/L in viewers(src))
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- flick("e_flash", C.flash)
- if(C.stuttering < 1 && (!(HULK in C.mutations)))
- C.stuttering = 1
- C.Weaken(1)
- C.Stun(1)
- C.show_message("\red The rune explodes in a bright flash.", 3)
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ flick("e_flash", C.flash)
+ if(C.stuttering < 1 && (!(HULK in C.mutations)))
+ C.stuttering = 1
+ C.Weaken(1)
+ C.Stun(1)
+ C.show_message("\red The rune explodes in a bright flash.", 3)
- else if(issilicon(L))
- var/mob/living/silicon/S = L
- S.Weaken(5)
- S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3)
- del(src)
- else ///When invoked as talisman, stun and mute the target mob.
- usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
- var/obj/item/weapon/nullrod/N = locate() in T
- if(N)
- for(var/mob/O in viewers(T, null))
- O.show_message(text("\red [] invokes a talisman at [], but they are unaffected!", usr, T), 1)
- else
- for(var/mob/O in viewers(T, null))
- O.show_message(text("\red [] invokes a talisman at []", usr, T), 1)
+ else if(issilicon(L))
+ var/mob/living/silicon/S = L
+ S.Weaken(5)
+ S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3)
+ del(src)
+ else ///When invoked as talisman, stun and mute the target mob.
+ usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
+ var/obj/item/weapon/nullrod/N = locate() in T
+ if(N)
+ for(var/mob/O in viewers(T, null))
+ O.show_message(text("\red [] invokes a talisman at [], but they are unaffected!", usr, T), 1)
+ else
+ for(var/mob/O in viewers(T, null))
+ O.show_message(text("\red [] invokes a talisman at []", usr, T), 1)
- if(issilicon(T))
- T.Weaken(15)
+ if(issilicon(T))
+ T.Weaken(15)
- else if(iscarbon(T))
- var/mob/living/carbon/C = T
- flick("e_flash", C.flash)
- if (!(HULK in C.mutations))
- C.silent += 15
- C.Weaken(25)
- C.Stun(25)
- return
+ else if(iscarbon(T))
+ var/mob/living/carbon/C = T
+ flick("e_flash", C.flash)
+ if (!(HULK in C.mutations))
+ C.silent += 15
+ C.Weaken(25)
+ C.Stun(25)
+ return
/////////////////////////////////////////TWENTY-FIFTH RUNE
-/obj/effect/rune/proc/armor()
- var/mob/living/carbon/human/user = usr
- if(istype(src,/obj/effect/rune))
- usr.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
- else
- usr.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
- usr.visible_message("\red The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \
- "\red You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.")
+ armor()
+ var/mob/living/carbon/human/user = usr
+ if(istype(src,/obj/effect/rune))
+ usr.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
+ else
+ usr.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
+ usr.visible_message("\red The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \
+ "\red You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.")
- user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
- user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
- user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes)
- user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
- //the above update their overlay icons cache but do not call update_icons()
- //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache
- user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor
+ user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
+ user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
+ user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes)
+ user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
+ //the above update their overlay icons cache but do not call update_icons()
+ //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache
+ user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor
- del(src)
- return
+ del(src)
+ return
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index e97c915c0ba..665c2f9c00e 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -249,7 +249,7 @@ Implants;
for (var/obj/machinery/computer/communications/comm in machines)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
+ intercept.name = "Cent. Com. Status Summary"
intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. Status Summary")
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index d42f88e8913..da9ce972ce1 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -364,7 +364,14 @@ var/global/datum/controller/gameticker/ticker
robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]"
world << "[robolist]"
+ var/dronecount = 0
+
for (var/mob/living/silicon/robot/robo in mob_list)
+
+ if(istype(robo,/mob/living/silicon/robot/drone))
+ dronecount++
+ continue
+
if (!robo.connected_ai)
if (robo.stat != 2)
world << "[robo.name] (Played by: [robo.key]) survived as an AI-less borg! Its laws were:"
@@ -374,6 +381,9 @@ var/global/datum/controller/gameticker/ticker
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
robo.laws.show_laws(world)
+ if(dronecount)
+ world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round."
+
mode.declare_completion()//To declare normal completion.
//calls auto_declare_completion_* for all modes
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 81559bcfe35..104fbf1cdb7 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -122,7 +122,7 @@ rcd light flash thingy on matter drain
mod_pick_name = "recam"
uses = 10
-/client/proc/reactivate_camera(obj/machinery/camera/C as obj in cameranet.viewpoints)
+/client/proc/reactivate_camera(obj/machinery/camera/C as obj in cameranet.cameras)
set name = "Reactivate Camera"
set category = "Malfunction"
if (istype (C, /obj/machinery/camera))
@@ -143,7 +143,7 @@ rcd light flash thingy on matter drain
mod_pick_name = "upgradecam"
uses = 10
-/client/proc/upgrade_camera(obj/machinery/camera/C as obj in cameranet.viewpoints)
+/client/proc/upgrade_camera(obj/machinery/camera/C as obj in cameranet.cameras)
set name = "Upgrade Camera"
set category = "Malfunction"
if(istype(C))
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 2bed9273e2e..9d86d2a3683 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -246,9 +246,9 @@
synd_mob.equip_to_slot_or_del(new_suit, slot_wear_suit)
synd_mob.equip_to_slot_or_del(new_helmet, slot_head)
- var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(synd_mob)
- E.imp_in = synd_mob
- E.implanted = 1
+// var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(synd_mob)
+// E.imp_in = synd_mob
+// E.implanted = 1
synd_mob.update_icons()
return 1
diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm
index 963579af7c8..2fdf8af27c7 100644
--- a/code/game/gamemodes/revolution/rp-revolution.dm
+++ b/code/game/gamemodes/revolution/rp-revolution.dm
@@ -45,7 +45,7 @@
for (var/obj/machinery/computer/communications/comm in world)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
+ intercept.name = "Cent. Com. Status Summary"
intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. Status Summary")
@@ -116,7 +116,7 @@
for (var/obj/machinery/computer/communications/comm in world)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
+ intercept.name = "Cent. Com. Status Summary"
intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. Status Summary")
@@ -134,7 +134,7 @@
for (var/obj/machinery/computer/communications/comm in world)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
+ intercept.name = "Cent. Com. Status Summary"
intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. Status Summary")
diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm
index 70fd1387f04..71c34c0d04e 100644
--- a/code/game/gamemodes/revolution/rp_revolution.dm
+++ b/code/game/gamemodes/revolution/rp_revolution.dm
@@ -248,7 +248,7 @@
for (var/obj/machinery/computer/communications/comm in world)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Announcement'"
+ intercept.name = "Cent. Com. Announcement"
intercept.info = message
comm.messagetitle.Add("Cent. Com. Announcement")
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 726de7ad810..33d9cb5523e 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -956,109 +956,29 @@ table tr:first-child th:first-child { border: none;}
return output
/obj/machinery/alarm/Topic(href, href_list)
-
- if(href_list["rcon"])
- rcon_setting = text2num(href_list["rcon"])
-
- if ( (get_dist(src, usr) > 1 ))
- if (!istype(usr, /mob/living/silicon))
- usr.machine = null
- usr << browse(null, "window=air_alarm")
- usr << browse(null, "window=AAlarmwires")
- return
+ if(..() || !( Adjacent(usr) || istype(usr, /mob/living/silicon)) ) // dont forget calling super in machine Topics -walter0o
+ usr.machine = null
+ usr << browse(null, "window=air_alarm")
+ usr << browse(null, "window=AAlarmwires")
+ return
add_fingerprint(usr)
- usr.machine = src
-
- if(href_list["command"])
- var/device_id = href_list["id_tag"]
- switch(href_list["command"])
- if( "power",
- "adjust_external_pressure",
- "set_external_pressure",
- "checks",
- "co2_scrub",
- "tox_scrub",
- "n2o_scrub",
- "panic_siphon",
- "scrubbing")
-
- send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) )
-
- if("set_threshold")
- var/env = href_list["env"]
- var/threshold = text2num(href_list["var"])
- var/list/selected = TLV[env]
- var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound")
- var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num
- if (isnull(newval) || ..() || (locked && issilicon(usr)))
- return
- if (newval<0)
- selected[threshold] = -1.0
- else if (env=="temperature" && newval>5000)
- selected[threshold] = 5000
- else if (env=="pressure" && newval>50*ONE_ATMOSPHERE)
- selected[threshold] = 50*ONE_ATMOSPHERE
- else if (env!="temperature" && env!="pressure" && newval>200)
- selected[threshold] = 200
- else
- newval = round(newval,0.01)
- selected[threshold] = newval
- if(threshold == 1)
- if(selected[1] > selected[2])
- selected[2] = selected[1]
- if(selected[1] > selected[3])
- selected[3] = selected[1]
- if(selected[1] > selected[4])
- selected[4] = selected[1]
- if(threshold == 2)
- if(selected[1] > selected[2])
- selected[1] = selected[2]
- if(selected[2] > selected[3])
- selected[3] = selected[2]
- if(selected[2] > selected[4])
- selected[4] = selected[2]
- if(threshold == 3)
- if(selected[1] > selected[3])
- selected[1] = selected[3]
- if(selected[2] > selected[3])
- selected[2] = selected[3]
- if(selected[3] > selected[4])
- selected[4] = selected[3]
- if(threshold == 4)
- if(selected[1] > selected[4])
- selected[1] = selected[4]
- if(selected[2] > selected[4])
- selected[2] = selected[4]
- if(selected[3] > selected[4])
- selected[3] = selected[4]
-
- apply_mode()
-
- if(href_list["screen"])
- screen = text2num(href_list["screen"])
-
- if(href_list["atmos_unlock"])
- switch(href_list["atmos_unlock"])
- if("0")
- air_doors_close(1)
- if("1")
- air_doors_open(1)
-
- if(href_list["atmos_alarm"])
- if (alarm_area.atmosalert(2))
- apply_danger_level(2)
- update_icon()
-
- if(href_list["atmos_reset"])
- if (alarm_area.atmosalert(0))
- apply_danger_level(0)
- update_icon()
-
- if(href_list["mode"])
- mode = text2num(href_list["mode"])
- apply_mode()
-
+ usr.set_machine(src)
+
+ // hrefs that can always be called -walter0o
+ if(href_list["rcon"])
+ var/attempted_rcon_setting = text2num(href_list["rcon"])
+
+ switch(attempted_rcon_setting)
+ if(RCON_NO)
+ rcon_setting = RCON_NO
+ if(RCON_AUTO)
+ rcon_setting = RCON_AUTO
+ if(RCON_YES)
+ rcon_setting = RCON_YES
+ else
+ return
+
if(href_list["temperature"])
var/list/selected = TLV["temperature"]
var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE)
@@ -1069,31 +989,126 @@ table tr:first-child th:first-child { border: none;}
else
target_temperature = input_temperature + T0C
- if (href_list["AAlarmwires"])
- var/t1 = text2num(href_list["AAlarmwires"])
- if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
- usr << "You need wirecutters!"
- return
- if (isWireColorCut(t1))
- mend(t1)
- else
- cut(t1)
- if (AAlarmwires == 0)
- usr << "You cut last of wires inside [src]"
- update_icon()
- buildstage = 1
- return
-
- else if (href_list["pulse"])
- var/t1 = text2num(href_list["pulse"])
- if (!istype(usr.equipped(), /obj/item/device/multitool))
- usr << "You need a multitool!"
- return
- if (isWireColorCut(t1))
- usr << "You can't pulse a cut wire."
- return
- else
- pulse(t1)
+ // hrefs that need the AA unlocked -walter0o
+ if(!locked || istype(usr, /mob/living/silicon))
+
+ if(href_list["command"])
+ var/device_id = href_list["id_tag"]
+ switch(href_list["command"])
+ if( "power",
+ "adjust_external_pressure",
+ "set_external_pressure",
+ "checks",
+ "co2_scrub",
+ "tox_scrub",
+ "n2o_scrub",
+ "panic_siphon",
+ "scrubbing")
+
+ send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) )
+
+ if("set_threshold")
+ var/env = href_list["env"]
+ var/threshold = text2num(href_list["var"])
+ var/list/selected = TLV[env]
+ var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound")
+ var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num
+ if (isnull(newval) || ..() || (locked && issilicon(usr)))
+ return
+ if (newval<0)
+ selected[threshold] = -1.0
+ else if (env=="temperature" && newval>5000)
+ selected[threshold] = 5000
+ else if (env=="pressure" && newval>50*ONE_ATMOSPHERE)
+ selected[threshold] = 50*ONE_ATMOSPHERE
+ else if (env!="temperature" && env!="pressure" && newval>200)
+ selected[threshold] = 200
+ else
+ newval = round(newval,0.01)
+ selected[threshold] = newval
+ if(threshold == 1)
+ if(selected[1] > selected[2])
+ selected[2] = selected[1]
+ if(selected[1] > selected[3])
+ selected[3] = selected[1]
+ if(selected[1] > selected[4])
+ selected[4] = selected[1]
+ if(threshold == 2)
+ if(selected[1] > selected[2])
+ selected[1] = selected[2]
+ if(selected[2] > selected[3])
+ selected[3] = selected[2]
+ if(selected[2] > selected[4])
+ selected[4] = selected[2]
+ if(threshold == 3)
+ if(selected[1] > selected[3])
+ selected[1] = selected[3]
+ if(selected[2] > selected[3])
+ selected[2] = selected[3]
+ if(selected[3] > selected[4])
+ selected[4] = selected[3]
+ if(threshold == 4)
+ if(selected[1] > selected[4])
+ selected[1] = selected[4]
+ if(selected[2] > selected[4])
+ selected[2] = selected[4]
+ if(selected[3] > selected[4])
+ selected[3] = selected[4]
+
+ apply_mode()
+
+ if(href_list["screen"])
+ screen = text2num(href_list["screen"])
+
+ if(href_list["atmos_unlock"])
+ switch(href_list["atmos_unlock"])
+ if("0")
+ air_doors_close(1)
+ if("1")
+ air_doors_open(1)
+
+ if(href_list["atmos_alarm"])
+ if (alarm_area.atmosalert(2))
+ apply_danger_level(2)
+ update_icon()
+
+ if(href_list["atmos_reset"])
+ if (alarm_area.atmosalert(0))
+ apply_danger_level(0)
+ update_icon()
+
+ if(href_list["mode"])
+ mode = text2num(href_list["mode"])
+ apply_mode()
+
+ // hrefs that need the AA wires exposed, note that borgs should be in range here too -walter0o
+ if(wiresexposed && Adjacent(usr))
+
+ if (href_list["AAlarmwires"])
+ var/t1 = text2num(href_list["AAlarmwires"])
+ if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
+ usr << "You need wirecutters!"
+ return
+ if (isWireColorCut(t1))
+ mend(t1)
+ else
+ cut(t1)
+ if (AAlarmwires == 0)
+ usr << "You cut last of wires inside [src]"
+ update_icon()
+ buildstage = 1
+ return
+
+ else if (href_list["pulse"])
+ var/t1 = text2num(href_list["pulse"])
+ if (!istype(usr.equipped(), /obj/item/device/multitool))
+ usr << "You need a multitool!"
+ return
+ if (isWireColorCut(t1))
+ usr << "You can't pulse a cut wire."
+ return
+ else
+ pulse(t1)
updateUsrDialog()
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 03401554555..64dcbe0c2fb 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -275,10 +275,15 @@ update_flag
/obj/machinery/portable_atmospherics/canister/Topic(href, href_list)
- //Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict.
+ //Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict. // yeah but without SOME sort of Topic check any dick can mess with them via exploits as he pleases -walter0o
if (!istype(src.loc, /turf))
return 0
-
+
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) // exploit protection -walter0o
+ usr << browse(null, "window=canister")
+ onclose(usr, "canister")
+ return
+
if(href_list["toggle"])
if (valve_open)
if (holding)
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index 49c491b16ec..4893bf47c20 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -269,7 +269,7 @@ Auto Patrol: []"},
walk_to(src,0)
if (target) // make sure target exists
- if (get_dist(src, src.target) <= 1) // if right next to perp
+ if (Adjacent(target)) // if right next to perp
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
src.icon_state = "[lasercolor]ed209-c"
spawn(2)
@@ -731,7 +731,7 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/Bump(M as mob|obj) //Leave no door unopened!
if ((istype(M, /obj/machinery/door)) && (!isnull(src.botcard)))
var/obj/machinery/door/D = M
- if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard))
+ if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard) && !istype(D,/obj/machinery/door/poddoor))
D.open()
src.frustration = 0
else if ((istype(M, /mob/living/)) && (!src.anchored))
diff --git a/code/game/machinery/bots/farmbot.dm b/code/game/machinery/bots/farmbot.dm
index fe110939a09..b6f81984637 100644
--- a/code/game/machinery/bots/farmbot.dm
+++ b/code/game/machinery/bots/farmbot.dm
@@ -540,10 +540,9 @@
var/obj/item/weapon/farmbot_arm_assembly/A = new /obj/item/weapon/farmbot_arm_assembly
A.loc = src.loc
- A.layer = 20
user << "You add the robot arm to the [src]"
src.loc = A //Place the water tank into the assembly, it will be needed for the finished bot
-
+ user.u_equip(S)
del(S)
/obj/item/weapon/farmbot_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -552,18 +551,21 @@
src.build_step++
user << "You add the plant analyzer to [src]!"
src.name = "farmbot assembly"
+ user.u_equip(W)
del(W)
else if(( istype(W, /obj/item/weapon/reagent_containers/glass/bucket)) && (src.build_step == 1))
src.build_step++
user << "You add a bucket to [src]!"
src.name = "farmbot assembly with bucket"
+ user.u_equip(W)
del(W)
else if(( istype(W, /obj/item/weapon/minihoe)) && (src.build_step == 2))
src.build_step++
user << "You add a minihoe to [src]!"
src.name = "farmbot assembly with bucket and minihoe"
+ user.u_equip(W)
del(W)
else if((isprox(W)) && (src.build_step == 3))
@@ -575,6 +577,7 @@
S.tank = wTank
S.loc = get_turf(src)
S.name = src.created_name
+ user.u_equip(W)
del(W)
del(src)
@@ -587,3 +590,6 @@
return
src.created_name = t
+
+/obj/item/weapon/farmbot_arm_assembly/attack_hand(mob/user as mob)
+ return //it's a converted watertank, no you cannot pick it up and put it in your backpack
\ No newline at end of file
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index 31fbb8c4679..1054f3c3582 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -284,7 +284,7 @@
continue
- if(src.patient && (get_dist(src,src.patient) <= 1))
+ if(src.patient && Adjacent(patient))
if(!src.currently_healing)
src.currently_healing = 1
src.frustration = 0
@@ -480,7 +480,7 @@
/obj/machinery/bot/medbot/Bump(M as mob|obj) //Leave no door unopened!
if ((istype(M, /obj/machinery/door)) && (!isnull(src.botcard)))
var/obj/machinery/door/D = M
- if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard))
+ if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard) && !istype(D,/obj/machinery/door/poddoor))
D.open()
src.frustration = 0
else if ((istype(M, /mob/living/)) && (!src.anchored))
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index ee014dd6dfb..06efb4673cf 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -219,7 +219,7 @@ Auto Patrol: []"},
walk_to(src,0)
if(target) // make sure target exists
- if(get_dist(src, src.target) <= 1 && isturf(src.target.loc)) // if right next to perp
+ if(Adjacent(target)) // if right next to perp
if(istype(src.target,/mob/living/carbon))
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
src.icon_state = "secbot-c"
@@ -600,8 +600,6 @@ Auto Patrol: []"},
if(istype(C, /mob/living/carbon/human))
src.threatlevel = src.assess_perp(C)
- else if((src.idcheck) && (istype(C, /mob/living/carbon/monkey)))
- src.threatlevel = 4
else if(istype(M, /mob/living/simple_animal/hostile))
if(M.stat == DEAD)
@@ -682,7 +680,7 @@ Auto Patrol: []"},
/obj/machinery/bot/secbot/Bump(M as mob|obj) //Leave no door unopened!
if((istype(M, /obj/machinery/door)) && (!isnull(src.botcard)))
var/obj/machinery/door/D = M
- if(!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard))
+ if(!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard) && !istype(D,/obj/machinery/door/poddoor))
D.open()
src.frustration = 0
else if((istype(M, /mob/living/)) && (!src.anchored))
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index e9257eacc06..5d206b9f94b 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -39,7 +39,7 @@
assembly = new(src)
assembly.state = 4
/* // Use this to look for cameras that have the same c_tag.
- for(var/obj/machinery/camera/C in cameranet.viewpoints)
+ for(var/obj/machinery/camera/C in cameranet.cameras)
var/list/tempnetwork = C.network&src.network
if(C != src && C.c_tag == src.c_tag && tempnetwork.len)
world.log << "[src.c_tag] [src.x] [src.y] [src.z] conflicts with [C.c_tag] [C.x] [C.y] [C.z]"
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 631594d28e8..b019c4ee862 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -4,7 +4,7 @@
return
var/list/L = list()
- for (var/obj/machinery/camera/C in cameranet.viewpoints)
+ for (var/obj/machinery/camera/C in cameranet.cameras)
L.Add(C)
camera_sort(L)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 853481b1440..d84e3271e1f 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -213,8 +213,8 @@
if(R.dna.species == "Human") //no more xenos losing ears/tentacles
H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
- //for(var/datum/language/L in languages)
- // H.add_language(L.name)
+ for(var/datum/language/L in R.languages)
+ H.add_language(L.name)
H.suiciding = 0
src.attempting = 0
return 1
@@ -434,7 +434,7 @@
*/
/obj/item/weapon/paper/Cloning
- name = "paper - 'H-87 Cloning Apparatus Manual"
+ name = "H-87 Cloning Apparatus Manual"
info = {"
Getting Started
Congratulations, your station has purchased the H-87 industrial cloning device!
Using the H-87 is almost as simple as brain surgery! Simply insert the target humanoid into the scanning chamber and select the scan option to create a new profile!
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 98548372af2..3048b644b43 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -2,6 +2,7 @@
name = "AI System Integrity Restorer"
icon = 'icons/obj/computer.dmi'
icon_state = "ai-fixer"
+ circuit = /obj/item/weapon/circuitboard/aifixer
req_access = list(access_captain, access_robotics, access_heads)
var/mob/living/silicon/ai/occupant = null
var/active = 0
@@ -11,43 +12,13 @@
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob)
-/*
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/robotics/M = new /obj/item/weapon/circuitboard/robotics( A )
- for (var/obj/C in src)
- C.loc = src.loc
- M.id = src.id
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/robotics/M = new /obj/item/weapon/circuitboard/robotics( A )
- for (var/obj/C in src)
- C.loc = src.loc
- M.id = src.id
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
-*/
if(istype(I, /obj/item/device/aicard))
if(stat & (NOPOWER|BROKEN))
user << "This terminal isn't functioning right now, get it working!"
return
I:transfer_ai("AIFIXER","AICARD",src,user)
-
- //src.attack_hand(user)
+
+ ..()
return
/obj/machinery/computer/aifixer/attack_ai(var/mob/user as mob)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index e5d4d3675a8..11bebd70b67 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -238,27 +238,10 @@
src.updateUsrDialog()
- else if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/arcade/M = new /obj/item/weapon/circuitboard/arcade( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.anchored = 1
+ else
+ ..()
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- new /obj/item/weapon/shard( src.loc )
- A.state = 3
- A.icon_state = "3"
- else
- user << "\blue You disconnect the monitor."
- A.state = 4
- A.icon_state = "4"
- del(src)
/obj/machinery/computer/arcade/emp_act(severity)
if(stat & (NOPOWER|BROKEN))
..(severity)
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 0f72177ca1f..3c6fbd991a3 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -281,14 +281,15 @@
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I,/obj/item/weapon/screwdriver))
+ user.visible_message("\blue \the [user] adjusts the jumper on the [src]'s access protocol pins.", "\blue You adjust the jumper on the access protocol pins.")
if(src.build_path == "/obj/machinery/computer/rdconsole/core")
src.name = "Circuit Board (RD Console - Robotics)"
src.build_path = "/obj/machinery/computer/rdconsole/robotics"
- user << "\blue Access protocols succesfully updated."
+ user << "\blue Access protocols set to robotics."
else
src.name = "Circuit Board (RD Console)"
src.build_path = "/obj/machinery/computer/rdconsole/core"
- user << "\blue Defaulting access protocols."
+ user << "\blue Access protocols set to default."
return
/obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob)
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 9eaf5c6da77..d2bf8a1661a 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -36,7 +36,7 @@
user.set_machine(src)
var/list/L = list()
- for (var/obj/machinery/camera/C in cameranet.viewpoints)
+ for (var/obj/machinery/camera/C in cameranet.cameras)
L.Add(C)
camera_sort(L)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 293046b0768..9ce8ccb4fc6 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -361,6 +361,7 @@
R.id= copytext(md5(subject.real_name), 2, 6)
R.name=R.dna.real_name
R.types=DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE
+ R.languages=subject.languages
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index c47eb1f9136..b289bcaa205 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -95,6 +95,11 @@
stat |= BROKEN
update_icon()
+/obj/machinery/computer/proc/decode(text)
+ // Adds line breaks
+ text = replacetext(text, "\n", " ")
+ return text
+
/obj/machinery/computer/attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 37cdd7deb6b..b9c821e18ea 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -78,7 +78,7 @@
else
dat += "General Record Lost! "
if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
- dat += text(" \n
")
else
@@ -275,11 +275,11 @@ What a mess.*/
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
P.info = "
Employment Record
"
if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] \nEmployment/Skills Summary:[] ", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"], active1.fields["notes"])
+ P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] \nEmployment/Skills Summary: \n[] ", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"], decode(active1.fields["notes"]))
else
P.info += "General Record Lost! "
P.info += ""
- P.name = "paper - 'Employment Record'"
+ P.name = "Employment Record ([active1.fields["name"]])"
printing = null
//RECORD DELETE
if ("Delete All Records")
@@ -302,7 +302,7 @@ What a mess.*/
temp += "No"
//RECORD CREATE
if ("New Record (General)")
-
+
if(PDA_Manifest.len)
PDA_Manifest.Cut()
var/datum/data/record/G = new /datum/data/record()
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index f48c3754c73..8086ea8d958 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -59,7 +59,7 @@
Topic(href, href_list)
..()
- if (usr.stat || usr.restrained() || !ishuman(usr))
+ if (usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon)))
return
if (href_list["close"])
usr << browse(null, "window=airlock")
@@ -113,4 +113,4 @@
/obj/item/weapon/airlock_electronics/secure
name = "secure airlock electronics"
desc = "designed to be somewhat more resistant to hacking than standard electronics."
- origin_tech = "programming=3"
\ No newline at end of file
+ origin_tech = "programming=3"
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index fb4c43daee1..950871d983e 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -262,6 +262,15 @@
/obj/machinery/door/proc/requiresID()
return 1
+/obj/machinery/door/proc/update_nearby_tiles(need_rebuild)
+ if(!air_master)
+ return 0
+
+ for(var/turf/simulated/turf in locs)
+ update_heat_protection(turf)
+ air_master.mark_for_update(turf)
+
+ return 1
/obj/machinery/door/proc/update_heat_protection(var/turf/simulated/source)
if(istype(source))
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 22cb0dc741f..56d71e1e0fd 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -33,6 +33,9 @@ var/const/HOLOPAD_MODE = 0
name = "\improper AI holopad"
desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely."
icon_state = "holopad0"
+
+ layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them.
+
var/mob/living/silicon/ai/master//Which AI, if any, is controlling the object? Only one AI may control a hologram at any time.
var/last_request = 0 //to prevent request spam. ~Carn
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index de3884923a3..bfdf3e32c25 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -362,6 +362,11 @@
/obj/machinery/mecha_part_fabricator/proc/build_part(var/obj/item/part)
if(!part) return
+
+ // critical exploit prevention, do not remove unless you replace it -walter0o
+ if( !(locate(part, src.contents)) || !(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
+ return
+
src.being_built = new part.type(src)
src.desc = "It's building [src.being_built]."
src.remove_resources(part)
@@ -603,9 +608,26 @@
onclose(user, "mecha_fabricator")
return
+/obj/machinery/mecha_part_fabricator/proc/exploit_prevention(var/obj/Part, mob/user as mob, var/desc_exploit)
+// critical exploit prevention, feel free to improve or replace this, but do not remove it -walter0o
+
+ if(!Part || !user || !istype(Part) || !istype(user)) // sanity
+ return 1
+
+ if( !(locate(Part, src.contents)) || !(Part.vars.Find("construction_time")) || !(Part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
+
+ var/turf/LOC = get_turf(user)
+ message_admins("[key_name_admin(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] ! ([LOC ? "JMP" : "null"])", 0)
+ log_admin("EXPLOIT : [key_name(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] !")
+ return 1
+
+ return null
/obj/machinery/mecha_part_fabricator/Topic(href, href_list)
- ..()
+
+ if(..()) // critical exploit prevention, do not remove unless you replace it -walter0o
+ return
+
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
if(href_list["part_set"])
var/tpart_set = filter.getStr("part_set")
@@ -616,13 +638,25 @@
src.part_set = tpart_set
screen = "parts"
if(href_list["part"])
- var/list/part = filter.getObj("part")
+ var/obj/part = filter.getObj("part")
+
+ // critical exploit prevention, do not remove unless you replace it -walter0o
+ if(src.exploit_prevention(part, usr))
+ return
+
if(!processing_queue)
build_part(part)
else
add_to_queue(part)
if(href_list["add_to_queue"])
- add_to_queue(filter.getObj("add_to_queue"))
+ var/obj/part = filter.getObj("add_to_queue")
+
+ // critical exploit prevention, do not remove unless you replace it -walter0o
+ if(src.exploit_prevention(part, usr))
+ return
+
+ add_to_queue(part)
+
return update_queue_on_page()
if(href_list["remove_from_queue"])
remove_from_queue(filter.getNum("remove_from_queue"))
@@ -661,7 +695,12 @@
return update_queue_on_page()
if(href_list["part_desc"])
var/obj/part = filter.getObj("part_desc")
- if(part)
+
+ // critical exploit prevention, do not remove unless you replace it -walter0o
+ if(src.exploit_prevention(part, usr, 1))
+ return
+
+ if(part)
temp = {"
[part] description:
[part.desc] Return
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 1e762e68b3f..da510025e35 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -184,6 +184,7 @@
anchored = 1
density = 0
+ layer = 2
var/health = 15
var/obj/effect/alien/weeds/node/linked_node = null
@@ -191,6 +192,7 @@
icon_state = "weednode"
name = "purple sac"
desc = "Weird purple octopus-like thing."
+ layer = 3
luminosity = NODERANGE
var/node_range = NODERANGE
@@ -200,10 +202,10 @@
/obj/effect/alien/weeds/New(pos, node)
..()
- linked_node = node
if(istype(loc, /turf/space))
del(src)
return
+ linked_node = node
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
spawn(rand(150, 200))
if(src)
@@ -230,6 +232,9 @@ Alien plants should do something if theres a lot of poison
del(src)
return
+ if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) )
+ return
+
direction_loop:
for(var/dirn in cardinal)
var/turf/T = get_step(src, dirn)
@@ -237,9 +242,6 @@ Alien plants should do something if theres a lot of poison
if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space))
continue
- if(!linked_node || get_dist(linked_node, src) > linked_node.node_range)
- return
-
// if (locate(/obj/movable, T)) // don't propogate into movables
// continue
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index b7c0cef238d..852072769a6 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -585,4 +585,14 @@
force = 5
w_class = 4.0
slot_flags = SLOT_BACK
-*/
\ No newline at end of file
+*/
+
+//This should really be somewhere else but I don't know where. w/e
+/obj/item/weapon/inflatable_duck
+ name = "inflatable duck"
+ desc = "No bother to sink or swim when you can just float!"
+ icon_state = "inflatable"
+ item_state = "inflatable"
+ flags = FPRINT | TABLEPASS
+ icon = 'icons/obj/clothing/belts.dmi'
+ slot_flags = SLOT_BELT
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 2c1a9977fde..b7f6c881657 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -134,12 +134,6 @@
"/obj/item/clothing/mask/luchador"
)
-/obj/item/weapon/storage/belt/inflatable
- name = "inflatable duck"
- desc = "No bother to sink or swim when you can just float!"
- icon_state = "inflatable"
- item_state = "inflatable"
-
/obj/item/weapon/storage/belt/security/tactical
name = "combat belt"
desc = "Can hold security gear like handcuffs and flashes, with more pouches for more storage."
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index b88550a0b5b..2a7f3a50613 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -458,36 +458,19 @@
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
return ..()
- if(S.brute_dam)
- S.heal_damage(15,0,0,1)
- if(user != M)
- user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src]",\
- "\red You patch some dents on \the [M]'s [S.display_name]",\
- "You hear a welder.")
- else
- user.visible_message("\red \The [user] patches some dents on their [S.display_name] with \the [src]",\
- "\red You patch some dents on your [S.display_name]",\
- "You hear a welder.")
- return
-
if(istype(M,/mob/living/carbon/human))
-
var/mob/living/carbon/human/H = M
-
if(H.species.flags & IS_SYNTHETIC)
-
- if(H.getBruteLoss() > 0)
-
- if(M == user)
- user << "\red You can't repair damage to your own body - it's against OH&S."
- return
-
- user.visible_message("\red \The [user] patches some dents on \the [M] with \the [src]",\
- "\red You patch some of the dents on \the [M].",\
- "You hear a welder.")
- H.heal_overall_damage(5,0)
+ if(M == user)
+ user << "\red You can't repair damage to your own body - it's against OH&S."
return
- user << "Nothing to fix!"
+ if(S.brute_dam)
+ S.heal_damage(15,0,0,1)
+ user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src].")
+ return
+ else
+ user << "Nothing to fix!"
+
else
- return ..()
+ return ..()
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index eaeba38e43f..3abf6d61d3b 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -95,3 +95,25 @@
else
user << "\red Access Denied"
return
+
+/obj/structure/closet/secure_closet/personal/verb/reset()
+ set src in oview(1) // One square distance
+ set category = "Object"
+ set name = "Reset Lock"
+ if(!usr.canmove || usr.stat || usr.restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
+ return
+ if(ishuman(usr))
+ src.add_fingerprint(usr)
+ if (src.locked || !src.registered_name)
+ usr << "\red You need to unlock it first."
+ else if (src.broken)
+ usr << "\red It appears to be broken."
+ else
+ if (src.opened)
+ if(!src.close())
+ return
+ src.locked = 1
+ src.icon_state = src.icon_locked
+ src.registered_name = null
+ src.desc = "It's a secure locker for personnel. The first card swiped gains control."
+ return
\ No newline at end of file
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index a9a5a5715e3..1d2faa89a57 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -499,36 +499,8 @@ var/list/mechtoys = list(
user << "\blue Special supplies unlocked."
hacked = 1
return
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( loc )
- new /obj/item/weapon/shard( loc )
- var/obj/item/weapon/circuitboard/supplycomp/M = new /obj/item/weapon/circuitboard/supplycomp( A )
- for (var/obj/C in src)
- C.loc = loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( loc )
- var/obj/item/weapon/circuitboard/supplycomp/M = new /obj/item/weapon/circuitboard/supplycomp( A )
- if(can_order_contraband)
- M.contraband_enabled = 1
- for (var/obj/C in src)
- C.loc = loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
else
- attack_hand(user)
+ ..()
return
/obj/machinery/computer/supplycomp/Topic(href, href_list)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 64728d2d9ab..54b4c2c2fbf 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -108,7 +108,6 @@ var/global/floorIsLava = 0
body += "Is an AI "
else if(ishuman(M))
body += {"Make AI |
- Make Mask |
Make Robot |
Make Alien |
Make slime
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 208ac86f92d..73d4c587543 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -563,8 +563,8 @@ var/list/admin_verbs_mentor = list(
/client/proc/give_disease(mob/T as mob in mob_list) // -- Giacom
set category = "Fun"
- set name = "Give Disease"
- set desc = "Gives a Disease to a mob."
+ set name = "Give Disease (old)"
+ set desc = "Gives a (tg-style) Disease to a mob."
var/list/disease_names = list()
for(var/v in diseases)
// "/datum/disease/" 15 symbols ~Intercross
@@ -576,6 +576,34 @@ var/list/admin_verbs_mentor = list(
feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].")
message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1)
+
+/client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom
+ set category = "Fun"
+ set name = "Give Disease"
+ set desc = "Gives a Disease to a mob."
+
+ var/datum/disease2/disease/D = new /datum/disease2/disease()
+
+ var/greater = ((input("Is this a lesser or greater disease?", "Give Disease") in list("Lesser", "Greater")) == "Greater")
+
+ D.makerandom(greater)
+ if (!greater)
+ D.infectionchance = 1
+
+ D.infectionchance = input("How virulent is this disease? (1-100)", "Give Disease", D.infectionchance) as num
+
+ if(istype(T,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = T
+ if (H.species)
+ D.affected_species = list(H.species.name)
+ if(istype(T,/mob/living/carbon/monkey))
+ var/mob/living/carbon/monkey/M = T
+ D.affected_species = list(M.greaterform)
+ infect_virus2(T,D,1)
+
+ feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ log_admin("[key_name(usr)] gave [key_name(T)] a [(greater)? "greater":"lesser"] disease2 with infection chance [D.infectionchance].")
+ message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [(greater)? "greater":"lesser"] disease2 with infection chance [D.infectionchance].", 1)
/client/proc/make_sound(var/obj/O in world) // -- TLE
set category = "Special Verbs"
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 9eb85cf34dc..21c1b6344c7 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -265,9 +265,6 @@
else if(isobserver(M))
M_job = "Ghost"
-
- else if(isSpirit(M))
- M_job = (ismask(M)) ? "Mask" : "Spirit"
M_job = replacetext(M_job, "'", "")
M_job = replacetext(M_job, "\"", "")
@@ -351,10 +348,6 @@
dat += "
Monkey
"
else if(isalien(M))
dat += "
Alien
"
- else if(ismask(M))
- dat += "
Mask
"
- else if(isSpirit(M))
- dat += "
Spirit
"
else
dat += "
Unknown
"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2834b4d4045..5129bba4a0c 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1200,15 +1200,6 @@
message_admins("\red Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1)
log_admin("[key_name(usr)] AIized [key_name(H)]")
H.AIize()
-
-
- else if(href_list["makemask"])
- if(!check_rights(R_SPAWN)) return
- var/mob/currentMob = locate(href_list["makemask"])
- message_admins("\red Admin [key_name_admin(usr)] made [key_name_admin(currentMob)] into a Mask of Nar'Sie!", 1)
- log_admin("[key_name(usr)] made [key_name(currentMob)] into a Mask of Nar'Sie!")
- currentMob.make_into_mask(0,0)
-
else if(href_list["makealien"])
if(!check_rights(R_SPAWN)) return
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index d0c552fe154..0a7c1fe345e 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -58,7 +58,7 @@ var/intercom_range_display_status = 0
del(C)
if(camera_range_display_status)
- for(var/obj/machinery/camera/C in cameranet.viewpoints)
+ for(var/obj/machinery/camera/C in cameranet.cameras)
new/obj/effect/debugging/camera_range(C.loc)
feedback_add_details("admin_verb","mCRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -74,7 +74,7 @@ var/intercom_range_display_status = 0
var/list/obj/machinery/camera/CL = list()
- for(var/obj/machinery/camera/C in cameranet.viewpoints)
+ for(var/obj/machinery/camera/C in cameranet.cameras)
CL += C
var/output = {"CAMERA ANNOMALITIES REPORT
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 45887586d5f..884d02d5494 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -5,6 +5,10 @@
//BS12: Species-restricted clothing check.
/obj/item/clothing/mob_can_equip(M as mob, slot)
+ //if we can equip the item anyway, don't bother with species_restricted (aslo cuts down on spam)
+ if (!..())
+ return 0
+
if(species_restricted && istype(M,/mob/living/carbon/human))
var/wearable = null
@@ -26,7 +30,7 @@
M << "\red Your species cannot wear [src]."
return 0
- return ..()
+ return 1
//Ears: headsets, earmuffs and tiny objects
/obj/item/clothing/ears
@@ -220,7 +224,7 @@ BLIND // can't see anything
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 3
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
@@ -252,7 +256,7 @@ BLIND // can't see anything
if(hastie)
hastie.attackby(I, user)
return
-
+
if(!hastie && istype(I, /obj/item/clothing/tie))
user.drop_item()
hastie = I
@@ -265,7 +269,7 @@ BLIND // can't see anything
return
..()
-
+
/obj/item/clothing/under/attack_hand(mob/user as mob)
//only forward to the attached accessory if the clothing is equipped (not in a storage)
if(hastie && src.loc == user)
@@ -282,7 +286,7 @@ BLIND // can't see anything
//makes sure that the clothing is equipped so that we can't drag it into our hand from miles away.
if (!(src.loc == usr))
return
-
+
if (!( usr.restrained() ) && !( usr.stat ))
switch(over_object.name)
if("r_hand")
@@ -310,13 +314,10 @@ BLIND // can't see anything
if(hastie)
usr << "\A [hastie] is clipped to it."
-/obj/item/clothing/under/verb/toggle()
- set name = "Toggle Suit Sensors"
- set category = "Object"
- set src in usr
+/obj/item/clothing/under/proc/set_sensors(mob/usr as mob)
var/mob/M = usr
if (istype(M, /mob/dead/)) return
- if (usr.stat) return
+ if (usr.stat || usr.restrained()) return
if(has_sensor >= 2)
usr << "The controls are locked."
return 0
@@ -326,17 +327,41 @@ BLIND // can't see anything
var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon")
var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes
+ if(get_dist(usr, src) > 1)
+ usr << "You have moved too far away."
+ return
sensor_mode = modes.Find(switchMode) - 1
- switch(sensor_mode)
- if(0)
- usr << "You disable your suit's remote sensing equipment."
- if(1)
- usr << "Your suit will now report whether you are live or dead."
- if(2)
- usr << "Your suit will now report your vital lifesigns."
- if(3)
- usr << "Your suit will now report your vital lifesigns as well as your coordinate position."
+ if (src.loc == usr)
+ switch(sensor_mode)
+ if(0)
+ usr << "You disable your suit's remote sensing equipment."
+ if(1)
+ usr << "Your suit will now report whether you are live or dead."
+ if(2)
+ usr << "Your suit will now report your vital lifesigns."
+ if(3)
+ usr << "Your suit will now report your vital lifesigns as well as your coordinate position."
+ else if (istype(src.loc, /mob))
+ switch(sensor_mode)
+ if(0)
+ for(var/mob/V in viewers(usr, 1))
+ V.show_message("\red [usr] disables [src.loc]'s remote sensing equipment.", 1)
+ if(1)
+ for(var/mob/V in viewers(usr, 1))
+ V.show_message("[usr] turns [src.loc]'s remote sensors to binary.", 1)
+ if(2)
+ for(var/mob/V in viewers(usr, 1))
+ V.show_message("[usr] sets [src.loc]'s sensors to track vitals.", 1)
+ if(3)
+ for(var/mob/V in viewers(usr, 1))
+ V.show_message("[usr] sets [src.loc]'s sensors to maximum.", 1)
+
+/obj/item/clothing/under/verb/toggle()
+ set name = "Toggle Suit Sensors"
+ set category = "Object"
+ set src in usr
+ set_sensors(usr)
..()
/obj/item/clothing/under/verb/rollsuit()
@@ -357,7 +382,7 @@ BLIND // can't see anything
/obj/item/clothing/under/proc/remove_accessory(mob/user as mob)
if(!hastie)
return
-
+
hastie.on_removed(user)
hastie = null
diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm
index e1456176903..8006652139e 100644
--- a/code/modules/ext_scripts/irc.dm
+++ b/code/modules/ext_scripts/irc.dm
@@ -7,9 +7,11 @@
else
nudge_lib = "lib/nudge.so"
- call(nudge_lib, "nudge")("[config.comms_password]","[config.irc_bot_host]","[channel]","[msg]")
+ spawn(0)
+ call(nudge_lib, "nudge")("[config.comms_password]","[config.irc_bot_host]","[channel]","[msg]")
else
- ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [channel] [msg]")
+ spawn(0)
+ ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [channel] [msg]")
return
/proc/send2mainirc(var/msg)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index c200d2ff537..288546872c2 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -161,28 +161,8 @@ proc/move_mining_shuttle()
src.req_access = list()
hacked = 1
usr << "You fried the consoles ID checking system. It's now available to everyone!"
-
- else if(istype(W, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/mining_shuttle/M = new /obj/item/weapon/circuitboard/mining_shuttle( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.anchored = 1
-
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- new /obj/item/weapon/shard( src.loc )
- A.state = 3
- A.icon_state = "3"
- else
- user << "\blue You disconnect the monitor."
- A.state = 4
- A.icon_state = "4"
-
- del(src)
+ else
+ ..()
/******************************Lantern*******************************/
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 292f74dbc57..bebd5680ef8 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -71,10 +71,9 @@
var/datum/organ/external/head = get_organ("head")
var/mob/living/simple_animal/borer/B
- if(istype(head))
- for(var/I in head.implants)
- if(istype(I,/mob/living/simple_animal/borer))
- B = I
+ for(var/I in head.implants)
+ if(istype(I,/mob/living/simple_animal/borer))
+ B = I
if(B)
if(!B.ckey && ckey && B.controlling)
B.ckey = ckey
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 9f5289c43ff..7b254cf890c 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -106,6 +106,11 @@
now_pushing = 0
return
+ if(istype(tmob,/mob/living/silicon/robot/drone)) //I have no idea why the hell this isn't already happening. How do mice do it?
+ loc = tmob.loc
+ now_pushing = 0
+ return
+
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && canmove) // mutual brohugs all around!
var/turf/oldloc = loc
@@ -398,6 +403,9 @@
/mob/living/carbon/human/show_inv(mob/user as mob)
+ var/obj/item/clothing/under/suit = null
+ if (istype(w_uniform, /obj/item/clothing/under))
+ suit = w_uniform
user.set_machine(src)
var/dat = {"
@@ -412,21 +420,22 @@
Right Ear:[(r_ear ? r_ear : "Nothing")] Head:[(head ? head : "Nothing")] Shoes:[(shoes ? shoes : "Nothing")]
- Belt:[(belt ? belt : "Nothing")]
- Uniform:[(w_uniform ? w_uniform : "Nothing")]
+ Belt:[(belt ? belt : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(belt, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
+ Uniform:[(w_uniform ? w_uniform : "Nothing")] [(suit) ? ((suit.has_sensor == 1) ? text(" Sensors", src) : "") :]
(Exo)Suit:[(wear_suit ? wear_suit : "Nothing")] Back:[(back ? back : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
ID:[(wear_id ? wear_id : "Nothing")]
- Suit Storage:[(s_store ? s_store : "Nothing")]
+ Suit Storage:[(s_store ? s_store : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(s_store, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
[(handcuffed ? text("Handcuffed") : text("Not Handcuffed"))]
[(legcuffed ? text("Legcuffed") : text(""))]
+ [(suit) ? ((suit.hastie) ? text(" Remove Accessory", src) : "") :]
[(internal ? text("Remove Internal") : "")]
Remove Splints Empty Pockets Refresh Close "}
- user << browse(dat, text("window=mob[name];size=340x480"))
+ user << browse(dat, text("window=mob[name];size=340x540"))
onclose(user, "mob[name]")
return
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 64d1ff64ef3..06dd4d6b0b2 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -388,11 +388,14 @@
if(count == 0)
del(src)
return
+ if("sensor")
+ if (! target.w_uniform )
+ del(src)
if("internal")
if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && istype(target.back, /obj/item/weapon/tank) && !( target.internal )) ) && !( target.internal )))
del(src)
- var/list/L = list( "syringe", "pill", "drink", "dnainjector", "fuel")
+ var/list/L = list( "syringe", "pill", "drink", "dnainjector", "fuel", "sensor", "internal", "tie")
if ((item && !( L.Find(place) )))
if(isrobot(source) && place != "handcuff")
del(src)
@@ -508,6 +511,17 @@
return
else
message = "\red [source] is trying to take off \a [target.w_uniform] from [target]'s body!"
+ if("tie")
+ var/obj/item/clothing/under/suit = target.w_uniform
+ target.attack_log += text("\[[time_stamp()]\] Has had their accessory ([suit.hastie]) removed by [source.name] ([source.ckey])")
+ source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) accessory ([suit.hastie])")
+ if(istype(suit.hastie, /obj/item/clothing/tie/holobadge) || istype(suit.hastie, /obj/item/clothing/tie/medal))
+ for(var/mob/M in viewers(target, null))
+ M.show_message("\red [source] tears off \the [suit.hastie] from [target]'s suit!" , 1)
+ done()
+ return
+ else
+ message = "\red [source] is trying to take off \a [suit.hastie] from [target]'s suit!"
if("s_store")
target.attack_log += text("\[[time_stamp()]\] Has had their suit storage item ([target.s_store]) removed by [source.name] ([source.ckey])")
source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) suit storage item ([target.s_store])")
@@ -537,6 +551,14 @@
message = "\red [source] is trying to set on [target]'s internals."
if("splints")
message = text("\red [] is trying to remove []'s splints!", source, target)
+ if("sensor")
+ target.attack_log += text("\[[time_stamp()]\] Has had their sensors toggled by [source.name] ([source.ckey])")
+ source.attack_log += text("\[[time_stamp()]\] Attempted to toggle [target.name]'s ([target.ckey]) sensors")
+ var/obj/item/clothing/under/suit = target.w_uniform
+ if (suit.has_sensor >= 2)
+ source << "The controls are locked."
+ return
+ message = "\red [source] is trying to set [target]'s suit sensors!"
for(var/mob/M in viewers(target, null))
M.show_message(message, 1)
@@ -624,6 +646,19 @@ It can still be worn/put on as normal.
slot_to_process = slot_wear_suit
if (target.wear_suit && target.wear_suit.canremove)
strip_item = target.wear_suit
+ if("tie")
+ var/obj/item/clothing/under/suit = target.w_uniform
+ //var/obj/item/clothing/tie/tie = suit.hastie
+ /*if(tie)
+ if (istype(tie,/obj/item/clothing/tie/storage))
+ var/obj/item/clothing/tie/storage/W = tie
+ if (W.hold)
+ W.hold.close(usr)
+ usr.put_in_hands(tie)
+ suit.hastie = null*/
+ suit.hastie.on_removed(usr)
+ suit.hastie = null
+ target.update_inv_w_uniform()
if("id")
slot_to_process = slot_wear_id
if (target.wear_id)
@@ -675,8 +710,20 @@ It can still be worn/put on as normal.
O.show_message("\red [source] injects [target] with the DNA Injector!", 1)
S.inuse = 0
if("pockets")
- slot_to_process = slot_l_store
- strip_item = target.l_store //We'll do both
+ if (!item || (target.l_store && target.r_store)) // Only empty pockets when hand is empty or both pockets are full
+ slot_to_process = slot_l_store
+ strip_item = target.l_store //We'll do both
+ else if (target.l_store)
+ slot_to_process = slot_r_store
+ else
+ slot_to_process = slot_l_store
+ if("sensor")
+ var/obj/item/clothing/under/suit = target.w_uniform
+ if (suit)
+ if(suit.has_sensor >= 2)
+ source << "The controls are locked."
+ else
+ suit.set_sensors(source)
if("internal")
if (target.internal)
target.internal.add_fingerprint(source)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 154439f33b8..910589867f4 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -321,9 +321,11 @@
var/datum/gas_mixture/environment = loc.return_air()
var/datum/gas_mixture/breath
+
// HACK NEED CHANGING LATER
- if(health < config.health_threshold_crit)
+ if(health < config.health_threshold_crit && !reagents.has_reagent("inaprovaline"))
losebreath++
+
if(losebreath>0) //Suffocating so do not take a breath
losebreath--
if (prob(10)) //Gasp per 10 ticks? Sounds about right.
@@ -431,8 +433,6 @@
return
if(!breath || (breath.total_moles() == 0) || suiciding)
- if(reagents.has_reagent("inaprovaline"))
- return
if(suiciding)
adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster
failed_last_breath = 1
@@ -508,7 +508,7 @@
if(prob(20))
spawn(0) emote("gasp")
if(inhale_pp > 0)
- var/ratio = safe_pressure_min/inhale_pp
+ var/ratio = inhale_pp/safe_pressure_min
// Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!)
// The hell? By definition ratio > 1, and HUMAN_MAX_OXYLOSS = 1... why do we even have this?
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index c9c4278f5a3..c98421d4243 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -367,7 +367,7 @@ var/list/ai_list = list()
unset_machine()
src << browse(null, t1)
if (href_list["switchcamera"])
- switchCamera(locate(href_list["switchcamera"])) in cameranet.viewpoints
+ switchCamera(locate(href_list["switchcamera"])) in cameranet.cameras
if (href_list["showalerts"])
ai_alerts()
//Carn: holopad requests
@@ -583,7 +583,7 @@ var/list/ai_list = list()
var/mob/living/silicon/ai/U = usr
- for (var/obj/machinery/camera/C in cameranet.viewpoints)
+ for (var/obj/machinery/camera/C in cameranet.cameras)
if(!C.can_use())
continue
@@ -601,7 +601,7 @@ var/list/ai_list = list()
if(isnull(network))
network = old_network // If nothing is selected
else
- for(var/obj/machinery/camera/C in cameranet.viewpoints)
+ for(var/obj/machinery/camera/C in cameranet.cameras)
if(!C.can_use())
continue
if(network in C.network)
diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm
index e34dee5b247..7d52fbd7a24 100644
--- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm
@@ -1,25 +1,148 @@
-/datum/visibility_network/cameras
- ChunkType = /datum/visibility_chunk/camera
+// CAMERA NET
+//
+// The datum containing all the chunks.
-/datum/visibility_network/cameras/getViewpointFromMob(var/mob/currentMob)
- var/mob/living/silicon/robot/currentRobot=currentMob
- if(currentRobot)
- return currentRobot.camera
- return FALSE
-
-/datum/visibility_network/cameras/validViewpoint(var/viewpoint)
- var/obj/machinery/camera/c = viewpoint
- if (!c)
- return FALSE
- return c.can_use()
-
-
-// adding some indirection so that I don't have to edit a ton of files
-/datum/visibility_network/cameras/proc/addCamera(var/camera)
- return addViewpoint(camera)
-
-/datum/visibility_network/cameras/proc/removeCamera(var/camera)
- return removeViewpoint(camera)
-
-/datum/visibility_network/cameras/proc/checkCameraVis(var/atom/target)
- return checkCanSee(target)
\ No newline at end of file
+var/datum/cameranet/cameranet = new()
+
+/datum/cameranet
+ // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del().
+ var/list/cameras = list()
+ // The chunks of the map, mapping the areas that the cameras can see.
+ var/list/chunks = list()
+ var/ready = 0
+
+// Checks if a chunk has been Generated in x, y, z.
+/datum/cameranet/proc/chunkGenerated(x, y, z)
+ x &= ~0xf
+ y &= ~0xf
+ var/key = "[x],[y],[z]"
+ return (chunks[key])
+
+// Returns the chunk in the x, y, z.
+// If there is no chunk, it creates a new chunk and returns that.
+/datum/cameranet/proc/getCameraChunk(x, y, z)
+ x &= ~0xf
+ y &= ~0xf
+ var/key = "[x],[y],[z]"
+ if(!chunks[key])
+ chunks[key] = new /datum/camerachunk(null, x, y, z)
+
+ return chunks[key]
+
+// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set.
+
+/datum/cameranet/proc/visibility(mob/aiEye/ai)
+ // 0xf = 15
+ var/x1 = max(0, ai.x - 16) & ~0xf
+ var/y1 = max(0, ai.y - 16) & ~0xf
+ var/x2 = min(world.maxx, ai.x + 16) & ~0xf
+ var/y2 = min(world.maxy, ai.y + 16) & ~0xf
+
+ var/list/visibleChunks = list()
+
+ for(var/x = x1; x <= x2; x += 16)
+ for(var/y = y1; y <= y2; y += 16)
+ visibleChunks += getCameraChunk(x, y, ai.z)
+
+ var/list/remove = ai.visibleCameraChunks - visibleChunks
+ var/list/add = visibleChunks - ai.visibleCameraChunks
+
+ for(var/chunk in remove)
+ var/datum/camerachunk/c = chunk
+ c.remove(ai)
+
+ for(var/chunk in add)
+ var/datum/camerachunk/c = chunk
+ c.add(ai)
+
+// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open.
+
+/datum/cameranet/proc/updateVisibility(atom/A, var/opacity_check = 1)
+
+ if(!ticker || (opacity_check && !A.opacity))
+ return
+ majorChunkChange(A, 2)
+
+/datum/cameranet/proc/updateChunk(x, y, z)
+ // 0xf = 15
+ if(!chunkGenerated(x, y, z))
+ return
+ var/datum/camerachunk/chunk = getCameraChunk(x, y, z)
+ chunk.hasChanged()
+
+// Removes a camera from a chunk.
+
+/datum/cameranet/proc/removeCamera(obj/machinery/camera/c)
+ if(c.can_use())
+ majorChunkChange(c, 0)
+
+// Add a camera to a chunk.
+
+/datum/cameranet/proc/addCamera(obj/machinery/camera/c)
+ if(c.can_use())
+ majorChunkChange(c, 1)
+
+// Used for Cyborg cameras. Since portable cameras can be in ANY chunk.
+
+/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c)
+ if(c.can_use())
+ majorChunkChange(c, 1)
+ //else
+ // majorChunkChange(c, 0)
+
+// Never access this proc directly!!!!
+// This will update the chunk and all the surrounding chunks.
+// It will also add the atom to the cameras list if you set the choice to 1.
+// Setting the choice to 0 will remove the camera from the chunks.
+// If you want to update the chunks around an object, without adding/removing a camera, use choice 2.
+
+/datum/cameranet/proc/majorChunkChange(atom/c, var/choice)
+ // 0xf = 15
+ if(!c)
+ return
+
+ var/turf/T = get_turf(c)
+ if(T)
+ var/x1 = max(0, T.x - 8) & ~0xf
+ var/y1 = max(0, T.y - 8) & ~0xf
+ var/x2 = min(world.maxx, T.x + 8) & ~0xf
+ var/y2 = min(world.maxy, T.y + 8) & ~0xf
+
+ //world << "X1: [x1] - Y1: [y1] - X2: [x2] - Y2: [y2]"
+
+ for(var/x = x1; x <= x2; x += 16)
+ for(var/y = y1; y <= y2; y += 16)
+ if(chunkGenerated(x, y, T.z))
+ var/datum/camerachunk/chunk = getCameraChunk(x, y, T.z)
+ if(choice == 0)
+ // Remove the camera.
+ chunk.cameras -= c
+ else if(choice == 1)
+ // You can't have the same camera in the list twice.
+ chunk.cameras |= c
+ chunk.hasChanged()
+
+// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0.
+
+/datum/cameranet/proc/checkCameraVis(mob/living/target as mob)
+
+ // 0xf = 15
+ var/turf/position = get_turf(target)
+ var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z)
+ if(chunk)
+ if(chunk.changed)
+ chunk.hasChanged(1) // Update now, no matter if it's visible or not.
+ if(chunk.visibleTurfs[position])
+ return 1
+ return 0
+
+
+// Debug verb for VVing the chunk that the turf is in.
+/*
+/turf/verb/view_chunk()
+ set src in world
+
+ if(cameranet.chunkGenerated(x, y, z))
+ var/datum/camerachunk/chunk = cameranet.getCameraChunk(x, y, z)
+ usr.client.debug_variables(chunk)
+*/
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
index 89c88c1aaff..33dbfd09665 100644
--- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
@@ -1,23 +1,168 @@
-/datum/visibility_chunk/camera
+#define UPDATE_BUFFER 25 // 2.5 seconds
+
+// CAMERA CHUNK
+//
+// A 16x16 grid of the map with a list of turfs that can be seen, are visible and are dimmed.
+// Allows the AI Eye to stream these chunks and know what it can and cannot see.
+
+/datum/camerachunk
+ var/list/obscuredTurfs = list()
+ var/list/visibleTurfs = list()
+ var/list/obscured = list()
+ var/list/cameras = list()
+ var/list/turfs = list()
+ var/list/seenby = list()
+ var/visible = 0
+ var/changed = 0
+ var/updating = 0
+ var/x = 0
+ var/y = 0
+ var/z = 0
+
+// Add an AI eye to the chunk, then update if changed.
+
+/datum/camerachunk/proc/add(mob/aiEye/ai)
+ if(!ai.ai)
+ return
+ ai.visibleCameraChunks += src
+ if(ai.ai.client)
+ ai.ai.client.images += obscured
+ visible++
+ seenby += ai
+ if(changed && !updating)
+ update()
+
+// Remove an AI eye from the chunk, then update if changed.
+
+/datum/camerachunk/proc/remove(mob/aiEye/ai)
+ if(!ai.ai)
+ return
+ ai.visibleCameraChunks -= src
+ if(ai.ai.client)
+ ai.ai.client.images -= obscured
+ seenby -= ai
+ if(visible > 0)
+ visible--
+
+// Called when a chunk has changed. I.E: A wall was deleted.
+
+/datum/camerachunk/proc/visibilityChanged(turf/loc)
+ if(!visibleTurfs[loc])
+ return
+ hasChanged()
+
+// Updates the chunk, makes sure that it doesn't update too much. If the chunk isn't being watched it will
+// instead be flagged to update the next time an AI Eye moves near it.
+
+/datum/camerachunk/proc/hasChanged(var/update_now = 0)
+ if(visible || update_now)
+ if(!updating)
+ updating = 1
+ spawn(UPDATE_BUFFER) // Batch large changes, such as many doors opening or closing at once
+ update()
+ updating = 0
+ else
+ changed = 1
+
+// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists.
+
+/datum/camerachunk/proc/update()
+
+ set background = 1
+
+ var/list/newVisibleTurfs = list()
+
+ for(var/camera in cameras)
+ var/obj/machinery/camera/c = camera
+
+ if(!c)
+ continue
+
+ if(!c.can_use())
+ continue
+
+ var/turf/point = locate(src.x + 8, src.y + 8, src.z)
+ if(get_dist(point, c) > 24)
+ continue
+
+ for(var/turf/t in c.can_see())
+ newVisibleTurfs[t] = t
+
+ // Removes turf that isn't in turfs.
+ newVisibleTurfs &= turfs
+
+ var/list/visAdded = newVisibleTurfs - visibleTurfs
+ var/list/visRemoved = visibleTurfs - newVisibleTurfs
+
+ visibleTurfs = newVisibleTurfs
+ obscuredTurfs = turfs - newVisibleTurfs
+
+ for(var/turf in visAdded)
+ var/turf/t = turf
+ if(t.obscured)
+ obscured -= t.obscured
+ for(var/eye in seenby)
+ var/mob/aiEye/m = eye
+ if(!m || !m.ai)
+ continue
+ if(m.ai.client)
+ m.ai.client.images -= t.obscured
+
+ for(var/turf in visRemoved)
+ var/turf/t = turf
+ if(obscuredTurfs[t])
+ if(!t.obscured)
+ t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15)
+
+ obscured += t.obscured
+ for(var/eye in seenby)
+ var/mob/aiEye/m = eye
+ if(!m || !m.ai)
+ seenby -= m
+ continue
+ if(m.ai.client)
+ m.ai.client.images += t.obscured
+
+// Create a new camera chunk, since the chunks are made as they are needed.
+
+/datum/camerachunk/New(loc, x, y, z)
+
+ // 0xf = 15
+ x &= ~0xf
+ y &= ~0xf
+
+ src.x = x
+ src.y = y
+ src.z = z
-/datum/visibility_chunk/camera/validViewpoint(var/viewpoint)
- var/obj/machinery/camera/c = viewpoint
- if(!c)
- return FALSE
- if(!c.can_use())
- return FALSE
- var/turf/point = locate(src.x + 8, src.y + 8, src.z)
- if(get_dist(point, c) > 24)
- return FALSE
- return TRUE
-
-
-/datum/visibility_chunk/camera/getVisibleTurfsForViewpoint(var/viewpoint)
- var/obj/machinery/camera/c = viewpoint
- return c.can_see()
-
-
-/datum/visibility_chunk/camera/findNearbyViewpoints()
for(var/obj/machinery/camera/c in range(16, locate(x + 8, y + 8, z)))
if(c.can_use())
- viewpoints += c
\ No newline at end of file
+ cameras += c
+
+ for(var/turf/t in range(10, locate(x + 8, y + 8, z)))
+ if(t.x >= x && t.y >= y && t.x < x + 16 && t.y < y + 16)
+ turfs[t] = t
+
+ for(var/camera in cameras)
+ var/obj/machinery/camera/c = camera
+ if(!c)
+ continue
+
+ if(!c.can_use())
+ continue
+
+ for(var/turf/t in c.can_see())
+ visibleTurfs[t] = t
+
+ // Removes turf that isn't in turfs.
+ visibleTurfs &= turfs
+
+ obscuredTurfs = turfs - visibleTurfs
+
+ for(var/turf in obscuredTurfs)
+ var/turf/t = turf
+ if(!t.obscured)
+ t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15)
+ obscured += t.obscured
+
+#undef UPDATE_BUFFER
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 351b9b60fa1..c82fbb7c76d 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -6,16 +6,13 @@
/mob/aiEye
name = "Inactive AI Eye"
icon = 'icons/obj/status_display.dmi' // For AI friend secret shh :o
+ var/list/visibleCameraChunks = list()
var/mob/living/silicon/ai/ai = null
density = 0
status_flags = GODMODE // You can't damage it.
mouse_opacity = 0
see_in_dark = 7
-/mob/aiEye/New()
- ..()
- visibility_interface = new /datum/visibility_interface/ai_eye(src)
-
// Movement code. Returns 0 to stop air movement from moving it.
/mob/aiEye/Move()
return 0
@@ -40,6 +37,7 @@
// It will also stream the chunk that the new loc is in.
/mob/aiEye/proc/setLoc(var/T)
+
if(ai)
if(!isturf(ai.loc))
return
@@ -138,8 +136,7 @@
if(client && client.eye)
client.eye = src
-
- for(var/datum/visibility_chunk/camera/c in eyeobj.visibility_interface.visible_chunks)
+ for(var/datum/camerachunk/c in eyeobj.visibleCameraChunks)
c.remove(eyeobj)
/mob/living/silicon/ai/verb/toggle_acceleration()
diff --git a/code/modules/mob/living/silicon/ai/freelook/read_me.dm b/code/modules/mob/living/silicon/ai/freelook/read_me.dm
index aa3d99bdba0..53e68ff1377 100644
--- a/code/modules/mob/living/silicon/ai/freelook/read_me.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/read_me.dm
@@ -43,7 +43,7 @@
WHERE IS EVERYTHING?
- cameraNetwork.dm = Everything about the cameraNetwork datum.
+ cameranet.dm = Everything about the cameranet datum.
chunk.dm = Everything about the chunk datum.
eye.dm = Everything about the AI and the AIEye.
updating.dm = Everything about triggers that will update chunks.
diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
index 5a1f9c6e9b6..c1f63313727 100644
--- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
@@ -1,5 +1,80 @@
#define BORG_CAMERA_BUFFER 30
+//UPDATE TRIGGERS, when the chunk (and the surrounding chunks) should update.
+
+// TURFS
+
+/turf
+ var/image/obscured
+
+/turf/proc/visibilityChanged()
+ if(ticker)
+ cameranet.updateVisibility(src)
+
+/turf/simulated/Del()
+ visibilityChanged()
+ ..()
+
+/turf/simulated/New()
+ ..()
+ visibilityChanged()
+
+
+
+// STRUCTURES
+
+/obj/structure/Del()
+ if(ticker)
+ cameranet.updateVisibility(src)
+ ..()
+
+/obj/structure/New()
+ ..()
+ if(ticker)
+ cameranet.updateVisibility(src)
+
+// EFFECTS
+
+/obj/effect/Del()
+ if(ticker)
+ cameranet.updateVisibility(src)
+ ..()
+
+/obj/effect/New()
+ ..()
+ if(ticker)
+ cameranet.updateVisibility(src)
+
+
+// DOORS
+
+// Simply updates the visibility of the area when it opens/closes/destroyed.
+/obj/machinery/door/update_nearby_tiles(need_rebuild)
+ . = ..(need_rebuild)
+ // Glass door glass = 1
+ // don't check then?
+ if(!glass && cameranet)
+ cameranet.updateVisibility(src, 0)
+
+
+// ROBOT MOVEMENT
+
+// Update the portable camera everytime the Robot moves.
+// This might be laggy, comment it out if there are problems.
+/mob/living/silicon/robot/var/updating = 0
+
+/mob/living/silicon/robot/Move()
+ var/oldLoc = src.loc
+ . = ..()
+ if(.)
+ if(src.camera && src.camera.network.len)
+ if(!updating)
+ updating = 1
+ spawn(BORG_CAMERA_BUFFER)
+ if(oldLoc != src.loc)
+ cameranet.updatePortableCamera(src.camera)
+ updating = 0
+
// CAMERA
// An addition to deactivate which removes/adds the camera from the chunk list based on if it works or not.
@@ -7,23 +82,23 @@
/obj/machinery/camera/deactivate(user as mob, var/choice = 1)
..(user, choice)
if(src.can_use())
- cameranet.addViewpoint(src)
+ cameranet.addCamera(src)
else
src.SetLuminosity(0)
- cameranet.removeViewpoint(src)
+ cameranet.removeCamera(src)
/obj/machinery/camera/New()
..()
- cameranet.viewpoints += src //Camera must be added to global list of all cameras no matter what...
+ cameranet.cameras += src //Camera must be added to global list of all cameras no matter what...
var/list/open_networks = difflist(network,RESTRICTED_CAMERA_NETWORKS) //...but if all of camera's networks are restricted, it only works for specific camera consoles.
if(open_networks.len) //If there is at least one open network, chunk is available for AI usage.
- cameranet.addViewpoint(src)
+ cameranet.addCamera(src)
/obj/machinery/camera/Del()
- cameranet.viewpoints -= src
+ cameranet.cameras -= src
var/list/open_networks = difflist(network,RESTRICTED_CAMERA_NETWORKS)
if(open_networks.len)
- cameranet.removeViewpoint(src)
+ cameranet.removeCamera(src)
..()
#undef BORG_CAMERA_BUFFER
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/freelook/visibility_interface.dm b/code/modules/mob/living/silicon/ai/freelook/visibility_interface.dm
deleted file mode 100644
index b55598c6090..00000000000
--- a/code/modules/mob/living/silicon/ai/freelook/visibility_interface.dm
+++ /dev/null
@@ -1,10 +0,0 @@
-/datum/visibility_interface/ai_eye
- chunk_type = /datum/visibility_chunk/camera
-
-/datum/visibility_interface/ai_eye/getClient()
- var/mob/aiEye/eye = controller
- if (!eye)
- return FALSE
- if (!eye.ai)
- return FALSE
- return eye.ai.client
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 4e9c8068509..86af5c33a92 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -11,11 +11,10 @@
pass_flags = PASSTABLE
braintype = "Robot"
lawupdate = 0
- density = 0
+ density = 1
// We need to keep track of a few module items so we don't need to do list operations
// every time we need them. These get set in New() after the module is chosen.
-
var/obj/item/stack/sheet/metal/cyborg/stack_metal = null
var/obj/item/stack/sheet/wood/cyborg/stack_wood = null
var/obj/item/stack/sheet/glass/cyborg/stack_glass = null
@@ -25,6 +24,8 @@
//Used for self-mailing.
var/mail_destination = 0
+ //Used for pulling.
+
/mob/living/silicon/robot/drone/New()
..()
@@ -58,7 +59,6 @@
updatename()
updateicon()
-
//Redefining some robot procs...
/mob/living/silicon/robot/drone/updatename()
real_name = "maintenance drone ([rand(100,999)])"
@@ -101,10 +101,27 @@
return emote(copytext(message,2))
else if(length(message) >= 2)
if(copytext(message, 1 ,3) == ":b" || copytext(message, 1 ,3) == ":B")
+
if(!is_component_functioning("comms"))
src << "\red Your binary communications component isn't functional."
return
+
robot_talk(trim(copytext(message,3)))
+
+ else if(copytext(message, 1 ,3) == ":d" || copytext(message, 1 ,3) == ":d")
+
+ if(!is_component_functioning("radio"))
+ src << "\red Your radio transmitter isn't functional."
+ return
+
+ for (var/mob/living/S in living_mob_list)
+ if(istype(S, /mob/living/silicon/robot/drone))
+ S << "Drone Talk, [name] transmits, \"[message]\""
+
+ for (var/mob/M in dead_mob_list)
+ if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain))
+ M << "Drone Talk, [name] transmits, \"[message]\""
+
else
var/list/listeners = hearers(5,src)
@@ -298,8 +315,35 @@
if(player.mob && player.mob.mind)
player.mob.mind.transfer_to(src)
- emagged = 0
lawupdate = 0
src << "Systems rebooted. Loading base pattern maintenance protocol... loaded."
full_law_reset()
+ src << " You are a maintenance drone, a tiny-brained robotic repair machine."
+ src << "You have no individual will, no personality, and no drives or urges other than your laws."
+ src << "Use :b to talk to your fellow synthetics, or use say to speak silently to other drones nearby."
+ src << "Remember, you are lawed against interference with the crew."
+ src << "Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets."
+ src << "If a crewmember has noticed you, you are probably breaking your third law."
+/mob/living/silicon/robot/drone/Bump(atom/movable/AM as mob|obj, yes)
+ if (!yes || (!istype(AM,/obj/machinery/door) && !istype(AM,/obj/machinery/recharge_station)) ) return
+ ..()
+ return
+
+/mob/living/silicon/robot/drone/Bumped(AM as mob|obj)
+ return
+
+/mob/living/silicon/robot/drone/start_pulling(var/atom/movable/AM)
+
+ if(istype(AM,/obj/item/pipe) || istype(AM,/obj/structure/disposalconstruct))
+ ..()
+ else if(istype(AM,/obj/item))
+ var/obj/item/O = AM
+ if(O.w_class > 2)
+ src << "You are too small to pull that."
+ return
+ else
+ ..()
+ else
+ src << "You are too small to pull that."
+ return
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index a1219919776..b8d3025db1e 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -53,9 +53,12 @@
wrapped = null
//update_icon()
-/obj/item/weapon/gripper/afterattack(atom/target, mob/user as mob)
+/obj/item/weapon/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ return
- if(!target) //Target is invalid.
+/obj/item/weapon/gripper/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
+
+ if(!target || !flag) //Target is invalid or we are not adjacent.
return
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
@@ -139,7 +142,12 @@
"plastic" = 0
)
-/obj/item/weapon/matter_decompiler/afterattack(atom/target, mob/user as mob)
+/obj/item/weapon/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ return
+
+/obj/item/weapon/matter_decompiler/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
+
+ if(!flag) return //Not adjacent.
//We only want to deal with using this on turfs. Specific items aren't important.
var/turf/T = get_turf(target)
@@ -160,7 +168,7 @@
stored_comms["plastic"]++
return
- else if(istype(M,/mob/living/silicon/robot/drone) && M.stat == 2 && !M.client)
+ else if(istype(M,/mob/living/silicon/robot/drone) && !M.client)
var/mob/living/silicon/robot/drone/D = src.loc
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index c72cb820304..b539af043fa 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -90,10 +90,7 @@
modtype = "Security"
else if(istype(src,/mob/living/silicon/robot/drone))
laws = new /datum/ai_laws/drone()
- connected_ai = select_active_ai_with_fewest_borgs()
- if(connected_ai)
- connected_ai.connected_robots += src
- lawsync()
+ connected_ai = null
else
laws = new /datum/ai_laws/nanotrasen()
connected_ai = select_active_ai_with_fewest_borgs()
@@ -531,15 +528,15 @@
/mob/living/silicon/robot/triggerAlarm(var/class, area/A, list/cameralist, var/source)
if (stat == 2)
return 1
-
+
..()
-
+
queueAlarm(text("--- [class] alarm detected in [A.name]!"), class)
/mob/living/silicon/robot/cancelAlarm(var/class, area/A as area, obj/origin)
var/has_alarm = ..()
-
+
if (!has_alarm)
queueAlarm(text("--- [class] alarm in [A.name] has been cleared."), class, 0)
// if (viewalerts) robot_alerts()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index f6ca16f6e4b..95f1205c639 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -305,9 +305,9 @@
src.modules += new /obj/item/weapon/wirecutters(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/lightreplacer(src)
- src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/matter_decompiler(src)
+ src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src)
src.emag = new /obj/item/weapon/card/emag(src)
src.emag.name = "Cryptographic Sequencer"
@@ -324,7 +324,7 @@
/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R)
var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules
- C.reagents.add_reagent("cleaner", 10)
+ C.reagents.add_reagent("cleaner", 3)
for(var/T in stacktypes)
var/O = locate(T) in src.modules
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 71e38d0ba55..4f50ef31e45 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -19,6 +19,8 @@
icon_state = "spiderbot-chassis"
icon_living = "spiderbot-chassis"
icon_dead = "spiderbot-smashed"
+ universal_speak = 1 //Temp until these are rewritten.
+
wander = 0
health = 10
@@ -33,9 +35,8 @@
response_disarm = "shoos"
response_harm = "stomps on"
+ var/emagged = 0
var/obj/item/held_item = null //Storage for single item they can hold.
- var/emagged = 0 //IS WE EXPLODEN?
- var/syndie = 0 //IS WE SYNDICAT? (currently unused)
speed = -1 //Spiderbots gotta go fast.
//pass_flags = PASSTABLE //Maybe griefy?
small = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index fb1d63ca348..bf02fadbfb0 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -127,7 +127,7 @@
// Copy Mimic
//
-var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/cable, /obj/structure/window)
+var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/cable, /obj/structure/window, /obj/item/projectile/animate)
/mob/living/simple_animal/hostile/mimic/copy
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 69eaa58b773..30ba30f6ad8 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -454,22 +454,22 @@
overlays = null
if (targeted_by && target_locked)
overlays += target_locked
-
-/mob/living/simple_animal/say(var/message)
- if(stat)
- return
-
- if(copytext(message,1,2) == "*")
- return emote(copytext(message,2))
-
- if(stat)
- return
-
- var/verb = "says"
-
- if(speak_emote.len)
- verb = pick(speak_emote)
-
- message = capitalize(trim_left(message))
-
- ..(message, null, verb)
+
+/mob/living/simple_animal/say(var/message)
+ if(stat)
+ return
+
+ if(copytext(message,1,2) == "*")
+ return emote(copytext(message,2))
+
+ if(stat)
+ return
+
+ var/verb = "says"
+
+ if(speak_emote.len)
+ verb = pick(speak_emote)
+
+ message = capitalize(trim_left(message))
+
+ ..(message, null, verb)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 60335b8df2c..217315111e5 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -333,9 +333,6 @@ var/list/slot_equipment_priority = list( \
return
*/
-/mob
- var/newPlayerType = /mob/new_player
-
/mob/verb/abandon_mob()
set name = "Respawn"
set category = "OOC"
@@ -385,12 +382,14 @@ var/list/slot_equipment_priority = list( \
log_game("[usr.key] AM failed due to disconnect.")
return
- var/mob/newPlayer = new newPlayerType()
+ var/mob/new_player/M = new /mob/new_player()
if(!client)
log_game("[usr.key] AM failed due to disconnect.")
- del(newPlayer)
+ del(M)
return
- newPlayer.key = key
+
+ M.key = key
+// M.Login() //wat
return
/client/verb/changes()
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 803b2e7c00e..777f684dcbe 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -205,7 +205,6 @@
var/obj/control_object //Used by admins to possess objects. All mobs should have this var
- var/datum/visibility_interface/visibility_interface = null // used by the visibility system to provide an interface for the visibility networks
//Whether or not mobs can understand other mobtypes. These stay in /mob so that ghosts can hear everything.
var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index bef1dd940da..314a4026ab1 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -114,17 +114,7 @@ proc/isobserver(A)
if(istype(A, /mob/dead/observer))
return 1
return 0
-
-/proc/isSpirit(A)
- if(istype(A, /mob/spirit))
- return 1
- return 0
-/proc/ismask(A)
- if(istype(A, /mob/spirit/mask))
- return 1
- return 0
-
proc/isorgan(A)
if(istype(A, /datum/organ/external))
return 1
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 0e1514177ac..59721a24ab4 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -176,15 +176,8 @@
return
if(mob.stat==2) return
-
-// handle possible spirit movement
- if(istype(mob,/mob/spirit))
- var/mob/spirit/currentSpirit = mob
- return currentSpirit.Spirit_Move(direct)
-
- // handle possible AI movement
- if(isAI(mob))
- return AIMove(n,direct,mob)
+
+ if(isAI(mob)) return AIMove(n,direct,mob)
if(mob.monkeyizing) return//This is sota the goto stop mobs from moving var
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 15a63ad79c0..029d2d03b56 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -53,8 +53,7 @@
if(name != real_name)
alt_name = " (died as [real_name])"
- message = src.say_quote(message)
- var/rendered = "DEAD:[name][alt_name] [message]"
+ var/rendered = "DEAD:[name][alt_name] [pick("complains","moans","whines","laments","blubbers")], \"[message]\""
for(var/mob/M in player_list)
if(istype(M, /mob/new_player))
diff --git a/code/modules/mob/spirit/cultnet.dm b/code/modules/mob/spirit/cultnet.dm
deleted file mode 100644
index df0cd57ff5d..00000000000
--- a/code/modules/mob/spirit/cultnet.dm
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-
-This file contains the code necessary to do the display code for cult spirits.
-
-It reuses a lot of code from the AIEye cameraNetwork. In order to work properly, some of those files needed to be modified as well.
-
-*/
-
-
-/proc/isCultRune(var/viewpoint)
- var/obj/effect/rune/test_rune = viewpoint
- if (test_rune)
- return TRUE
- return FALSE
-
-
-/proc/isCultViewpoint(var/viewpoint)
- var/obj/cult_viewpoint/vp = viewpoint
- if (vp)
- return TRUE
- return FALSE
-
-
-/datum/visibility_chunk/cult/validViewpoint(var/atom/viewpoint)
- var/turf/point = locate(src.x + 8, src.y + 8, src.z)
- if(get_dist(point, viewpoint) > 24)
- return FALSE
-
- if (isCultRune(viewpoint) || isCultViewpoint(viewpoint))
- return viewpoint:can_use()
- return FALSE
-
-
-/datum/visibility_chunk/cult/getVisibleTurfsForViewpoint(var/viewpoint)
- var/obj/effect/rune/rune = viewpoint
- if (rune)
- return rune.can_see()
- var/obj/cult_viewpoint/cvp = viewpoint
- if (cvp)
- return cvp.can_see()
- return null
-
-
-/datum/visibility_chunk/cult/findNearbyViewpoints()
- for(var/obj/cult_viewpoint/vp in range(16, locate(x + 8, y + 8, z)))
- if(vp.can_use())
- viewpoints += vp
- for(var/obj/effect/rune/rune in range(16, locate(x + 8, y + 8, z)))
- viewpoints += rune
-
-
-/datum/visibility_network/cult
- ChunkType = /datum/visibility_chunk/cult
-
-
-/datum/visibility_network/cult/validViewpoint(var/viewpoint)
- if (isCultRune(viewpoint) || isCultViewpoint(viewpoint))
- return viewpoint:can_use()
- return FALSE
-
-/datum/visibility_network/cult/getViewpointFromMob(var/mob/currentMob)
- for(var/obj/cult_viewpoint/currentView in currentMob)
- return currentView
- return FALSE
-
-
-/datum/visibility_interface/cult
- chunk_type = /datum/visibility_chunk/cult
-
-
-/*
-RUNE JUNK
-*/
-
-/obj/effect/rune/proc/can_use()
- return TRUE
-
-/obj/effect/rune/proc/can_see()
- return hear(view_range, get_turf(src))
-
diff --git a/code/modules/mob/spirit/mask/mask.dm b/code/modules/mob/spirit/mask/mask.dm
deleted file mode 100644
index 6b58f201cf2..00000000000
--- a/code/modules/mob/spirit/mask/mask.dm
+++ /dev/null
@@ -1,227 +0,0 @@
-/mob/spirit/mask
- icon = 'icons/mob/spirits/mask.dmi'
- icon_state = "depressurized"
-
-/mob/spirit/mask/New()
- ..()
- spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/create_talisman(src)
- spell_list += new /obj/effect/proc_holder/spell/aoe_turf/blood_speech(src)
- spell_list += new /obj/effect/proc_holder/spell/aoe_turf/shatter_lights(src)
-
-
-/mob/spirit/mask/verb/go_to_follower()
- set category = "Mask"
- set name = "Go to follower"
- set desc = "Select who you would like to go too."
-
- var/obj/cult_viewpoint/cultist = pick_cultist()
- if (cultist)
- follow_cultist(cultist.owner)
- cult_log("[key_name_admin(src)] started following [key_name_admin(cultist)].")
- src << "You start following [cultist.get_display_name()]."
-
-
-/mob/spirit/mask/verb/urge_cultist()
- set category = "Mask"
- set name = "Urge cultist"
- set desc = "Push your cultists to do something."
-
- var/obj/cult_viewpoint/cultist = pick_cultist()
- if (cultist)
- if (cultist.owner)
- var/newUrge = stripped_input(usr, "", "Set Urge", "")
- cultist.set_urge(newUrge)
- src << "You urge [cultist.owner.name] to [newUrge]."
- cult_log("controlled by [key_name_admin(src)] has urged [key_name_admin(cultist.owner)] to [newUrge].")
-
-/mob/spirit/mask/verb/set_cult_name()
- set category = "Mask"
- set name = "Set Cult Name"
- set desc = "Grant a cultist a name."
-
- var/obj/cult_viewpoint/cultist = pick_cultist()
- if (cultist)
- var/newName = stripped_input(usr, "", "Set Cult Name", "")
- if (!newName)
- return
- cultist.set_cult_name(newName)
- src << "You grant [cultist.owner.name] the secret name of [newName]."
- if (cultist.owner)
- cult_log("[key_name_admin(src)] has set [key_name_admin(cultist.owner)] to \'[newName]\'")
-
-
-/mob/spirit/mask/verb/urge_cult()
- set category = "Mask"
- set name = "Urge Cult"
- set desc = "Set urge on the entire cult."
-
- var/newUrge = stripped_input(usr, "Please choose an urge.", "Set Urge", "")
- for(var/obj/cult_viewpoint/viewpoint in cult_viewpoints)
- viewpoint.set_urge(newUrge)
- src << "You urge the entire cult to [newUrge]."
- cult_log("[key_name_admin(src)] has urged the entire cult to [newUrge]")
-
-
-/mob/spirit/mask/verb/set_favor_for_cultist()
- set category = "Mask"
- set name = "Show your favor"
- set desc = "Set the favor for a cultist"
-
- var/obj/cult_viewpoint/cultist = pick_cultist()
- if (cultist)
- if (cultist.owner)
- var/list/favor = list("Pleased", "Displeased", "Indifference")
- var/emotion = input("Pick your emotion", "Mask", null, null) in favor
- switch(emotion)
- if("Pleased")
- cultist.set_favor(1)
- cult_log("[key_name_admin(src)] is pleased with [key_name_admin(cultist.owner)]")
- if("Displeased")
- cultist.set_favor(-1)
- cult_log("[key_name_admin(src)] is displeased with [key_name_admin(cultist.owner)]")
- if("Indifference")
- cultist.set_favor(0)
- cult_log("[key_name_admin(src)] is indifferent too [key_name_admin(cultist.owner)]")
-
-
-/mob/spirit/mask/proc/set_name()
- spawn(0)
- var/newName = stripped_input(src, "Please pick a name.", "Pick Name for Mask", "")
- name = newName ? newName : "Mask of Nar'sie"
- src << "You have set your name to [name]."
-
-
-/mob/spirit/mask/proc/pick_cultist()
- var/list/cultists = list()
- for(var/obj/cult_viewpoint/viewpoint in cult_viewpoints)
- cultists[viewpoint.get_display_name()]=viewpoint
- var/input = input("Please, select a cultist!", "Cult", null, null) as null|anything in cultists
- var/obj/cult_viewpoint/result = cultists[input]
- return result
-
-
-// this proc makes the mask visible very briefly
-/mob/spirit/mask/proc/flicker()
- spawn(0)
- alpha = 127
- invisibility=0
- sleep(5)
- invisibility=initial(invisibility)
- alpha = 255
-
-/proc/flicker_mask(mob/spirit/mask/target)
- if(istype(target))
- target.flicker()
-
-// SPELLS
-/obj/effect/proc_holder/spell/aoe_turf/blood_speech
- name = "Speak to your Acolytes"
- desc = "This spell allows you to speak to your flock."
- school = "unknown evil"
- charge_type = "recharge"
- charge_max = 2000
- clothes_req = 0
- invocation = "none"
- invocation_type = "none"
- range = 0
-
-/obj/effect/proc_holder/spell/aoe_turf/blood_speech/cast(list/targets)
- var/input = stripped_input(usr, "Please choose a message to tell your acolytes.", "Voice of Blood", "")
- if(!input)
- revert_cast(usr)
- cult_log("[key_name_admin(usr)]says : [input]")
- flicker_mask(usr)
- for(var/datum/mind/H in ticker.mode.cult)
- if (H.current)
- H.current << "[usr.name]: [input]"
- for(var/mob/spirit/spirit in spirits)
- spirit << "[usr.name]: [input]"
-
-
-/obj/effect/proc_holder/spell/aoe_turf/shatter_lights
- name = "Spread Shadows"
- desc = "This spell breaks lights near the mask."
- school = "unknown evil"
- charge_type = "recharge"
- charge_max = 1000
- clothes_req = 0
- invocation = "none"
- invocation_type = "none"
- range = 0
-
-/obj/effect/proc_holder/spell/aoe_turf/shatter_lights/cast(list/targets)
- cult_log("[key_name_admin(usr)] used Spread Shadows.")
- flicker_mask(usr)
- spawn(0)
- for(var/area/A in range(3,get_turf(usr)))
- for(var/obj/machinery/light/L in A)
- L.on = 1
- L.broken()
- sleep(1)
- for(var/obj/item/device/flashlight/F in A)
- F.on = 0
-
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/create_talisman
- name = "Create Talisman"
- desc = "This spell conjures a talisman"
-
- school = "conjuration"
- charge_type = "recharge"
- charge_max = 3000
- clothes_req = 0
- invocation = "none"
- invocation_type = "none"
- range = 0
- summon_type = list(/obj/item/weapon/paper/talisman)
-
- var/list/talismans = list( "Armor"="armor",
- "Blind"="blind",
- "Conceal"="conceal",
- "Communicate"="communicate",
- "Deafen"="deafen",
- "EMP"="emp",
- "Teleport"="teleport",
- "Tome"="newtome",
- "Reveal Runes",
- "Stun"="runestun",
- "Soul Stone"="soulstone",
- "Construct"="construct")
-
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/create_talisman/cast(list/targets)
-
- var/talisman = input("Pick a talisman type", "Talisman", null, null) as null|anything in talismans
- var/imbue_value = talismans[talisman]
- if (!talisman)
- usr << "You choose not to create a talisman."
- revert_cast(usr)
- return
-
- cult_log("[key_name_admin(usr,0)] created a talisman of type [talisman].")
- flicker_mask(usr)
-
- switch(talisman)
-
- if ("Teleport")
- var/target_rune = input("Pick a teleport target", "Teleport Rune", null, null) as null|anything in engwords
- if (!target_rune)
- usr << "You choose not to create a talisman."
- revert_cast(usr)
- return
- summon_type = list(/obj/item/weapon/paper/talisman)
- newVars = list("imbue" = "[target_rune]", "info" = "[target_rune]")
-
- if ("Soul Stone")
- summon_type = list(/obj/item/device/soulstone)
- newVars = list()
-
- if ("Construct")
- summon_type = list(/obj/structure/constructshell)
- newVars = list()
-
- else
- summon_type = list(/obj/item/weapon/paper/talisman)
- newVars = list("imbue" = "[imbue_value]")
-
- ..()
\ No newline at end of file
diff --git a/code/modules/mob/spirit/mask/respawn.dm b/code/modules/mob/spirit/mask/respawn.dm
deleted file mode 100644
index acfb69073c2..00000000000
--- a/code/modules/mob/spirit/mask/respawn.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/proc/there_can_be_only_one_mask(var/mob/spirit/mask/target)
- if(!istype(target))
- return
- for(var/mob/spirit/mask/currentSpirit in spirits)
- if(currentSpirit)
- if(currentSpirit!=target)
- // create the ghost
- var/mob/dead/observer/ghost = currentSpirit.ghostize(TRUE)
- // let the deposed mask respawn immediately, the poor dear
- ghost.timeofdeath = world.time - 20000
- ghost.newPlayerType = /mob/new_player/cultist
- // remove old mask body
- del(currentSpirit)
-
-
-/mob/new_player/cultist/AttemptLateSpawn(rank)
- var/mob/newCharacter = ..(rank)
- if(ticker.mode)
- if(is_convertable_to_cult(newCharacter.mind))
- ticker.mode.add_cultist(newCharacter.mind)
\ No newline at end of file
diff --git a/code/modules/mob/spirit/movement.dm b/code/modules/mob/spirit/movement.dm
deleted file mode 100644
index d8847cb480a..00000000000
--- a/code/modules/mob/spirit/movement.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-// spirits are not moved by airflow
-mob/spirit/Move()
- return 0
-
-// this is the main move proc for spirits, it uses their 'setLoc' function to handle all the visibility shenanigans
-// this, like most movement code for these guys, is cribbed from the AIEye movement code
-mob/spirit/proc/Spirit_Move(direct)
-
- var/initial = initial(sprint)
- var/max_sprint = 50
-
- // if we haven't moved in a while, we stop sprinting
- if(cooldown && cooldown < world.timeofday) // 3 seconds
- sprint = initial
-
- for(var/i = 0; i < max(sprint, initial); i += 20)
- var/turf/step = get_turf(get_step(src, direct))
- if(step)
- setLoc(step)
-
- dir = direct // update our sprite
-
- cooldown = world.timeofday + 5
- if(acceleration)
- sprint = min(sprint + 0.5, max_sprint)
- else
- sprint = initial
-
- // if we're trying to move, we want to stop following our target
- follow_target = null
-
-
-/mob/spirit/proc/follow_cultist(mob/living/target as mob)
- if(!istype(target)) return
- var/obj/cult_viewpoint/currentView = getCultViewpoint(target)
- var/mob/spirit/U = usr
-
- if (!currentView)
- U << "As a spirit, you may only track cultists."
-
- U.follow_target = target
- U << "Now following [currentView.get_cult_name()]."
-
- spawn (0)
- while (U.follow_target == target)
- if (U.follow_target == null)
- return
- U.setLoc(get_turf(target))
- sleep(10)
-
-
-mob/spirit/proc/setLoc(var/T)
- T = get_turf(T)
- loc = T
- cultNetwork.visibility(src)
-
-mob/spirit/verb/toggle_acceleration()
- set category = "Spirit"
- set name = "Toggle Acceleration"
-
- acceleration = !acceleration
- usr << "Acceleration has been toggled [acceleration ? "on" : "off"]."
\ No newline at end of file
diff --git a/code/modules/mob/spirit/spirit.dm b/code/modules/mob/spirit/spirit.dm
deleted file mode 100644
index ce7080b744c..00000000000
--- a/code/modules/mob/spirit/spirit.dm
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
-This mob type is used for entities that exist within the Cult's spirit world. They share the same visibility network and are intangible.
-*/
-
-mob/spirit
- name = "spirit"
- desc = "A spirit"
- icon = 'icons/mob/mob.dmi'
- icon_state = "ghost"
- layer = 4
- stat = CONSCIOUS
- status_flags = GODMODE // spirits cannot be killed
- density = 0
- canmove = 0
- blinded = 0
- anchored = 1
- mouse_opacity = 0
- invisibility = INVISIBILITY_SPIRIT
- universal_speak = 1
-
- // pseudo-movement values
- var/sprint = 10
- var/cooldown = 0
- var/acceleration = 1
- var/follow_target = null
-
-
-mob/spirit/is_active()
- if (client && client.inactivity <= 10 * 60 * 10)
- return TRUE
- return FALSE
-
-
-mob/spirit/New()
- sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
- see_invisible = SEE_SPIRITS
- see_in_dark = 100
-
- loc = pick(latejoin)
-
- // hook them to the cult visibility network
- visibility_interface = new /datum/visibility_interface/cult(src)
-
- // no nameless spirits
- if (!name)
- name = "Boogyman"
-
- spirits+=src
-
- ..()
-
-mob/spirit/Del()
- spirits-=src
- ..()
-
-
-mob/spirit/Topic(href, href_list)
-
- if(usr != src)
- return
- ..()
-
- usr << "Spirit Href = [href]"
- for (var/tempref in href_list)
- usr << "Spirit href list [tempref] = [href_list[tempref]]"
-
- if (href_list["track"])
- usr << "Got to tracking."
- var/mob/target = locate(href_list["track"]) in mob_list
- var/mob/spirit/A = locate(href_list["track2"]) in spirits
- if(A && target)
- A.follow_cultist(target)
- return
\ No newline at end of file
diff --git a/code/modules/mob/spirit/viewpoint.dm b/code/modules/mob/spirit/viewpoint.dm
deleted file mode 100644
index 5e063561297..00000000000
--- a/code/modules/mob/spirit/viewpoint.dm
+++ /dev/null
@@ -1,202 +0,0 @@
-#define FAVOR_PLEASED 1
-#define FAVOR_INDIFFERENT 0
-#define FAVOR_DISPLEASED -1
-
-
-var/obj/cult_viewpoint/list/cult_viewpoints = list()
-
-
-/obj/cult_viewpoint
- var/view_range = 7
- var/updating = 0
- var/mob/owner = null
- var/urge = ""
- var/favor = FAVOR_INDIFFERENT
- var/cult_name = null
-
-
-/obj/cult_viewpoint/New(var/mob/target)
- owner = target
- //src.loc = owner
- owner.addToVisibilityNetwork(cultNetwork)
- cultNetwork.viewpoints+=src
- cultNetwork.addViewpoint(src)
- cult_viewpoints+=src
- //handle_missing_mask()
- ..()
-
-
-/obj/cult_viewpoint/Del()
- processing_objects.Remove(src)
- cultNetwork.viewpoints-=src
- cultNetwork.removeViewpoint(src)
- cult_viewpoints-=src
- owner.removeFromVisibilityNetwork(cultNetwork)
- ..()
- return
-
-
-// VERBS
-/obj/cult_viewpoint/verb/check_urge()
- set category = "Cult"
- set desc = "Discover what your god commands of you."
- set name = "Check Urge"
- set src in usr
- if (src.urge)
- owner << "\red \b You feel the urge to [src.urge]"
- else
- owner << "\b You feel no supernatural compulsions."
-
-
-/obj/cult_viewpoint/verb/reach_out()
- set category = "Cult"
- set desc = "Reach out for your gods presence."
- set name = "Reach Out"
- set src in usr
-
- for(var/mob/spirit/mask/currentMask in spirits)
- if (currentMask.is_active())
- owner << "\red \b You feel the reassuring presence of your god."
- currentMask << "[get_display_name()] has reached out to you."
- return
- owner << "\b You feel a chilling absence."
- handle_missing_mask()
-
-
-/obj/cult_viewpoint/verb/check_favor()
- set category = "Cult"
- set desc = "Check your favor with your god."
- set name = "Check Favor"
- set src in usr
- switch(favor)
- if(FAVOR_PLEASED)
- owner << "\red \b You bask in your gods favor."
- if(FAVOR_INDIFFERENT)
- owner << "\red \b You feel nothing."
- if(FAVOR_DISPLEASED)
- owner << "\red \b You cringe at your gods displeasure."
-
-
-/obj/cult_viewpoint/verb/pray_to_mask()
- set category = "Cult"
- set desc = "Pray to your god"
- set name = "Pray to Nar'Sie"
- set src in usr
-
- var/input = stripped_input(usr, "Please choose a message to say to your god.", "Pray to Nar'Sie", "")
- if(!input)
- return
-
- cult_log("[key_name(usr,0)](Pray):[input]")
- owner << "You pray to Nar'Sie: [input]"
-
- for(var/mob/spirit/spirit in spirits)
- spirit << "[get_display_name()] prays : [input]"
-
-// PROCS
-/obj/cult_viewpoint/proc/set_favor(var/newFavor)
- favor = newFavor
- check_favor()
-
-
-/obj/cult_viewpoint/proc/set_urge(var/newUrge)
- if (!newUrge)
- src.urge = null
- src.urge = copytext(newUrge, 1, MAX_MESSAGE_LEN)
- check_urge()
-
-
-/obj/cult_viewpoint/proc/can_use()
- if (owner.stat != DEAD)
- return TRUE
- return FALSE
-
-
-/obj/cult_viewpoint/proc/can_see()
- return hear(view_range, get_turf(owner))
-
-
-/obj/cult_viewpoint/proc/get_cult_name()
- if (cult_name)
- return cult_name
- return "An Unknown Servent"
-
-
-/obj/cult_viewpoint/proc/set_cult_name(var/newName)
- if (!owner)
- return FALSE
- if (newName)
- cult_name = newName
- owner << "\red \b You have been blessed with the secret name of '[newName]'."
- else
- cult_name = null
- owner << "\red \b Your god has taken your secret name."
-
-
-/obj/cult_viewpoint/proc/get_display_name()
- if (!owner)
- return
- if (cult_name)
- return cult_name
- return owner.name
-
-
-/obj/cult_viewpoint/proc/become_mask()
- set category = "Cult"
- set name = "Become Mask"
- set desc = "Sacrifice your life and become a Mask of Nar'sie."
- set src in usr
-
- cult_log("[key_name(usr,0)] has tried to become a Mask of Nar'sie.")
-
- if (!active_mask())
- var/transformation_type = alert(owner.client, "You are about to become a Mask. Do you want it to be subtle or violent?", "Mask", "Subtle", "Violent")
- if(!active_mask())
- cult_log("[key_name(usr,0)] has become a Mask of Nar'sie.")
- if (transformation_type=="Subtle")
- log_admin("[key_name_admin(owner)] has subtly become a Mask of Nar'sie")
- owner.make_into_mask(0,0)
- else
- log_admin("[key_name_admin(owner)] has violently become a Mask of Nar'sie")
- owner.make_into_mask(1,1)
- else
- owner << "\b You cannot become a mask of Nar'Sie because a Mask already exists."
- mask_has_been_found()
- return
-
-
-/obj/cult_viewpoint/proc/active_mask()
- for(var/mob/spirit/mask/currentMask in spirits)
- if (currentMask.is_active())
- return TRUE
- return FALSE
-
-
-/obj/cult_viewpoint/proc/handle_missing_mask()
- if (active_mask())
- mask_has_been_found()
- else
- mask_is_missing()
-
-
-/obj/cult_viewpoint/proc/mask_has_been_found()
- for(var/obj/cult_viewpoint/viewpoint in cult_viewpoints)
- if (viewpoint.verbs.Find(/obj/cult_viewpoint/proc/become_mask))
- viewpoint.verbs-=/obj/cult_viewpoint/proc/become_mask
-
-
-/obj/cult_viewpoint/proc/mask_is_missing()
- for(var/obj/cult_viewpoint/viewpoint in cult_viewpoints)
- if (!viewpoint.verbs.Find(/obj/cult_viewpoint/proc/become_mask))
- viewpoint.verbs+=/obj/cult_viewpoint/proc/become_mask
-
-
-/proc/getCultViewpoint(var/mob/currentMob)
- for(var/obj/cult_viewpoint/currentView in currentMob)
- return currentView
- return FALSE
-
-
-#undef FAVOR_PLEASED
-#undef FAVOR_INDIFFERENT
-#undef FAVOR_DISPLEASED
\ No newline at end of file
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index d9f0a403b34..6efec2f7ec1 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -134,59 +134,7 @@
. = O
del(src)
-
-/mob/living/carbon/human/make_into_mask(var/should_gib = 0)
- for(var/t in organs)
- del(t)
- return ..(should_gib)
-
-/mob/proc/make_into_mask(var/should_gib = 0, var/should_remove_items = 0)
-
- if(!should_gib)
- icon = null
- invisibility = 101
-
- if(!should_remove_items)
- for(var/obj/item/W in src)
- drop_from_inventory(W)
-
- var/mob/spirit/mask/new_spirit = new()
-
- if(mind)
- new_spirit.mind = mind
- new_spirit.mind.assigned_role = "Mask"
- new_spirit.mind.original = new_spirit
-
- new_spirit.key = key
- new_spirit.loc=loc
-
- if (should_gib)
- spawn(0)
- src.gib() // gib the body
- else
- spawn(0)//To prevent the proc from returning null.
- src.visible_message( \
- "[src] disappears into the shadows, never to be seen again.", \
- "You disappear into the shadows, never to be seen again.", \
- "You hear strange noise, you can't quite place it.")
- del(src)
-
- new_spirit << "You are a Mask of Nar'sie now. You are a tiny fragment of the unknowable entity that is the god."
- new_spirit << "Your job is to help your acolytes complete their goals. Be spooky. Do evil."
-
- new_spirit.set_name()
-
- // let spirits identify cultists
- if(ticker.mode)
- ticker.mode.reset_cult_icons_for_spirit(new_spirit)
-
- // highlander test
- there_can_be_only_one_mask(new_spirit)
-
- return new_spirit
-
-
//human -> robot
/mob/living/carbon/human/proc/Robotize()
if (monkeyizing)
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index aeb6851145e..1dd51443fb4 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -121,7 +121,7 @@
P.info += "[S.fields["com_[counter]"]] "
counter++
P.info += ""
- P.name = "paper - '[G.fields["name"]]'"
+ P.name = "Security Record ([G.fields["name"]])"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
..()
@@ -157,7 +157,7 @@
P.info += "[M.fields["com_[counter]"]] "
counter++
P.info += ""
- P.name = "paper - '[G.fields["name"]]'"
+ P.name = "Medical Record ([G.fields["name"]])"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
..()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 3564b928a34..29099da9fb5 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -329,25 +329,45 @@
clown = 1
if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo))
+ if (istype(P, /obj/item/weapon/paper/carbon))
+ var/obj/item/weapon/paper/carbon/C = P
+ if (!C.iscopy && !C.copied)
+ user << "Take off the carbon copy first."
+ add_fingerprint(user)
+ return
var/obj/item/weapon/paper_bundle/B = new(src.loc)
if (name != "paper")
B.name = name
else if (P.name != "paper" && P.name != "photo")
B.name = P.name
user.drop_from_inventory(P)
- if (user.r_hand == src)
- user.drop_from_inventory(src)
- B.loc = user
- user.r_hand = B
- B.layer = 20
- else if (user.l_hand == src)
- user.drop_from_inventory(src)
- B.loc = user
- user.l_hand = B
- B.layer = 20
- if(istype(user,/mob/living/carbon/human))
- user:update_inv_l_hand()
- user:update_inv_r_hand()
+ if (istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/h_user = user
+ if (h_user.r_hand == src)
+ h_user.drop_from_inventory(src)
+ h_user.put_in_r_hand(B)
+ else if (h_user.l_hand == src)
+ h_user.drop_from_inventory(src)
+ h_user.put_in_l_hand(B)
+ else if (h_user.l_store == src)
+ h_user.drop_from_inventory(src)
+ B.loc = h_user
+ B.layer = 20
+ h_user.l_store = B
+ h_user.update_inv_pockets()
+ else if (h_user.r_store == src)
+ h_user.drop_from_inventory(src)
+ B.loc = h_user
+ B.layer = 20
+ h_user.r_store = B
+ h_user.update_inv_pockets()
+ else if (h_user.head == src)
+ h_user.u_equip(src)
+ h_user.put_in_hands(B)
+ else if (!istype(src.loc, /turf))
+ src.loc = get_turf(h_user)
+ if(h_user.client) h_user.client.screen -= src
+ h_user.put_in_hands(B)
user << "You clip the [P.name] to [(src.name == "paper") ? "the paper" : src.name]."
src.loc = B
P.loc = B
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index 8ede4c9ed1b..da9a3e150ef 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -21,6 +21,13 @@
var/obj/item/weapon/paper/P
if(istype(W, /obj/item/weapon/paper))
P = W
+ if (istype(P, /obj/item/weapon/paper/carbon))
+ var/obj/item/weapon/paper/carbon/C = P
+ if (!C.iscopy && !C.copied)
+ user << "Take off the carbon copy first."
+ add_fingerprint(user)
+ return
+
amount++
if(screen == 2)
screen = 1
@@ -37,9 +44,18 @@
user << "You add [(W.name == "photo") ? "the photo" : W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
user.drop_from_inventory(W)
W.loc = src
- if(istype(user,/mob/living/carbon/human))
- user:update_inv_l_hand()
- user:update_inv_r_hand()
+ else if(istype(W, /obj/item/weapon/lighter))
+ burnpaper(W, user)
+ else if(istype(W, /obj/item/weapon/paper_bundle))
+ user.drop_from_inventory(W)
+ for(var/obj/O in W)
+ O.loc = src
+ O.add_fingerprint(usr)
+ src.amount++
+ if(screen == 2)
+ screen = 1
+ user << "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
+ del(W)
else
if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/toy/crayon))
usr << browse("", "window=[name]") //Closes the dialog
@@ -50,6 +66,31 @@
return
+/obj/item/weapon/paper_bundle/proc/burnpaper(obj/item/weapon/lighter/P, mob/user)
+ var/class = ""
+
+ if(P.lit && !user.restrained())
+ if(istype(P, /obj/item/weapon/lighter/zippo))
+ class = ""
+
+ user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like \he's trying to burn it!", \
+ "[class]You hold \the [P] up to \the [src], burning it slowly.")
+
+ spawn(20)
+ if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit)
+ user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \
+ "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.")
+
+ if(user.get_inactive_hand() == src)
+ user.drop_from_inventory(src)
+
+ new /obj/effect/decal/cleanable/ash(src.loc)
+ del(src)
+
+ else
+ user << "\red You must hold \the [P] steady to burn \the [src]."
+
+
/obj/item/weapon/paper_bundle/examine()
set src in oview(1)
@@ -103,7 +144,7 @@
/obj/item/weapon/paper_bundle/Topic(href, href_list)
..()
- if((src in usr.contents) || (src.loc in usr.contents))
+ if((src in usr.contents) || (istype(src.loc, /obj/item/weapon/folder) && (src.loc in usr.contents)))
usr.set_machine(src)
if(href_list["next_page"])
if(page == amount)
@@ -125,44 +166,18 @@
playsound(src.loc, "pageturn", 50, 1)
if(href_list["remove"])
var/obj/item/weapon/W = src[page]
- W.loc = usr.loc
- if(istype(usr,/mob/living/carbon))
- //Place the item in the user's hand if possible
- if(!usr.r_hand)
- W.loc = usr
- usr.r_hand = W
- W.layer = 20
- else if(!usr.l_hand)
- W.loc = usr
- usr.l_hand = W
- W.layer = 20
+ usr.put_in_hands(W)
usr << "You remove the [W.name] from the bundle."
-
if(amount == 1)
var/obj/item/weapon/paper/P = src[1]
- P.loc = usr.loc
- if (usr.r_hand == src)
- usr.drop_from_inventory(src)
- P.loc = usr
- usr.r_hand = P
- P.layer = 20
- else if (usr.l_hand == src)
- usr.drop_from_inventory(src)
- P.loc = usr
- usr.l_hand = P
- P.layer = 20
- if(istype(usr,/mob/living/carbon/human))
- usr:update_inv_l_hand()
- usr:update_inv_r_hand()
+ usr.drop_from_inventory(src)
+ usr.put_in_hands(P)
del(src)
else if(page == amount)
screen = 2
else if(page == amount+1)
page--
- if(istype(usr,/mob/living/carbon/human))
- usr:update_inv_l_hand()
- usr:update_inv_r_hand()
amount--
update_icon()
else
@@ -193,10 +208,9 @@
usr << "You loosen the bundle."
for(var/obj/O in src)
O.loc = usr.loc
+ O.layer = initial(O.layer)
+ O.add_fingerprint(usr)
usr.drop_from_inventory(src)
- if(istype(usr,/mob/living/carbon/human))
- usr:update_inv_l_hand()
- usr:update_inv_r_hand()
del(src)
return
@@ -220,7 +234,6 @@
i++
else if(istype(O, /obj/item/weapon/photo))
var/obj/item/weapon/photo/Ph = O
-// img.icon_state = "photo"
img = Ph.tiny
photo = 1
overlays += img
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 1b02d2d7eb1..2321d7587d1 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -223,14 +223,18 @@
var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (src.loc)
var/icon/I = icon(photocopy.icon, photocopy.icon_state)
var/icon/img = icon(photocopy.img)
+ var/icon/tiny = icon(photocopy.tiny)
if(toner > 10) //plenty of toner, go straight greyscale
I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) //I'm not sure how expensive this is, but given the many limitations of photocopying, it shouldn't be an issue.
img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
+ tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
else //not much toner left, lighten the photo
I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
+ tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
p.icon = I
p.img = img
+ p.tiny = tiny
p.name = photocopy.name
p.desc = photocopy.desc
p.scribble = photocopy.scribble
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 00d5dc2b958..3656d550907 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -68,7 +68,7 @@
var/n_name = copytext(sanitize(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text), 1, MAX_NAME_LEN)
//loc.loc check is for making possible renaming photos in clipboards
if(( (loc == usr || (loc.loc && loc.loc == usr)) && usr.stat == 0))
- name = "photo[(n_name ? text("- '[n_name]'") : null)]"
+ name = "[(n_name ? text("[n_name]") : "photo")]"
add_fingerprint(usr)
return
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 93d196942f6..0c143c28a42 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -640,39 +640,19 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
return ..()
- if(S.burn_dam > 0 && use(1))
- S.heal_damage(0,15,0,1)
-
- if(user != M)
- user.visible_message("\The [user] repairs some burn damage on [M]'s [S.display_name] with \the [src]",\
- "\The [user] repairs some burn damage on your [S.display_name]",\
- "You hear wires being cut.")
- else
- user.visible_message("\The [user] repairs some burn damage on their [S.display_name] with \the [src]",\
- "You repair some burn damage on your [S.display_name]",\
- "You hear wires being cut.")
-
- return
-
if(istype(M,/mob/living/carbon/human))
-
var/mob/living/carbon/human/H = M
-
if(H.species.flags & IS_SYNTHETIC)
-
- if(H.getFireLoss() > 0)
-
- if(M == user)
- user << "\red You can't repair damage to your own body - it's against OH&S."
- return
-
- user.visible_message("\The [user] repairs some burn damage on [M] with \the [src]",\
- "You repair some of \the [M]'s burn damage.",\
- "You hear wires being cut.")
- H.heal_overall_damage(0,5)
+ if(M == user)
+ user << "\red You can't repair damage to your own body - it's against OH&S."
return
- user << "Nothing to fix!"
+ if(S.burn_dam > 0 && use(1))
+ S.heal_damage(0,15,0,1)
+ user.visible_message("\red \The [user] repairs some burn damage on \the [M]'s [S.display_name] with \the [src].")
+ return
+ else
+ user << "Nothing to fix!"
else
return ..()
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 82e05e954be..03afd0723f3 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -31,6 +31,7 @@
desc = "A computer to remotely control a gas turbine"
icon = 'icons/obj/computer.dmi'
icon_state = "airtunnel0e"
+ circuit = /obj/item/weapon/circuitboard/turbine_control
anchored = 1
density = 1
var/obj/machinery/compressor/compressor
@@ -220,6 +221,7 @@
if(P.id == id)
doors += P
+/*
/obj/machinery/computer/turbine_computer/attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
@@ -252,6 +254,7 @@
else
src.attack_hand(user)
return
+*/
/obj/machinery/computer/turbine_computer/attack_hand(var/mob/user as mob)
user.machine = src
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 27b98eddf31..87fb193bed1 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -599,8 +599,9 @@
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0"
- use_power = 1
- idle_power_usage = 20
+ circuit = /obj/item/weapon/circuitboard/pandemic
+ //use_power = 1
+ //idle_power_usage = 20 //defaults make more sense.
var/temphtml = ""
var/wait = null
var/obj/item/weapon/reagent_containers/glass/beaker = null
@@ -829,33 +830,7 @@
/obj/machinery/computer/pandemic/attackby(var/obj/I as obj, var/mob/user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe(src.loc)
- new /obj/item/weapon/shard(src.loc)
- var/obj/item/weapon/circuitboard/pandemic/M = new /obj/item/weapon/circuitboard/pandemic(A)
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/pandemic/M = new /obj/item/weapon/circuitboard/pandemic(A)
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
- else if(istype(I, /obj/item/weapon/reagent_containers/glass))
+ if(istype(I, /obj/item/weapon/reagent_containers/glass))
if(stat & (NOPOWER|BROKEN)) return
if(src.beaker)
user << "A beaker is already loaded into the machine."
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 47e2ca5a7b7..741a5493d95 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -118,11 +118,14 @@
name = "space cleaner"
desc = "BLAM!-brand non-foaming space cleaner!"
+/obj/item/weapon/reagent_containers/spray/cleaner/drone
+ name = "space cleaner"
+ desc = "BLAM!-brand non-foaming space cleaner!"
+ volume = 50
/obj/item/weapon/reagent_containers/spray/cleaner/New()
..()
- reagents.add_reagent("cleaner", 250)
-
+ reagents.add_reagent("cleaner", src.volume)
//pepperspray
/obj/item/weapon/reagent_containers/spray/pepper
name = "pepperspray"
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index f98ce8279e3..e72c971891b 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -34,6 +34,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
/obj/machinery/computer/rdconsole
name = "R&D Console"
icon_state = "rdcomp"
+ circuit = /obj/item/weapon/circuitboard/rdconsole
var/datum/research/files //Stores all the collected research data.
var/obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk.
var/obj/item/weapon/disk/design_disk/d_disk = null //Stores the design disk.
@@ -46,7 +47,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/id = 0 //ID of the computer (for server restrictions).
var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console
- req_access = list(access_tox) //Data and setting manipulation requires scientist access.
+ req_access = list(access_research) //Data and setting manipulation requires scientist access.
/obj/machinery/computer/rdconsole/proc/CallTechName(var/ID) //A simple helper proc to find the name of a tech with a given ID.
@@ -141,35 +142,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
*/
/obj/machinery/computer/rdconsole/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
- //The construction/deconstruction of the console code.
- if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/rdconsole/M = new /obj/item/weapon/circuitboard/rdconsole( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/rdconsole/M = new /obj/item/weapon/circuitboard/rdconsole( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
//Loading a disk into it.
- else if(istype(D, /obj/item/weapon/disk))
+ if(istype(D, /obj/item/weapon/disk))
if(t_disk || d_disk)
user << "A disk is already loaded into the machine."
return
@@ -186,6 +160,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
user << "\blue You you disable the security protocols"
+ else
+ //The construction/deconstruction of the console code.
+ ..()
+
src.updateUsrDialog()
return
diff --git a/code/modules/research/research_shuttle.dm b/code/modules/research/research_shuttle.dm
index 91c1464d36b..b0119b42aad 100644
--- a/code/modules/research/research_shuttle.dm
+++ b/code/modules/research/research_shuttle.dm
@@ -104,24 +104,5 @@ proc/move_research_shuttle()
hacked = 1
usr << "You fried the consoles ID checking system. It's now available to everyone!"
- else if(istype(W, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/research_shuttle/M = new /obj/item/weapon/circuitboard/research_shuttle( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.anchored = 1
-
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- new /obj/item/weapon/shard( src.loc )
- A.state = 3
- A.icon_state = "3"
- else
- user << "\blue You disconnect the monitor."
- A.state = 4
- A.icon_state = "4"
-
- del(src)
+ else
+ ..()
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index ac9166602f1..a22d6e03995 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -193,6 +193,7 @@
/obj/machinery/computer/rdservercontrol
name = "R&D Server Controller"
icon_state = "rdcomp"
+ circuit = /obj/item/weapon/circuitboard/rdservercontrol
var/screen = 0
var/obj/machinery/r_n_d/server/temp_server
var/list/servers = list()
@@ -332,38 +333,12 @@
return
/obj/machinery/computer/rdservercontrol/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
- if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/rdservercontrol/M = new /obj/item/weapon/circuitboard/rdservercontrol( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/rdservercontrol/M = new /obj/item/weapon/circuitboard/rdservercontrol( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
- else if(istype(D, /obj/item/weapon/card/emag) && !emagged)
+ if(istype(D, /obj/item/weapon/card/emag) && !emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
user << "\blue You you disable the security protocols"
src.updateUsrDialog()
- return
+ return ..()
/obj/machinery/r_n_d/server/robotics
diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm
index 4d616048d18..44a0fd348b9 100644
--- a/code/modules/virus2/curer.dm
+++ b/code/modules/virus2/curer.dm
@@ -2,20 +2,20 @@
name = "Cure Research Machine"
icon = 'icons/obj/computer.dmi'
icon_state = "dna"
+ circuit = /obj/item/weapon/circuitboard/curefab
var/curing
var/virusing
var/obj/item/weapon/reagent_containers/container = null
/obj/machinery/computer/curer/attackby(var/obj/I as obj, var/mob/user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
- return ..(I,user)
if(istype(I,/obj/item/weapon/reagent_containers))
var/mob/living/carbon/C = user
if(!container)
container = I
C.drop_item()
I.loc = src
+ return
if(istype(I,/obj/item/weapon/virusdish))
if(virusing)
user << "The pathogen materializer is still recharging.."
@@ -31,8 +31,8 @@
state("The [src.name] Buzzes", "blue")
return
- src.attack_hand(user)
- return
+ ..()
+ return
/obj/machinery/computer/curer/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
diff --git a/code/setup.dm b/code/setup.dm
index 6d0be632adc..e31ff23bdbf 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -533,9 +533,6 @@ var/list/liftable_structures = list(\
#define SEE_INVISIBLE_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
#define INVISIBILITY_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized.
-#define INVISIBILITY_SPIRIT 50
-#define SEE_SPIRITS 50
-
#define INVISIBILITY_OBSERVER 60
#define SEE_INVISIBLE_OBSERVER 60
diff --git a/code/unused/computer2/peripherals.dm b/code/unused/computer2/peripherals.dm
index 9e19cb9d236..1e6ff79e8b9 100644
--- a/code/unused/computer2/peripherals.dm
+++ b/code/unused/computer2/peripherals.dm
@@ -110,7 +110,7 @@
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.host.loc )
P.info = print_data
if(print_title)
- P.name = "paper - '[print_title]'"
+ P.name = "[print_title]"
src.printing = 0
return
diff --git a/html/changelog.html b/html/changelog.html
index d125f7ddc13..1155221cdfe 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -54,7 +54,7 @@ should be listed in the changelog upon commit though. Thanks. -->
-
+
31 May 2014
@@ -69,44 +69,44 @@ should be listed in the changelog upon commit though. Thanks. -->
-
-
23 Mai 2014
-
Hubble updated:
-
-
Personal lockers are now resettable
-
Take off people's accessories or change their sensors in the drag and drop-interface
-
Merge paper bundles by hitting one with another
-
Line breaks in Security, Medical and Employment Records
-
Record printouts will have names on it
-
Set other people's internals in belt and suit storage slots
-
No longer changing suit sensors while cuffed
-
No longer emptying other people's pockets when they are not full yet
-
-
-
-
-
-
6 Mai 2014
-
Hubble updated:
-
-
Clip papers together by hitting a paper with a paper or photo
-
Adds icons for copied stamps
-
-
-
-
-
-
-
-
28 мая 2014
-
Chinsky updated:
-
-
Adds few new paperBBcode tags, to make up for HTML removal.
-
[logo] tag draws NT logo image (one from wiki).
-
[table] [/table] tags mark borders of tables. [grid] [/grid] are borderless tables, useful of making layouts. Inside tables following tags are used: [row] marks beginning of new table row, [cell] - beginning of new table cell.
-
-
-
+
+
23 Mai 2014
+
Hubble updated:
+
+
Personal lockers are now resettable
+
Take off people's accessories or change their sensors in the drag and drop-interface
+
Merge paper bundles by hitting one with another
+
Line breaks in Security, Medical and Employment Records
+
Record printouts will have names on it
+
Set other people's internals in belt and suit storage slots
+
No longer changing suit sensors while cuffed
+
No longer emptying other people's pockets when they are not full yet
+
+
+
+
+
+
6 Mai 2014
+
Hubble updated:
+
+
Clip papers together by hitting a paper with a paper or photo
+
Adds icons for copied stamps
+
+
+
+
+
+
+
+
28 мая 2014
+
Chinsky updated:
+
+
Adds few new paperBBcode tags, to make up for HTML removal.
+
[logo] tag draws NT logo image (one from wiki).
+
[table] [/table] tags mark borders of tables. [grid] [/grid] are borderless tables, useful of making layouts. Inside tables following tags are used: [row] marks beginning of new table row, [cell] - beginning of new table cell.
+
+
+
25 April 2014
Various updated:
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
index f47c2e673ea..0e2f6ea246e 100644
Binary files a/icons/mob/custom-synthetic.dmi and b/icons/mob/custom-synthetic.dmi differ
diff --git a/icons/mob/spirits/mask.dmi b/icons/mob/spirits/mask.dmi
deleted file mode 100644
index 20fe26c4bce..00000000000
Binary files a/icons/mob/spirits/mask.dmi and /dev/null differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 3c6d52748c6..b4426508926 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index f23f5f9eb56..56703f88449 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm
index 593554e8b7c..d5765ed8c20 100644
--- a/maps/tgstation2.dmm
+++ b/maps/tgstation2.dmm
@@ -122,7 +122,7 @@
"acr" = (/obj/machinery/camera{c_tag = "Firing Range"; dir = 8; network = list("SS13")},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/range)
"acs" = (/obj/machinery/shower{icon_state = "shower"; dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/main)
"act" = (/obj/structure/window/basic{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/main)
-"acu" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/stack/medical/bruise_pack{pixel_x = 10; pixel_y = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig)
+"acu" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/plating,/area)
"acv" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/sink{pixel_y = 22},/turf/simulated/floor{icon_state = "bar"},/area/security/main)
"acw" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/sink{pixel_y = 22},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "bar"},/area/security/main)
"acx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/security/prison)
@@ -144,7 +144,7 @@
"acN" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/security/range)
"acO" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/paper{info = "Directions: First you'll want to make sure there is a target stake in the center of the magnetic platform. Next, take an aluminum target from the crates back there and slip it into the stake. Make sure it clicks! Next, there should be a control console mounted on the wall somewhere in the room.
This control console dictates the behaviors of the magnetic platform, which can move your firing target around to simulate real-world combat situations. From here, you can turn off the magnets or adjust their electromagnetic levels and magnetic fields. The electricity level dictates the strength of the pull - you will usually want this to be the same value as the speed. The magnetic field level dictates how far the magnetic pull reaches.
Speed and path are the next two settings. Speed is associated with how fast the machine loops through the designated path. Paths dictate where the magnetic field will be centered at what times. There should be a pre-fabricated path input already. You can enable moving to observe how the path affects the way the stake moves. To script your own path, look at the following key: