diff --git a/baystation12.dme b/baystation12.dme
index 30a0fcf2b11..2218c3fa7cd 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -124,6 +124,7 @@
#define FILE_DIR "code/modules/mob/new_player"
#define FILE_DIR "code/modules/mob/organ"
#define FILE_DIR "code/modules/mob/simple_animal"
+#define FILE_DIR "code/modules/paperwork"
#define FILE_DIR "code/modules/power"
#define FILE_DIR "code/modules/power/antimatter"
#define FILE_DIR "code/modules/power/singularity"
@@ -196,16 +197,16 @@
#define FILE_DIR "interface"
#define FILE_DIR "maps"
#define FILE_DIR "sound"
+#define FILE_DIR "sound/AI"
#define FILE_DIR "sound/ambience"
#define FILE_DIR "sound/announcer"
-#define FILE_DIR "sound/bots"
#define FILE_DIR "sound/effects"
+#define FILE_DIR "sound/hallucinations"
#define FILE_DIR "sound/items"
#define FILE_DIR "sound/machines"
#define FILE_DIR "sound/mecha"
#define FILE_DIR "sound/misc"
#define FILE_DIR "sound/piano"
-#define FILE_DIR "sound/scary"
#define FILE_DIR "sound/voice"
#define FILE_DIR "sound/weapons"
// END_FILE_DIR
@@ -382,7 +383,6 @@
#include "code\game\throwing.dm"
#include "code\game\topic.dm"
#include "code\game\turf.dm"
-#include "code\game\vials.dm"
#include "code\game\vote.dm"
#include "code\game\area\ai_monitored.dm"
#include "code\game\area\areas.dm"
@@ -396,6 +396,7 @@
#include "code\game\events\EventProcs\ninja_abilities.dm"
#include "code\game\events\EventProcs\ninja_equipment.dm"
#include "code\game\events\EventProcs\space_ninja.dm"
+#include "code\game\events\EventProcs\spacevines.dm"
#include "code\game\events\Events\AlienInfestation.dm"
#include "code\game\events\Events\Appendicitis.dm"
#include "code\game\events\Events\ElectricalStorm.dm"
@@ -439,9 +440,11 @@
#include "code\game\gamemodes\sandbox\h_sandbox.dm"
#include "code\game\gamemodes\sandbox\sandbox.dm"
#include "code\game\gamemodes\traitor\traitor.dm"
+#include "code\game\gamemodes\wizard\rightandwrong.dm"
#include "code\game\gamemodes\wizard\soulstone.dm"
#include "code\game\gamemodes\wizard\spellbook.dm"
#include "code\game\gamemodes\wizard\spells.dm"
+#include "code\game\gamemodes\wizard\veilrender.dm"
#include "code\game\gamemodes\wizard\wizard.dm"
#include "code\game\jobs\access.dm"
#include "code\game\jobs\job_controller.dm"
@@ -526,6 +529,7 @@
#include "code\game\machinery\computer\atmos.dm"
#include "code\game\machinery\computer\buildandrepair.dm"
#include "code\game\machinery\computer\camera_monitor.dm"
+#include "code\game\machinery\computer\cloning.dm"
#include "code\game\machinery\computer\communications.dm"
#include "code\game\machinery\computer\computer.dm"
#include "code\game\machinery\computer\crew.dm"
@@ -768,6 +772,7 @@
#include "code\modules\admin\player_panel.dm"
#include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm"
+#include "code\modules\admin\verbs\adminpm.dm"
#include "code\modules\admin\verbs\adminsay.dm"
#include "code\modules\admin\verbs\atmosdebug.dm"
#include "code\modules\admin\verbs\BrokenInhands.dm"
@@ -783,6 +788,7 @@
#include "code\modules\admin\verbs\modifyvariables.dm"
#include "code\modules\admin\verbs\onlyone.dm"
#include "code\modules\admin\verbs\playsound.dm"
+#include "code\modules\admin\verbs\possess.dm"
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\striketeam.dm"
@@ -849,7 +855,6 @@
#include "code\modules\food\food.dm"
#include "code\modules\food\meat.dm"
#include "code\modules\food\recipes_microwave.dm"
-#include "code\modules\mining\datum_processing_recipe.dm"
#include "code\modules\mining\machine_input_output_plates.dm"
#include "code\modules\mining\machine_processing.dm"
#include "code\modules\mining\machine_stacking.dm"
@@ -1018,6 +1023,7 @@
#include "code\modules\power\sd_DynamicAreaLighting.dm"
#include "code\modules\power\smes.dm"
#include "code\modules\power\solar.dm"
+#include "code\modules\power\switch.dm"
#include "code\modules\power\terminal.dm"
#include "code\modules\power\tracker.dm"
#include "code\modules\power\turbine.dm"
diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm
index 230296a9f48..b755071487e 100644
--- a/code/ATMOSPHERICS/components/unary/unary_base.dm
+++ b/code/ATMOSPHERICS/components/unary/unary_base.dm
@@ -1,6 +1,7 @@
/obj/machinery/atmospherics/unary
dir = SOUTH
initialize_directions = SOUTH
+ layer = TURF_LAYER+0.1
var/datum/gas_mixture/air_contents
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 03a79934b0c..3388cfd9667 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -6,7 +6,6 @@
desc = "Has a valve and pump attached to it"
level = 1
- layer = TURF_LAYER
var/area_uid
var/id_tag = null
power_channel = ENVIRON
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index a55e38140b1..6c427baab38 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -6,7 +6,6 @@
desc = "Has a valve and pump attached to it"
level = 1
- layer = TURF_LAYER
var/id_tag = null
var/frequency = 1439
diff --git a/code/ATMOSPHERICS/mapdebugging.dm b/code/ATMOSPHERICS/mapdebugging.dm
new file mode 100644
index 00000000000..2dc39497136
--- /dev/null
+++ b/code/ATMOSPHERICS/mapdebugging.dm
@@ -0,0 +1,16 @@
+client/verb/discon_pipes()
+ set name = "Show Disconnected Pipes"
+ set category = "Debug"
+
+ for(var/obj/machinery/atmospherics/pipe/simple/P in world)
+ if(!P.node1 || !P.node2)
+ usr << "[P], [P.x], [P.y], [P.z], [P.loc.loc]"
+
+ for(var/obj/machinery/atmospherics/pipe/manifold/P in world)
+ if(!P.node1 || !P.node2 || !P.node3)
+ usr << "[P], [P.x], [P.y], [P.z], [P.loc.loc]"
+
+ for(var/obj/machinery/atmospherics/pipe/manifold4w/P in world)
+ if(!P.node1 || !P.node2 || !P.node3 || !P.node4)
+ usr << "[P], [P.x], [P.y], [P.z], [P.loc.loc]"
+//With thanks to mini. Check before use, uncheck after. Do Not Use on a live server.
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index da136715a58..71d9490160a 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -6,7 +6,7 @@ obj/machinery/atmospherics/pipe
var/volume = 0
var/force = 20
- layer = 2.4 //under wires with their 2.5
+ layer = 2.4 //under wires with their 2.44
var/alert_pressure = 80*ONE_ATMOSPHERE
//minimum pressure before check_pressure(...) should be called
@@ -605,6 +605,7 @@ obj/machinery/atmospherics/pipe
var/obj/machinery/atmospherics/node3
level = 1
+ layer = 2.4 //under wires with their 2.44
New()
switch(dir)
diff --git a/code/WorkInProgress/Ported/Bureaucracy/filing.dm b/code/WorkInProgress/Ported/Bureaucracy/filing.dm
index a742371e33e..47ffb29f3d9 100644
--- a/code/WorkInProgress/Ported/Bureaucracy/filing.dm
+++ b/code/WorkInProgress/Ported/Bureaucracy/filing.dm
@@ -1,8 +1,8 @@
/obj/structure/filingcabinet
name = "Filing Cabinet"
desc = "A large cabinet with drawers."
- icon = 'computer.dmi'
- icon_state = "messyfiles"
+ icon = 'bureaucracy.dmi'
+ icon_state = "filingcabinet"
density = 1
anchored = 1
diff --git a/code/WorkInProgress/SkyMarshal/wardrobes.dm b/code/WorkInProgress/SkyMarshal/wardrobes.dm
index 35879744025..8645d0dc62b 100755
--- a/code/WorkInProgress/SkyMarshal/wardrobes.dm
+++ b/code/WorkInProgress/SkyMarshal/wardrobes.dm
@@ -172,7 +172,7 @@
new /obj/item/weapon/storage/toolbox/mechanical(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/gloves/black(src)
- new /obj/item/device/radio/headset/headset_eng(src)
+ new /obj/item/device/radio/headset/headset_rob(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/under/rank/roboticist(src)
@@ -420,7 +420,7 @@
new /obj/item/weapon/storage/box(BPK)
new /obj/item/weapon/fcardholder(src)
new /obj/item/weapon/clipboard(src)
- new /obj/item/weapon/notebook(src)
+ new /obj/item/weapon/clipboard/notebook(src)
new /obj/item/device/detective_scanner(src)
new /obj/item/policetaperoll(src)
new /obj/item/weapon/storage/box/evidence(src)
diff --git a/code/datums/configuration.dm b/code/datums/configuration.dm
index d9974c18097..46b38c2f745 100644
--- a/code/datums/configuration.dm
+++ b/code/datums/configuration.dm
@@ -27,12 +27,13 @@
var/vote_period = 60 // length of voting period (seconds, default 1 minute)
var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi)
var/vote_no_dead = 0 // dead people can't vote (tbi)
- var/enable_authentication = 0 // goon authentication
+// var/enable_authentication = 0 // goon authentication
var/del_new_on_log = 1 // del's new players if they log before they spawn in
var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
- var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
+ var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
var/Tensioner_Active = 0 // If the tensioner is running.
+ var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
var/list/mode_names = list()
var/list/modes = list() // allowed modes
@@ -197,8 +198,8 @@
if ("allow_ai")
config.allow_ai = 1
- if ("authentication")
- config.enable_authentication = 1
+// if ("authentication")
+// config.enable_authentication = 1
if ("norespawn")
config.respawn = 0
@@ -287,6 +288,8 @@
if("forbid_singulo_possession")
forbid_singulo_possession = 1
+ if("popup_admin_pm")
+ config.popup_admin_pm = 1
if("useircbot")
useircbot = 1
diff --git a/code/datums/disease.dm b/code/datums/disease.dm
index f54da940f88..99dd086df79 100644
--- a/code/datums/disease.dm
+++ b/code/datums/disease.dm
@@ -112,7 +112,7 @@ to null does not delete the object itself. Thank you.
if(spread_type != AIRBORNE && spread_type != SPECIAL)
check_range = 0 // everything else, like infect-on-contact things, only infect things on top of it
- for(var/mob/living/carbon/M in oviewers(check_range, source))
+ for(var/mob/living/carbon/M in oview(check_range, source)) //I have no idea why oview works when oviewers doesn't. -Pete
M.contract_disease(src)
return
diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm
index 8ae893b26b0..10e2f92a234 100644
--- a/code/datums/helper_datums/events.dm
+++ b/code/datums/helper_datums/events.dm
@@ -10,13 +10,16 @@
..()
events = new
- proc/addEventType(event_type)
+ proc/addEventType(event_type as text)
if(!(event_type in events) || !islist(events[event_type]))
events[event_type] = list()
return 1
return
- proc/addEvent(event_type,proc_holder,proc_name)
+
+ // Arguments: event_type as text, proc_holder as datum, proc_name as text
+ // Returns: New event, null on error.
+ proc/addEvent(event_type as text, proc_holder, proc_name as text)
if(!event_type || !proc_holder || !proc_name)
return
addEventType(event_type)
@@ -25,6 +28,8 @@
event += E
return E
+ // Arguments: event_type as text, any number of additional arguments to pass to event handler
+ // Returns: null
proc/fireEvent()
//world << "Events in [args[1]] called"
var/list/event = listgetindex(events,args[1])
@@ -35,7 +40,9 @@
clearEvent(args[1],E)
return
- proc/clearEvent(event_type,datum/event/E)
+ // Arguments: event_type as text, E as /datum/event
+ // Returns: 1 if event cleared, null on error
+ proc/clearEvent(event_type as text, datum/event/E)
if(!event_type || !E)
return
var/list/event = listgetindex(events,event_type)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 5e46cf6e39e..32862eb6f06 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -86,7 +86,7 @@ datum/mind
else
text += "."
- text += " Reequip."
+ text += " Reequip (gives traitor uplink)."
if (objectives.len==0)
text += "
Objectives are empty! Set to kill all heads."
else if (src in ticker.mode.revolutionaries)
diff --git a/code/datums/spells/projectile.dm b/code/datums/spells/projectile.dm
index 31530d33808..b255e84523a 100644
--- a/code/datums/spells/projectile.dm
+++ b/code/datums/spells/projectile.dm
@@ -16,7 +16,7 @@
var/proj_lingering = 0 //if it lingers or disappears upon hitting an obstacle
var/proj_homing = 1 //if it follows the target
var/proj_insubstantial = 0 //if it can pass through dense objects or not
- var/proj_trigger_range = 1 //the range from target at which the projectile triggers cast(target)
+ var/proj_trigger_range = 0 //the range from target at which the projectile triggers cast(target)
var/proj_lifespan = 15 //in deciseconds * proj_step_delay
var/proj_step_delay = 1 //lower = faster
@@ -39,6 +39,8 @@
var/current_loc = usr.loc
+ projectile.loc = current_loc
+
for(var/i = 0,i < proj_lifespan,i++)
if(!projectile)
break
diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm
index 66821e3d33b..311be1b3ba9 100644
--- a/code/datums/spells/wizard.dm
+++ b/code/datums/spells/wizard.dm
@@ -3,7 +3,7 @@
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
school = "evocation"
- charge_max = 100
+ charge_max = 150
clothes_req = 1
invocation = "FORTI GY AMA"
invocation_type = "shout"
@@ -134,6 +134,7 @@
summon_type = list("/obj/effect/forcefield")
summon_lifespan = 300
+
/obj/effect/proc_holder/spell/aoe_turf/conjure/carp
name = "Summon Bigger Carp"
desc = "This spell conjures an elite carp."
@@ -147,6 +148,21 @@
summon_type = list("/obj/effect/critter/spesscarp/elite")
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/construct
+ name = "Artificer"
+ desc = "This spell conjures a construct which may be controlled by Shades"
+
+ school = "conjuration"
+ charge_max = 600
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+
+ summon_type = list("/obj/structure/constructshell")
+
+
/obj/effect/proc_holder/spell/aoe_turf/conjure/creature
name = "Summon Creature Swarm"
desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth"
@@ -211,4 +227,95 @@
ex_severe = -1
ex_heavy = -1
ex_light = 2
- ex_flash = 5
\ No newline at end of file
+ ex_flash = 5
+
+
+
+
+
+
+//////////////////////////////Construct Spells/////////////////////////
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser
+ charge_max = 1800
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/floor
+ name = "Floor Construction"
+ desc = "This spell constructs a cult floor"
+
+ school = "conjuration"
+ charge_max = 20
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+ summon_type = list("/turf/simulated/floor/engine/cult")
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/wall
+ name = "Leser Construction"
+ desc = "This spell constructs a cult wall"
+
+ school = "conjuration"
+ charge_max = 100
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+ summon_type = list("/turf/simulated/wall/cult")
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced
+ name = "Greater Construction"
+ desc = "This spell constructs a reinforced metal wall"
+
+ school = "conjuration"
+ charge_max = 300
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+
+ summon_type = list("/turf/simulated/wall/r_wall")
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone
+ name = "Summon Soulstone"
+ desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space"
+
+ school = "conjuration"
+ charge_max = 3000
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+
+ summon_type = list("/obj/item/device/soulstone")
+
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall
+ name = "Shield"
+ desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire"
+
+ school = "transmutation"
+ charge_max = 300
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = 0
+ summon_type = list("/obj/effect/forcefield")
+ summon_lifespan = 50
+
+
+
+
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift
+ name = "Phase Shift"
+ desc = "This spell allows you to pass through walls"
+
+ school = "transmutation"
+ charge_max = 200
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ range = -1
+ include_user = 1
+
+ jaunt_duration = 50 //in deciseconds
diff --git a/code/defines/atom.dm b/code/defines/atom.dm
index 1991e1c3bf3..f04d83c77fc 100644
--- a/code/defines/atom.dm
+++ b/code/defines/atom.dm
@@ -13,13 +13,13 @@
///Chemistry.
var/datum/reagents/reagents = null
- //Detective Work, used for the duplicate data points kept in the scanners
- var/list/original_atom
-
//var/chem_is_open_container = 0
// replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry.
+ //Detective Work, used for the duplicate data points kept in the scanners
+ var/list/original_atom
+
proc/assume_air(datum/air_group/giver)
del(giver)
return null
@@ -246,4 +246,4 @@ atom/movable/proc/forceMove(atom/destination)
loc = destination
loc.Entered(src)
return 1
- return 0
+ return 0
\ No newline at end of file
diff --git a/code/defines/mob/dead/observer.dm b/code/defines/mob/dead/observer.dm
index 9e63345a3d2..2cecfcf1841 100644
--- a/code/defines/mob/dead/observer.dm
+++ b/code/defines/mob/dead/observer.dm
@@ -1,4 +1,6 @@
/mob/dead/observer
+ name = "ghost"
+ desc = "It's a g-g-g-g-ghooooost!" //jinkies!
icon = 'mob.dmi'
icon_state = "ghost"
layer = 4
diff --git a/code/defines/mob/living/carbon/alien_humanoid.dm b/code/defines/mob/living/carbon/alien_humanoid.dm
index 6a880121b4d..4c6ae07fbe3 100644
--- a/code/defines/mob/living/carbon/alien_humanoid.dm
+++ b/code/defines/mob/living/carbon/alien_humanoid.dm
@@ -45,7 +45,7 @@
health = 250
icon_state = "queen_s"
-
+ nopush = 1
/mob/living/carbon/alien/humanoid/rpbody
update_icon = 0
diff --git a/code/defines/mob/living/silicon/robot.dm b/code/defines/mob/living/silicon/robot.dm
index f059433a17a..a245fe44671 100644
--- a/code/defines/mob/living/silicon/robot.dm
+++ b/code/defines/mob/living/silicon/robot.dm
@@ -1,5 +1,5 @@
/mob/living/silicon/robot
- name = "Robot"
+ name = "Cyborg"
icon = 'robots.dmi'//
icon_state = "robot"
health = 300
@@ -36,6 +36,7 @@
var/wiresexposed = 0
var/locked = 1
var/list/req_access = list(access_robotics)
+ var/ident = 0
//var/list/laws = list()
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list())
var/viewalerts = 0
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index fd4dc7d4d98..438a322193e 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -640,6 +640,10 @@
color="blue"
icon = 'power_cond_blue.dmi'
+/obj/structure/cable/pink
+ color="pink"
+ icon = 'power_cond_pink.dmi'
+
/obj/effect/manifest
name = "manifest"
icon = 'screen1.dmi'
@@ -759,7 +763,6 @@
desc = "Apply butt."
icon = 'objects.dmi'
icon_state = "stool"
- anchored = 1.0
flags = FPRINT
pressure_resistance = 3*ONE_ATMOSPHERE
@@ -768,6 +771,7 @@
desc = "This is used to lie in, sleep in or strap on."
icon_state = "bed"
var/mob/living/buckled_mob
+ anchored = 1.0
/obj/structure/stool/bed/alien
name = "Resting contraption"
@@ -779,6 +783,7 @@
name = "chair"
desc = "You sit in this. Either by will or force."
icon_state = "chair"
+ anchored = 0
/obj/structure/stool/bed/chair/comfy
name = "comfy chair"
diff --git a/code/defines/obj/closet.dm b/code/defines/obj/closet.dm
index 652a89cac76..23a1d6a3ba6 100644
--- a/code/defines/obj/closet.dm
+++ b/code/defines/obj/closet.dm
@@ -1,6 +1,6 @@
/obj/structure/closet
- name = "Closet"
- desc = "It's a closet."
+ name = "closet"
+ desc = "It's a basic storage unit."
icon = 'closet.dmi'
icon_state = "closed"
density = 1
@@ -16,18 +16,18 @@
layer = 2.98
/obj/structure/closet/detective
- name = "Detective's Closet"
+ name = "detective's closet"
desc = "Holds the detective's clothes while his coat rack is being repaired."
/obj/structure/closet/acloset
- name = "Strange closet"
- desc = "It looks weird."
+ name = "strange closet"
+ desc = "It looks alien!"
icon_state = "acloset"
icon_closed = "acloset"
icon_opened = "aclosetopen"
/obj/structure/closet/cabinet
- name = "Cabinet"
+ name = "cabinet"
desc = "Old will forever be in fashion."
icon_state = "cabinet_closed"
icon_closed = "cabinet_closed"
@@ -42,12 +42,12 @@
anchored = 0
/obj/structure/closet/gmcloset
- name = "Formal closet"
- desc = "A bulky (yet mobile) closet. Comes with formal clothes."
+ name = "formal closet"
+ desc = "It's a storage unit for formal clothing."
/obj/structure/closet/emcloset
- name = "Emergency Closet"
- desc = "A bulky (yet mobile) closet. Comes prestocked with a gasmask and o2 tank for emergencies."
+ name = "emergency closet"
+ desc = "It's a storage unit for emergency breathmasks and o2 tanks."
icon_state = "emergency"
icon_closed = "emergency"
icon_opened = "emergencyopen"
@@ -55,15 +55,15 @@
/obj/structure/closet/emcloset/legacy
/obj/structure/closet/firecloset
- name = "Fire Closet"
- desc = "A bulky (yet mobile) closet. Comes with supplies to fight fire."
+ name = "fire-safety closet"
+ desc = "It's a storage unit for fire-fighting supplies."
icon_state = "firecloset"
icon_closed = "firecloset"
icon_opened = "fireclosetopen"
/obj/structure/closet/hydrant //wall mounted fire closet
- name = "Fire Closet"
- desc = "A wall mounted closet which comes with supplies to fight fire."
+ name = "fire-safety closet"
+ desc = "It's a storage unit for fire-fighting supplies."
icon_state = "hydrant"
icon_closed = "hydrant"
icon_opened = "hydrant_open"
@@ -72,8 +72,8 @@
wall_mounted = 1
/obj/structure/closet/medical_wall //wall mounted medical closet
- name = "First Aid Closet"
- desc = "A wall mounted closet which should have some first aid."
+ name = "first-aid closet"
+ desc = "It's wall-mounted storage unit for first aid supplies."
icon_state = "medical_wall"
icon_closed = "medical_wall"
icon_opened = "medical_wall_open"
@@ -82,352 +82,314 @@
wall_mounted = 1
/obj/structure/closet/toolcloset
- name = "Tool Closet"
- desc = "A bulky (yet mobile) closet. Contains tools."
+ name = "tool closet"
+ desc = "It's a storage unit for tools."
icon_state = "toolcloset"
icon_closed = "toolcloset"
icon_opened = "toolclosetopen"
+/obj/structure/closet/radiation
+ name = "radiation suit closet"
+ desc = "It's a storage unit for rad-protective suits."
+ icon_state = "radsuitcloset"
+ icon_opened = "toolclosetopen"
+ icon_closed = "radsuitcloset"
+
/obj/structure/closet/jcloset
- name = "Custodial Closet"
- desc = "A bulky (yet mobile) closet. Contains the janitor's gear."
+ name = "custodial closet"
+ desc = "It's a storage unit for janitorial clothes and gear."
/obj/structure/closet/jcloset2
- name = "Cleaner's Closet"
- desc = "A bulky (yet mobile) closet. Contains various items for cleaning."
+ name = "cleaner's closet"
+ desc = "It's a storage unit for various cleaning items."
/obj/structure/closet/lawcloset
- name = "Legal Closet"
- desc = "A bulky (yet mobile) closet. Comes with lawyer apparel and items."
+ name = "legal closet"
+ desc = "It's a storage unit for courtroom apparel and items."
/obj/structure/closet/coffin
name = "coffin"
- desc = "A burial receptacle for the dearly departed."
+ desc = "It's a burial receptacle for the dearly departed."
icon_state = "coffin"
icon_closed = "coffin"
icon_opened = "coffin_open"
/obj/structure/closet/bombcloset
- name = "EOD closet"
- desc = "A bulky (yet mobile) closet. Comes prestocked with a level 4 bombsuit."
+ name = "\improper EOD closet"
+ desc = "It's a storage unit for explosion-protective suits."
icon_state = "bombsuit"
icon_closed = "bombsuit"
icon_opened = "bombsuitopen"
/obj/structure/closet/bombclosetsecurity
- name = "EOD closet"
- desc = "A bulky (yet mobile) closet. Comes prestocked with a level 4 bombsuit."
+ name = "\improper EOD closet"
+ desc = "It's a storage unit for explosion-protective suits."
icon_state = "bombsuitsec"
icon_closed = "bombsuitsec"
icon_opened = "bombsuitsecopen"
/obj/structure/closet/l3closet
- name = "Level 3 Biohazard Suit"
- desc = "A bulky (yet mobile) closet. Comes prestocked with level 3 biohazard gear for emergencies."
+ name = "level-3 biohazard suit closet"
+ desc = "It's a storage unit for level-3 biohazard gear."
icon_state = "bio"
icon_closed = "bio"
icon_opened = "bioopen"
/obj/structure/closet/l3closet/general
- name = "Level 3 Biohazard Suit"
- desc = "A bulky (yet mobile) closet. Comes prestocked with level 3 biohazard gear for emergencies."
icon_state = "bio_general"
icon_closed = "bio_general"
icon_opened = "bio_generalopen"
/obj/structure/closet/l3closet/virology
- name = "Level 3 Biohazard Suit"
- desc = "A bulky (yet mobile) closet. Comes prestocked with level 3 biohazard gear for emergencies."
icon_state = "bio_virology"
icon_closed = "bio_virology"
icon_opened = "bio_virologyopen"
/obj/structure/closet/l3closet/security
- name = "Level 3 Biohazard Suit"
- desc = "A bulky (yet mobile) closet. Comes prestocked with level 3 biohazard gear for emergencies."
icon_state = "bio_security"
icon_closed = "bio_security"
icon_opened = "bio_securityopen"
/obj/structure/closet/l3closet/janitor
- name = "Level 3 Biohazard Suit"
- desc = "A bulky (yet mobile) closet. Comes prestocked with level 3 biohazard gear for emergencies."
icon_state = "bio_janitor"
icon_closed = "bio_janitor"
icon_opened = "bio_janitoropen"
/obj/structure/closet/l3closet/scientist
- name = "Level 3 Biohazard Suit"
- desc = "A bulky (yet mobile) closet. Comes prestocked with level 3 biohazard gear for emergencies."
icon_state = "bio_scientist"
icon_closed = "bio_scientist"
icon_opened = "bio_scientistopen"
/obj/structure/closet/syndicate
- name = "Weapons Closet"
+ name = "armoury closet"
desc = "Why is this here?"
icon_state = "syndicate"
icon_closed = "syndicate"
icon_opened = "syndicateopen"
/obj/structure/closet/syndicate/personal
- name = "Gear Closet"
- desc = "Gear preperations closet."
+ desc = "It's a storage unit for operative gear."
/obj/structure/closet/syndicate/nuclear
- name = "Nuclear Closet"
- desc = "Nuclear preperations closet."
+ desc = "It's a storage unit for nuclear-operative gear."
// Inserting the gimmick clothing stuff here for generic items, IE Tacticool stuff
/obj/structure/closet/gimmick
- name = "Administrative Supply Closet"
+ name = "administrative supply closet"
+ desc = "It's a storage unit for things that have no right being here."
icon_state = "syndicate1"
icon_closed = "syndicate1"
icon_opened = "syndicate1open"
- desc = "Closet of things that have no right being here."
anchored = 0
/obj/structure/closet/gimmick/russian
- name = "Russian Surplus"
+ name = "russian surplus closet"
+ desc = "It's a storage unit for Russian standard-issue surplus."
icon_state = "syndicate1"
icon_closed = "syndicate1"
icon_opened = "syndicate1open"
- desc = "Russian Surplus Closet"
/obj/structure/closet/gimmick/tacticool
- name = "Tacticool Gear"
+ name = "tacticool gear closet"
+ desc = "It's a storage unit for Tacticool gear."
icon_state = "syndicate1"
icon_closed = "syndicate1"
icon_opened = "syndicate1open"
- desc = "Tacticool Gear Closet"
/obj/structure/closet/thunderdome
+ name = "\improper Thunderdome closet"
desc = "Everything you need!"
icon_state = "syndicate"
icon_closed = "syndicate"
icon_opened = "syndicateopen"
- name = "Thunderdome closet"
anchored = 1
/obj/structure/closet/thunderdome/tdred
- desc = "Everything you need!"
- icon_state = "syndicate"
- icon_closed = "syndicate"
- icon_opened = "syndicateopen"
- name = "Thunderdome closet"
+ name = "red-team Thunderdome closet"
/obj/structure/closet/thunderdome/tdgreen
- desc = "Everything you need!"
+ name = "green-team Thunderdome closet"
icon_state = "syndicate1"
icon_closed = "syndicate1"
icon_opened = "syndicate1open"
- name = "Thunderdome closet"
+
/obj/structure/closet/malf/suits
- desc = "Gear preparations closet"
+ desc = "It's a storage unit for operational gear."
icon_state = "syndicate"
icon_closed = "syndicate"
icon_opened = "syndicateopen"
/obj/structure/closet/wardrobe
- desc = "A bulky (yet mobile) wardrobe closet. Comes prestocked with 6 changes of clothes."
- name = "Wardrobe"
+ name = "wardrobe"
+ desc = "It's a storage unit for standard-issue Nanotrasen attire."
icon_state = "blue"
icon_closed = "blue"
/obj/structure/closet/wardrobe/black
- name = "Black Wardrobe"
- desc = "Contains black jumpsuits."
+ name = "black wardrobe"
icon_state = "black"
icon_closed = "black"
/obj/structure/closet/wardrobe/chaplain_black
- name = "Chaplain Wardrobe"
- desc = "Closet of basic chaplain clothes."
+ name = "chapel wardrobe"
+ desc = "It's a storage unit for Nanotrasen-approved religious attire."
icon_state = "black"
icon_closed = "black"
/obj/structure/closet/wardrobe/green
- name = "Green Wardrobe"
- desc = "Contains green jumpsuits."
+ name = "green wardrobe"
icon_state = "green"
icon_closed = "green"
/obj/structure/closet/wardrobe/mixed
- name = "Mixed Wardrobe"
- desc = "This appears to contain several different sets of clothing."
+ name = "mixed wardrobe"
icon_state = "mixed"
icon_closed = "mixed"
/obj/structure/closet/wardrobe/orange
- name = "Prisoner's Wardrobe"
- desc = "Contains orange jumpsuits."
+ name = "prison wardrobe"
+ desc = "It's a storage unit for Nanotrasen-regulation prisoner attire."
icon_state = "orange"
icon_closed = "orange"
/obj/structure/closet/wardrobe/pink
- name = "Pink Wardrobe"
- desc = "Contains pink jumpsuits."
+ name = "pink wardrobe"
icon_state = "pink"
icon_closed = "pink"
/obj/structure/closet/wardrobe/red
- name = "Red Wardrobe"
- desc = "Contains red security jumpsuits."
+ name = "security wardrobe"
icon_state = "red"
icon_closed = "red"
/obj/structure/closet/wardrobe/warden
- name = "Warden's Wardrobe"
- desc = "Contains the warden's security uniform."
+ name = "Warden's wardrobe"
icon_state = "red"
icon_closed = "red"
/obj/structure/closet/wardrobe/hos
- name = "Head of Security's Wardrobe"
- desc = "Contains the Head of Security's uniform."
+ name = "Head of Security's wardrobe"
icon_state = "red"
icon_closed = "red"
/obj/structure/closet/wardrobe/hop
- name = "Head of Personnel's Wardrobe"
- desc = "Contains the Head of Personnel's uniform."
+ name = "Head of Personnel's wardrobe"
icon_state = "blue"
icon_closed = "blue"
/obj/structure/closet/wardrobe/white
- name = "White Wardrobe"
- desc = "Contains white jumpsuits."
+ name = "white wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/toxins_white
- name = "Toxins Wardrobe"
- desc = "Contains toxins jumpsuits."
+ name = "toxins wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/genetics_white
- name = "Genetics Wardrobe"
- desc = "Contains genetics jumpsuits."
+ name = "genetics wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/medic_white
- name = "Doctor's Wardrobe"
- desc = "Contains medical jumpsuits."
+ name = "doctor's wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/chemistry_white
- name = "Chemistry Wardrobe"
- desc = "Contains chemistry jumpsuits."
+ name = "chemistry wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/nurse
- name = "Nurse's Wardrobe"
- desc = "Contains nurse uniforms."
+ name = "nurse's wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/cmo
- name = "Chief Medical Officer's Wardrobe"
- desc = "Contains the Chief Medical Officer's clothing."
+ name = "Chief Medical Officer's wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/rd
- name = "Research Director's Wardrobe"
- desc = "Contains the Research Director's clothing."
+ name = "Research Director's wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/scientist
- name = "Scientist's Wardrobe"
- desc = "Contains the scientist's clothing."
+ name = "scientist's wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/virology_white
- name = "Virology Wardrobe"
- desc = "Contains virologist jumpsuits."
+ name = "virology wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/yellow
- name = "Yellow Wardrobe"
- desc = "Contains yellow jumpsuits."
- icon_state = "yellow"
- icon_closed = "yellow"
+ name = "yellow wardrobe"
+ icon_state = "wardrobe-y"
+ icon_closed = "wardrobe-y"
/obj/structure/closet/wardrobe/engineering_yellow
- name = "Engineering Wardrobe"
- desc = "Contains engineering jumpsuits."
+ name = "engineering wardrobe"
icon_state = "yellow"
icon_closed = "yellow"
/obj/structure/closet/wardrobe/robotics_yellow
- name = "Robotics Wardrobe"
- desc = "Contains robotics jumpsuits."
+ name = "robotics wardrobe"
icon_state = "yellow"
icon_closed = "yellow"
/obj/structure/closet/wardrobe/atmospherics_yellow
- name = "Atmospherics Wardrobe"
- desc = "Contains atmospheric jumpsuits."
+ name = "atmospherics wardrobe"
icon_state = "yellow"
icon_closed = "yellow"
/obj/structure/closet/wardrobe/grey
- name = "Grey Wardrobe"
- desc = "Contains grey jumpsuits."
+ name = "grey wardrobe"
icon_state = "grey"
icon_closed = "grey"
/obj/structure/closet/wardrobe/bartender_black
- name = "Bartender's Wardrobe"
- desc = "Closet of basic bartending clothes."
+ name = "Bartender's wardrobe"
icon_state = "black"
icon_closed = "black"
/obj/structure/closet/wardrobe/chef_white
- name = "Chef's Wardrobe"
- desc = "Contains chef jumpsuits."
+ name = "Chef's wardrobe"
icon_state = "white"
icon_closed = "white"
/obj/structure/closet/wardrobe/hydro_green
- name = "Hydroponics Wardrobe"
- desc = "Contains botanist jumpsuits."
+ name = "Hydroponics wardrobe"
icon_state = "green"
icon_closed = "green"
/obj/structure/closet/wardrobe/librarian_red
- name = "Librarian's Wardrobe"
- desc = "Contains librarian jumpsuits."
+ name = "Librarian's wardrobe"
icon_state = "red"
icon_closed = "red"
/obj/structure/closet/wardrobe/cargo_yellow
- name = "Cargo Tech's Wardrobe"
- desc = "Contains cargo tech jumpsuits."
+ name = "Cargo Tech's wardrobe"
icon_state = "yellow"
icon_closed = "yellow"
/obj/structure/closet/wardrobe/qm_yellow
- name = "Quartermaster's Wardrobe"
- desc = "Contains quartermaster jumpsuits."
+ name = "Quartermaster's wardrobe"
icon_state = "yellow"
icon_closed = "yellow"
/obj/structure/closet/secure_closet
- desc = "An immobile card-locked storage closet."
- name = "Security Locker"
+ name = "secure locker"
+ desc = "It's an immobile card-locked storage unit."
icon = 'closet.dmi'
icon_state = "secure1"
density = 1
@@ -445,7 +407,7 @@
/obj/structure/closet/secure_closet/medical_wall
name = "First Aid Closet"
- desc = "A wall mounted closet which --should-- contain medical supplies."
+ desc = "It's a secure wall-mounted storage unit for first aid supplies."
icon_state = "medical_wall_locked"
icon_closed = "medical_wall_unlocked"
icon_locked = "medical_wall_locked"
@@ -458,21 +420,29 @@
req_access = list(access_medical)
/obj/structure/closet/secure_closet/personal
- desc = "The first card swiped gains control."
- name = "Personal Closet"
+ desc = "It's a secure locker for personnel. The first card swiped gains control."
+ name = "personal closet"
/obj/structure/closet/secure_closet/personal/patient
- name = "Patient's closet"
+ name = "patient's closet"
+
+/obj/structure/closet/secure_closet/personal/cabinet
+ icon_state = "cabinetdetective_locked"
+ icon_closed = "cabinetdetective"
+ icon_locked = "cabinetdetective_locked"
+ icon_opened = "cabinetdetective_open"
+ icon_broken = "cabinetdetective_broken"
+ icon_off = "cabinetdetective_broken"
/obj/structure/closet/secure_closet/kitchen
- name = "Kitchen Cabinet"
+ name = "kitchen cabinet"
req_access = list(access_kitchen)
/obj/structure/closet/secure_closet/kitchen/mining
req_access = list()
/obj/structure/closet/secure_closet/meat
- name = "Meat Fridge"
+ name = "meat fridge"
icon_state = "fridge1"
icon_closed = "fridge"
icon_locked = "fridge1"
@@ -481,7 +451,7 @@
icon_off = "fridge1"
/obj/structure/closet/secure_closet/fridge
- name = "Refrigerator"
+ name = "refrigerator"
icon_state = "fridge1"
icon_closed = "fridge"
icon_locked = "fridge1"
@@ -490,7 +460,7 @@
icon_off = "fridge1"
/obj/structure/closet/secure_closet/money_freezer
- name = "Freezer"
+ name = "freezer"
icon_state = "fridge1"
icon_closed = "fridge"
icon_locked = "fridge1"
diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index 493693af7e9..3fb16ec45b2 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -1,8 +1,7 @@
// Plant analyzer
/obj/item/device/analyzer/plant_analyzer
- name = "Plant Analyzer"
- desc = "Analyzes plants."
+ name = "plant analyzer"
icon = 'device.dmi'
icon_state = "hydro"
item_state = "analyzer"
@@ -11,17 +10,17 @@
return 0
// ********************************************************
-// Here's all the seeds (=plants) that can be used in hydro
+// Here's all the seeds (plants) that can be used in hydro
// ********************************************************
/obj/item/seeds
- name = "seed"
+ name = "pack of seeds"
icon = 'seeds.dmi'
icon_state = "seed" // unknown plant seed - these shouldn't exist in-game
flags = FPRINT | TABLEPASS
w_class = 1.0 // Makes them pocketable
var/mypath = "/obj/item/seeds"
- var/plantname = ""
+ var/plantname = "Plants"
var/productname = ""
var/species = ""
var/lifespan = 0
@@ -36,12 +35,12 @@
/obj/item/seeds/chiliseed
- name = "Chili plant seeds"
- desc = "Seeds that grow into peppers."
+ name = "pack of chili seeds"
+ desc = "These seeds grow into chili plants. HOT! HOT! HOT!"
icon_state = "seed-chili"
mypath = "/obj/item/seeds/chiliseed"
species = "chili"
- plantname = "Chili plant"
+ plantname = "Chili Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/chili"
lifespan = 20
endurance = 15
@@ -53,12 +52,12 @@
growthstages = 6
/obj/item/seeds/replicapod
- name = "Replica pod seeds"
- desc = "Used to make replica humans, but made of plants."
+ name = "pack of replica pod seeds"
+ desc = "These seeds grow into replica pods. They say these are used to harvest humans."
icon_state = "seed-replicapod"
mypath = "/obj/item/seeds/replicapod"
species = "replicapod"
- plantname = "Replica pod"
+ plantname = "Replica Pod"
productname = "/mob/living/carbon/human" //verrry special -- Urist
lifespan = 50 //no idea what those do
endurance = 8
@@ -77,8 +76,8 @@
gender = "male"
/obj/item/seeds/grapeseed
- name = "Grape seeds"
- desc = "Seeds that grows into grapes."
+ name = "pack of grape seeds"
+ desc = "These seeds grow into grape vines."
icon_state = "seed-grapes"
mypath = "/obj/item/seeds/grapeseed"
species = "grape"
@@ -94,12 +93,12 @@
growthstages = 2
/obj/item/seeds/greengrapeseed
- name = "Green Grape seeds"
- desc = "Seeds that grows into green grapes."
+ name = "pack of green grape seeds"
+ desc = "These seeds grow into green-grape vines."
icon_state = "seed-greengrapes"
mypath = "/obj/item/seeds/greengrapeseed"
species = "greengrape"
- plantname = "Gren Grape Vine"
+ plantname = "Green-Grape Vine"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes"
lifespan = 50
endurance = 25
@@ -111,12 +110,12 @@
growthstages = 2
/obj/item/seeds/cabbageseed
- name = "Cabbage seeds"
- desc = "Seeds that grow into cabbages."
+ name = "pack of cabbage seeds"
+ desc = "These seeds grow into cabbages."
icon_state = "seed-cabbage"
mypath = "/obj/item/seeds/cabbageseed"
species = "cabbage"
- plantname = "Cabbage Plant"
+ plantname = "Cabbages"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage"
lifespan = 50
endurance = 25
@@ -128,12 +127,12 @@
growthstages = 1
/obj/item/seeds/berryseed
- name = "Berry seeds"
- desc = "Seeds that grow into berries."
+ name = "pack of berry seeds"
+ desc = "These seeds grow into berry bushes."
icon_state = "seed-berry"
mypath = "/obj/item/seeds/berryseed"
species = "berry"
- plantname = "Berry bush"
+ plantname = "Berry Bush"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/berries"
lifespan = 20
endurance = 15
@@ -145,12 +144,12 @@
growthstages = 6
/obj/item/seeds/glowberryseed
- name = "Glow Berry seeds"
- desc = "Seeds that grow into glow berries."
+ name = "pack of glow-berry seeds"
+ desc = "These seeds grow into glow-berry bushes."
icon_state = "seed-glowberry"
mypath = "/obj/item/seeds/glowberryseed"
species = "glowberry"
- plantname = "Glow Berry bush"
+ plantname = "Glow-Berry Bush"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries"
lifespan = 30
endurance = 25
@@ -162,12 +161,12 @@
growthstages = 6
/obj/item/seeds/bananaseed
- name = "Banana seeds"
- desc = "Seeds that grow into bananas."
+ name = "pack of banana seeds"
+ desc = "They're seeds that grow into banana trees. When grown, keep away from clown."
icon_state = "seed-banana"
mypath = "/obj/item/seeds/bananaseed"
species = "banana"
- plantname = "Banana tree"
+ plantname = "Banana Tree"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/banana"
lifespan = 50
endurance = 30
@@ -178,28 +177,29 @@
growthstages = 6
/obj/item/seeds/eggplantseed
- name = "Eggplant seeds"
- desc = "These seeds grow into plants in the form of eggs."
+ name = "pack of eggplant seeds"
+ desc = "These seeds grow to produce berries that look nothing like eggs."
icon_state = "seed-eggplant"
mypath = "/obj/item/seeds/eggplantseed"
species = "eggplant"
- plantname = "Eggplant plant"
+ plantname = "Eggplants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant"
lifespan = 25
endurance = 15
maturation = 6
production = 6
yield = 2
+ potency = 20
plant_type = 0
growthstages = 6
/obj/item/seeds/eggyseed
- name = "Egg Plant seeds"
- desc = "These seeds grow into plants in the form of eggs."
+ name = "pack of eggplant seeds"
+ desc = "These seeds grow to produce berries that look a lot like eggs."
icon_state = "seed-eggy"
mypath = "/obj/item/seeds/eggy"
species = "eggy"
- plantname = "Egg Plant plant"
+ plantname = "Eggplants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/egg"
lifespan = 75
endurance = 15
@@ -210,12 +210,12 @@
growthstages = 6
/obj/item/seeds/bloodtomatoseed
- name = "Blood Tomato seeds"
- desc = "Used to grow blood tomotoes."
+ name = "pack of blood-tomato seeds"
+ desc = "These seeds grow into blood-tomato plants."
icon_state = "seed-bloodtomato"
mypath = "/obj/item/seeds/bloodtomatoseed"
species = "bloodtomato"
- plantname = "Blood Tomato plant"
+ plantname = "Blood-Tomato Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato"
lifespan = 25
endurance = 20
@@ -227,12 +227,12 @@
growthstages = 6
/obj/item/seeds/tomatoseed
- name = "Tomato seeds"
- desc = "Used to grow tomotoes."
+ name = "pack of tomato seeds"
+ desc = "These seeds grow into tomato plants."
icon_state = "seed-tomato"
mypath = "/obj/item/seeds/tomatoseed"
species = "tomato"
- plantname = "Tomato plant"
+ plantname = "Tomato Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/tomato"
lifespan = 25
endurance = 15
@@ -244,12 +244,12 @@
growthstages = 6
/obj/item/seeds/killertomatoseed
- name = "Killer Tomato seeds"
- desc = "Used to grow killer tomotoes."
+ name = "pack of killer-tomato seeds"
+ desc = "These seeds grow into killer-tomato plants."
icon_state = "seed-killertomato"
mypath = "/obj/item/seeds/killertomatoseed"
species = "killertomato"
- plantname = "Killer Tomato plant"
+ plantname = "Killer-Tomato Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/killertomato"
lifespan = 25
endurance = 15
@@ -262,12 +262,12 @@
growthstages = 2
/obj/item/seeds/bluetomatoseed
- name = "Blue Tomato seeds"
- desc = "Used to grow blue tomotoes."
+ name = "pack of blue-tomato seeds"
+ desc = "These seeds grow into blue-tomato plants."
icon_state = "seed-bluetomato"
mypath = "/obj/item/seeds/bluetomatoseed"
species = "bluetomato"
- plantname = "Blue Tomato plant"
+ plantname = "Blue-Tomato Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato"
lifespan = 25
endurance = 15
@@ -279,12 +279,12 @@
growthstages = 6
/obj/item/seeds/cornseed
- name = "Corn seeds"
- desc = "Grows corn."
+ name = "pack of corn seeds"
+ desc = "I don't mean to sound corny..."
icon_state = "seed-corn"
mypath = "/obj/item/seeds/cornseed"
species = "corn"
- plantname = "Corn plant"
+ plantname = "Corn Stalks"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/corn"
lifespan = 25
endurance = 15
@@ -293,15 +293,16 @@
yield = 3
plant_type = 0
oneharvest = 1
+ potency = 20
growthstages = 3
/obj/item/seeds/poppyseed
- desc = "Grows poppies."
- name = "Poppy seeds"
+ name = "pack of poppy seeds"
+ desc = "These seeds grow into poppies."
icon_state = "seed-poppy"
mypath = "/obj/item/seeds/poppyseed"
species = "poppy"
- plantname = "Poppy plant"
+ plantname = "Poppy Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/poppy"
lifespan = 25
endurance = 10
@@ -314,12 +315,12 @@
growthstages = 3
/obj/item/seeds/potatoseed
- name = "Potato Seeds"
- desc = "Grows into potatoes.."
+ name = "pack of potato seeds"
+ desc = "Boil 'em! Mash 'em! Stick 'em in a stew!"
icon_state = "seed-potato"
mypath = "/obj/item/seeds/potatoseed"
species = "potato"
- plantname = "Potato Plant"
+ plantname = "Potato-Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/potato"
lifespan = 30
endurance = 15
@@ -332,12 +333,12 @@
growthstages = 4
/obj/item/seeds/icepepperseed
- name = "Ice pepper seeds"
- desc = "Grows mutant, frozen peppers."
+ name = "pack of ice-pepper seeds"
+ desc = "These seeds grow into ice-pepper plants."
icon_state = "seed-icepepper"
mypath = "/obj/item/seeds/icepepperseed"
species = "chiliice"
- plantname = "Ice pepper plant"
+ plantname = "Ice-Pepper Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper"
lifespan = 25
endurance = 15
@@ -349,47 +350,47 @@
growthstages = 6
/obj/item/seeds/soyaseed
- name = "Soybean seeds"
- desc = "These grow into soy.."
+ name = "pack of soybean seeds"
+ desc = "These seeds grow into soybean plants."
icon_state = "seed-soybean"
mypath = "/obj/item/seeds/soyaseed"
species = "soybean"
- plantname = "Soybean plant"
+ plantname = "Soybean Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans"
lifespan = 25
endurance = 15
maturation = 4
production = 4
yield = 3
- potency = 0
+ potency = 5
plant_type = 0
growthstages = 6
/obj/item/seeds/wheatseed
- name = "Wheat seeds"
- desc = "Grows into wheat."
+ name = "pack of wheat seeds"
+ desc = "These may, or may not, grow into weed."
icon_state = "seed-wheat"
mypath = "/obj/item/seeds/wheatseed"
species = "wheat"
- plantname = "Wheat stalks"
+ plantname = "Wheat Stalks"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/wheat"
lifespan = 25
endurance = 15
maturation = 6
production = 1
yield = 4
- potency = 0
+ potency = 5
oneharvest = 1
plant_type = 0
growthstages = 6
/obj/item/seeds/carrotseed
- name = "Carrot seeds"
- desc = "Used to grow carrots."
+ name = "pack of carrot seeds"
+ desc = "These seeds grow into carrots."
icon_state = "seed-carrot"
mypath = "/obj/item/seeds/carrotseed"
species = "carrot"
- plantname = "Carrot"
+ plantname = "Carrots"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/carrot"
lifespan = 25
endurance = 15
@@ -402,12 +403,12 @@
growthstages = 5
/obj/item/seeds/amanitamycelium
- name = "Fly Amanita mycelium"
- desc = "Grows into some kind of mushroom."
+ name = "pack of fly amanita mycelium"
+ desc = "This mycelium grows into something horrible."
icon_state = "mycelium-amanita"
mypath = "/obj/item/seeds/amanitamycelium"
species = "amanita"
- plantname = "Fly Amanita"
+ plantname = "Fly Amanitas"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita"
lifespan = 50
endurance = 35
@@ -420,11 +421,12 @@
plant_type = 2
/obj/item/seeds/angelmycelium
- name = "Destroying Angel mycelium"
+ name = "pack of destroying angel mycelium"
+ desc = "This mycelium grows into something devestating."
icon_state = "mycelium-angel"
mypath = "/obj/item/seeds/angelmycelium"
species = "angel"
- plantname = "Destroying Angel"
+ plantname = "Destroying Angels"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel"
lifespan = 50
endurance = 35
@@ -437,12 +439,12 @@
plant_type = 2
/obj/item/seeds/libertymycelium
- name = "Liberty Cap mycelium"
- desc = "It is said to grow drugs."
+ name = "pack of liberty-cap mycelium"
+ desc = "This mycelium grows into liberty-cap mushrooms."
icon_state = "mycelium-liberty"
mypath = "/obj/item/seeds/libertymycelium"
species = "liberty"
- plantname = "Liberty Cap"
+ plantname = "Liberty-Caps"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap"
lifespan = 25
endurance = 15
@@ -455,12 +457,12 @@
plant_type = 2
/obj/item/seeds/chantermycelium
- name = "Chanterelle mycelium"
- desc = "Grows chanterelle."
+ name = "pack of chanterelle mycelium"
+ desc = "This mycelium grows into chanterelle mushrooms."
icon_state = "mycelium-chanter"
mypath = "/obj/item/seeds/chantermycelium"
species = "chanter"
- plantname = "Chanterelle"
+ plantname = "Chanterelle Mushrooms"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle"
lifespan = 35
endurance = 20
@@ -473,12 +475,12 @@
plant_type = 2
/obj/item/seeds/towermycelium
- name = "Tower Cap mycelium"
- desc = "Why does this sound so familiar...?"
+ name = "pack of tower-cap mycelium"
+ desc = "This mycelium grows into tower-cap mushrooms."
icon_state = "mycelium-tower"
mypath = "/obj/item/seeds/towermycelium"
species = "towercap"
- plantname = "Tower Cap"
+ plantname = "Tower Caps"
productname = "/obj/item/weapon/grown/log"
lifespan = 80
endurance = 50
@@ -491,12 +493,12 @@
plant_type = 2
/obj/item/seeds/glowshroom
- name = "Glowshroom mycelium"
- desc = "This will glow into mushrooms."
+ name = "pack of glowshroom mycelium"
+ desc = "This mycelium -glows- into mushrooms!"
icon_state = "mycelium-glowshroom"
mypath = "/obj/item/seeds/glowshroom"
species = "glowshroom"
- plantname = "Glowshroom"
+ plantname = "Glowshrooms"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom"
lifespan = 120 //ten times that is the delay
endurance = 30
@@ -509,12 +511,12 @@
plant_type = 2
/obj/item/seeds/plumpmycelium
- name = "Plump Helmet mycelium"
- desc = "Grows into giant mushrooms. Very healthy to consume, unlike most."
+ name = "pack of plump-helmet mycelium"
+ desc = "This mycelium grows into helmets... maybe."
icon_state = "mycelium-plump"
mypath = "/obj/item/seeds/plumpmycelium"
species = "plump"
- plantname = "Plump Helmet"
+ plantname = "Plump-Helmet Mushrooms"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet"
lifespan = 25
endurance = 15
@@ -527,12 +529,12 @@
plant_type = 2
/obj/item/seeds/walkingmushroommycelium
- name = "Walking Mushroom mycelium"
- desc = "This will grow into huge stuff."
+ name = "pack of walking mushroom mycelium"
+ desc = "This mycelium will grow into huge stuff!"
icon_state = "mycelium-walkingmushroom"
mypath = "/obj/item/seeds/walkingmushroommycelium"
species = "walkingmushroom"
- plantname = "Walking Mushroom"
+ plantname = "Walking Mushrooms"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom"
lifespan = 30
endurance = 30
@@ -545,12 +547,12 @@
plant_type = 2
/obj/item/seeds/nettleseed
- name = "Nettle seeds"
- desc = "Grows into nettle."
+ name = "pack of nettle seeds"
+ desc = "These seeds grow into nettles."
icon_state = "seed-nettle"
mypath = "/obj/item/seeds/nettleseed"
species = "nettle"
- plantname = "Nettle"
+ plantname = "Nettles"
productname = "/obj/item/weapon/grown/nettle"
lifespan = 30
endurance = 40 // tuff like a toiger
@@ -563,12 +565,12 @@
plant_type = 1
/obj/item/seeds/deathnettleseed
- name = "Deathnettle seeds"
- desc = "Grows into Nettle."
+ name = "pack of death-nettle seeds"
+ desc = "These seeds grow into death-nettles."
icon_state = "seed-deathnettle"
mypath = "/obj/item/seeds/deathnettleseed"
species = "deathnettle"
- plantname = "Death Nettle"
+ plantname = "Death Nettles"
productname = "/obj/item/weapon/grown/deathnettle"
lifespan = 30
endurance = 25
@@ -581,12 +583,12 @@
plant_type = 1
/obj/item/seeds/weeds
- name = "Weeds"
- desc = "These are not to be confused with the illegal kind of weed."
+ name = "pack of weed seeds"
+ desc = "Yo mang, want some weeds?"
icon_state = "seed"
mypath = "/obj/item/seeds/weeds"
species = "weeds"
- plantname = "Generic weeds"
+ plantname = "Starthistle"
productname = ""
lifespan = 100
endurance = 50 // damm pesky weeds
@@ -599,12 +601,12 @@
plant_type = 1
/obj/item/seeds/harebell
- name = "Harebell"
- desc = "Grows harebell."
+ name = "pack of harebell seeds"
+ desc = "These seeds grow into pretty little flowers."
icon_state = "seed"
mypath = "/obj/item/seeds/harebell"
species = "harebell"
- plantname = "Harebell"
+ plantname = "Harebells"
productname = ""
lifespan = 100
endurance = 20
@@ -617,12 +619,12 @@
plant_type = 1
/obj/item/seeds/sunflowerseed
- name = "Sunflower seeds"
- desc = "Seeds that make sunflowers when they grow."
+ name = "pack of sunflower seeds"
+ desc = "These seeds grow into sunflowers."
icon_state = "seed-sunflower"
mypath = "/obj/item/seeds/sunflowerseed"
species = "sunflower"
- plantname = "Sunflower"
+ plantname = "Sunflowers"
productname = "/obj/item/weapon/grown/sunflower"
lifespan = 25
endurance = 20
@@ -635,8 +637,8 @@
plant_type = 1
/obj/item/seeds/brownmold
- name = "Brown Mold"
- desc = "Moldy."
+ name = "pack of brown mold"
+ desc = "Eww.. moldy."
icon_state = "seed"
mypath = "/obj/item/seeds/brownmold"
species = "mold"
@@ -653,12 +655,12 @@
plant_type = 2
/obj/item/seeds/appleseed
- name = "Apple seeds"
- desc = "Grows apples."
+ name = "pack of apple seeds"
+ desc = "These seeds grow into apple trees."
icon_state = "seed-apple"
mypath = "/obj/item/seeds/appleseed"
species = "apple"
- plantname = "Apple tree"
+ plantname = "Apple Tree"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/apple"
lifespan = 55
endurance = 35
@@ -669,8 +671,8 @@
growthstages = 6
/obj/item/seeds/ambrosiavulgarisseed
- name = "Ambrosia Vulgaris seeds"
- desc = "Plant seeds which grown by and from medicine."
+ name = "pack of ambrosia vulgaris seeds"
+ desc = "These seeds grow into common ambrosia, a plant grown by and from medicine."
icon_state = "seed-ambrosiavulgaris"
mypath = "/obj/item/seeds/ambrosiavulgarisseed"
species = "ambrosiavulgaris"
@@ -680,29 +682,49 @@
endurance = 25
maturation = 6
production = 6
- yield = 8
+ yield = 6
+ potency = 5
+ plant_type = 0
+ growthstages = 6
+
+/obj/item/seeds/ambrosiadeusseed
+ name = "pack of ambrosia deus seeds"
+ desc = "These seeds grow into ambrosia deus. Could it be the food of the gods..?"
+ icon_state = "seed-ambrosiadeus"
+ mypath = "/obj/item/seeds/ambrosiadeusseed"
+ species = "ambrosiadeus"
+ plantname = "Ambrosia Deus"
+ productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus"
+ lifespan = 60
+ endurance = 25
+ maturation = 6
+ production = 6
+ yield = 6
+ potency = 5
plant_type = 0
growthstages = 6
/obj/item/seeds/whitebeetseed
- name = "White Beet seed"
- desc = "Seeds for white beets."
+ name = "pack of white-beet seeds"
+ desc = "These seeds grow into sugary beet producing plants."
icon_state = "seed-whitebeet"
mypath = "/obj/item/seeds/whitebeetseed"
species = "whitebeet"
- plantname = "White Beet Plant"
+ plantname = "White-Beet Plants"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet"
lifespan = 60
endurance = 50
maturation = 6
production = 6
- yield = 4
+ yield = 6
+ oneharvest = 1
+ potency = 10
plant_type = 0
growthstages = 6
/obj/item/seeds/sugarcaneseed
- name = "Sugarcane seed"
- desc = "Seeds for sugarcane."
+ name = "pack of sugarcane seeds"
+ desc = "These seeds grow into sugarcane."
icon_state = "seed-sugarcane"
mypath = "/obj/item/seeds/sugarcaneseed"
species = "sugarcane"
@@ -713,45 +735,48 @@
maturation = 3
production = 6
yield = 4
+ potency = 10
plant_type = 0
growthstages = 3
/obj/item/seeds/watermelonseed
- name = "Watermelon Seed"
- desc = "Some seeds for watermelons."
+ name = "pack of watermelon seeds"
+ desc = "These seeds grow into watermelon plants."
icon_state = "seed-watermelon"
mypath = "/obj/item/seeds/watermelonseed"
species = "watermelon"
- plantname = "Watermelon Plant"
+ plantname = "Watermelon Vines"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon"
lifespan = 50
endurance = 40
maturation = 6
production = 6
yield = 3
+ potency = 1
plant_type = 0
growthstages = 6
/obj/item/seeds/pumpkinseed
- name = "Pumpkin Seed"
- desc = "Some seeds for pumpkins."
+ name = "pack of pumpkin seeds"
+ desc = "These seeds grow into pumpkin vines."
icon_state = "seed-pumpkin"
mypath = "/obj/item/seeds/pumpkinseed"
species = "pumpkin"
- plantname = "pumpkin Plant"
+ plantname = "Pumpkin Vines"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin"
lifespan = 50
endurance = 40
maturation = 6
production = 6
yield = 3
+ potency = 10
plant_type = 0
growthstages = 3
/obj/item/seeds/limeseed
- name = "Lime Seed"
- desc = "Seeds for limes."
+ name = "pack of lime seeds"
+ desc = "These are very sour seeds."
icon_state = "seed-lime"
mypath = "/obj/item/seeds/limeseed"
species = "lime"
@@ -762,12 +787,13 @@
maturation = 6
production = 6
yield = 4
+ potency = 15
plant_type = 0
growthstages = 6
/obj/item/seeds/lemonseed
- name = "Lemon Seed"
- desc = "Seeds for lemons."
+ name = "pack of lemon seeds"
+ desc = "These are sour seeds."
icon_state = "seed-lemon"
mypath = "/obj/item/seeds/lemonseed"
species = "lemon"
@@ -778,12 +804,30 @@
maturation = 6
production = 6
yield = 4
+ potency = 10
+ plant_type = 0
+ growthstages = 6
+
+/obj/item/seeds/cashseed
+ name = "pack of money seeds"
+ desc = "When life gives you lemons, mutate them into cash."
+ icon_state = "seed-cash"
+ mypath = "/obj/item/seeds/cashseed"
+ species = "cashtree"
+ plantname = "Money Tree"
+ productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/money"
+ lifespan = 55
+ endurance = 45
+ maturation = 6
+ production = 6
+ yield = 4
+ potency = 10
plant_type = 0
growthstages = 6
/obj/item/seeds/orangeseed
- name = "Orange Seed"
- desc = "Seeds for oranges."
+ name = "pack of orange seed"
+ desc = "Sour seeds."
icon_state = "seed-orange"
mypath = "/obj/item/seeds/orangeseed"
species = "orange"
@@ -794,16 +838,17 @@
maturation = 6
production = 6
yield = 5
+ potency = 1
plant_type = 0
growthstages = 6
/obj/item/seeds/poisonberryseed
- name = "Poison Berry seeds"
- desc = "Seeds that grows into poison berries."
+ name = "pack of poison-berry seeds"
+ desc = "These seeds grow into poison-berry bushes."
icon_state = "seed-poisonberry"
mypath = "/obj/item/seeds/poisonberryseed"
species = "poisonberry"
- plantname = "Poison Berry bush"
+ plantname = "Poison-Berry Bush"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries"
lifespan = 20
endurance = 15
@@ -815,12 +860,12 @@
growthstages = 6
/obj/item/seeds/deathberryseed
- name = "Death Berry seeds"
- desc = "Seeds that grows into death berries."
+ name = "pack of death-berry seeds"
+ desc = "These seeds grow into death berries."
icon_state = "seed-deathberry"
mypath = "/obj/item/seeds/deathberryseed"
species = "deathberry"
- plantname = "Death Berry bush"
+ plantname = "Death Berry Bush"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/deathberries"
lifespan = 30
endurance = 20
@@ -832,8 +877,8 @@
growthstages = 6
/obj/item/seeds/grassseed
- name = "Grass seeds"
- desc = "Seeds that will one day become grass."
+ name = "pack of grass seeds"
+ desc = "These seeds grow into grass. Yummy!"
icon_state = "seed-grass"
mypath = "/obj/item/seeds/grassseed"
species = "grass"
@@ -844,17 +889,16 @@
maturation = 2
production = 5
yield = 5
- potency = 10
plant_type = 0
growthstages = 2
/obj/item/seeds/cocoapodseed
- name = "Cocoa Pod seeds"
- desc = "Seeds for cocoa; a major ingredient in chocolate."
+ name = "pack of cocoa pod seeds"
+ desc = "These seeds grow into cacao trees. They look fattening." //SIC: cocoa is the seeds. The tress ARE spelled cacao.
icon_state = "seed-cocoapod"
mypath = "/obj/item/seeds/cocoapodseed"
species = "cocoapod"
- plantname = "Cocoa Pod Tree"
+ plantname = "Cocao Tree" //SIC: see above
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod"
lifespan = 20
endurance = 15
@@ -863,7 +907,7 @@
yield = 2
potency = 10
plant_type = 0
- growthstages = 5
+ growthstages = 6
/* // Maybe one day when I get it to work like a grenade which exlodes gibs.
/obj/item/seeds/gibtomatoseed
@@ -935,68 +979,81 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(var/obj/item/O as obj, var/mob/user as mob)
..()
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
- user << "This is a \blue [name]"
+ var/msg
+ msg = "*---------*\n This is \a [src]\n"
switch(plant_type)
if(0)
- user << "- Plant type: \blue Normal plant"
+ msg += "- Plant type: Normal plant\n"
if(1)
- user << "- Plant type: \blue Weed"
+ msg += "- Plant type: Weed\n"
if(2)
- user << "- Plant type: \blue Mushroom"
- user << "- Potency: \blue [potency]"
- user << "- Yield: \blue [yield]"
- user << "- Maturation speed: \blue [maturation]"
- user << "- Production speed: \blue [production]"
- user << "- Endurance: \blue [endurance]"
- user << "- Healing properties: \blue [reagents.get_reagent_amount("nutriment")]"
+ msg += "- Plant type: Mushroom\n"
+ msg += "- Potency: [potency]\n"
+ msg += "- Yield: [yield]\n"
+ msg += "- Maturation speed: [maturation]\n"
+ msg += "- Production speed: [production]\n"
+ msg += "- Endurance: [endurance]\n"
+ msg += "- Healing properties: [reagents.get_reagent_amount("nutriment")]\n"
+ msg += "*---------*"
+ usr << msg
return
/obj/item/weapon/grown/attackby(var/obj/item/O as obj, var/mob/user as mob)
..()
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
- user << "This is a \blue [name]"
+ var/msg
+ msg = "*---------*\n This is \a [src]\n"
switch(plant_type)
if(0)
- user << "- Plant type: \blue Normal plant"
+ msg += "- Plant type: Normal plant\n"
if(1)
- user << "- Plant type: \blue Weed"
+ msg += "- Plant type: Weed\n"
if(2)
- user << "- Plant type: \blue Mushroom"
- user << "- Acid strength: \blue [potency]"
- user << "- Yield: \blue [yield]"
- user << "- Maturation speed: \blue [maturation]"
- user << "- Production speed: \blue [production]"
- user << "- Endurance: \blue [endurance]"
- user << ""
-
+ msg += "- Plant type: Mushroom\n"
+ msg += "- Acid strength: [potency]\n"
+ msg += "- Yield: [yield]\n"
+ msg += "- Maturation speed: [maturation]\n"
+ msg += "- Production speed: [production]\n"
+ msg += "- Endurance: [endurance]\n"
+ msg += "*---------*"
+ usr << msg
return
+
/obj/item/weapon/reagent_containers/food/snacks/grown/corn
seed = "/obj/item/seeds/cornseed"
- name = "Corn"
- desc = "I like corm!"
+ name = "cob of corn"
+ desc = "Needs some butter!"
icon_state = "corn"
potency = 40
+ On_Consume()
+ if(!reagents.total_volume)
+ var/mob/M = usr
+ var/obj/item/weapon/corncob/W = new /obj/item/weapon/corncob( M )
+ M << "You chew on the corn, leaving nothing behind but a cob."
+ M.put_in_hand(W)
+ W.add_fingerprint(M)
New()
..()
reagents.add_reagent("nutriment", 1+round((potency / 10), 1))
bitesize = 1+round(reagents.total_volume / 2, 1)
+
/obj/item/weapon/reagent_containers/food/snacks/grown/poppy
seed = "/obj/item/seeds/poppyseed"
- name = "Poppy"
+ name = "poppy"
icon_state = "poppy"
potency = 30
New()
..()
- reagents.add_reagent("nutriment", round((potency / 20), 1))
- reagents.add_reagent("opium", 1+round((potency / 5), 1))
+ reagents.add_reagent("nutriment", 1+round((potency / 20), 1))
+ reagents.add_reagent("bicaridine", 1+round((potency / 10), 1))
bitesize = 1+round(reagents.total_volume / 3, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/potato
seed = "/obj/item/seeds/potatoseed"
- name = "Potato"
- desc = "Starchy!"
+ name = "potato"
+ desc = "Boil 'em! Mash 'em! Stick 'em in a stew!"
icon_state = "potato"
potency = 25
New()
@@ -1004,19 +1061,9 @@
reagents.add_reagent("nutriment", 1+round((potency / 10), 1))
bitesize = reagents.total_volume
- /*attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/cable_coil))
- if(W:amount >= 5)
- W:amount -= 5
- if(!W:amount) del(W)
- user << "\blue You add cable to the potato."
- new /obj/item/weapon/cell/potato(src.loc)
- del(src)*/
-
-
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes
seed = "/obj/item/seeds/grapeseed"
- name = "Grapes"
+ name = "bunch of grapes"
desc = "Nutritious!"
icon_state = "grapes"
New()
@@ -1027,7 +1074,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes
seed = "/obj/item/seeds/greengrapeseed"
- name = "Green Grapes"
+ name = "bunch of green grapes"
desc = "Nutritious!"
icon_state = "greengrapes"
potency = 25
@@ -1039,8 +1086,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage
seed = "/obj/item/seeds/cabbageseed"
- name = "Cabbage"
- desc = "Ewwwwwwwwww"
+ name = "cabbage"
+ desc = "Ewwwwwwwwww. Cabbage."
icon_state = "cabbage"
potency = 25
New()
@@ -1050,7 +1097,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/berries
seed = "/obj/item/seeds/berryseed"
- name = "Berries"
+ name = "bunch of berries"
desc = "Nutritious!"
icon_state = "berrypile"
New()
@@ -1060,7 +1107,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries
seed = "/obj/item/seeds/glowberryseed"
- name = "Glow Berries"
+ name = "bunch of glow-berries"
desc = "Nutritious!"
var/on = 1
var/brightness_on = 2 //luminosity when on
@@ -1086,8 +1133,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod
seed = "/obj/item/seeds/cocoapodseed"
- name = "Cocoa Pod"
- desc = "Fattening"
+ name = "cocoa pod"
+ desc = "Fattening... Mmmmm... chucklate."
icon_state = "cocoapod"
potency = 50
New()
@@ -1099,18 +1146,47 @@
//This object is just a transition object. All it does is make a grass tile and delete itself.
/obj/item/weapon/reagent_containers/food/snacks/grown/grass
seed = "/obj/item/seeds/grassseed"
- name = "Grass"
- desc = "Greeny"
- icon_state = "grass"
+ name = "grass"
+ desc = "Green and lush."
+ icon_state = "spawner"
potency = 20
New()
new/obj/item/stack/tile/grass(src.loc)
- del(src)
+ spawn(5) //Workaround to keep harvesting from working weirdly.
+ del(src)
+
+//This object is just a transition object. All it does is make dosh and delete itself. -Cheridan
+/obj/item/weapon/reagent_containers/food/snacks/grown/money
+ seed = "/obj/item/seeds/cashseed"
+ name = "dosh"
+ desc = "Green and lush."
+ icon_state = "spawner"
+ potency = 10
+ New()
+ switch(rand(1,100))//(potency) //It wants to use the default potency instead of the new, so it was always 10. Will try to come back to this later - Cheridan
+ if(0 to 10)
+ new/obj/item/weapon/spacecash/(src.loc)
+ if(11 to 20)
+ new/obj/item/weapon/spacecash/c10(src.loc)
+ if(21 to 30)
+ new/obj/item/weapon/spacecash/c20(src.loc)
+ if(31 to 40)
+ new/obj/item/weapon/spacecash/c50(src.loc)
+ if(41 to 50)
+ new/obj/item/weapon/spacecash/c100(src.loc)
+ if(51 to 60)
+ new/obj/item/weapon/spacecash/c200(src.loc)
+ if(61 to 80)
+ new/obj/item/weapon/spacecash/c500(src.loc)
+ else
+ new/obj/item/weapon/spacecash/c1000(src.loc)
+ spawn(5) //Workaround to keep harvesting from working weirdly.
+ del(src)
/obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane
seed = "/obj/item/seeds/sugarcaneseed"
- name = "Sugarcane"
- desc = "Sugary"
+ name = "sugarcane"
+ desc = "Sickly sweet."
icon_state = "sugarcane"
potency = 50
New()
@@ -1119,9 +1195,10 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries
seed = "/obj/item/seeds/poisonberryseed"
- name = "Poison Berries"
- desc = "Nutritious in a deadly way."
+ name = "bunch of poison-berries"
+ desc = "Taste so good, you could die!"
icon_state = "poisonberrypile"
+ gender = PLURAL
potency = 15
New()
..()
@@ -1131,20 +1208,22 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/deathberries
seed = "/obj/item/seeds/deathberryseed"
- name = "Death Berries"
- desc = "Nutritious in a deadly way."
+ name = "bunch of death-berries"
+ desc = "Taste so good, you could die!"
icon_state = "deathberrypile"
+ gender = PLURAL
potency = 50
New()
..()
reagents.add_reagent("nutriment", 1)
reagents.add_reagent("toxin", 3+round(potency / 3, 1))
+ reagents.add_reagent("lexorin", 1+round(potency / 5, 1))
bitesize = 1+round(reagents.total_volume / 2, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris
- seed = "/obj/item/seeds/ambrosiavulgarisseed"
- name = "Ambrosia Vulgaris"
- desc = "A plant containing various healing chemicals."
+ seed = "/obj/item/seeds/ambrosiavulgaris"
+ name = "ambrosia vulgaris branch"
+ desc = "This is a plant containing various healing chemicals."
icon_state = "ambrosiavulgaris"
potency = 10
New()
@@ -1156,72 +1235,92 @@
reagents.add_reagent("toxin", 3+round(potency / 5, 1))
bitesize = 1+round(reagents.total_volume / 2, 1)
+/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus
+ seed = "/obj/item/seeds/ambrosiadeus"
+ name = "ambrosia deus branch"
+ desc = "Eating this makes you feel immortal!"
+ icon_state = "ambrosiadeus"
+ potency = 10
+ New()
+ ..()
+ reagents.add_reagent("nutriment", 1)
+ reagents.add_reagent("bicaridine", 3+round(potency / 5, 1))
+ reagents.add_reagent("synaptizine", 3+round(potency / 5, 1))
+ reagents.add_reagent("hyperzine", 3+round(potency / 8, 1))
+ reagents.add_reagent("kelotane", 3+round(potency / 8, 1))
+ reagents.add_reagent("toxin", 1+round(potency / 8, 1))
+ bitesize = 1+round(reagents.total_volume / 2, 1)
+
/obj/item/weapon/reagent_containers/food/snacks/grown/apple
seed = "/obj/item/seeds/appleseed"
- name = "Apple"
- desc = "A piece of Eden."
+ name = "apple"
+ desc = "It's a little piece of Eden."
icon_state = "apple"
potency = 15
New()
..()
reagents.add_reagent("nutriment", 1+round((potency / 10), 1))
+ bitesize = 1+round(reagents.total_volume / 2, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon
seed = "/obj/item/seeds/watermelonseed"
- name = "Watermelon"
- desc = "A melon full of watery goodness"
+ name = "watermelon"
+ desc = "It's full of watery goodness."
icon_state = "watermelon"
potency = 10
New()
..()
- reagents.add_reagent("nutriment", 1+round((potency / 5), 1))
+ reagents.add_reagent("nutriment", 1+round((potency / 6), 1))
+ bitesize = 1+round(reagents.total_volume / 2, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin
seed = "/obj/item/seeds/pumpkinseed"
- name = "Pumpkin"
- desc = "A large and scary pumpkin"
+ name = "pumpkin"
+ desc = "It's large and scary."
icon_state = "pumpkin"
potency = 10
New()
..()
- reagents.add_reagent("nutriment", 1+round((potency / 5), 1))
+ reagents.add_reagent("nutriment", 1+round((potency / 6), 1))
+ bitesize = 1+round(reagents.total_volume / 2, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/lime
seed = "/obj/item/seeds/limeseed"
- name = "Lime"
- desc = "A fruit so sour it twists your face."
+ name = "lime"
+ desc = "It's so sour, your face will twist."
icon_state = "lime"
potency = 20
New()
..()
reagents.add_reagent("nutriment", 1+round((potency / 20), 1))
- reagents.add_reagent("nutriment", 1+round((potency / 20), 1))
+ bitesize = 1+round(reagents.total_volume / 2, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/lemon
seed = "/obj/item/seeds/lemonseed"
- name = "Lemon"
- desc = "A sour fruit that makes your mouth bleed."
+ name = "lemon"
+ desc = "When life gives you lemons, be grateful they aren't limes."
icon_state = "lemon"
potency = 20
New()
..()
reagents.add_reagent("nutriment", 1+round((potency / 20), 1))
- reagents.add_reagent("nutriment", 1+round((potency / 20), 1))
+ bitesize = 1+round(reagents.total_volume / 2, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/orange
seed = "/obj/item/seeds/orangeseed"
- name = "Orange"
- desc = "A sweet and sour fruit."
+ name = "orange"
+ desc = "It's an tangy fruit."
icon_state = "orange"
potency = 20
New()
..()
reagents.add_reagent("nutriment", 1+round((potency / 20), 1))
+ bitesize = 1+round(reagents.total_volume / 2, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet
seed = "/obj/item/seeds/whitebeetseed"
- name = "White Beet"
- desc = "A beeting of white."
+ name = "white-beet"
+ desc = "You can't beat white-beet."
icon_state = "whitebeet"
potency = 15
New()
@@ -1232,8 +1331,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/banana
seed = "/obj/item/seeds/bananaseed"
- name = "Banana"
- desc = "A banana. Excellent clown weapon."
+ name = "banana"
+ desc = "It's an excellent prop for a clown."
icon = 'items.dmi'
icon_state = "banana"
item_state = "banana"
@@ -1241,7 +1340,7 @@
if(!reagents.total_volume)
var/mob/M = usr
var/obj/item/weapon/bananapeel/W = new /obj/item/weapon/bananapeel( M )
- M << "\blue You peel the banana."
+ M << "You peel the banana."
M.put_in_hand(W)
W.add_fingerprint(M)
New()
@@ -1253,8 +1352,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/chili
seed = "/obj/item/seeds/chiliseed"
- name = "Chili"
- desc = "Spicy! Wait...ITS BURNING ME!"
+ name = "chili"
+ desc = "It's spicy! Wait... IT'S BURNING ME!!"
icon_state = "chilipepper"
New()
..()
@@ -1265,12 +1364,12 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/chili/attackby(var/obj/item/O as obj, var/mob/user as mob)
. = ..()
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
- user << "- Capsaicin: \blue [reagents.get_reagent_amount("capsaicin")]%"
+ user << "- Capsaicin: [reagents.get_reagent_amount("capsaicin")]%"
/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant
seed = "/obj/item/seeds/eggplantseed"
- name = "Eggplant"
- desc = "Yum!"
+ name = "eggplant"
+ desc = "Maybe there's a chicken inside?"
icon_state = "eggplant"
New()
..()
@@ -1279,8 +1378,9 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans
seed = "/obj/item/seeds/soyaseed"
- name = "Soybeans"
- desc = "Pretty bland, but the possibilities..."
+ name = "soybeans"
+ desc = "It's pretty bland, but oh the possibilities..."
+ gender = PLURAL
icon_state = "soybeans"
New()
..()
@@ -1289,8 +1389,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato
seed = "/obj/item/seeds/tomatoseed"
- name = "Tomato"
- desc = "Tom-mae-to or to-mah-to? You decide."
+ name = "tomato"
+ desc = "I say to-mah-to, you say tom-mae-to."
icon_state = "tomato"
potency = 10
New()
@@ -1301,14 +1401,14 @@
throw_impact(atom/hit_atom)
..()
new/obj/effect/decal/cleanable/tomato_smudge(src.loc)
- src.visible_message("\red [src.name] has been squashed.","\red You hear a smack.")
+ src.visible_message("The [src.name] has been squashed.","You hear a smack.")
del(src)
return
/obj/item/weapon/reagent_containers/food/snacks/grown/killertomato
seed = "/obj/item/seeds/killertomatoseed"
- name = "Killer Tomato"
- desc = "Tom-mae-to or to-mah-to? You decide."
+ name = "killer-tomato"
+ desc = "I say to-mah-to, you say tom-mae-to... OH GOD IT'S EATING MY LEGS!!"
icon_state = "killertomato"
potency = 10
New()
@@ -1332,11 +1432,11 @@
del(src)
- user << "You plant the killertomato."
+ user << "You plant the killer-tomato."
/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato
seed = "/obj/item/seeds/bloodtomatoseed"
- name = "Blood Tomato"
+ name = "blood-tomato"
desc = "So bloody...so...very...bloody....AHHHH!!!!"
icon_state = "bloodtomato"
potency = 10
@@ -1346,10 +1446,20 @@
reagents.add_reagent("blood", 1+round((potency / 5), 1))
bitesize = 1+round(reagents.total_volume / 2, 1)
+ throw_impact(atom/hit_atom)
+ ..()
+ new/obj/effect/decal/cleanable/blood/splatter(src.loc)
+ src.visible_message("The [src.name] has been squashed.","You hear a smack.")
+ src.reagents.reaction(get_turf(hit_atom))
+ for(var/atom/A in get_turf(hit_atom))
+ src.reagents.reaction(A)
+ del(src)
+ return
+
/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato
seed = "/obj/item/seeds/bluetomatoseed"
- name = "Blue Tomato"
- desc = "Tom-mae-to or to-mah-to? You decide."
+ name = "blue-tomato"
+ desc = "I say blue-mah-to, you say blue-mae-to."
icon_state = "bluetomato"
potency = 10
New()
@@ -1358,11 +1468,21 @@
reagents.add_reagent("lube", 1+round((potency / 5), 1))
bitesize = 1+round(reagents.total_volume / 2, 1)
+ throw_impact(atom/hit_atom)
+ ..()
+ new/obj/effect/decal/cleanable/oil(src.loc)
+ src.visible_message("The [src.name] has been squashed.","You hear a smack.")
+ src.reagents.reaction(get_turf(hit_atom))
+ for(var/atom/A in get_turf(hit_atom))
+ src.reagents.reaction(A)
+ del(src)
+ return
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat
seed = "/obj/item/seeds/wheatseed"
- name = "Wheat"
- desc = "I wouldn't eat this, unless you're one of those health freaks.."
+ name = "wheat"
+ desc = "Sigh... wheat... a-grain?"
+ gender = PLURAL
icon_state = "wheat"
New()
..()
@@ -1371,8 +1491,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper
seed = "/obj/item/seeds/icepepperseed"
- name = "Icepepper"
- desc = "A mutant strain of chile"
+ name = "ice-pepper"
+ desc = "It's a mutant strain of chili"
icon_state = "icepepper"
potency = 20
New()
@@ -1384,12 +1504,12 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper/attackby(var/obj/item/O as obj, var/mob/user as mob)
. = ..()
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
- user << "- Frostoil: \blue [reagents.get_reagent_amount("frostoil")]%"
+ user << "- Frostoil: [reagents.get_reagent_amount("frostoil")]%"
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot
seed = "/obj/item/seeds/carrotseed"
- name = "Carrot"
- desc = "Good for the eyes!"
+ name = "carrot"
+ desc = "It's good for the eyes!"
icon_state = "carrot"
potency = 10
New()
@@ -1400,7 +1520,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita
seed = "/obj/item/seeds/amanitamycelium"
- name = "Fly amanita"
+ name = "fly amanita"
desc = "Amanita Muscaria: Learn poisonous mushrooms by heart. Only pick mushrooms you know."
icon_state = "amanita"
potency = 10
@@ -1414,12 +1534,12 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita/attackby(var/obj/item/O as obj, var/mob/user as mob)
. = ..()
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
- user << "- Amatoxins: \blue [reagents.get_reagent_amount("amatoxin")]%"
- user << "- Psilocybin: \blue [reagents.get_reagent_amount("psilocybin")]%"
+ user << "- Amatoxins: [reagents.get_reagent_amount("amatoxin")]%"
+ user << "- Psilocybin: [reagents.get_reagent_amount("psilocybin")]%"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel
seed = "/obj/item/seeds/angelmycelium"
- name = "Destroying angel"
+ name = "destroying angel"
desc = "Amanita Virosa: Deadly poisonous basidiomycete fungus filled with alpha amatoxins."
icon_state = "angel"
potency = 35
@@ -1433,12 +1553,12 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel/attackby(var/obj/item/O as obj, var/mob/user as mob)
. = ..()
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
- user << "- Amatoxins: \blue [reagents.get_reagent_amount("amatoxin")]%"
- user << "- Psilocybin: \blue [reagents.get_reagent_amount("psilocybin")]%"
+ user << "- Amatoxins: [reagents.get_reagent_amount("amatoxin")]%"
+ user << "- Psilocybin: [reagents.get_reagent_amount("psilocybin")]%"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap
seed = "/obj/item/seeds/libertymycelium"
- name = "Liberty cap"
+ name = "liberty-cap"
desc = "Psilocybe Semilanceata: Liberate yourself!"
icon_state = "libertycap"
potency = 15
@@ -1451,11 +1571,11 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap/attackby(var/obj/item/O as obj, var/mob/user as mob)
. = ..()
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
- user << "- Psilocybin: \blue [reagents.get_reagent_amount("psilocybin")]%"
+ user << "- Psilocybin: [reagents.get_reagent_amount("psilocybin")]%"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet
seed = "/obj/item/seeds/plumpmycelium"
- name = "Plump Helmet"
+ name = "plump-helmet"
desc = "Plumus Hellmus: Plump, soft and s-so inviting~"
icon_state = "plumphelmet"
New()
@@ -1465,7 +1585,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom
seed = "/obj/item/seeds/walkingmushroom"
- name = "Walking Mushroom"
+ name = "walking mushroom"
desc = "The beginging of the great walk."
icon_state = "walkingmushroom"
New()
@@ -1489,12 +1609,12 @@
del(src)
- user << "You plant the walking mushroom."
+ user << "You plant the walking mushroom."
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle
seed = "/obj/item/seeds/chantermycelium"
- name = "Chanterelle"
- desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty! There's a lot!"
+ name = "chanterelle cluster"
+ desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!"
icon_state = "chanterelle"
New()
..()
@@ -1503,8 +1623,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom
seed = "/obj/item/seeds/glowshroom"
- name = "Glowshroom"
- desc = "Glowshroom: These species of mushrooms glown in the dark. OR DO THEY?"
+ name = "glowshroom cluster"
+ desc = "Glowshroom: This species of mushroom glows in the dark. Or does it?"
icon_state = "glowshroom"
New()
..()
@@ -1533,7 +1653,7 @@
del(src)
- user << "You plant the glowshroom."
+ user << "You plant the glowshroom."
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/Del()
if(istype(loc,/mob))
@@ -1572,9 +1692,9 @@
R.my_atom = src
/obj/item/weapon/grown/log
+ name = "tower-cap log"
desc = "It's better than bad, it's good!"
icon = 'harvest.dmi'
- name = "Tower Cap Log"
icon_state = "logs"
force = 5
flags = TABLEPASS
@@ -1587,17 +1707,17 @@
seed = "/obj/item/seeds/towermycelium"
attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/circular_saw))
- W.visible_message(" \red You make planks out of the [src]! ", 1)
+ if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || (istype(W, /obj/item/weapon/fireaxe) && W:wielded) || istype(W, /obj/item/weapon/melee/energy))
+ user.show_message("You make planks out of the [src]!", 1)
for(var/i=0,i<2,i++)
new /obj/item/stack/sheet/wood (src.loc)
del(src)
return
/obj/item/weapon/grown/sunflower // FLOWER POWER!
- desc = "This is a beautiful sunflower! A certain person might beat you to death if you trample these."
+ name = "sunflower"
+ desc = "It's beautiful! A certain person might beat you to death if you trample these."
icon = 'harvest.dmi'
- name = "Sunflower"
icon_state = "sunflower"
damtype = "fire"
force = 0
@@ -1634,9 +1754,9 @@
src.smoke.set_up(10, 0, usr.loc)
*/
/obj/item/weapon/grown/nettle // -- Skie
- desc = "This is a nettle. It's probably not wise to touch it with bare hands..."
+ desc = "It's probably not wise to touch it with bare hands..."
icon = 'weapons.dmi'
- name = "Nettle"
+ name = "nettle"
icon_state = "nettle"
damtype = "fire"
force = 15
@@ -1657,7 +1777,7 @@
/obj/item/weapon/grown/deathnettle // -- Skie
desc = "The \red glowing \black nettle incites \redrage\black in you just from looking at it!"
icon = 'weapons.dmi'
- name = "Deathnettle"
+ name = "deathnettle"
icon_state = "deathnettle"
damtype = "fire"
force = 30
@@ -1680,7 +1800,7 @@
// *************************************
/obj/item/pestkiller
- name = ""
+ name = "bottle of pestkiller"
icon = 'chemical.dmi'
icon_state = "bottle16"
flags = FPRINT | TABLEPASS
@@ -1691,7 +1811,7 @@
src.pixel_y = rand(-5.0, 5)
/obj/item/pestkiller/carbaryl
- name = "Carbaryl"
+ name = "bottle of carbaryl"
icon = 'chemical.dmi'
icon_state = "bottle16"
flags = FPRINT | TABLEPASS
@@ -1702,7 +1822,7 @@
src.pixel_y = rand(-5.0, 5)
/obj/item/pestkiller/lindane
- name = "Lindane"
+ name = "bottle of lindane"
icon = 'chemical.dmi'
icon_state = "bottle18"
flags = FPRINT | TABLEPASS
@@ -1713,7 +1833,7 @@
src.pixel_y = rand(-5.0, 5)
/obj/item/pestkiller/phosmet
- name = "Phosmet"
+ name = "bottle of phosmet"
icon = 'chemical.dmi'
icon_state = "bottle15"
flags = FPRINT | TABLEPASS
@@ -1728,9 +1848,9 @@
// *************************************
/obj/item/weapon/plantbgone // -- Skie
- desc = "Plant-B-Gone! Kill those pesky weeds!"
+ desc = "Kill those pesky weeds!"
icon = 'hydroponics.dmi'
- name = "Plant-B-Gone"
+ name = "bottle of Plant-B-Gone"
icon_state = "plantbgone"
item_state = "plantbgone"
flags = ONBELT|TABLEPASS|OPENCONTAINER|FPRINT|USEDELAY
@@ -1742,9 +1862,9 @@
/obj/item/weapon/weedspray // -- Skie
- desc = "Toxic mixture in spray form to kill small weeds."
+ desc = "It's a toxic mixture, in spray form, to kill small weeds."
icon = 'hydroponics.dmi'
- name = "Weed Spray"
+ name = "weed-spray"
icon_state = "weedspray"
item_state = "spray"
flags = ONBELT|TABLEPASS|OPENCONTAINER|FPRINT|USEDELAY
@@ -1756,9 +1876,9 @@
var/WeedKillStr = 2
/obj/item/weapon/pestspray // -- Skie
- desc = "Pest eliminator spray! Do not inhale!"
+ desc = "It's some pest eliminator spray! Do not inhale!"
icon = 'hydroponics.dmi'
- name = "Pest Spray"
+ name = "pest-spray"
icon_state = "pestspray"
item_state = "spray"
flags = ONBELT|TABLEPASS|OPENCONTAINER|FPRINT|USEDELAY
@@ -1770,8 +1890,8 @@
var/PestKillStr = 2
/obj/item/weapon/minihoe // -- Numbers
- name = "Mini hoe"
- desc = "Use for removing weeds or scratching your back. Might be convinced for other uses."
+ name = "mini hoe"
+ desc = "It's used for removing weeds or scratching your back."
icon = 'weapons.dmi'
icon_state = "hoe"
item_state = "hoe"
@@ -1786,7 +1906,7 @@
// *************************************
/obj/item/weedkiller
- name = ""
+ name = "bottle of weedkiller"
icon = 'chemical.dmi'
icon_state = "bottle16"
flags = FPRINT | TABLEPASS
@@ -1794,7 +1914,7 @@
var/WeedKillStr = 0
/obj/item/weedkiller/triclopyr
- name = "Glyphosate"
+ name = "bottle of glyphosate"
icon = 'chemical.dmi'
icon_state = "bottle16"
flags = FPRINT | TABLEPASS
@@ -1802,7 +1922,7 @@
WeedKillStr = 2
/obj/item/weedkiller/lindane
- name = "Triclopyr"
+ name = "bottle of triclopyr"
icon = 'chemical.dmi'
icon_state = "bottle18"
flags = FPRINT | TABLEPASS
@@ -1810,7 +1930,7 @@
WeedKillStr = 4
/obj/item/weedkiller/D24
- name = "2,4-D"
+ name = "bottle of 2,4-D"
icon = 'chemical.dmi'
icon_state = "bottle15"
flags = FPRINT | TABLEPASS
@@ -1822,7 +1942,7 @@
// *************************************
/obj/item/nutrient
- name = ""
+ name = "bottle of nutrient"
icon = 'chemical.dmi'
icon_state = "bottle16"
flags = FPRINT | TABLEPASS
@@ -1834,7 +1954,7 @@
src.pixel_y = rand(-5.0, 5)
/obj/item/nutrient/ez
- name = "E-Z-Nutrient"
+ name = "bottle of E-Z-Nutrient"
icon = 'chemical.dmi'
icon_state = "bottle16"
flags = FPRINT | TABLEPASS
@@ -1845,7 +1965,7 @@
src.pixel_y = rand(-5.0, 5)
/obj/item/nutrient/l4z
- name = "Left 4 Zed"
+ name = "bottle of Left 4 Zed"
icon = 'chemical.dmi'
icon_state = "bottle18"
flags = FPRINT | TABLEPASS
@@ -1856,7 +1976,7 @@
src.pixel_y = rand(-5.0, 5)
/obj/item/nutrient/rh
- name = "Robust Harvest"
+ name = "bottle of Robust Harvest"
icon = 'chemical.dmi'
icon_state = "bottle15"
flags = FPRINT | TABLEPASS
diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm
index 0d617c0f471..a0870edcc53 100644
--- a/code/defines/obj/machinery.dm
+++ b/code/defines/obj/machinery.dm
@@ -43,7 +43,7 @@
/obj/machinery/camera
name = "security camera"
- desc = "This is used to monitor rooms."
+ desc = "It's used to monitor rooms."
icon = 'monitors.dmi'
icon_state = "camera"
var/network = "SS13"
@@ -224,45 +224,6 @@
idle_power_usage = 10
active_power_usage = 400
-/obj/machinery/scan_consolenew
- name = "DNA Modifier Access Console"
- desc = "Scans DNA."
- icon = 'computer.dmi'
- icon_state = "scanner"
- density = 1
- var/uniblock = 1.0
- var/strucblock = 1.0
- var/subblock = 1.0
- var/status = null
- var/radduration = 2.0
- var/radstrength = 1.0
- var/radacc = 1.0
- var/buffer1 = null
- var/buffer2 = null
- var/buffer3 = null
- var/buffer1owner = null
- var/buffer2owner = null
- var/buffer3owner = null
- var/buffer1label = null
- var/buffer2label = null
- var/buffer3label = null
- var/buffer1type = null
- var/buffer2type = null
- var/buffer3type = null
- var/buffer1iue = 0
- var/buffer2iue = 0
- var/buffer3iue = 0
- var/delete = 0
- var/injectorready = 1
- var/temphtml = null
- var/obj/machinery/dna_scanner/connected = null
- var/obj/item/weapon/disk/data/diskette = null
- var/list/message = list()
- anchored = 1.0
- use_power = 1
- idle_power_usage = 10
- active_power_usage = 400
-
/obj/machinery/door_control
name = "remote door-control"
desc = "It controls doors, remotely."
diff --git a/code/defines/obj/radio.dm b/code/defines/obj/radio.dm
index b10b2034e96..e69de29bb2d 100644
--- a/code/defines/obj/radio.dm
+++ b/code/defines/obj/radio.dm
@@ -1 +0,0 @@
-// why the heck is this blank? - 702
\ No newline at end of file
diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm
index 50bcc68c1cc..67459f8f934 100644
--- a/code/defines/obj/storage.dm
+++ b/code/defines/obj/storage.dm
@@ -313,13 +313,13 @@
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
/obj/item/weapon/storage/firstaid/toxin
- name = "Toxin First Aid"
+ name = "toxin first aid"
desc = "Contains anti-toxin medication."
icon_state = "antitoxin"
item_state = "firstaid-toxin"
/obj/item/weapon/storage/firstaid/o2
- name = "Oxygen Deprivation First Aid"
+ name = "oxygen deprivation first aid"
desc = "Contains oxygen deprivation medication."
icon_state = "o2"
item_state = "firstaid-o2"
@@ -331,7 +331,7 @@
item_state = "firstaid-advanced"
/obj/item/weapon/storage/flashbang_kit
- name = "Flashbangs (WARNING)"
+ name = "flashbangs (WARNING)"
desc = "WARNING: Do not use without reading these preautions!\nThese devices are extremely dangerous and can cause blindness or deafness if used incorrectly.\nThe chemicals contained in these devices have been tuned for maximal effectiveness and due to\nextreme safety precuaiotn shave been incased in a tamper-proof pack. DO NOT ATTEMPT TO OPEN\nFLASH WARNING: Do not use continually. Excercise extreme care when detonating in closed spaces.\n\tMake attemtps not to detonate withing range of 2 meters of the intended target. It is imperative\n\tthat the targets visit a medical professional after usage. Damage to eyes increases extremely per\n\tuse and according to range. Glasses with flash resistant filters DO NOT always work on high powered\n\tflash devices such as this. EXERCISE CAUTION REGARDLESS OF CIRCUMSTANCES\nSOUND WARNING: Do not use continually. Visit a medical professional if hearing is lost.\n\tThere is a slight chance per use of complete deafness. Exercise caution and restraint.\nSTUN WARNING: If the intended or unintended target is too close to detonation the resulting sound\n\tand flash have been known to cause extreme sensory overload resulting in temporary\n\tincapacitation.\nDO NOT USE CONTINUALLY\nOperating Directions:\n\t1. Pull detonnation pin. ONCE THE PIN IS PULLED THE GRENADE CAN NOT BE DISARMED!\n\t2. Throw grenade. NEVER HOLD A LIVE FLASHBANG\n\t3. The grenade will detonste 10 seconds hafter being primed. EXCERCISE CAUTION\n\t-Never prime another grenade until after the first is detonated\nNote: Usage of this pyrotechnic device without authorization is an extreme offense and can\nresult in severe punishment upwards of 10 years in prison per use.\n\nDefault 3 second wait till from prime to detonation. This can be switched with a screwdriver\nto 10 seconds.\n\nCopyright of Nanotrasen Industries- Military Armnaments Division\nThis device was created by Nanotrasen Labs a member of the Expert Advisor Corporation"
icon_state = "flashbang"
item_state = "syringe_kit"
diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm
index 0f3dad8132f..cc1940219ee 100755
--- a/code/defines/obj/supplypacks.dm
+++ b/code/defines/obj/supplypacks.dm
@@ -313,18 +313,11 @@
containertype = "/obj/structure/closet/crate"
containername = "Janitorial supplies"
-/obj/item/weapon/storage/lightbox/tubes
-
/datum/supply_packs/lightbulbs
name = "Replacement lights"
- contains = list("/obj/item/weapon/storage/lightbox/tubes",
- "/obj/item/weapon/storage/lightbox/tubes",
- "/obj/item/weapon/storage/lightbox/tubes",
- "/obj/item/weapon/storage/lightbox/tubes",
- "/obj/item/weapon/storage/lightbox/tubes",
- "/obj/item/weapon/storage/lightbox/tubes",
- "/obj/item/weapon/storage/lightbox/bulbs",
- "/obj/item/weapon/storage/lightbox/bulbs")
+ contains = list("/obj/item/weapon/storage/lightbox/mixed",
+ "/obj/item/weapon/storage/lightbox/mixed",
+ "/obj/item/weapon/storage/lightbox/mixed")
cost = 5
containertype = "/obj/structure/closet/crate"
containername = "Replacement lights"
diff --git a/code/defines/obj/toy.dm b/code/defines/obj/toy.dm
index 9011ac00c0d..68746bfc60d 100644
--- a/code/defines/obj/toy.dm
+++ b/code/defines/obj/toy.dm
@@ -241,12 +241,16 @@
user.Weaken(5)
return
-/obj/item/toy/crayonbox
+/obj/item/weapon/storage/crayonbox
name = "box of crayons"
- desc = "A box of crayons for all your drawing needs."
+ desc = "A box of crayons for all your rune drawing needs."
icon = 'crayons.dmi'
icon_state = "crayonbox"
w_class = 2.0
+ storage_slots = 6
+ can_hold = list(
+ "/obj/item/toy/crayon"
+ )
/obj/item/toy/crayon
name = "crayon"
@@ -387,4 +391,64 @@
set src in usr
usr << text("\icon[] [] units of water left!", src, src.reagents.total_volume)
..()
- return
\ No newline at end of file
+ return
+
+/obj/item/toy/balloon
+ name = "water balloon"
+ desc = "A translucent balloon. There's nothing in it."
+ icon = 'toy.dmi'
+ icon_state = "waterballoon-e"
+ item_state = "balloon-empty"
+
+/obj/item/toy/balloon/New()
+ var/datum/reagents/R = new/datum/reagents(10)
+ reagents = R
+ R.my_atom = src
+
+/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob)
+ return
+
+/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob)
+ if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1)
+ A.reagents.trans_to(src, 10)
+ user << "\blue You fill the balloon with the contents of [A]."
+ src.desc = "A translucent balloon with some form of liquid sloshing around in it."
+ src.update_icon()
+ return
+
+/obj/item/toy/balloon/attackby(obj/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/weapon/reagent_containers/glass))
+ if(O.reagents)
+ if(O.reagents.total_volume < 1)
+ user << "The [O] is empty."
+ else if(O.reagents.total_volume >= 1)
+ if(O.reagents.has_reagent("pacid", 1))
+ user << "The acid chews through the balloon!"
+ O.reagents.reaction(user)
+ del(src)
+ else
+ src.desc = "A translucent balloon with some form of liquid sloshing around in it."
+ user << "\blue You fill the balloon with the contents of [O]."
+ O.reagents.trans_to(src, 10)
+ src.update_icon()
+ return
+
+/obj/item/toy/balloon/throw_impact(atom/hit_atom)
+ if(src.reagents.total_volume >= 1)
+ src.visible_message("\red The [src] bursts!","You hear a pop and a splash.")
+ src.reagents.reaction(get_turf(hit_atom))
+ for(var/atom/A in get_turf(hit_atom))
+ src.reagents.reaction(A)
+ src.icon_state = "burst"
+ spawn(5)
+ if(src)
+ del(src)
+ return
+
+/obj/item/toy/balloon/update_icon()
+ if(src.reagents.total_volume >= 1)
+ icon_state = "waterballoon"
+ item_state = "balloon"
+ else
+ icon_state = "waterballoon-e"
+ item_state = "balloon-empty"
\ No newline at end of file
diff --git a/code/defines/obj/vending.dm b/code/defines/obj/vending.dm
index cda3510df6a..648886f8f23 100755
--- a/code/defines/obj/vending.dm
+++ b/code/defines/obj/vending.dm
@@ -153,15 +153,15 @@
name = "cigarette machine"
desc = "If you want to get cancer, might as well do it in style"
icon_state = "cigs"
- product_paths = "/obj/item/weapon/cigpacket;/obj/item/weapon/matchbox"
-// product_amounts = "10;10"
- product_prices = "1;1"
+ product_paths = "/obj/item/weapon/cigpacket;/obj/item/weapon/matchbox;/obj/item/weapon/lighter/random"
+// product_amounts = "10;10;4"
+ product_prices = "1;1;2"
product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
vend_delay = 34
- product_hidden = "/obj/item/weapon/zippo"
+ product_hidden = "/obj/item/weapon/lighter/zippo"
// product_hideamt = "4"
hidden_prices = "2"
- product_coin = "/obj/item/clothing/mask/cigarette/cigar/havanian"
+ product_coin = "/obj/item/clothing/mask/cigarette/cigar/havana"
product_coin_amt = "2"
product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
charge_type = "cigarette"
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 001d7d7944f..e737c29cb4e 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -29,18 +29,59 @@
IsShield()
return 1
+
/obj/item/weapon/nullrod
name = "null rod"
desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of Nar-Sie's followers."
icon_state = "nullrod"
item_state = "nullrod"
flags = FPRINT | ONBELT | TABLEPASS
- force = 15
+ force = 10
throw_speed = 1
throw_range = 4
throwforce = 10
w_class = 1
+/obj/item/weapon/nullrod/attack(mob/M as mob, mob/living/user as mob)
+
+ M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+
+ log_admin("ATTACK: [user] ([user.ckey]) attacked [M] ([M.ckey]) with [src].")
+ message_admins("ATTACK: [user] ([user.ckey]) attacked [M] ([M.ckey]) with [src].")
+ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
+ if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ user << "\red You don't have the dexterity to do this!"
+ return
+
+ if ((user.mutations & CLUMSY) && prob(50))
+ user << "\red The rod slips out of your hand and hits your head."
+ user.take_organ_damage(10)
+ user.Paralyse(20)
+ return
+
+ if (M.stat !=2)
+ if((M.mind in ticker.mode.cult) && prob(33))
+ M << "\red The power of [src] clears your mind of the cult's influence!"
+ user << "\red You wave [src] over [M]'s head and see their eyes become clear, their mind returning to normal."
+ ticker.mode.remove_cultist(M.mind)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] waves [] over []'s head.", user, src, M), 1)
+ else if(prob(10))
+ user << "\red The rod slips in your hand."
+ ..()
+ else
+ user << "\red The rod appears to do nothing."
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] waves [] over []'s head.", user, src, M), 1)
+ return
+
+/obj/item/weapon/nullrod/afterattack(atom/A, mob/user as mob)
+ if (istype(A, /turf/simulated/floor))
+ user << "\blue You hit the floor with the [src]."
+ call(/obj/effect/rune/proc/revealrunes)(src)
+
/*/obj/item/weapon/sord
name = "\improper SORD"
desc = "This thing is so unspeakably shitty you are having a hard time even holding it."
@@ -93,7 +134,7 @@
w_class = 3.0
/obj/item/weapon/rsp
- name = "\improper Rapid-Seed-Producer"
+ name = "\improper Rapid-Seed-Producer (RSP)"
desc = "A device used to rapidly deploy seeds."
icon = 'items.dmi'
icon_state = "rcd"
@@ -289,6 +330,17 @@
throw_speed = 4
throw_range = 20
+/obj/item/weapon/corncob
+ name = "corn cob"
+ desc = "A reminder of meals gone by."
+ icon = 'harvest.dmi'
+ icon_state = "corncob"
+ item_state = "corncob"
+ w_class = 1.0
+ throwforce = 0
+ throw_speed = 4
+ throw_range = 20
+
/obj/item/weapon/soap
name = "soap"
desc = "A cheap bar of soap. Doesn't smell."
@@ -414,15 +466,15 @@
var/heal_burn = 0
/obj/item/stack/medical/bruise_pack
- name = "\improper Roll of Gauze"
- singular_name = "\improper Roll of Gauze"
+ name = "roll of gauze"
+ singular_name = "roll of gauze"
desc = "A roll of gauze for sealing up wounds."
icon_state = "brutepack"
heal_brute = 1
origin_tech = "biotech=1"
/obj/item/stack/medical/bruise_pack/tajaran
- name = "S'rendarr's Hand leaf"
+ name = "\improper S'rendarr's Hand leaf"
singular_name = "S'rendarr's Hand leaf"
desc = "A soft leaf that is rubbed on bruises."
icon = 'harvest.dmi'
@@ -439,7 +491,7 @@
origin_tech = "biotech=1"
/obj/item/stack/medical/ointment/tajaran
- name = "Messa's Tear leaf"
+ name = "\improper Messa's Tear leaf"
singular_name = "Messa's Tear leaf"
desc = "A cold leaf that is rubbed on burns."
icon = 'harvest.dmi'
@@ -528,10 +580,15 @@
var/access = list()
var/registered_name = null
var/assignment = null
- var/obj/item/weapon/photo/PHOTO = null
var/over_jumpsuit = 1 // If set to 0, it won't display on top of the mob's jumpsuit
var/dorm = 0 // determines if this ID has claimed a dorm already
+/obj/item/weapon/card/id/silver
+ name = "identification card"
+ desc = "A silver card which shows honour and dedication."
+ icon_state = "silver"
+ item_state = "silver_id"
+
/obj/item/weapon/card/id/gold
name = "identification card"
desc = "A golden card which shows authority."
@@ -586,18 +643,10 @@
throw_range = 10
flags = ONBELT
-/obj/item/weapon/notebook
+/obj/item/weapon/clipboard/notebook
name = "notebook"
desc = "Holds paper and pens. Feels very noire."
- icon = 'items.dmi'
icon_state = "notebook00"
- var/obj/item/weapon/pen/pen = null
- item_state = "notebook"
- throwforce = 0
- w_class = 2.0
- throw_speed = 3
- throw_range = 10
- flags = ONBELT
#define MAXCOIL 30
/obj/item/weapon/cable_coil
@@ -613,7 +662,7 @@
throw_range = 5
m_amt = 50
g_amt = 20
- flags = TABLEPASS|USEDELAY|FPRINT|CONDUCT
+ flags = TABLEPASS|USEDELAY|FPRINT|CONDUCT | ONBELT
item_state = "coil_red"
/obj/item/weapon/cable_coil/cut
@@ -631,12 +680,22 @@
color = "green"
icon_state = "coil_green"
+/obj/item/weapon/cable_coil/pink
+ color = "pink"
+ icon_state = "coil_pink"
+
+/obj/item/weapon/cable_coil/random/New()
+ color = pick("red","yellow","green","blue","pink")
+ icon_state = "coil_[color]"
+ ..()
+
+
/obj/item/weapon/crowbar
name = "crowbar"
desc = "Used to remove floor tiles."
icon = 'items.dmi'
icon_state = "crowbar"
- flags = FPRINT | TABLEPASS| CONDUCT
+ flags = FPRINT | TABLEPASS| CONDUCT | ONBELT
force = 5.0
throwforce = 7.0
item_state = "wrench"
@@ -821,9 +880,6 @@
m_amt = 400
origin_tech = "magnets=1"
-
-
-
/obj/item/weapon/caution
desc = "Caution! Wet Floor!"
name = "wet floor sign"
@@ -877,9 +933,14 @@
name = "paper - 'Judgement'"
info = "For crimes against the station, the offender is sentenced to:
\n
\n"
+//Please resist giving this to people who have not survived game breaking bugs.
+/*Current recipients:
+Searif: Survived infinite cold bug, body temp was "-nan", still alive.
+eternal248: Found broken and buggy Z-levels 7-12, ended up leading to my discovery of that code and subsequent diking out.
+*/
/obj/item/weapon/paper/certificate
name = "paper - 'Certificate'"
- info = "Due to this person's unique actions in the past, we hereby certify that they are \"Totally Radical\"
----Central Command
This paper has been stamped with the central command rubber stamp.
"
+ info = "Due to this person's unique actions in the past, we hereby certify that they are \"Well Qualified\"
----Central Command
This paper has been stamped with the central command rubber stamp.
"
stamped = list(/obj/item/weapon/stamp/centcom)
overlays = list("paper_stamped_cent")
@@ -1005,7 +1066,7 @@
desc = "Used for screwing."
icon = 'items.dmi'
icon_state = "screwdriver"
- flags = FPRINT | TABLEPASS| CONDUCT
+ flags = FPRINT | TABLEPASS| CONDUCT | ONBELT
force = 5.0
w_class = 1.0
throwforce = 5.0
@@ -1045,7 +1106,7 @@
origin_tech = "magnets=1"
/obj/item/weapon/spellbook
- name = "Spell Book"
+ name = "spell book"
desc = "The legendary book of spells of a wizard."
icon = 'library.dmi'
icon_state ="book"
@@ -1169,6 +1230,12 @@
maxcharge = 500
g_amt = 40
+/obj/item/weapon/cell/secborg
+ name = "\improper Security borg rechargable D battery"
+ origin_tech = "powerstorage=0"
+ maxcharge = 600 //600 max charge / 100 charge per shot = six shots
+ g_amt = 40
+
/obj/item/weapon/cell/high
name = "high-capacity power cell"
origin_tech = "powerstorage=2"
@@ -1195,14 +1262,17 @@
use()
return 1
-/*/obj/item/weapon/cell/potato
- name = "Potato Battery"
+/obj/item/weapon/cell/potato
+ name = "potato battery"
desc = "A rechargable starch based power cell."
- icon = 'harvest.dmi'
- icon_state = "potato_battery"
- maxcharge = 100
+ origin_tech = "powerstorage=1"
+ icon = 'power.dmi' //'harvest.dmi'
+ icon_state = "cell" //"potato_battery"
+ charge = 100
+ maxcharge = 300
m_amt = 0
- g_amt = 0*/
+ g_amt = 0
+ minor_fault = 1
/obj/item/weapon/camera_bug/attack_self(mob/usr as mob)
var/list/cameras = new/list()
@@ -1330,7 +1400,7 @@
name = "tray"
icon = 'food.dmi'
icon_state = "tray"
- desc = "A tray to lay food on."
+ desc = "A metal tray to lay food on."
throwforce = 12.0
throwforce = 10.0
throw_speed = 1
@@ -1435,6 +1505,7 @@
icon = 'surgery.dmi'
icon_state = "drill"
flags = FPRINT | TABLEPASS | CONDUCT
+ force = 15.0
w_class = 1.0
origin_tech = "materials=1;biotech=1"
@@ -1442,7 +1513,7 @@
name = "circular saw"
desc = "For heavy duty cutting."
icon = 'surgery.dmi'
- icon_state = "saw"
+ icon_state = "saw3"
flags = FPRINT | TABLEPASS | CONDUCT
force = 15.0
w_class = 1.0
@@ -1471,7 +1542,7 @@
w_class = 1.0
origin_tech = "biotech=2"
-/*/obj/item/weapon/hatchet
+/obj/item/weapon/hatchet
name = "hatchet"
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
icon = 'weapons.dmi'
@@ -1483,7 +1554,7 @@
throw_speed = 4
throw_range = 4
m_amt = 15000
- origin_tech = "materials=2;combat=1"*/
+ origin_tech = "materials=2;combat=1"
/obj/item/weapon/stamp
desc = "A rubber stamp for stamping important documents."
@@ -1612,7 +1683,6 @@
/obj/item/weapon/pai_cable
desc = "A flexible coated cable with a universal jack on one end."
- desc = "Some spacey cable."
name = "data cable"
icon = 'power.dmi'
icon_state = "wire1"
@@ -1740,7 +1810,7 @@
/obj/item/weapon/stock_parts/capacitor/super
name = "super capacitor"
desc = "A super-high capacity capacitor used in the construction of a variety of devices."
- origin_tech = "powerstorage=3;materials=4"
+ origin_tech = "powerstorage=5;materials=4"
rating = 3
m_amt = 50
g_amt = 50
diff --git a/code/defines/obj/window.dm b/code/defines/obj/window.dm
index 62174ece4f3..5b4bdf29698 100644
--- a/code/defines/obj/window.dm
+++ b/code/defines/obj/window.dm
@@ -23,30 +23,6 @@
/obj/structure/window/basic
icon_state = "window"
-/obj/structure/window/basic/north
- dir = NORTH
-
-/obj/structure/window/basic/east
- dir = EAST
-
-/obj/structure/window/basic/west
- dir = WEST
-
-/obj/structure/window/basic/south
- dir = SOUTH
-
-/obj/structure/window/basic/northwest
- dir = NORTHWEST
-
-/obj/structure/window/basic/northeast
- dir = NORTHEAST
-
-/obj/structure/window/basic/southwest
- dir = SOUTHWEST
-
-/obj/structure/window/basic/southeast
- dir = SOUTHEAST
-
// Reinforced
/obj/structure/window/reinforced
diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm
index dd97fea6c59..fcd244a61f6 100644
--- a/code/defines/procs/gamehelpers.dm
+++ b/code/defines/procs/gamehelpers.dm
@@ -101,60 +101,6 @@
//turfs += centerturf
return turfs
-
-/proc/get_mobs_in_view(var/R, var/atom/source)
- // Returns a list of mobs in range of R from source. Used in radio and say code.
-
- var/turf/T = get_turf(source)
- var/list/hear = hearers(R, T)
- var/list/V = view(R, T)
-
- // Search for closets:
- for(var/obj/structure/closet/C in V)
- for(var/mob/M in C.contents)
- if(M.client)
- hear += M
-
- // Cryos:
- for(var/obj/machinery/atmospherics/unary/cryo_cell/C in V)
- if(C.occupant)
- if(C.occupant.client)
- hear += C.occupant
-
- // Intelicards
- for(var/obj/item/device/aicard/C in V)
- for(var/mob/living/silicon/ai/M in C)
- if(M.client)
- hear += M
-
- // Brains/MMIs/pAIs
- for(var/mob/living/carbon/brain/C in world)
- if(get_turf(C) in V)
- hear += C
- for(var/mob/living/silicon/pai/C in world)
- if(get_turf(C) in V)
- hear += C
-
- // Personal AIs
- for(var/obj/item/device/paicard/C in V)
- if(C.pai)
- if(C.pai.client)
- hear += C.pai
-
- // Exosuits
- for(var/obj/mecha/C in V)
- if(C.occupant)
- if(C.occupant.client)
- hear += C.occupant
-
- // Disposal Machines
- for(var/obj/machinery/disposal/C in V)
- for(var/mob/M in C.contents)
- if(M.client)
- hear += M
-
- return hear
-
/proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj)
var/dx = Loc1.x - Loc2.x
var/dy = Loc1.y - Loc2.y
@@ -189,6 +135,154 @@
turfs += T
return turfs
+
+/proc/get_mobs_in_view(var/R, var/atom/source)
+ // Returns a list of mobs in range of R from source. Used in radio and say code.
+
+ var/turf/T = get_turf(source)
+ var/list/hear = hearers(R, T)
+ var/list/V = range(R, T)
+
+ // Search for closets:
+ for(var/obj/structure/closet/C in V)
+ for(var/mob/M in C.contents)
+ if(isInSight(source,C))
+ if(M.client)
+ hear += M
+
+ // Cryos:
+ for(var/obj/machinery/atmospherics/unary/cryo_cell/C in V)
+ if(C.occupant)
+ if(isInSight(source,C))
+ if(C.occupant.client)
+ hear += C.occupant
+
+ // Intelicards
+ for(var/obj/item/device/aicard/C in V)
+ for(var/mob/living/silicon/ai/M in C)
+ if(isInSight(source,C))
+ if(M.client)
+ hear += M
+
+ // Kind of a hacky fix, but should fix most cases without undo issues.
+ for(var/mob/M as mob in V)
+ for(var/obj/item/device/aicard/C in M.contents)
+ for(var/mob/living/silicon/ai/A in C)
+ if(isInSight(source,A))
+ if(A.client)
+ hear += A
+
+ // Soulstones
+ for(var/obj/item/device/soulstone/C in V)
+ for(var/mob/living/simple_animal/shade/M in C)
+ if(isInSight(source,C))
+ if(M.client)
+ hear += M
+
+ // Kind of a hacky fix, but should fix most cases without undo issues.
+ for(var/mob/M as mob in V)
+ for(var/obj/item/device/soulstone/C in M.contents)
+ for(var/mob/living/simple_animal/shade/A in C)
+ if(isInSight(source,A))
+ if(A.client)
+ hear += A
+
+
+
+ // Brains/MMIs/pAIs
+ for(var/mob/living/carbon/brain/C in world)
+ if(get_turf(C) in V)
+ if(isInSight(source,C))
+ hear += C
+ for(var/mob/living/silicon/pai/C in world)
+ if(get_turf(C) in V)
+ if(isInSight(source,C))
+ hear += C
+
+/* -- Handled above. WHY IS THIS HERE? WHYYYYYYY
+ // Personal AIs
+ for(var/obj/item/device/paicard/C in V)
+ if(C.pai)
+ if(isInSight(source,C))
+ if(C.pai.client)
+ hear += C.pai
+*/
+ // Exosuits
+ for(var/obj/mecha/C in V)
+ if(C.occupant)
+ if(isInSight(source,C))
+ if(C.occupant.client)
+ hear += C.occupant
+
+ // Disposal Machines
+ for(var/obj/machinery/disposal/C in V)
+ for(var/mob/M in C.contents)
+ if(isInSight(source,C))
+ if(M.client)
+ hear += M
+
+ //Borg rechargers
+ for(var/obj/machinery/recharge_station/C in V)
+ if(C.occupant)
+ if(isInSight(source,C))
+ if(C.occupant.client)
+ hear += C.occupant
+
+ for(var/obj/item/device/radio/theradio in V)
+ if(isInSight(source,theradio))
+ hear += theradio
+
+
+
+ return hear
+
+#define SIGN(X) ((X<0)?-1:1)
+
+proc
+ inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
+ var/turf/T
+ if(X1==X2)
+ if(Y1==Y2)
+ return 1 //Light cannot be blocked on same tile
+ else
+ var/s = SIGN(Y2-Y1)
+ Y1+=s
+ while(Y1!=Y2)
+ T=locate(X1,Y1,Z)
+ if(T.opacity)
+ return 0
+ Y1+=s
+ else
+ var
+ m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
+ b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles
+ signX = SIGN(X2-X1)
+ signY = SIGN(Y2-Y1)
+ if(X1")
+ var/list/strip_chars = list("<",">","&","'")
t = copytext(t,1,limit)
for(var/char in strip_chars)
var/index = findtext(t, char)
@@ -910,11 +910,21 @@ Turf and target are seperate in case you want to teleport some distance from a t
if (!the_key)
text += "*no client*"
else
+ var/linked = 1
if (include_link && !isnull(the_mob))
if (istext(include_link))
- text += ""
+ text += ""
else
- text += ""
+ if(ismob(include_link))
+ var/mob/MM = include_link
+ if(MM.client)
+ text += ""
+ else
+ linked = 0
+ else if (istype(include_link, /client))
+ text += ""
+ else
+ linked = 0
if (the_client && the_client.holder && the_client.stealth && !include_name)
text += "Administrator"
@@ -922,7 +932,10 @@ Turf and target are seperate in case you want to teleport some distance from a t
text += "[the_key]"
if (!isnull(include_link) && !isnull(the_mob))
- text += ""
+ if(linked)
+ text += ""
+ else
+ text += " (DC)"
if (include_name && !isnull(the_mob))
if (the_mob.real_name)
@@ -1587,7 +1600,7 @@ proc/get_opposite(var/checkdir)
var/a = copytext(text,i,i+1)
if(a == character)
count++
- return count
+ return count
/proc/reverse_direction(var/dir)
switch(dir)
diff --git a/code/game/algorithm.dm b/code/game/algorithm.dm
index 4a5851d9036..3a6d9407f6d 100644
--- a/code/game/algorithm.dm
+++ b/code/game/algorithm.dm
@@ -191,3 +191,11 @@ proc/countJob(rank)
for(var/mob/living/silicon/ai/M in world)
if ((M.client && M.machine == subject))
subject.attack_ai(M)
+
+/proc/AutoUpdateTK(obj/subject)
+ if (subject!=null)
+ for(var/obj/item/tk_grab/T in world)
+ if (T.host)
+ var/mob/M = T.host
+ if(M.client && M.machine == subject)
+ subject.attack_hand(M)
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index 66a3b259156..563bee56c86 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -127,7 +127,7 @@
if (!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32))
if(!istype(H.dna, /datum/dna))
H.dna = new /datum/dna(null)
- H.check_dna()
+ H.check_dna()
if (H.gloves && H.gloves != src)
if(fingerprintslast != H.key)
fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
@@ -136,7 +136,7 @@
if(H.gloves != src)
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex))
return 0
- else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex))
+ else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex) && !istype(H.gloves, /obj/item/clothing/gloves/fingerless))
return 0
if(fingerprintslast != H.key)
fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
@@ -336,6 +336,7 @@
T.icon = I
else
T.icon = initial(icon)
+
if(blood_DNA && !blood_DNA.len)
del(blood_DNA)
if(src.fingerprints && src.fingerprints.len)
@@ -376,16 +377,10 @@
//world << "atom.Click() on [src] by [usr] : src.type is [src.type]"
if(!istype(src,/obj/item/weapon/gun))
usr.last_target_click = world.time
- var/list/pram = params2list(params)
- if((pram["alt"] != null && pram["ctrl"] != null && pram["left"] != null) && istype(src,/atom/movable))
- src:pull()
- return
- if(pram["ctrl"] != null && pram["left"] != null)
- src.examine()
- return
if(usr.client.buildmode)
build_click(usr, usr.client.buildmode, location, control, params, src)
return
+
if(using_new_click_proc) //TODO ERRORAGE (see message below)
return DblClickNew()
return DblClick(location, control, params)
@@ -694,6 +689,33 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// world << "atom.DblClick() on [src] by [usr] : src.type is [src.type]"
usr:lastDblClick = world.time
+ // ------- DIR CHANGING WHEN CLICKING (changes facting direction) ------
+
+ if( usr && iscarbon(usr) && !usr.buckled )
+ if( src.x && src.y && usr.x && usr.y )
+ var/dx = src.x - usr.x
+ var/dy = src.y - usr.y
+
+ if( dy > 0 && abs(dx) < dy ) //North
+ usr.dir = 1
+ if( dy < 0 && abs(dx) < abs(dy) ) //South
+ usr.dir = 2
+ if( dx > 0 && abs(dy) <= dx ) //East
+ usr.dir = 4
+ if( dx < 0 && abs(dy) <= abs(dx) ) //West
+ usr.dir = 8
+ if( dx == 0 && dy == 0 )
+ if(src.pixel_y > 16)
+ usr.dir = 1
+ if(src.pixel_y < -16)
+ usr.dir = 2
+ if(src.pixel_x > 16)
+ usr.dir = 4
+ if(src.pixel_x < -16)
+ usr.dir = 8
+
+
+
// ------- AI -------
if (istype(usr, /mob/living/silicon/ai))
@@ -707,6 +729,43 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
if (bot.lockcharge) return
..()
+
+
+
+
+
+ // ------- SHIFT-CLICK -------
+
+ var/parameters = params2list(params)
+
+ if(parameters["shift"]){
+ if(!isAI(usr))
+ ShiftClick(usr)
+ else
+ AIShiftClick(usr)
+ return
+ }
+
+ // ------- ALT-CLICK -------
+
+ if(parameters["alt"]){
+ if(!isAI(usr))
+ AltClick(usr)
+ else
+ AIAltClick(usr)
+ return
+ }
+
+ // ------- CTRL-CLICK -------
+
+ if(parameters["ctrl"]){
+ if(!isAI(usr))
+ CtrlClick(usr)
+ else
+ AICtrlClick(usr)
+ return
+ }
+
// ------- THROW -------
if(usr.in_throw_mode)
return usr:throw_item(src)
@@ -965,6 +1024,51 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
del D
return 1
+/atom/proc/CtrlClick(var/mob/M as mob)
+ examine()
+ return
+
+/atom/proc/AltClick()
+ if(hascall(src,"pull"))
+ src:pull()
+ return
+
+/atom/proc/ShiftClick()
+ if(hascall(src,"pull"))
+ src:pull()
+ return
+
+/atom/proc/AIShiftClick() // Opens and closes doors!
+ if(istype(src , /obj/machinery/door/airlock))
+ if(src:density)
+ var/nhref = "src=\ref[src];aiEnable=7"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ else
+ var/nhref = "src=\ref[src];aiDisable=7"
+ src.Topic(nhref, params2list(nhref), src, 1)
+
+ return
+
+/atom/proc/AIAltClick() // Eletrifies doors.
+ if(istype(src , /obj/machinery/door/airlock))
+ if(!src:secondsElectrified)
+ var/nhref = "src=\ref[src];aiEnable=6"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ else
+ var/nhref = "src=\ref[src];aiDisable=5"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ return
+
+/atom/proc/AICtrlClick() // Bolts doors.
+ if(istype(src , /obj/machinery/door/airlock))
+ if(src:locked)
+ var/nhref = "src=\ref[src];aiEnable=4"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ else
+ var/nhref = "src=\ref[src];aiDisable=4"
+ src.Topic(nhref, params2list(nhref), src, 1)
+ return
+
/*/atom/proc/get_global_map_pos()
if(!islist(global_map) || isemptylist(global_map)) return
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 00756a6ed66..86830134bb3 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -841,14 +841,16 @@
src.icon_state = "c_unpowered"
stat |= NOPOWER
-/obj/machinery/scan_consolenew/New()
+/obj/machinery/computer/scan_consolenew/New()
..()
- spawn( 5 )
+ spawn(5)
src.connected = locate(/obj/machinery/dna_scannernew, get_step(src, WEST))
+ spawn(250)
+ src.injectorready = 1
return
return
-/obj/machinery/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob)
+/obj/machinery/computer/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob)
if ((istype(W, /obj/item/weapon/disk/data)) && (!src.diskette))
user.drop_item()
W.loc = src
@@ -856,7 +858,7 @@
user << "You insert [W]."
src.updateUsrDialog()
-/obj/machinery/scan_consolenew/process() //not really used right now
+/obj/machinery/computer/scan_consolenew/process() //not really used right now
processing_objects.Remove(src) //Lets not have it waste CPU
if(stat & (NOPOWER|BROKEN))
return
@@ -864,13 +866,13 @@
return
return
-/obj/machinery/scan_consolenew/attack_paw(user as mob)
+/obj/machinery/computer/scan_consolenew/attack_paw(user as mob)
return src.attack_hand(user)
-/obj/machinery/scan_consolenew/attack_ai(user as mob)
+/obj/machinery/computer/scan_consolenew/attack_ai(user as mob)
return src.attack_hand(user)
-/obj/machinery/scan_consolenew/attack_hand(user as mob)
+/obj/machinery/computer/scan_consolenew/attack_hand(user as mob)
if(..())
return
if(!(user in message))
@@ -931,7 +933,7 @@
onclose(user, "scannernew")
return
-/obj/machinery/scan_consolenew/Topic(href, href_list)
+/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
if(..())
return
if(!istype(usr.loc, /turf))
diff --git a/code/game/events/EventProcs/miniblob.dm b/code/game/events/EventProcs/miniblob.dm
index ed390a2148f..f81fda88197 100644
--- a/code/game/events/EventProcs/miniblob.dm
+++ b/code/game/events/EventProcs/miniblob.dm
@@ -6,7 +6,7 @@
for(var/atom/A in T)
if(A.density)
del(A)
- var/obj/effect/blob/bl = new /obj/effect/blob( T.loc, 30 )
+ var/obj/effect/blob/bl = new /obj/effect/blob( T, 30 )
spawn(0)
bl.Life()
bl.Life()
diff --git a/code/game/events/EventProcs/kudzu.dm b/code/game/events/EventProcs/spacevines.dm
similarity index 51%
rename from code/game/events/EventProcs/kudzu.dm
rename to code/game/events/EventProcs/spacevines.dm
index 17d2215eb85..8f279d51f04 100644
--- a/code/game/events/EventProcs/kudzu.dm
+++ b/code/game/events/EventProcs/spacevines.dm
@@ -1,19 +1,17 @@
-// SPACE VINE OR KUDZU
-
+// SPACE VINES
/obj/effect/spacevine
- name = "Space Kudzu"
+ name = "space vines"
desc = "An extremely expansionistic species of vine."
- icon = 'kudzu.dmi'
+ icon = 'spacevines.dmi'
icon_state = "Light1"
anchored = 1
density = 0
- var/energy = 0 //Energy sounds like an arbitrary-enough variable name.
+ pass_flags = PASSTABLE | PASSGRILLE
+ var/energy = 0
var/obj/effect/spacevine_controller/master = null
New()
- if(istype(src.loc, /turf/space))
- del(src)
- return
+ return
Del()
if(master)
@@ -22,37 +20,65 @@
..()
attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (!W) return
- if (!user) return
- if (istype(W, /obj/item/weapon/circular_saw)) del src
- if (istype(W, /obj/item/weapon/kitchen/utensil/knife)) del src
- if (istype(W, /obj/item/weapon/scalpel)) del src
- if (istype(W, /obj/item/weapon/screwdriver)) del src
- if (istype(W, /obj/item/weapon/shard)) del src
- if (istype(W, /obj/item/weapon/weldingtool)) del src
- if (istype(W, /obj/item/weapon/wirecutters)) del src
+ if (!W || !user || !W.type) return
+ switch(W.type)
+ if(/obj/item/weapon/circular_saw) del src
+ if(/obj/item/weapon/kitchen/utensil/knife) del src
+ if(/obj/item/weapon/scalpel) del src
+ if(/obj/item/weapon/fireaxe) del src
+// if(/obj/item/weapon/hatchet) del src
+ if(/obj/item/weapon/melee/energy) del src
+
+ //less effective weapons
+ if(/obj/item/weapon/wirecutters)
+ if(prob(25)) del src
+ if(/obj/item/weapon/shard)
+ if(prob(25)) del src
+
+ else //weapons with subtypes
+ if(istype(W, /obj/item/weapon/melee/energy/sword)) del src
+ else if(istype(W, /obj/item/weapon/weldingtool))
+ if(W:welding) del src
+ //TODO: add plant-b-gone
..()
+ attack_hand(mob/user as mob)
+ for(var/mob/M in src.loc)
+ if(M.buckled == src)
+ if(prob(50))
+ if(M == user)
+ user << "\red You break free from the vines!"
+ else
+ user << "\red You rip away at the vines and free [M]!"
+ M << "\red [user] frees you from the vines!"
+ M.buckled = null
+ else
+ user << "\red You rip away at the vines..."
+ break //only process one captured mob.
+
+ attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
/obj/effect/spacevine_controller
var/list/obj/effect/spacevine/vines = list()
var/list/growth_queue = list()
var/reached_collapse_size
var/reached_slowdown_size
//What this does is that instead of having the grow minimum of 1, required to start growing, the minimum will be 0,
- //meaning if you get the kudzu's size to something less than 20 plots, it won't grow anymore.
+ //meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore.
New()
if(!istype(src.loc,/turf/simulated/floor))
del(src)
- spawn_kudzu_piece(src.loc)
+ spawn_spacevine_piece(src.loc)
processing_objects.Add(src)
Del()
processing_objects.Remove(src)
..()
- proc/spawn_kudzu_piece(var/turf/location)
+ proc/spawn_spacevine_piece(var/turf/location)
var/obj/effect/spacevine/SV = new(location)
growth_queue += SV
vines += SV
@@ -60,7 +86,7 @@
process()
if(!vines)
- del(src) //Kudzu exterminated
+ del(src) //space vines exterminated. Remove the controller
return
if(!growth_queue)
del(src) //Sanity check
@@ -88,39 +114,47 @@
i++
queue_end += SV
growth_queue -= SV
- if(SV.energy < 2)
- if(prob(10))
+ if(SV.energy < 2) //If tile isn't fully grown
+ if(prob(20))
SV.grow()
+ else //If tile is fully grown
+ SV.grab()
+
//if(prob(25))
SV.spread()
if(i >= length)
break
growth_queue = growth_queue + queue_end
-
//sleep(5)
//src.process()
/obj/effect/spacevine/proc/grow()
- switch(energy)
- if (0)
- src.icon_state = pick("Med1", "Med2", "Med3")
- energy = 1
- src.opacity = 1
- if (1)
- src.icon_state = pick("Hvy1", "Hvy2", "Hvy3")
- energy = 2
- src.density = 1
+ if(!energy)
+ src.icon_state = pick("Med1", "Med2", "Med3")
+ energy = 1
+ src.opacity = 1
+ layer = 5
+ else
+ src.icon_state = pick("Hvy1", "Hvy2", "Hvy3")
+ energy = 2
+
+/obj/effect/spacevine/proc/grab()
+ for(var/mob/living/carbon/V in src.loc)
+ if((V.stat != DEAD) && (V.buckled != src)) //if mob not dead or captured
+ V.buckled = src
+ V << "\red The vines [pick("wind", "tangle")] around you!"
+ break //only capture one mob at a time.
/obj/effect/spacevine/proc/spread()
var/direction = pick(cardinal)
- if(istype(get_step(src,direction),/turf/simulated/floor))
- var/turf/simulated/floor/F = get_step(src,direction)
+ var/step = get_step(src,direction)
+ if(istype(step,/turf/simulated/floor))
+ var/turf/simulated/floor/F = step
if(!locate(/obj/effect/spacevine,F))
if(F.Enter(src))
if(master)
- master.spawn_kudzu_piece( F )
-
+ master.spawn_spacevine_piece( F )
/*
/obj/effect/spacevine/proc/Life()
@@ -169,8 +203,23 @@
if (prob(50))
del(src)
return
- else
return
-/obj/effect/spacevine/temperature_expose(null, temp, volume)
- del src
\ No newline at end of file
+/obj/effect/spacevine/temperature_expose(null, temp, volume) //hotspots kill vines
+ del src
+
+//Carn: Spacevines random event.
+/proc/spacevine_infestation()
+
+ spawn() //to stop the secrets panel hanging
+ var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas
+ for(var/areapath in typesof(/area/hallway))
+ var/area/hallway/A = locate(areapath)
+ for(var/turf/simulated/floor/F in A)
+ if(!F.contents.len)
+ turfs += F
+
+ if(turfs.len) //Pick a turf to spawn at if we can
+ var/turf/simulated/floor/T = pick(turfs)
+ new/obj/effect/spacevine_controller(T) //spawn a controller at turf
+ message_admins("\blue Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm
index 3ed828f6a7e..d8bc72d945d 100644
--- a/code/game/gamemodes/changeling/traitor_chan.dm
+++ b/code/game/gamemodes/changeling/traitor_chan.dm
@@ -2,11 +2,10 @@
name = "traitor+changeling"
config_tag = "traitorchan"
traitors_possible = 3 //hard limit on traitors if scaling is turned off
+ restricted_jobs = list("AI", "Cyborg")
required_players = 20
required_enemies = 2
- uplink_welcome = "Syndicate Uplink Console:"
- uplink_uses = 10
/datum/game_mode/traitor/changeling/announce()
world << "The current game mode is - Traitor+Changeling!"
@@ -14,6 +13,9 @@
/datum/game_mode/traitor/changeling/pre_setup()
+ if(config.protect_roles_from_antagonist)
+ restricted_jobs += protected_jobs
+
var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
for(var/datum/mind/player in possible_changelings)
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index b528394a39d..0cb18c5ca6c 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -9,10 +9,10 @@
/proc/is_convertable_to_cult(datum/mind/mind)
if(!istype(mind)) return 0
- //This makes security unconvertable. *comments out*
-/* for(var/obj/item/weapon/implant/loyalty/L in mind.current)
+/* if(istype(mind.current, /mob/living/carbon/human) && (mind.assigned_role in list("Captain", "Head of Security", "Security Officer", "Detective", "Chaplain", "Warden"))) return 0
+ for(var/obj/item/weapon/implant/loyalty/L in mind.current)
if(L && L.implanted)
- return 0 */
+ return 0*/
return 1
@@ -20,10 +20,14 @@
name = "cult"
config_tag = "cult"
restricted_jobs = list("AI", "Cyborg")
+ protected_jobs = list("Security Officer", "Warden", "Detective", "Captain", "Head of Security")
required_players = 3
required_enemies = 3
recommended_enemies = 4
+ uplink_welcome = "Nar-Sie Uplink Console:"
+ uplink_uses = 10
+
var/datum/mind/sacrifice_target = null
var/finished = 0
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
@@ -40,9 +44,6 @@
var/const/max_cultists_to_start = 4
var/acolytes_survived = 0
- uplink_welcome = "Nar-Sie Uplink Console:"
- uplink_uses = 10
-
/datum/game_mode/cult/announce()
world << "The current game mode is - Cult!"
@@ -50,6 +51,15 @@
/datum/game_mode/cult/pre_setup()
+ if(prob(50) || num_players() < 10) // don't give summon nar-sie if less than 10 people, it's literally impossible in that case!
+ objectives += "survive"
+ objectives += "sacrifice"
+ else
+ objectives += "eldergod"
+ objectives += "sacrifice"
+
+ if(config.protect_roles_from_antagonist)
+ restricted_jobs += protected_jobs
var/list/cultists_possible = get_players_for_role(BE_CULTIST)
for(var/datum/mind/player in cultists_possible)
@@ -64,26 +74,18 @@
cultists_possible -= cultist
cult += cultist
- // don't give summon nar-sie if less than 10 people,
- // it's literally impossible in that case!
- if(prob(50) || num_players() < 10)
- objectives += "survive"
- objectives += "sacrifice"
- else
- objectives += "eldergod"
- objectives += "sacrifice"
-
return (cult.len>0)
/datum/game_mode/cult/post_setup()
modePlayer += cult
if("sacrifice" in objectives)
- var/list/possible_targets = list()
+ var/list/possible_targets = get_unconvertables()
- for(var/mob/living/carbon/human/player in world)
- if(player.mind && !(player.mind in cult))
- possible_targets += player.mind
+ if(!possible_targets.len)
+ for(var/mob/living/carbon/human/player in world)
+ if(player.mind && !(player.mind in cult))
+ possible_targets += player.mind
if(possible_targets.len > 0)
sacrifice_target = pick(possible_targets)
@@ -254,6 +256,14 @@
del(I)
+/datum/game_mode/cult/proc/get_unconvertables()
+ var/list/ucs = list()
+ for(var/mob/living/carbon/human/player in world)
+ if(!is_convertable_to_cult(player.mind))
+ ucs += player.mind
+ return ucs
+
+
/datum/game_mode/cult/proc/check_cult_victory()
var/cult_fail = 0
if(objectives.Find("survive"))
@@ -301,23 +311,30 @@
if("survive")
if(!check_survive())
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. \green Success!"
+ //feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
else
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. \red Failed."
+ //feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
if("sacrifice")
if(!sacrifice_target)
explanation = "Free objective"
else
if(sacrificed.Find(sacrifice_target))
explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.role_alt_title ? sacrifice_target.role_alt_title : sacrifice_target.assigned_role]. \green Success!"
+ //feedback_add_details("cult_objective","cult_sacrifice|SUCCESS")
else if(sacrifice_target && sacrifice_target.current)
explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.role_alt_title ? sacrifice_target.role_alt_title : sacrifice_target.assigned_role]. \red Failed."
+ //feedback_add_details("cult_objective","cult_sacrifice|FAIL")
else
explanation = "Sacrifice Unknown, the Unknown whos body was likely gibbed. \red Failed."
+ //feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
if("eldergod")
if(!eldergod)
explanation = "Summon Nar-Sie. \green Success!"
+ //feedback_add_details("cult_objective","cult_narsie|SUCCESS")
else
explanation = "Summon Nar-Sie. \red Failed."
+ //feedback_add_details("cult_objective","cult_narsie|FAIL")
world << "Objective #[obj_count]: [explanation]"
..()
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 555229335df..b78bf6cae6e 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -33,7 +33,7 @@
/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow;
/obj/item/weapon/melee/energy/sword:4:Energy Sword;
/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle;
-/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades;
+/obj/item/weapon/storage/emp_kit:3:5 EMP Grenades;
Whitespace:Seperator;
Stealthy and Inconspicuous Weapons;
/obj/item/weapon/pen/sleepypen:3:Sleepy Pen;
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 9cef526ae52..3bed4357d8d 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -177,14 +177,13 @@ var/datum/roundinfo/roundinfo = new()
spawn(50)
if (mode.station_was_nuked)
- feedback_set_details("end_proper","nuke")
+ //feedback_set_details("end_proper","nuke")
world << "\blue Rebooting due to destruction of station in [restart_timeout/10] seconds"
else
- feedback_set_details("end_proper","proper completion")
+ //feedback_set_details("end_proper","proper completion")
world << "\blue Restarting in [restart_timeout/10] seconds"
- // send2irc(world.url,"Server Rebooting!")
- feedback_set_details("round_end","[time2text(world.realtime)]")
+
if(blackbox)
blackbox.save_all_data_to_sql()
@@ -199,23 +198,23 @@ var/datum/roundinfo/roundinfo = new()
for (var/mob/living/silicon/ai/aiPlayer in world)
if (aiPlayer.stat != 2)
- world << "[aiPlayer.name]'s laws at the end of the game were:"
+ world << "[aiPlayer.name] (Played by: [aiPlayer.key])'s laws at the end of the game were:"
else
- world << "[aiPlayer.name]'s laws when it was deactivated were:"
+ world << "[aiPlayer.name] (Played by: [aiPlayer.key])'s laws when it was deactivated were:"
aiPlayer.show_laws(1)
if (aiPlayer.connected_robots.len)
var/robolist = "The AI's loyal minions were: "
for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots)
- robolist += "[robo.name][robo.stat?" (Deactivated), ":", "]"
+ robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":", (Played by: [robo.key])"]"
world << "[robolist]"
for (var/mob/living/silicon/robot/robo in world)
if (!robo.connected_ai)
if (robo.stat != 2)
- world << "[robo.name] survived as an AI-less borg! Its laws were:"
+ world << "[robo.name] (Played by: [robo.key]) survived as an AI-less borg! Its laws were:"
else
- world << "[robo.name] was unable to survive the rigors of being a cyborg without an AI. Its laws were:"
+ world << "[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:"
robo.laws.show_laws(world)
mode.declare_completion()//To declare normal completion.
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 7d37ad039e3..3669561f82c 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -42,8 +42,8 @@
world << "Uh oh, its malfunction and there is no AI! Please report this."
world << "Rebooting world in 5 seconds."
- feedback_set_details("end_error","malf - no AI")
- feedback_set_details("round_end","[time2text(world.realtime)]")
+ //feedback_set_details("end_error","malf - no AI")
+
if(blackbox)
blackbox.save_all_data_to_sql()
sleep(50)
@@ -166,6 +166,7 @@
ticker.mode:malf_mode_declared = 1
for(var/datum/mind/AI_mind in ticker.mode:malf_ai)
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/takeover
+ world << sound('aimalf.ogg')
/datum/game_mode/malfunction/proc/ai_win()
@@ -203,37 +204,37 @@
var/crew_evacuated = (emergency_shuttle.location==2)
if ( station_captured && station_was_nuked)
- feedback_set_details("round_end_result","win - AI win - nuke")
+ //feedback_set_details("round_end_result","win - AI win - nuke")
world << "AI Victory"
world << "Everyone was killed by the self-destruct!"
else if ( station_captured && malf_dead && !station_was_nuked)
- feedback_set_details("round_end_result","halfwin - AI killed, staff lost control")
+ //feedback_set_details("round_end_result","halfwin - AI killed, staff lost control")
world << "Neutral Victory"
world << "The AI has been killed! The staff has lose control over the station."
else if ( station_captured && !malf_dead && !station_was_nuked)
- feedback_set_details("round_end_result","win - AI win - no explosion")
+ //feedback_set_details("round_end_result","win - AI win - no explosion")
world << "AI Victory"
world << "The AI has chosen not to explode you all!"
else if (!station_captured && station_was_nuked)
- feedback_set_details("round_end_result","halfwin - everyone killed by nuke")
+ //feedback_set_details("round_end_result","halfwin - everyone killed by nuke")
world << "Neutral Victory"
world << "Everyone was killed by the nuclear blast!"
else if (!station_captured && malf_dead && !station_was_nuked)
- feedback_set_details("round_end_result","loss - staff win")
+ //feedback_set_details("round_end_result","loss - staff win")
world << "Human Victory"
world << "The AI has been killed! The staff is victorious."
else if (!station_captured && !malf_dead && !station_was_nuked && crew_evacuated)
- feedback_set_details("round_end_result","halfwin - evacuated")
+ //feedback_set_details("round_end_result","halfwin - evacuated")
world << "Neutral Victory"
world << "The Corporation has lose [station_name()]! All survived personnel will be fired!"
else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated)
- feedback_set_details("round_end_result","nalfwin - interrupted")
+ //feedback_set_details("round_end_result","nalfwin - interrupted")
world << "Neutral Victory"
world << "Round was mysteriously interrupted!"
..()
diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm
index 76113946fba..94dfc03b75c 100644
--- a/code/game/gamemodes/meteor/meteor.dm
+++ b/code/game/gamemodes/meteor/meteor.dm
@@ -52,8 +52,8 @@
else
survivors[player.real_name] = "alive"
- feedback_set_details("round_end_result","end - evacuation")
- feedback_set("round_end_result",survivors.len)
+ //feedback_set_details("round_end_result","end - evacuation")
+ //feedback_set("round_end_result",survivors.len)
if (survivors.len)
world << "\blue The following survived the meteor attack!"
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 2f86ac6568d..fd090b36c09 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -132,9 +132,9 @@
if(!leader_selected)
prepare_syndicate_leader(synd_mind, nuke_code)
leader_selected = 1
- //else
- //synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]"
- //agent_number++
+/* else
+ synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]"
+ agent_number++*/
equip_syndicate(synd_mind.current,freq)
update_synd_icons_added(synd_mind)
@@ -166,10 +166,10 @@
/datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code)
- // var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
- // spawn(1) // don't change names anymore!
- // NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
- //synd_mind.current.real_name = "[syndicate_name()] [leader_title]"
+/* var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
+ spawn(1)
+ NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
+ synd_mind.current.real_name = "[syndicate_name()] [leader_title]"*/
if (nuke_code)
synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0)
synd_mind.current << "The nuclear authorization code is: [nuke_code]"
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 3e35b675abb..e13d4cd37a2 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -217,8 +217,7 @@
if(!ticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is
world << "Resetting in 30 seconds!"
- feedback_set_details("end_error","nuke - unhandled ending")
- feedback_set_details("round_end","[time2text(world.realtime)]")
+ //feedback_set_details("end_error","nuke - unhandled ending")
if(blackbox)
blackbox.save_all_data_to_sql()
sleep(300)
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 48b434270ca..fa38c98f625 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -11,22 +11,22 @@
var/obj/item/weapon/disk/nuclear/the_disk = null
var/active = 0
+
attack_self()
if(!active)
active = 1
- work()
+ workdisk()
usr << "\blue You activate the pinpointer"
else
active = 0
icon_state = "pinoff"
usr << "\blue You deactivate the pinpointer"
- proc/work()
+ proc/workdisk()
if(!active) return
if(!the_disk)
the_disk = locate()
if(!the_disk)
- active = 0
icon_state = "pinonnull"
return
src.dir = get_dir(src,the_disk)
@@ -41,6 +41,141 @@
icon_state = "pinonfar"
spawn(5) .()
+ examine()
+ ..()
+ for(var/obj/machinery/nuclearbomb/bomb in world)
+ if(bomb.timing)
+ usr << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]"
+
+
+/obj/item/weapon/pinpointer/advpinpointer
+ name = "Advanced Pinpointer"
+ icon = 'device.dmi'
+ desc = "A larger version of the normal pinpointer, this unit features a helpful quantum entanglement detection system to locate various objects that do not broadcast a locator signal."
+ var/mode = 0 // Mode 0 locates disk, mode 1 locates coordinates.
+ var/turf/location = null
+ var/obj/target = null
+
+ attack_self()
+ if(!active)
+ active = 1
+ if(mode == 0)
+ workdisk()
+ if(mode == 1)
+ worklocation()
+ if(mode == 2)
+ workobj()
+ usr << "\blue You activate the pinpointer"
+ else
+ active = 0
+ icon_state = "pinoff"
+ usr << "\blue You deactivate the pinpointer"
+
+
+ proc/worklocation()
+ if(!active)
+ return
+ if(!location)
+ icon_state = "pinonnull"
+ return
+ src.dir = get_dir(src,location)
+ switch(get_dist(src,location))
+ if(0)
+ icon_state = "pinondirect"
+ if(1 to 8)
+ icon_state = "pinonclose"
+ if(9 to 16)
+ icon_state = "pinonmedium"
+ if(16 to INFINITY)
+ icon_state = "pinonfar"
+ spawn(5) .()
+
+
+ proc/workobj()
+ if(!active)
+ return
+ if(!target)
+ icon_state = "pinonnull"
+ return
+ src.dir = get_dir(src,target)
+ switch(get_dist(src,target))
+ if(0)
+ icon_state = "pinondirect"
+ if(1 to 8)
+ icon_state = "pinonclose"
+ if(9 to 16)
+ icon_state = "pinonmedium"
+ if(16 to INFINITY)
+ icon_state = "pinonfar"
+ spawn(5) .()
+
+/obj/item/weapon/pinpointer/advpinpointer/verb/toggle_mode()
+ set category = "Object"
+ set name = "Toggle Pinpointer Mode"
+ set src in view(1)
+
+ active = 0
+ icon_state = "pinoff"
+ target=null
+ location = null
+
+ switch(alert("Please select the mode you want to put the pinpointer in.", "Pinpointer Mode Select", "Location", "Disk Recovery", "Other Signature"))
+ if("Location")
+ mode = 1
+
+ var/locationx = input(usr, "Please input the x coordinate to search for.", "Location?" , "") as num
+ if(!locationx || !(usr in view(1,src)))
+ return
+ var/locationy = input(usr, "Please input the y coordinate to search for.", "Location?" , "") as num
+ if(!locationy || !(usr in view(1,src)))
+ return
+
+ var/turf/Z = get_turf(src)
+
+ location = locate(locationx,locationy,Z.z)
+
+ usr << "You set the pinpointer to locate [locationx],[locationy]"
+
+
+ return attack_self()
+
+ if("Disk Recovery")
+ mode = 0
+ return attack_self()
+
+ if("Other Signature")
+ mode = 2
+ switch(alert("Search for item signature or DNA fragment?" , "Signature Mode Select" , "" , "Item" , "DNA"))
+ if("Item")
+/* var/datum/objective/steal/itemlist
+ itemlist = itemlist // To supress a 'variable defined but not used' error.
+ var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in itemlist.possible_items
+ if(!targetitem)
+ return
+ target=locate(itemlist.possible_items[targetitem])
+ if(!target)
+ usr << "Failed to locate [targetitem]!"
+ return
+ usr << "You set the pinpointer to locate [targetitem]"*/
+ usr << "This doesn't work yet."
+ if("DNA")
+ var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "")
+ if(!DNAstring)
+ return
+ for(var/mob/living/carbon/M in world)
+ if(!M.dna)
+ continue
+ if(M.dna.unique_enzymes == DNAstring)
+ target = M
+ break
+
+ return attack_self()
+
+
+
+
+
+
/*/obj/item/weapon/pinpointer/New()
. = ..()
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 04d534826dd..bf996b30ee1 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -40,6 +40,10 @@
//Gets the round setup, cancelling if there's not enough players at the start//
///////////////////////////////////////////////////////////////////////////////
/datum/game_mode/revolution/pre_setup()
+
+ if(config.protect_roles_from_antagonist)
+ restricted_jobs += protected_jobs
+
var/list/datum/mind/possible_headrevs = get_players_for_role(BE_REV)
var/head_check = 0
diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm
index e6f51b9dacb..f3c83149600 100644
--- a/code/game/gamemodes/sandbox/sandbox.dm
+++ b/code/game/gamemodes/sandbox/sandbox.dm
@@ -15,9 +15,6 @@
for(var/mob/M in world)
if(M.client)
M.CanBuild()
-
-// setup_sectors()
-// spawn_exporation_packs()
return 1
/datum/game_mode/sandbox/check_finished()
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index f2a79377d8d..bb8cc21b11d 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -6,6 +6,7 @@
name = "traitor"
config_tag = "traitor"
restricted_jobs = list("Cyborg", "AI")//Approved by headmins for a week test, if you see this it would be nice if you didn't spread it everywhere
+ protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")
required_players = 0
required_enemies = 1
recommended_enemies = 4
@@ -29,6 +30,10 @@
/datum/game_mode/traitor/pre_setup()
+
+ if(config.protect_roles_from_antagonist)
+ restricted_jobs += protected_jobs
+
var/list/possible_traitors = get_players_for_role(BE_TRAITOR)
// stop setup if no possible traitors
@@ -118,6 +123,7 @@
/datum/game_mode/traitor/declare_completion()
+ ..()
return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder.
@@ -166,15 +172,19 @@
for(var/datum/objective/objective in traitor.objectives)
if(objective.check_completion())
world << "Objective #[count]: [objective.explanation_text] \green Success"
+ //feedback_add_details("traitor_objective","[objective.type]|SUCCESS")
else
world << "Objective #[count]: [objective.explanation_text] \red Failed"
+ //feedback_add_details("traitor_objective","[objective.type]|FAIL")
traitorwin = 0
count++
if(traitorwin)
world << "The [special_role_text] was successful!"
+ //feedback_add_details("traitor_success","SUCCESS")
else
world << "The [special_role_text] has failed!"
+ //feedback_add_details("traitor_success","FAIL")
return 1
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
new file mode 100644
index 00000000000..5bd77a7fdeb
--- /dev/null
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -0,0 +1,54 @@
+
+
+/client/proc/rightandwrong()
+ set category = "Spells"
+ set desc = "Summon Guns"
+ set name = "Wizards: No sense of right and wrong!"
+
+ for(var/mob/living/carbon/human/H in world)
+ if(H.stat == 2 || !(H.client)) continue
+ if(is_special_character(H)) continue
+ if(prob(25))
+ ticker.mode.traitors += H.mind
+ H.mind.special_role = "traitor"
+ var/datum/objective/survive/survive = new
+ survive.owner = H.mind
+ H.mind.objectives += survive
+ H << "You are the survivor! Your own safety matters above all else, trust no one and kill anyone who gets in your way. However, armed as you are, now would be the perfect time to settle that score or grab that pair of yellow gloves you've been eyeing..."
+ var/obj_count = 1
+ for(var/datum/objective/OBJ in H.mind.objectives)
+ H << "Objective #[obj_count]: [OBJ.explanation_text]"
+ obj_count++
+ var/randomize = pick("taser","egun","laser","revolver","smg","decloner","deagle","gyrojet","pulse","silenced","cannon","shotgun","freeze","uzi","crossbow")
+ switch (randomize)
+ if("taser")
+ new /obj/item/weapon/gun/energy/taser(get_turf(H))
+ if("egun")
+ new /obj/item/weapon/gun/energy(get_turf(H))
+ if("laser")
+ new /obj/item/weapon/gun/energy/laser(get_turf(H))
+ if("revolver")
+ new /obj/item/weapon/gun/projectile(get_turf(H))
+ if("smg")
+ new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H))
+ if("decloner")
+ new /obj/item/weapon/gun/energy/decloner(get_turf(H))
+ if("deagle")
+ new /obj/item/weapon/gun/projectile/deagle/camo(get_turf(H))
+ if("gyrojet")
+ new /obj/item/weapon/gun/projectile/gyropistol(get_turf(H))
+ if("pulse")
+ new /obj/item/weapon/gun/energy/pulse_rifle(get_turf(H))
+ if("silenced")
+ new /obj/item/weapon/gun/projectile/silenced(get_turf(H))
+ if("cannon")
+ new /obj/item/weapon/gun/energy/lasercannon(get_turf(H))
+ if("shotgun")
+ new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H))
+ if("freeze")
+ new /obj/item/weapon/gun/energy/temperature(get_turf(H))
+ if("uzi")
+ new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H))
+ if("crossbow")
+ new /obj/item/weapon/gun/energy/crossbow(get_turf(H))
+ usr.verbs -= /client/proc/rightandwrong
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 54c48e838bd..eb313f56493 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -78,7 +78,17 @@
src.icon_state = "soulstone"
attack_self(U)
+///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
+/obj/structure/constructshell
+ name = "empty shell"
+ icon = 'wizard.dmi'
+ icon_state = "construct"
+ desc = "A wicked machine used by those skilled in magical arts. It is inactive"
+ flags = FPRINT | TABLEPASS
+/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/device/soulstone))
+ O.transfer_soul("CONSTRUCT",src,user)
////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
@@ -123,7 +133,7 @@
C.name = "Soul Stone: [S.name]"
S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs."
U << "\blue Capture successful!: \black [T.name]'s soul has been ripped from their body and stored within the soul stone."
- S << "The soulstone has been imprinted with [S.name]'s mind, it will no longer react to other souls."
+ U << "The soulstone has been imprinted with [S.name]'s mind, it will no longer react to other souls."
C.imprinted = "[S.name]"
del T
if("SHADE")
@@ -145,4 +155,50 @@
C.icon_state = "soulstone2"
T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form"
U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone."
- return
\ No newline at end of file
+ if("CONSTRUCT")
+ var/obj/structure/constructshell/T = target
+ var/obj/item/device/soulstone/C = src
+ var/mob/living/simple_animal/shade/A = locate() in C
+ if(A)
+ var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
+ var/mob/living/simple_animal/Z
+ switch(construct_class)
+ if("Juggernaut")
+ Z = new /mob/living/simple_animal/constructarmoured (get_turf(T.loc))
+ if (A.client)
+ A.client.mob = Z
+ del(T)
+ Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike."
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall(Z)
+ Z.cancel_camera()
+ del(C)
+
+ if("Wraith")
+ Z = new /mob/living/simple_animal/constructwraith (get_turf(T.loc))
+ if (A.client)
+ A.client.mob = Z
+ del(T)
+ Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls."
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift(Z)
+ Z.cancel_camera()
+ del(C)
+
+ if("Artificer")
+ Z = new /mob/living/simple_animal/constructbuilder (get_turf(T.loc))
+ if (A.client)
+ A.client.mob = Z
+ del(T)
+ Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs"
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser(Z)
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/wall(Z)
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/floor(Z)
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced(Z)
+ Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone(Z)
+ Z.cancel_camera()
+ del(C)
+ else
+ U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!"
+ return
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 6676196cece..dd3179789a0 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -25,16 +25,21 @@
dat += "Mutate (60)
"
dat += "Ethereal Jaunt (60)
"
dat += "Knock (10)
"
+// if(op)
+// dat += "Summon Guns (One time use, global spell)
"
dat += "
"
dat += "Artefacts:
"
dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of spells.
"
dat += "It is recommended that only experienced wizards attempt to wield such artefacts.
"
dat += "
"
- dat += "Staff of Change
"
+ dat += "Staff of Change
"
dat += "
"
- dat += "Six Soul Stone Shards
"
+ dat += "Six Soul Stone Shards and the spell Artificer
"
dat += "
"
- dat += "Re-memorize Spells
"
+// if(op)
+// dat += "Veil Render
"
+ dat += "
"
+ dat += "Re-memorize Spells
"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
@@ -50,7 +55,7 @@
if ((usr.contents.Find(src) || (in_range(src,usr) && istype(src.loc, /turf))))
usr.machine = src
if(href_list["spell_choice"])
- if(src.uses >= 1 && href_list["spell_choice"] != 16)
+ if(src.uses >= 1 && src.max_uses >=1 && text2num(href_list["spell_choice"]) < 18)
src.uses--
if(spell_type == "verb")
switch(href_list["spell_choice"])
@@ -105,16 +110,24 @@
usr.verbs += /client/proc/knock
usr.mind.special_verbs += /client/proc/knock
src.temp = "This spell opens nearby doors and does not require wizard garb."
- if ("14")
+// if ("14")
+// usr.verbs += /client/proc/rightandwrong
+// src.max_uses--
+// src.temp = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill eachother. Just be careful not to get hit in the crossfire!"
+ if ("15")
new /obj/item/weapon/gun/energy/staff(get_turf(usr))
src.temp = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
src.max_uses--
- if ("15")
+ if ("16")
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(usr))
src.temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying"
src.max_uses--
+// if ("17")
+// new /obj/item/weapon/veilrender(get_turf(usr))
+// src.temp = "Recovered from a shattered temple in what was speculated to be the ruins of an alien capital city, the blade is said to cut more than just the material. There was no trace of the blades creators, nor of any other life left on the dead planet, and what caused such an apocalypse remains a mystery."
+// src.max_uses--
else if(spell_type == "object")
- var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock")
+ var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock","Summon Guns","Staff of Change","Six Soul Stone Shards and the spell Artificer","Veil Render")
var/already_knows = 0
for(var/obj/effect/proc_holder/spell/aspell in usr.spell_list)
if(available_spells[text2num(href_list["spell_choice"])] == aspell.name)
@@ -125,67 +138,79 @@
if(!already_knows)
switch(href_list["spell_choice"])
if ("1")
- feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(usr)
src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage."
if ("2")
- feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/fireball(usr)
src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you."
// if ("3")
+// feedback_add_details("wizard_spell_learned","DG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
// usr.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(usr)
// src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown."
if ("4")
- feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(usr)
src.temp = "This spell disables all weapons, cameras and most other technology in range."
if ("5")
- feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/smoke(usr)
src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb."
if ("6")
- feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/trigger/blind(usr)
src.temp = "This spell temporarly blinds a single person and does not require wizard garb."
if ("7")
- feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(usr)
src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process."
if ("8")
- feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(usr)
src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb."
if ("9")
- feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(usr)
src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience."
if ("10")
- feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(usr)
src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable."
if ("11")
- feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/genetic/mutate(usr)
src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while."
if ("12")
- feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(usr)
src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls."
if ("13")
- feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ //feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(usr)
src.temp = "This spell opens nearby doors and does not require wizard garb."
- if ("14")
- feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+// if ("14")
+// //feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+// usr.verbs += /client/proc/rightandwrong
+// src.max_uses--
+// src.temp = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill eachother. Just be careful not to get hit in the crossfire!"
+ if ("15")
+ //feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/energy/staff(get_turf(usr))
src.temp = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
src.max_uses--
- if ("15")
- feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ if ("16")
+ //feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(usr))
- src.temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying"
+ usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(usr)
+ src.temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot."
src.max_uses--
- if (href_list["spell_choice"] == "16")
+// if ("17")
+// //feedback_add_details("wizard_spell_learned","VR") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+// new /obj/item/weapon/veilrender(get_turf(usr))
+// src.temp = "Recovered from a shattered temple in what was speculated to be the ruins of an alien capital city, the blade is said to cut more than just the material. There was no trace of the blades creators, nor of any other life left on the dead planet, and what caused such an apocalypse remains a mystery.(Activate inhand to trigger its special ability)"
+// src.max_uses--
+ if (href_list["spell_choice"] == "18")
var/area/wizard_station/A = locate()
if(usr in A.contents)
src.uses = src.max_uses
diff --git a/code/game/gamemodes/wizard/veilrender.dm b/code/game/gamemodes/wizard/veilrender.dm
new file mode 100644
index 00000000000..2310b16ff41
--- /dev/null
+++ b/code/game/gamemodes/wizard/veilrender.dm
@@ -0,0 +1,41 @@
+/obj/item/weapon/veilrender
+ name = "veil render"
+ desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city."
+ icon = 'wizard.dmi'
+ icon_state = "render"
+ item_state = "render"
+ flags = FPRINT | TABLEPASS
+ force = 15
+ throwforce = 10
+ w_class = 3
+ var/charged = 1
+
+
+/obj/effect/rend
+ name = "Tear in the fabric of reality"
+ desc = "You should run now"
+ icon = 'biomass.dmi'
+ icon_state = "rift"
+ density = 1
+ unacidable = 1
+ anchored = 1.0
+
+
+/obj/effect/rend/New()
+ spawn(50)
+ new /obj/machinery/singularity/narsie/wizard(get_turf(src))
+ del(src)
+ return
+ return
+
+
+/obj/item/weapon/veilrender/attack_self(mob/user as mob)
+ if(charged == 1)
+ new /obj/effect/rend(get_turf(usr))
+ charged = 0
+ for(var/mob/M in viewers(usr, null))
+ if ((M.client && !( M.blinded )))
+ M.show_message("\red [src] hums with power as [usr] deals a blow to reality itself!")
+ else
+ user << "\red The unearthly energies that powered the blade are now dormant"
+
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 9ae136270a6..2fc32363892 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -183,15 +183,19 @@
for(var/datum/objective/objective in wizard.objectives)
if(objective.check_completion())
world << "Objective #[count]: [objective.explanation_text] \green Success"
+ //feedback_add_details("wizard_objective","[objective.type]|SUCCESS")
else
world << "Objective #[count]: [objective.explanation_text] \red Failed"
+ //feedback_add_details("wizard_objective","[objective.type]|FAIL")
wizardwin = 0
count++
if(wizard.current && wizard.current.stat!=2 && wizardwin)
world << "The wizard was successful!"
+ //feedback_add_details("wizard_success","SUCCESS")
else
world << "The wizard has failed!"
+ //feedback_add_details("wizard_success","FAIL")
return 1
//OTHER PROCS
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index dc513705e96..c37c7937b90 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -174,7 +174,7 @@
if("Geneticist")
return list(access_medical, access_morgue, access_medlab)
if("Station Engineer")
- return list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks)
+ return list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
if("Assistant")
return list()
if("Chaplain")
diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm
index e328aa3a773..af9d8b193cf 100644
--- a/code/game/jobs/job/assistant.dm
+++ b/code/game/jobs/job/assistant.dm
@@ -6,6 +6,7 @@
total_positions = -1
spawn_positions = -1
supervisors = "absolutely everyone"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index e1fa773119e..c5fb2e259cf 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -6,18 +6,24 @@
total_positions = 1
spawn_positions = 1
supervisors = "Nanotrasen officials and Space law"
+ selection_color = "#ccccff"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_norm(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/captain(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/device/pda/captain(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/clothing/head/caphat(H), H.slot_head)
H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(H), H.slot_glasses)
- H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_in_backpack)
+ if(H.backbag == 1)
+ H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_r_hand)
+ else
+ H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H.back), H.slot_in_backpack)
var/datum/organ/external/O = H.organs[pick(H.organs)]
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O)
O.implant += L
@@ -36,17 +42,23 @@
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
+ selection_color = "#ddddff"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/heads/hop(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_norm(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/head_of_personnel(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/heads/hop(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/suit/armor/vest(H), H.slot_wear_suit)
H.equip_if_possible(new /obj/item/clothing/head/helmet(H), H.slot_head)
- H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/gloves/blue(H), H.slot_gloves)
+ if(H.backbag == 1)
+ H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_r_hand)
+ else
+ H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H.back), H.slot_in_backpack)
return 1
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 7149a7550a2..aa294a16ce5 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -1,8 +1,3 @@
-
-
-
-
-
//Food
/datum/job/bartender
title = "Bartender"
@@ -12,18 +7,32 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/clothing/under/rank/bartender(H), H.slot_w_uniform)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_norm(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/clothing/suit/armor/vest(H), H.slot_wear_suit)
- H.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(H), H.slot_in_backpack)
- H.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(H), H.slot_in_backpack)
- H.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(H), H.slot_in_backpack)
- H.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(H), H.slot_in_backpack)
+ H.equip_if_possible(new /obj/item/clothing/under/rank/bartender(H), H.slot_w_uniform)
+
+ if(H.backbag == 1)
+ var/obj/item/weapon/storage/box/Barpack = new /obj/item/weapon/storage/box(H)
+ H.equip_if_possible(Barpack, H.slot_r_hand)
+ new /obj/item/ammo_casing/shotgun/beanbag(Barpack)
+ new /obj/item/ammo_casing/shotgun/beanbag(Barpack)
+ new /obj/item/ammo_casing/shotgun/beanbag(Barpack)
+ new /obj/item/ammo_casing/shotgun/beanbag(Barpack)
+ else
+ H.equip_if_possible(new /obj/item/weapon/storage/box(H), H.slot_in_backpack)
+ H.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(H), H.slot_in_backpack)
+ H.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(H), H.slot_in_backpack)
+ H.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(H), H.slot_in_backpack)
+ H.equip_if_possible(new /obj/item/ammo_casing/shotgun/beanbag(H), H.slot_in_backpack)
+
return 1
@@ -36,6 +45,7 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
@@ -56,6 +66,7 @@
total_positions = 2
spawn_positions = 2
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
@@ -78,6 +89,7 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
@@ -100,6 +112,7 @@
total_positions = 2
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
@@ -120,16 +133,25 @@
total_positions = 3
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_mine (H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_eng(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/miner(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
- H.equip_if_possible(new /obj/item/weapon/crowbar(H), H.slot_in_backpack)
- H.equip_if_possible(new /obj/item/weapon/satchel(H), H.slot_in_backpack)
+ if(H.backbag == 1)
+ H.equip_if_possible(new /obj/item/weapon/storage/box(H), H.slot_r_hand)
+ H.equip_if_possible(new /obj/item/weapon/crowbar(H), H.slot_l_hand)
+ H.equip_if_possible(new /obj/item/weapon/satchel(H), H.slot_l_store)
+ else
+ H.equip_if_possible(new /obj/item/weapon/storage/box(H.back), H.slot_in_backpack)
+ H.equip_if_possible(new /obj/item/weapon/crowbar(H), H.slot_in_backpack)
+ H.equip_if_possible(new /obj/item/weapon/satchel(H), H.slot_in_backpack)
return 1
@@ -144,6 +166,7 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
@@ -172,12 +195,13 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/mime(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/mime(H), H.slot_belt)
@@ -185,8 +209,14 @@
H.equip_if_possible(new /obj/item/clothing/mask/gas/mime(H), H.slot_wear_mask)
H.equip_if_possible(new /obj/item/clothing/head/beret(H), H.slot_head)
H.equip_if_possible(new /obj/item/clothing/suit/suspenders(H), H.slot_wear_suit)
- H.equip_if_possible(new /obj/item/toy/crayon/mime(H), H.slot_in_backpack)
- H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), H.slot_in_backpack)
+ if(H.backbag == 1)
+ H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H), H.slot_r_hand)
+ H.equip_if_possible(new /obj/item/toy/crayon/mime(H), H.slot_l_store)
+ H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), H.slot_l_hand)
+ else
+ H.equip_if_possible(new /obj/item/weapon/storage/box/survival(H.back), H.slot_in_backpack)
+ H.equip_if_possible(new /obj/item/toy/crayon/mime(H), H.slot_in_backpack)
+ H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), H.slot_in_backpack)
H.verbs += /client/proc/mimespeak
H.verbs += /client/proc/mimewall
H.mind.special_verbs += /client/proc/mimespeak
@@ -205,6 +235,7 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
@@ -226,6 +257,7 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
@@ -246,11 +278,11 @@ var/global/lawyer = 0//Checks for another lawyer
total_positions = 2
spawn_positions = 2
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
if(!lawyer)
lawyer = 1
H.equip_if_possible(new /obj/item/clothing/under/lawyer/bluesuit(H), H.slot_w_uniform)
@@ -260,7 +292,6 @@ var/global/lawyer = 0//Checks for another lawyer
H.equip_if_possible(new /obj/item/clothing/suit/lawyer/purpjacket(H), H.slot_wear_suit)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/lawyer(H), H.slot_belt)
- H.equip_if_possible(new /obj/item/device/detective_scanner(H), H.slot_in_backpack)//Why do they even get this?
H.equip_if_possible(new /obj/item/weapon/storage/briefcase(H), H.slot_l_hand)
return 1
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index 53e620c38b6..6f66f194b5b 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -7,6 +7,7 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
+ selection_color = "#dddddd"
alt_titles = list("Counselor")
@@ -48,6 +49,7 @@
B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
else
B.name = "The Holy Book of [new_religion]"
+// feedback_set_details("religion_name","[new_religion]")
spawn(1)
var/deity_name = "Space Jesus"
@@ -66,10 +68,12 @@
var/outoftime = 0
spawn(200) // 20 seconds to choose
outoftime = 1
+ var/new_book_style = "Bible"
+
while(!accepted)
if(!B) break // prevents possible runtime errors
-
- switch(input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon"))
+ new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon")
+ switch(new_book_style)
if("Koran")
B.icon_state = "koran"
B.item_state = "koran"
@@ -141,4 +145,6 @@
ticker.Bible_icon_state = B.icon_state
ticker.Bible_item_state = B.item_state
ticker.Bible_name = B.name
+// feedback_set_details("religion_deity","[new_deity]")
+// feedback_set_details("religion_book","[new_book_style]")
return 1
\ No newline at end of file
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index e17f99c932e..df37a83acd8 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -6,12 +6,15 @@
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
+ selection_color = "#ffeeaa"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/heads/ce(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial (H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_eng(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/chief_engineer(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/device/pda/heads/ce(H), H.slot_l_store)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
@@ -48,18 +51,21 @@
total_positions = 5
spawn_positions = 5
supervisors = "the chief engineer"
+ selection_color = "#fff5cc"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_eng(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial(H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/industrial(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_eng(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/engineer(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/orange(H), H.slot_shoes)
- H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_l_store)
- H.equip_if_possible(new /obj/item/clothing/head/helmet/hardhat(H), H.slot_head)
H.equip_if_possible(new /obj/item/weapon/storage/belt/utility/full(H), H.slot_belt)
+ H.equip_if_possible(new /obj/item/clothing/head/helmet/hardhat(H), H.slot_head)
H.equip_if_possible(new /obj/item/device/t_scanner(H), H.slot_r_store)
+ H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_l_store)
return 1
@@ -72,17 +78,24 @@
total_positions = 2
spawn_positions = 2
supervisors = "the chief engineer"
+ selection_color = "#fff5cc"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_eng(H), H.slot_ears)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_norm(H), H.slot_back)
H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
- H.equip_if_possible(new /obj/item/weapon/storage/box/engineer(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/clothing/under/rank/atmospheric_technician(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
- H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_belt)
- H.equip_if_possible(new /obj/item/weapon/storage/toolbox/mechanical(H), H.slot_l_hand)
+ H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_l_store)
+ H.equip_if_possible(new /obj/item/weapon/storage/belt/utility/atmostech/(H), H.slot_belt)
+ if(H.backbag == 1)
+ H.equip_if_possible(new /obj/item/weapon/storage/box/engineer(H), H.slot_r_hand)
+ else
+ H.equip_if_possible(new /obj/item/weapon/storage/box/engineer(H.back), H.slot_in_backpack)
return 1
@@ -95,11 +108,14 @@
total_positions = 1
spawn_positions = 1
supervisors = "the chief engineer and research director"
+ selection_color = "#fff5cc"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_if_possible(new /obj/item/device/radio/headset/headset_eng(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ H.equip_if_possible(new /obj/item/device/radio/headset/headset_rob(H), H.slot_ears)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_norm(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/roboticist(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/engineering(H), H.slot_belt)
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index 7a005104b9b..217e5e7e087 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -22,6 +22,9 @@
//Supervisors, who this person answers to directly
var/supervisors = ""
+ //Sellection screen color
+ var/selection_color = "#ffffff"
+
//List of alternate titles, if any
var/list/alt_titles
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index ec5bf5afa7e..5a4220828dc 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -6,12 +6,15 @@
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
+ selection_color = "#ffddf0"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/heads/cmo(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_med(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/chief_medical_officer(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/heads/cmo(H), H.slot_belt)
@@ -31,13 +34,20 @@
total_positions = 5
spawn_positions = 3
supervisors = "the chief medical officer"
+ selection_color = "#ffeef0"
alt_titles = list("Virologist", "Surgeon", "Emergency Medical Technician")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_med(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4)
+ if(alt_titles == "Virologist")
+ H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_vir(H), H.slot_back)
+ else
+ H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_med(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/medical(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/white(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/medical(H), H.slot_belt)
@@ -57,12 +67,15 @@
total_positions = 1
spawn_positions = 1
supervisors = "the chief medical officer and research director"
+ selection_color = "#ffeef0"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_medsci(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_gen(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/geneticist(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/white(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/medical(H), H.slot_belt)
@@ -80,17 +93,19 @@
total_positions = 1
spawn_positions = 1
supervisors = "the chief medical officer and research director"
+ selection_color = "#ffeef0"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_if_possible(new /obj/item/device/radio/headset/headset_med(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
- H.equip_if_possible(new /obj/item/clothing/under/rank/medical(H), H.slot_w_uniform)
+ H.equip_if_possible(new /obj/item/device/radio/headset/headset_medsci(H), H.slot_ears)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/medic (H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ H.equip_if_possible(new /obj/item/clothing/under/rank/virologist(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/device/pda/medical(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/mask/surgical(H), H.slot_wear_mask)
H.equip_if_possible(new /obj/item/clothing/shoes/white(H), H.slot_shoes)
- H.equip_if_possible(new /obj/item/clothing/suit/storage/labcoat/virologist(H), H.slot_wear_suit)
+ H.equip_if_possible(new /obj/item/clothing/suit/labcoat/virologist(H), H.slot_wear_suit)
H.equip_if_possible(new /obj/item/device/flashlight/pen(H), H.slot_s_store)
return 1
*/
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 3eedd80b16a..d3eb18db922 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -6,6 +6,7 @@
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
+ selection_color = "#ffddff"
equip(var/mob/living/carbon/human/H)
@@ -28,11 +29,15 @@
total_positions = 5
spawn_positions = 3
supervisors = "the research director"
+ selection_color = "#ffeeff"
alt_titles = list("Plasma Researcher", "Xenobiologist")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_tox(H), H.slot_back)
H.equip_if_possible(new /obj/item/device/radio/headset/headset_sci(H), H.slot_ears)
H.equip_if_possible(new /obj/item/clothing/under/rank/scientist(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/white(H), H.slot_shoes)
@@ -43,7 +48,7 @@
return 1
-
+//Chemist is a medical job damnit
/datum/job/chemist
title = "Chemist"
flag = CHEMIST
@@ -52,10 +57,14 @@
total_positions = 1
spawn_positions = 1
supervisors = "the chief medical officer and the research director"
+ selection_color = "#ffeeff"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_chem(H), H.slot_back)
H.equip_if_possible(new /obj/item/device/radio/headset/headset_medsci(H), H.slot_ears)
H.equip_if_possible(new /obj/item/clothing/under/rank/chemist(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/white(H), H.slot_shoes)
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index c7945cda4f7..364508ee048 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -6,11 +6,14 @@
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
+ selection_color = "#ffdddd"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/security (H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/security (H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_sec(H), H.slot_back)
H.equip_if_possible(new /obj/item/device/radio/headset/heads/hos(H), H.slot_ears)
H.equip_if_possible(new /obj/item/clothing/under/rank/head_of_security(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/suit/storage/armourrigvest(H), H.slot_wear_suit)
@@ -40,12 +43,15 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of security"
+ selection_color = "#ffeeee"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_sec(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/security(H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/security(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_sec(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/warden(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/jackboots(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/security(H), H.slot_belt)
@@ -72,13 +78,16 @@
total_positions = 1
spawn_positions = 1
supervisors = "the head of security"
+ selection_color = "#ffeeee"
alt_titles = list("Forensic Technician")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_sec(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_norm(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/det(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/suit/storage/det_suit(H), H.slot_wear_suit)
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
@@ -93,7 +102,7 @@
H.equip_if_possible(new /obj/item/weapon/fcardholder(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/device/detective_scanner(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/drinks/dflask(H.back), H.slot_in_backpack)
- H.equip_if_possible(new /obj/item/weapon/zippo(H), H.slot_l_store)
+ H.equip_if_possible(new /obj/item/weapon/lighter/zippo(H), H.slot_l_store)
// H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/snacks/candy_corn(H), H.slot_h_store)
// No... just no. --SkyMarshal
var/datum/organ/external/O = H.organs[pick(H.organs)]
@@ -113,12 +122,15 @@
total_positions = 5
spawn_positions = 5
supervisors = "the head of security"
+ selection_color = "#ffeeee"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_if_possible(new /obj/item/device/radio/headset/headset_sec(H), H.slot_ears)
- H.equip_if_possible(new /obj/item/weapon/storage/backpack/security(H), H.slot_back)
+ if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack/security(H), H.slot_back)
+ if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
+ if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_sec(H), H.slot_back)
H.equip_if_possible(new /obj/item/clothing/under/rank/security(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/shoes/jackboots(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/security(H), H.slot_belt)
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index d91b4f89d92..1b608e200dc 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -5,6 +5,7 @@
faction = "Station"
total_positions = 0
spawn_positions = 1
+ selection_color = "#ccffcc"
supervisors = "your laws"
@@ -22,6 +23,7 @@
total_positions = 0
spawn_positions = 1
supervisors = "your laws and the AI" //Nodrak
+ selection_color = "#ddffdd"
equip(var/mob/living/carbon/human/H)
if(!H) return 0
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index cf2f443dcff..46502b1e550 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -4,7 +4,7 @@ var/global/datum/controller/occupations/job_master
var
//List of all jobs
list/occupations = list()
- list/occupations2 = list()
+ list/occupations2 = list() // Prevents problems with latejoiners.
//Players who need jobs
list/unassigned = list()
//Debug info
@@ -28,6 +28,8 @@ var/global/datum/controller/occupations/job_master
if(!job) continue
if(job.faction != faction) continue
occupations += job
+
+
return 1
@@ -162,6 +164,8 @@ var/global/datum/controller/occupations/job_master
unassigned = shuffle(unassigned)
occupations2 = shuffle(occupations)
+ //HandleFeedbackGathering()
+
//Assistants are checked first
Debug("DO, Running Assistant Check 1")
var/datum/job/assist = new /datum/job/assistant()
@@ -188,9 +192,12 @@ var/global/datum/controller/occupations/job_master
for(var/level = 1 to 3)
for(var/datum/job/job in occupations2)
Debug("Checking job: [job]")
- if(!job) continue
- if(!unassigned.len) break
- if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) continue
+ if(!job)
+ continue
+ if(!unassigned.len)
+ break
+ if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1)
+ continue
var/list/candidates = FindOccupationCandidates(job, level)
while(candidates.len && ((job.current_positions < job.spawn_positions) || job.spawn_positions == -1))
var/mob/new_player/candidate = pick(candidates)
@@ -244,9 +251,26 @@ var/global/datum/controller/occupations/job_master
// make sure we don't already have one on 1 ear :p
if(!istype(H.r_ear,/obj/item/device/radio/headset) && !istype(H.l_ear,/obj/item/device/radio/headset))
H.equip_if_possible(new /obj/item/device/radio/headset(H), H.slot_ears)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack(H)
- H.equip_if_possible(BPK, H.slot_back,1)
- H.equip_if_possible(new /obj/item/weapon/storage/box(H.back), H.slot_in_backpack)
+
+ if(H.mind && H.mind.assigned_role != "Cyborg" && H.mind.assigned_role != "AI" && H.mind.assigned_role != "Clown")
+ if(H.backbag == 1) //Clown always gets his backbuddy.
+ H.equip_if_possible(new /obj/item/weapon/storage/box(H), H.slot_r_hand)
+
+ if(H.backbag == 2)
+ var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack(H)
+ new /obj/item/weapon/storage/box(BPK)
+ H.equip_if_possible(BPK, H.slot_back,1)
+
+ if(H.backbag == 3)
+ var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel(H)
+ new /obj/item/weapon/storage/box(BPK)
+ H.equip_if_possible(BPK, H.slot_back,1)
+
+ if(H.backbag == 4)
+ var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel_norm(H)
+ new /obj/item/weapon/storage/box(BPK)
+ H.equip_if_possible(BPK, H.slot_back,1)
+
//Give'em glasses if they are nearsighted
if(H.disabilities & 1)
var/equipped = H.equip_if_possible(new /obj/item/clothing/glasses/regular(H), H.slot_glasses)
@@ -277,7 +301,7 @@ var/global/datum/controller/occupations/job_master
if(!H.equip_if_possible(new /obj/item/weapon/pen(H), H.slot_r_store))
H.equip_if_possible(new /obj/item/weapon/pen(H), H.slot_ears)
H.equip_if_possible(new /obj/item/device/pda(H), H.slot_belt)
- if(locate(/obj/item/device/pda,H))//I bet this could just use locate
+ if(locate(/obj/item/device/pda,H))//I bet this could just use locate. It can --SkyMarshal
var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
pda.owner = H.real_name
pda.ownjob = H.wear_id.assignment
@@ -327,4 +351,32 @@ var/global/datum/controller/occupations/job_master
if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now
J.total_positions = 0
- return 1
\ No newline at end of file
+ return 1
+
+/*
+ proc/HandleFeedbackGathering()
+ for(var/datum/job/job in occupations)
+ var/tmp_str = "|[job.title]|"
+
+ var/level1 = 0 //high
+ var/level2 = 0 //medium
+ var/level3 = 0 //low
+ var/level4 = 0 //never
+ var/level5 = 0 //banned
+ for(var/mob/new_player/player in world)
+ if(!((player) && (player.client) && (player.ready) && (player.mind) && (!player.mind.assigned_role)))
+ continue //This player is not ready
+ if(jobban_isbanned(player, job.title))
+ level5++
+ continue
+ if(player.preferences.GetJobDepartment(job, 1) & job.flag)
+ level1++
+ else if(player.preferences.GetJobDepartment(job, 2) & job.flag)
+ level2++
+ else if(player.preferences.GetJobDepartment(job, 3) & job.flag)
+ level3++
+ else level4++ //not selected
+
+ tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|-"
+ feedback_add_details("job_preferences",tmp_str)
+*/
\ No newline at end of file
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index a5a9950441e..afb73392adf 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -69,12 +69,11 @@ obj/machinery/door/airlock
. = ..()
if(!surpress_send) send_status()
- proc
- set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- if(new_frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
+ proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ if(new_frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
initialize()
if(frequency)
@@ -140,11 +139,10 @@ obj/machinery/airlock_sensor
update_icon()
- proc
- set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
+ proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
initialize()
set_frequency(frequency)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 4279110d627..22cb14661fe 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -58,10 +58,10 @@
else
icon_state = "[color]"
if(holding)
- overlays += image('atmos.dmi', "can-open")
+ overlays += "can-open"
if(connected_port)
- overlays += image('atmos.dmi', "can-connector")
+ overlays += "can-connector"
var/tank_pressure = air_contents.return_pressure()
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 4c83f8a76fb..f718d8ba034 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -19,6 +19,12 @@
else
icon_state = "psiphon:0"
+ if(holding)
+ overlays += "siphon-open"
+
+ if(connected_port)
+ overlays += "siphon-connector"
+
return
/obj/machinery/portable_atmospherics/pump/process()
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index cec39215e6b..c3ea2164a1d 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -39,6 +39,12 @@
else
icon_state = "pscrubber:0"
+ if(holding)
+ overlays += "scrubber-open"
+
+ if(connected_port)
+ overlays += "scrubber-connector"
+
return
/obj/machinery/portable_atmospherics/scrubber/process()
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index 1a852e33b25..5a5ac4b8cf0 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -57,6 +57,16 @@
healthcheck()
+/obj/machinery/bot/attack_animal(var/mob/living/simple_animal/M as mob)
+ if(M.melee_damage_upper == 0) return
+ src.health -= M.melee_damage_upper
+ src.visible_message("\red [M] has [M.attacktext] [src]!")
+ if(prob(10))
+ new /obj/effect/decal/cleanable/oil(src.loc)
+ healthcheck()
+
+
+
/obj/machinery/bot/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/screwdriver))
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index d559dc6ea47..7484273b4de 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -319,6 +319,7 @@ text("[src.oddbutton ? "Yes" : "No"
target_types += /obj/effect/decal/cleanable/xenoblood/xgibs
target_types += /obj/effect/decal/cleanable/blood/
target_types += /obj/effect/decal/cleanable/blood/gibs/
+ target_types += /obj/effect/decal/cleanable/dirt
/obj/machinery/bot/cleanbot/proc/clean(var/obj/effect/decal/cleanable/target)
src.anchored = 1
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index eabfdd003ab..17239407b6e 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -51,7 +51,7 @@
if(!charging || (stat & (BROKEN|NOPOWER)) )
return
- var/added = charging.give(500)
+ var/added = charging.give(75)
use_power(added / CELLRATE)
updateicon()
\ No newline at end of file
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 726bc8a9899..038e89d5568 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -20,23 +20,6 @@
var/attempting = 0 //One clone attempt at a time thanks
var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk
-/obj/machinery/computer/cloning
- name = "Cloning console"
- icon = 'computer.dmi'
- icon_state = "dna"
- circuit = "/obj/item/weapon/circuitboard/cloning"
- req_access = list(access_heads) //Only used for record deletion right now.
- var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
- var/obj/machinery/clonepod/pod1 = null //Linked cloning pod.
- var/temp = "Initializing System..."
- var/menu = 1 //Which menu screen to display
- var/list/records = list()
- var/datum/data/record/active_record = null
- var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything.
- var/wantsscan = 1
- var/wantspod = 1
- var/list/message = list()
-
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
/obj/item/weapon/disk/data
@@ -64,375 +47,6 @@
data = "0983E840344C39F4B059D5145FC5785DC6406A4FFF"
read_only = 1
-/obj/machinery/computer/cloning/New()
- ..()
- spawn(5)
- updatemodules()
- /*src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir))
- src.pod1 = locate(/obj/machinery/clonepod, get_step(src, poddir))
-
- src.temp = ""
- if (isnull(src.scanner) && wantsscan)
- src.temp += " SCNR-ERROR"
- if (isnull(src.pod1) && wantspod)
- src.temp += " POD1-ERROR"
- else if (wantspod)
- src.pod1.connected = src
-
- if (src.temp == "")
- src.temp = "System ready."*/
- return
- return
-
-/obj/machinery/computer/cloning/proc/updatemodules()
- //world << "UPDATING MODULES"
- src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST))
- src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST))
- //world << "SEARCHING FOR MACHEIN"
- //src.temp = ""
- //if (isnull(src.scanner))
- // src.temp += " SCNR-ERROR"
- if (!isnull(src.pod1) && !wantspod)
- src.pod1.connected = src
- // src.temp += " POD1-ERROR"
- //else
-
- //if (src.temp == "")
- // src.temp = "System ready."
-
-/obj/machinery/computer/cloning/proc/findscanner()
- //..()
- //world << "SEARCHING FOR SCANNER"
- var/obj/machinery/dna_scannernew/scannerf = null
- for(dir in list(1,2,4,8,5,6,9,10))
- //world << "SEARCHING IN [dir]"
- scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
- if (!isnull(scannerf))
- //world << "FOUND"
- break
- if(isnull(scannerf) && wantsscan)
- src.temp += " SCNR-ERROR"
- return scannerf
-
-/obj/machinery/computer/cloning/proc/findcloner()
- //..()
- //world << "SEARCHING FOR POD"
- var/obj/machinery/clonepod/podf = null
- for(dir in list(1,2,4,8,5,6,9,10))
- //world << "SEARCHING IN [dir]"
- podf = locate(/obj/machinery/clonepod, get_step(src, dir))
- if (!isnull(podf))
- //world << "FOUND"
- break
- if(isnull(podf) && wantspod)
- src.temp += " POD1-ERROR"
- return podf
-
-/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
- if (!src.diskette)
- user.drop_item()
- W.loc = src
- src.diskette = W
- user << "You insert [W]."
- src.updateUsrDialog()
- return
- else
- ..()
- return
-
-/obj/machinery/computer/cloning/attack_paw(mob/user as mob)
- return attack_hand(user)
-
-/obj/machinery/computer/cloning/attack_ai(mob/user as mob)
- return attack_hand(user)
-
-/obj/machinery/computer/cloning/attack_hand(mob/user as mob)
- if(!(user in message))
- user << "\blue This machine looks extremely complex. You'd probably need a decent knowledge of Genetics to understand it."
- message += user
- user.machine = src
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER))
- return
-
- updatemodules()
- var/dat = "Cloning System Control
"
- dat += "Refresh"
-
- dat += "
[temp]
"
-
- switch(src.menu)
- if(1)
- if(wantsscan)
- dat += "Scanner Functions
"
-
- if (isnull(src.scanner))
- dat += "No scanner connected!"
- else
- if (src.scanner.occupant)
- dat += "Scan - [src.scanner.occupant]"
- else
- dat += "Scanner unoccupied"
-
- dat += "
Lock status: [src.scanner.locked ? "Locked" : "Unlocked"]"
-
- dat += "Database Functions
"
- dat += "View Records
"
- if (src.diskette)
- dat += "Eject Disk"
-
-
- if(2)
- dat += "Current records
"
- dat += "Back
"
- for(var/datum/data/record/R in geneticsrecords)
- dat += "[R.fields["id"]]-[R.fields["name"]]
"
-
- if(3)
- dat += "Selected Record
"
- dat += "Back
"
-
- if (!src.active_record)
- dat += "ERROR: Record not found."
- else
- dat += "
Delete Record
"
- dat += "Name: [src.active_record.fields["name"]]
"
-
- var/obj/item/weapon/implant/health/H = locate(src.active_record.fields["imp"])
-
- if ((H) && (istype(H)))
- dat += "Health: [H.sensehealth()] | OXY-BURN-TOX-BRUTE
"
- else
- dat += "Unable to locate implant.
"
-
- if (!isnull(src.diskette))
- dat += "Load from disk."
-
- dat += " | Save: UI + UE"
- dat += " | Save: UI"
- dat += " | Save: SE"
- dat += "
"
- else
- dat += "
" //Keeping a line empty for appearances I guess.
-
- dat += {"UI: [src.active_record.fields["UI"]]
- SE: [src.active_record.fields["SE"]]
"}
- if(wantspod)
- dat += "Clone
"
-
- if(4)
- if (!src.active_record)
- src.menu = 2
- dat = "[src.temp]
"
- dat += "Confirm Record Deletion
"
-
- dat += "Scan card to confirm.
"
- dat += "No"
-
-
- user << browse(dat, "window=cloning")
- onclose(user, "cloning")
- return
-
-/obj/machinery/computer/cloning/Topic(href, href_list)
- if(..())
- return
-
- if ((href_list["scan"]) && (!isnull(src.scanner)))
- src.scan_mob(src.scanner.occupant)
-
- //No locking an open scanner.
- else if ((href_list["lock"]) && (!isnull(src.scanner)))
- if ((!src.scanner.locked) && (src.scanner.occupant))
- src.scanner.locked = 1
- else
- src.scanner.locked = 0
-
- else if (href_list["view_rec"])
- src.active_record = locate(href_list["view_rec"])
- if ((isnull(src.active_record.fields["ckey"])) || (src.active_record.fields["ckey"] == ""))
- del(src.active_record)
- src.temp = "ERROR: Record Corrupt"
- else
- src.menu = 3
-
- else if (href_list["del_rec"])
- if ((!src.active_record) || (src.menu < 3))
- return
- if (src.menu == 3) //If we are viewing a record, confirm deletion
- src.temp = "Delete record?"
- src.menu = 4
-
- else if (src.menu == 4)
- var/obj/item/weapon/card/id/C = usr.equipped()
- if (istype(C)||istype(C, /obj/item/device/pda))
- if(src.check_access(C))
- geneticsrecords.Remove(src.active_record)
- del(src.active_record)
- src.temp = "Record deleted."
- src.menu = 2
- else
- src.temp = "Access Denied."
-
- else if (href_list["disk"]) //Load or eject.
- switch(href_list["disk"])
- if("load")
- if ((isnull(src.diskette)) || (src.diskette.data == ""))
- src.temp = "Load error."
- src.updateUsrDialog()
- return
- if (isnull(src.active_record))
- src.temp = "Record error."
- src.menu = 1
- src.updateUsrDialog()
- return
-
- if (src.diskette.data_type == "ui")
- src.active_record.fields["UI"] = src.diskette.data
- if (src.diskette.ue)
- src.active_record.fields["name"] = src.diskette.owner
- else if (src.diskette.data_type == "se")
- src.active_record.fields["SE"] = src.diskette.data
-
- src.temp = "Load successful."
- if("eject")
- if (!isnull(src.diskette))
- src.diskette.loc = src.loc
- src.diskette = null
-
- else if (href_list["save_disk"]) //Save to disk!
- if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record)))
- src.temp = "Save error."
- src.updateUsrDialog()
- return
-
- switch(href_list["save_disk"]) //Save as Ui/Ui+Ue/Se
- if("ui")
- src.diskette.data = src.active_record.fields["UI"]
- src.diskette.ue = 0
- src.diskette.data_type = "ui"
- if("ue")
- src.diskette.data = src.active_record.fields["UI"]
- src.diskette.ue = 1
- src.diskette.data_type = "ui"
- if("se")
- src.diskette.data = src.active_record.fields["SE"]
- src.diskette.ue = 0
- src.diskette.data_type = "se"
- src.diskette.owner = src.active_record.fields["name"]
- src.diskette.name = "data disk - '[src.diskette.owner]'"
- src.temp = "Save \[[href_list["save_disk"]]\] successful."
-
- else if (href_list["refresh"])
- src.updateUsrDialog()
-
- else if (href_list["clone"])
- var/datum/data/record/C = locate(href_list["clone"])
- //Look for that player! They better be dead!
- if(C)
- var/mob/selected = find_dead_player("[C.fields["ckey"]]")
- var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No")
- if(answer == "No")
- selected = null
-//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
- if ((!selected) || (!src.pod1) || (src.pod1.occupant) || (src.pod1.mess) || !config.revival_cloning)
- src.temp = "Unable to initiate cloning cycle." // most helpful error message in THE HISTORY OF THE WORLD
- else if (src.pod1.growclone(selected, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"],C.fields["original"]))
- src.temp = "Cloning cycle activated."
- geneticsrecords.Remove(C)
- del(C)
- src.menu = 1
-
- else if (href_list["menu"])
- src.menu = text2num(href_list["menu"])
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
-
-/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob)
- if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna))
- src.temp = "Error: Unable to locate valid genetic data."
- return
- if (subject.brain_op_stage == 4.0)
- src.temp = "Error: No signs of intelligence detected."
- return
-// if (subject.suiciding == 1)
-// src.temp = "Error: Subject's brain is not responding to scanning stimuli."
-// return
-// if ((!subject.ckey) || (!subject.client))
-// src.temp = "Error: Mental interface failure."
-// return
- if (subject.mutations & HUSK)
- src.temp = "Error: Mental interface failure."
- return
- if (!isnull(find_record(subject.ckey)))
- src.temp = "Subject already in database."
- return
-
- subject.dna.check_integrity()
-
- var/ckey = subject.ckey
- if(!ckey && subject && subject.mind)
- ckey = subject.mind.key
-
- var/datum/data/record/R = new /datum/data/record( )
- R.fields["mrace"] = subject.mutantrace
- R.fields["ckey"] = ckey
- R.fields["name"] = subject.real_name
- R.fields["id"] = copytext(md5(subject.real_name), 2, 6)
- R.fields["UI"] = subject.dna.uni_identity
- R.fields["SE"] = subject.dna.struc_enzymes
- R.fields["changeling"] = subject.changeling
- R.fields["original"] = subject.original_name
-
- // Preferences stuff
- R.fields["interface"] = subject.UI
-
-
-
- //Add an implant if needed
- var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
- if (isnull(imp))
- var/datum/organ/external/O = subject.organs[pick(subject.organs)]
- imp = new /obj/item/weapon/implant/health(O)
- O.implant += imp
- imp.implanted = subject
- R.fields["imp"] = "\ref[imp]"
- //Update it if needed
- else
- R.fields["imp"] = "\ref[imp]"
-
- if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
- R.fields["mind"] = "\ref[subject.mind]"
-
- geneticsrecords += R //Save it to the global scan list.
- src.temp = "Subject successfully scanned."
-
-//Find a specific record by key.
-/obj/machinery/computer/cloning/proc/find_record(var/find_key)
- var/selected_record = null
- for(var/datum/data/record/R in geneticsrecords)
- if (R.fields["ckey"] == find_key)
- selected_record = R
- break
- return selected_record
-
-/obj/machinery/computer/cloning/power_change()
-
- if(stat & BROKEN)
- icon_state = "commb"
- else
- if( powered() )
- icon_state = initial(icon_state)
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- src.icon_state = "c_unpowered"
- stat |= NOPOWER
-
-
//Find a dead mob with a brain and client.
/proc/find_dead_player(var/find_key)
if (isnull(find_key))
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index c6c2eac9296..f01c55134a8 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -143,9 +143,11 @@
new /obj/item/clothing/suit/syndicatefake(src.loc)
new /obj/item/clothing/head/syndicatefake(src.loc)
if(8)
- new /obj/item/toy/crayonbox(src.loc)
+ new /obj/item/weapon/storage/crayonbox(src.loc)
if(9)
new /obj/item/toy/spinningtoy(src.loc)
+ // if(10) //Commented out on Urist-chan's orders~
+ // new /obj/item/toy/balloon(src.loc) //Until it gets a better sprite~
else
var/atom/movable/Prize = pick(contents)
Prize.loc = src.loc
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
new file mode 100644
index 00000000000..84a9ed1356a
--- /dev/null
+++ b/code/game/machinery/computer/cloning.dm
@@ -0,0 +1,464 @@
+/obj/machinery/computer/scan_consolenew
+ name = "DNA Modifier Access Console"
+ desc = "Scans DNA."
+ icon = 'computer.dmi'
+ icon_state = "scanner"
+ density = 1
+ var/uniblock = 1.0
+ var/strucblock = 1.0
+ var/subblock = 1.0
+ var/status = null
+ var/radduration = 2.0
+ var/radstrength = 1.0
+ var/radacc = 1.0
+ var/buffer1 = null
+ var/buffer2 = null
+ var/buffer3 = null
+ var/buffer1owner = null
+ var/buffer2owner = null
+ var/buffer3owner = null
+ var/buffer1label = null
+ var/buffer2label = null
+ var/buffer3label = null
+ var/buffer1type = null
+ var/buffer2type = null
+ var/buffer3type = null
+ var/buffer1iue = 0
+ var/buffer2iue = 0
+ var/buffer3iue = 0
+ var/delete = 0
+ var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete
+ var/temphtml = null
+ var/obj/machinery/dna_scanner/connected = null
+ var/obj/item/weapon/disk/data/diskette = null
+ var/list/message = list()
+ anchored = 1.0
+ use_power = 1
+ idle_power_usage = 10
+ active_power_usage = 400
+
+/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, '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 DISKETTES
+ if (!src.diskette)
+ user.drop_item()
+ I.loc = src
+ src.diskette = I
+ user << "You insert [I]."
+ src.updateUsrDialog()
+ return
+ else
+ src.attack_hand(user)
+ return
+
+/obj/machinery/computer/cloning
+ name = "Cloning console"
+ icon = 'computer.dmi'
+ icon_state = "dna"
+ circuit = "/obj/item/weapon/circuitboard/cloning"
+ req_access = list(access_heads) //Only used for record deletion right now.
+ var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
+ var/obj/machinery/clonepod/pod1 = null //Linked cloning pod.
+ var/temp = "Initializing System..."
+ var/menu = 1 //Which menu screen to display
+ var/list/records = list()
+ var/datum/data/record/active_record = null
+ var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything.
+ var/wantsscan = 1
+ var/wantspod = 1
+ var/list/message = list()
+
+/obj/machinery/computer/cloning/New()
+ ..()
+ spawn(5)
+ updatemodules()
+ /*src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir))
+ src.pod1 = locate(/obj/machinery/clonepod, get_step(src, poddir))
+
+ src.temp = ""
+ if (isnull(src.scanner) && wantsscan)
+ src.temp += " SCNR-ERROR"
+ if (isnull(src.pod1) && wantspod)
+ src.temp += " POD1-ERROR"
+ else if (wantspod)
+ src.pod1.connected = src
+
+ if (src.temp == "")
+ src.temp = "System ready."*/
+ return
+ return
+
+/obj/machinery/computer/cloning/proc/updatemodules()
+ //world << "UPDATING MODULES"
+ src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST))
+ src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST))
+ //world << "SEARCHING FOR MACHEIN"
+ //src.temp = ""
+ //if (isnull(src.scanner))
+ // src.temp += " SCNR-ERROR"
+ if (!isnull(src.pod1) && !wantspod)
+ src.pod1.connected = src
+ // src.temp += " POD1-ERROR"
+ //else
+
+ //if (src.temp == "")
+ // src.temp = "System ready."
+
+/obj/machinery/computer/cloning/proc/findscanner()
+ //..()
+ //world << "SEARCHING FOR SCANNER"
+ var/obj/machinery/dna_scannernew/scannerf = null
+ for(dir in list(1,2,4,8,5,6,9,10))
+ //world << "SEARCHING IN [dir]"
+ scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
+ if (!isnull(scannerf))
+ //world << "FOUND"
+ break
+ if(isnull(scannerf) && wantsscan)
+ src.temp += " SCNR-ERROR"
+ return scannerf
+
+/obj/machinery/computer/cloning/proc/findcloner()
+ //..()
+ //world << "SEARCHING FOR POD"
+ var/obj/machinery/clonepod/podf = null
+ for(dir in list(1,2,4,8,5,6,9,10))
+ //world << "SEARCHING IN [dir]"
+ podf = locate(/obj/machinery/clonepod, get_step(src, dir))
+ if (!isnull(podf))
+ //world << "FOUND"
+ break
+ if(isnull(podf) && wantspod)
+ src.temp += " POD1-ERROR"
+ return podf
+
+/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
+ if (!src.diskette)
+ user.drop_item()
+ W.loc = src
+ src.diskette = W
+ user << "You insert [W]."
+ src.updateUsrDialog()
+ return
+ else
+ ..()
+ return
+
+/obj/machinery/computer/cloning/attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/cloning/attack_ai(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/cloning/attack_hand(mob/user as mob)
+ if(!(user in message))
+ user << "\blue This machine looks extremely complex. You'd probably need a decent knowledge of Genetics to understand it."
+ message += user
+ user.machine = src
+ add_fingerprint(user)
+
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ updatemodules()
+
+ var/dat = "Cloning System Control
"
+ dat += "Refresh"
+
+ dat += "
[temp]
"
+
+ switch(src.menu)
+ if(1)
+ if(wantsscan)
+ dat += "Scanner Functions
"
+
+ if (isnull(src.scanner))
+ dat += "No scanner connected!"
+ else
+ if (src.scanner.occupant)
+ dat += "Scan - [src.scanner.occupant]"
+ else
+ dat += "Scanner unoccupied"
+
+ dat += "
Lock status: [src.scanner.locked ? "Locked" : "Unlocked"]"
+
+ dat += "Database Functions
"
+ dat += "View Records
"
+ if (src.diskette)
+ dat += "Eject Disk"
+
+
+ if(2)
+ dat += "Current records
"
+ dat += "Back
"
+ for(var/datum/data/record/R in geneticsrecords)
+ dat += "[R.fields["id"]]-[R.fields["name"]]
"
+
+ if(3)
+ dat += "Selected Record
"
+ dat += "Back
"
+
+ if (!src.active_record)
+ dat += "ERROR: Record not found."
+ else
+ dat += "
Delete Record
"
+ dat += "Name: [src.active_record.fields["name"]]
"
+
+ var/obj/item/weapon/implant/health/H = locate(src.active_record.fields["imp"])
+
+ if ((H) && (istype(H)))
+ dat += "Health: [H.sensehealth()] | OXY-BURN-TOX-BRUTE
"
+ else
+ dat += "Unable to locate implant.
"
+
+ if (!isnull(src.diskette))
+ dat += "Load from disk."
+
+ dat += " | Save: UI + UE"
+ dat += " | Save: UI"
+ dat += " | Save: SE"
+ dat += "
"
+ else
+ dat += "
" //Keeping a line empty for appearances I guess.
+
+ dat += {"UI: [src.active_record.fields["UI"]]
+ SE: [src.active_record.fields["SE"]]
"}
+ if(wantspod)
+ dat += "Clone
"
+
+ if(4)
+ if (!src.active_record)
+ src.menu = 2
+ dat = "[src.temp]
"
+ dat += "Confirm Record Deletion
"
+
+ dat += "Scan card to confirm.
"
+ dat += "No"
+
+
+ user << browse(dat, "window=cloning")
+ onclose(user, "cloning")
+ return
+
+/obj/machinery/computer/cloning/Topic(href, href_list)
+ if(..())
+ return
+
+ if ((href_list["scan"]) && (!isnull(src.scanner)))
+ src.scan_mob(src.scanner.occupant)
+
+ //No locking an open scanner.
+ else if ((href_list["lock"]) && (!isnull(src.scanner)))
+ if ((!src.scanner.locked) && (src.scanner.occupant))
+ src.scanner.locked = 1
+ else
+ src.scanner.locked = 0
+
+ else if (href_list["view_rec"])
+ src.active_record = locate(href_list["view_rec"])
+ if ((isnull(src.active_record.fields["ckey"])) || (src.active_record.fields["ckey"] == ""))
+ del(src.active_record)
+ src.temp = "ERROR: Record Corrupt"
+ else
+ src.menu = 3
+
+ else if (href_list["del_rec"])
+ if ((!src.active_record) || (src.menu < 3))
+ return
+ if (src.menu == 3) //If we are viewing a record, confirm deletion
+ src.temp = "Delete record?"
+ src.menu = 4
+
+ else if (src.menu == 4)
+ var/obj/item/weapon/card/id/C = usr.equipped()
+ if (istype(C)||istype(C, /obj/item/device/pda))
+ if(src.check_access(C))
+ geneticsrecords.Remove(src.active_record)
+ del(src.active_record)
+ src.temp = "Record deleted."
+ src.menu = 2
+ else
+ src.temp = "Access Denied."
+
+ else if (href_list["disk"]) //Load or eject.
+ switch(href_list["disk"])
+ if("load")
+ if ((isnull(src.diskette)) || (src.diskette.data == ""))
+ src.temp = "Load error."
+ src.updateUsrDialog()
+ return
+ if (isnull(src.active_record))
+ src.temp = "Record error."
+ src.menu = 1
+ src.updateUsrDialog()
+ return
+
+ if (src.diskette.data_type == "ui")
+ src.active_record.fields["UI"] = src.diskette.data
+ if (src.diskette.ue)
+ src.active_record.fields["name"] = src.diskette.owner
+ else if (src.diskette.data_type == "se")
+ src.active_record.fields["SE"] = src.diskette.data
+
+ src.temp = "Load successful."
+ if("eject")
+ if (!isnull(src.diskette))
+ src.diskette.loc = src.loc
+ src.diskette = null
+
+ else if (href_list["save_disk"]) //Save to disk!
+ if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record)))
+ src.temp = "Save error."
+ src.updateUsrDialog()
+ return
+
+ switch(href_list["save_disk"]) //Save as Ui/Ui+Ue/Se
+ if("ui")
+ src.diskette.data = src.active_record.fields["UI"]
+ src.diskette.ue = 0
+ src.diskette.data_type = "ui"
+ if("ue")
+ src.diskette.data = src.active_record.fields["UI"]
+ src.diskette.ue = 1
+ src.diskette.data_type = "ui"
+ if("se")
+ src.diskette.data = src.active_record.fields["SE"]
+ src.diskette.ue = 0
+ src.diskette.data_type = "se"
+ src.diskette.owner = src.active_record.fields["name"]
+ src.diskette.name = "data disk - '[src.diskette.owner]'"
+ src.temp = "Save \[[href_list["save_disk"]]\] successful."
+
+ else if (href_list["refresh"])
+ src.updateUsrDialog()
+
+ else if (href_list["clone"])
+ var/datum/data/record/C = locate(href_list["clone"])
+ //Look for that player! They better be dead!
+ if(C)
+ var/mob/selected = find_dead_player("[C.fields["ckey"]]")
+ var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No")
+ if(answer == "No")
+ selected = null
+//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
+ if ((!selected) || (!src.pod1) || (src.pod1.occupant) || (src.pod1.mess) || !config.revival_cloning)
+ src.temp = "Unable to initiate cloning cycle." // most helpful error message in THE HISTORY OF THE WORLD
+ else if (src.pod1.growclone(selected, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"],C.fields["original"]))
+ src.temp = "Cloning cycle activated."
+ geneticsrecords.Remove(C)
+ del(C)
+ src.menu = 1
+
+ else if (href_list["menu"])
+ src.menu = text2num(href_list["menu"])
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ return
+
+/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob)
+ if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna))
+ src.temp = "Error: Unable to locate valid genetic data."
+ return
+ if (subject.brain_op_stage == 4.0)
+ src.temp = "Error: No signs of intelligence detected."
+ return
+// if (subject.suiciding == 1)
+// src.temp = "Error: Subject's brain is not responding to scanning stimuli."
+// return
+// if ((!subject.ckey) || (!subject.client))
+// src.temp = "Error: Mental interface failure."
+// return
+ if (subject.mutations & HUSK)
+ src.temp = "Error: Mental interface failure."
+ return
+ if (!isnull(find_record(subject.ckey)))
+ src.temp = "Subject already in database."
+ return
+
+ subject.dna.check_integrity()
+
+ var/ckey = subject.ckey
+ if(!ckey && subject && subject.mind)
+ ckey = subject.mind.key
+
+ var/datum/data/record/R = new /datum/data/record( )
+ R.fields["mrace"] = subject.mutantrace
+ R.fields["ckey"] = ckey
+ R.fields["name"] = subject.real_name
+ R.fields["id"] = copytext(md5(subject.real_name), 2, 6)
+ R.fields["UI"] = subject.dna.uni_identity
+ R.fields["SE"] = subject.dna.struc_enzymes
+ R.fields["changeling"] = subject.changeling
+ R.fields["original"] = subject.original_name
+
+ // Preferences stuff
+ R.fields["interface"] = subject.UI
+
+
+
+ //Add an implant if needed
+ var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
+ if (isnull(imp))
+ var/datum/organ/external/O = subject.organs[pick(subject.organs)]
+ imp = new /obj/item/weapon/implant/health(O)
+ O.implant += imp
+ imp.implanted = subject
+ R.fields["imp"] = "\ref[imp]"
+ //Update it if needed
+ else
+ R.fields["imp"] = "\ref[imp]"
+
+ if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
+ R.fields["mind"] = "\ref[subject.mind]"
+
+ geneticsrecords += R //Save it to the global scan list.
+ src.temp = "Subject successfully scanned."
+
+//Find a specific record by key.
+/obj/machinery/computer/cloning/proc/find_record(var/find_key)
+ var/selected_record = null
+ for(var/datum/data/record/R in geneticsrecords)
+ if (R.fields["ckey"] == find_key)
+ selected_record = R
+ break
+ return selected_record
+
+/obj/machinery/computer/cloning/power_change()
+
+ if(stat & BROKEN)
+ icon_state = "commb"
+ else
+ if( powered() )
+ icon_state = initial(icon_state)
+ stat &= ~NOPOWER
+ else
+ spawn(rand(0, 15))
+ src.icon_state = "c_unpowered"
+ stat |= NOPOWER
\ No newline at end of file
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index ddd19232481..efde1f1f012 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -98,7 +98,7 @@
var/obj/item/weapon/implant/I = locate(href_list["warn"])
if((I)&&(I.imp_in))
var/mob/living/carbon/R = I.imp_in
- R << "\green You hear a voice in your head saying: '[warning]'"
+ R << "\green You think: '[warning]'"
src.add_fingerprint(usr)
src.updateUsrDialog()
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index dc17e6cdfe6..13a39ca1c59 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -21,9 +21,11 @@
if(screen == 1)
for(var/mob/living/silicon/robot/R in world)
if(istype(user, /mob/living/silicon/ai))
- if (R.connected_ai != user) continue
+ if (R.connected_ai != user)
+ continue
if(istype(user, /mob/living/silicon/robot))
- if (R != user) continue
+ if (R != user)
+ continue
dat += "[R.name] |"
if(R.stat)
dat += " Not Responding |"
@@ -148,10 +150,10 @@
else if (href_list["stopbot"])
if(src.allowed(usr))
var/mob/living/silicon/robot/R = locate(href_list["stopbot"])
- if(R)
+ if(R && istype(R)) // Extra sancheck because of input var references
var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
if(choice == "Confirm")
- if(R)
+ if(R && istype(R))
message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
R.canmove = !R.canmove
@@ -173,7 +175,7 @@
if(R)
var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort")
if(choice == "Confirm")
- if(R)
+ if(R && istype(R))
message_admins("\blue [key_name_admin(usr)] emagged [R.name] using robotic console!")
log_game("[key_name(usr)] emagged [R.name] using robotic console!")
R.emagged = 1
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index afa39cbdf3a..479e8edf240 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -458,7 +458,7 @@ What a mess.*/
temp = "Rank:
"
temp += ""
for(var/rank in get_all_jobs())
- temp += "- [rank]
"
+ temp += "- [rank]
"
temp += "
"
else
alert(usr, "You do not have the required rank to do this!")
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 0381c873b70..263b705624a 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -1,10 +1,27 @@
/obj/machinery/door_control/attack_ai(mob/user as mob)
- return src.attack_hand(user)
+ if(wires & 2)
+ return src.attack_hand(user)
+ else
+ user << "Error, no route to host."
/obj/machinery/door_control/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/door_control/attackby(obj/item/weapon/W, mob/user as mob)
+ /* For later implementation
+ if (istype(W, /obj/item/weapon/screwdriver))
+ {
+ if(wiresexposed)
+ icon_state = "doorctrl0"
+ wiresexposed = 0
+
+ else
+ icon_state = "doorctrl-open"
+ wiresexposed = 1
+
+ return
+ }
+ */
if(istype(W, /obj/item/device/detective_scanner))
return
return src.attack_hand(user)
@@ -12,6 +29,11 @@
/obj/machinery/door_control/attack_hand(mob/user as mob)
if(stat & (NOPOWER|BROKEN))
return
+
+ if(!allowed(user) && (wires & 1))
+ flick("doorctrl-denied",src)
+ return
+
use_power(5)
icon_state = "doorctrl1"
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index b7a8cf2fdcf..1b312f30261 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -274,7 +274,10 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
if (src.welded || src.locked || (!src.arePowerSystemsOn()) || (stat & NOPOWER) || src.isWireCut(AIRLOCK_WIRE_OPEN_DOOR))
return 0
use_power(50)
- playsound(src.loc, 'airlock.ogg', 30, 1)
+ if(istype(src, /obj/machinery/door/airlock/glass))
+ playsound(src.loc, 'windowdoor.ogg', 30, 1)
+ else
+ playsound(src.loc, 'airlock.ogg', 30, 1)
if (src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density)
src.closeOther.close()
return ..()
@@ -285,7 +288,10 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
return
..()
use_power(50)
- playsound(src.loc, 'airlock.ogg', 30, 1)
+ if(istype(src, /obj/machinery/door/airlock/glass))
+ playsound(src.loc, 'windowdoor.ogg', 30, 1)
+ else
+ playsound(src.loc, 'airlock.ogg', 30, 1)
var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src))
if(killthis)
killthis.ex_act(2)//Smashin windows
@@ -1068,8 +1074,9 @@ About the new airlock wires panel:
-/obj/machinery/door/airlock/Topic(href, href_list)
- ..()
+/obj/machinery/door/airlock/Topic(href, href_list, var/nowindow = 0)
+ if(!nowindow)
+ ..()
if (usr.stat || usr.restrained() )
return
if (href_list["close"])
@@ -1277,7 +1284,8 @@ About the new airlock wires panel:
src.holdopen = 1
src.update_icon()
- src.updateUsrDialog()
+ if(!nowindow)
+ src.updateUsrDialog()
if((istype(usr.equipped(), /obj/item/device/hacktool)))
return attack_ai(usr, usr.equipped())
else if(issilicon(usr))
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index cdb69cf7593..758a5347043 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -300,6 +300,7 @@
src.operating = 1
animate("opening")
+ src.sd_SetOpacity(0)
sleep(10)
src.layer = 2.7
src.density = 0
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index 06a74aec0c6..85a1d818b20 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -623,11 +623,11 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
src.updateicon()
else
- user << "\red The tray already has a seed in it!"
+ user << "\red The tray already has seeds in it!"
else if (istype(O, /obj/item/device/analyzer/plant_analyzer))
if(src.planted && src.myseed)
- user << "*** [src.myseed.name] ***"
+ user << "*** [src.myseed.plantname] ***" //Carn: now reports the plants growing, not the seeds.
user << "-Plant Age: \blue [src.age]"
user << "-Plant Endurance: \blue [src.myseed.endurance]"
user << "-Plant Lifespan: \blue [src.myseed.lifespan]"
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 590fa2635b2..49892a3331e 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -158,8 +158,19 @@ Class Procs:
istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
usr << "\red You don't have the dexterity to do this!"
return 1
- if ((!in_range(src, usr) || !istype(src.loc, /turf)) && !istype(usr, /mob/living/silicon))
- return 1
+
+ var/norange = 0
+ if(istype(usr, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = usr
+ if(istype(H.l_hand, /obj/item/tk_grab))
+ norange = 1
+ else if(istype(H.r_hand, /obj/item/tk_grab))
+ norange = 1
+
+ if(!norange)
+ if ((!in_range(src, usr) || !istype(src.loc, /turf)) && !istype(usr, /mob/living/silicon))
+ return 1
+
src.add_fingerprint(usr)
return 0
@@ -174,9 +185,9 @@ Class Procs:
return 1
if(user.lying || user.stat)
return 1
- if ( ! (istype(user, /mob/living/carbon/human) || \
- istype(user, /mob/living/silicon) || \
- istype(user, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
+ if ( ! (istype(usr, /mob/living/carbon/human) || \
+ istype(usr, /mob/living/silicon) || \
+ istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
usr << "\red You don't have the dexterity to do this!"
return 1
/*
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index ea8c3f2ff36..9c9d6c675af 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -19,7 +19,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
// 1 = assistance
// 2 = supplies
// 3 = info
- // 4 = ass + sup
+ // 4 = ass + sup //Erro goddamn you just HAD to shorten "assistance" down to "ass"
// 5 = ass + info
// 6 = sup + info
// 7 = ass + sup + info
@@ -217,7 +217,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
announceAuth = 0;
screen = 0
if(href_list["sendAnnouncement"])
- world << " [department] announcement: [html_encode(message)]"
+ world << "[department] announcement: [html_encode(message)]"
announceAuth = 0
message = ""
screen = 0
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 629725132cc..128f4190576 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -23,10 +23,10 @@
return
update_icon()
+ overlays = null
+ icon_state = "sheater[on]"
if(open)
- icon_state = "sheater-open"
- else
- icon_state = "sheater[on]"
+ overlays += "sheater-open"
return
examine()
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 5b32f3a1f78..707e68225c4 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -288,6 +288,9 @@ var
if (R.client && R.client.STFU_radio) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
+ if(istype(M, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
+ continue
+
// --- Check for compression ---
if(compression > 0)
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index a9934dd7b78..9e4bf23ab9c 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -58,10 +58,12 @@
for(var/datum/comm_log_entry/C in SelectedServer.log_entries)
i++
- dat += "[C.name] \[X\]
"
// If the log is a speech file
if(C.input_type == "Speech File")
+
+ dat += "[C.name] \[X\]
"
+
// -- Determine race of orator --
var/race // The actual race of the mob
@@ -113,9 +115,10 @@
dat += "
"
else if(C.input_type == "Execution Error")
- dat += "Data type: [C.input_type]
"
- dat += "Source: Internal server code
"
- dat += "Contents: \"[C.parameters["message"]]\"
"
+
+ dat += "[C.name] \[X\]
"
+ dat += "Output: \"[C.parameters["message"]]\"
"
+ dat += "
"
dat += ""
@@ -192,7 +195,7 @@
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
- if(newnet && usr in range(1, src))
+ if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -"
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index 1014a2b62ea..972c36e9110 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -10,6 +10,7 @@
screen = 0 // the screen number:
list/servers = list() // the servers located by the computer
mob/editingcode
+ mob/lasteditor
list/viewingcode = list()
obj/machinery/telecomms/server/SelectedServer
@@ -49,13 +50,13 @@
showcode = dd_replacetext(storedcode, "\"", "\\\"")
for(var/mob/M in viewingcode)
- if(M.machine == src && M in view(1, src))
+
+ if( (M.machine == src && M in view(1, src) ) || issilicon(M))
winset(M, "tcscode", "is-disabled=true")
winset(M, "tcscode", "text=\"[showcode]\"")
else
- if(!issilicon(M))
- viewingcode.Remove(M)
- winshow(M, "Telecomms IDE", 0) // hide the window!
+ viewingcode.Remove(M)
+ winshow(M, "Telecomms IDE", 0) // hide the window!
sleep(5)
@@ -164,6 +165,7 @@
if(usr in viewingcode) return
if(!editingcode)
+ lasteditor = usr
editingcode = usr
winshow(editingcode, "Telecomms IDE", 1) // show the IDE
winset(editingcode, "tcscode", "is-disabled=false")
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index 240e5d22913..0a4ec6453cd 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -385,6 +385,20 @@
user << browse(t, "window=turretid")
onclose(user, "turretid")
+
+/obj/machinery/turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
+ if(!(stat & BROKEN))
+ playsound(src.loc, 'slash.ogg', 25, 1, -1)
+ for(var/mob/O in viewers(src, null))
+ if ((O.client && !( O.blinded )))
+ O.show_message(text("\red [] has slashed at []!", M, src), 1)
+ src.health -= 15
+ if (src.health <= 0)
+ src.die()
+ else
+ M << "\green That object is useless to you."
+ return
+
/obj/machinery/turretid/Topic(href, href_list)
..()
if (src.locked)
@@ -400,6 +414,12 @@
src.attack_hand(usr)
/obj/machinery/turretid/proc/updateTurrets()
+ if(control_area)
+ for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area))
+ aTurret.setState(enabled, lethal)
+ src.update_icons()
+
+/obj/machinery/turretid/proc/update_icons()
if (src.enabled)
if (src.lethal)
src.icon_state = "motion1"
@@ -417,20 +437,6 @@
for (var/obj/machinery/turret/aTurret in turrets)
aTurret.setState(enabled, lethal)
-/obj/machinery/turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if(!(stat & BROKEN))
- playsound(src.loc, 'slash.ogg', 25, 1, -1)
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red [] has slashed at []!", M, src), 1)
- src.health -= 15
- if (src.health <= 0)
- src.die()
- else
- M << "\green That object is useless to you."
- return
-
-
/obj/structure/turret/gun_turret
name = "Gun Turret"
density = 1
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index fa3f10211c7..f696f28e9f5 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -50,7 +50,6 @@ To combat this, I changed the window name. -- Doohl
//Add hidden inventory
src.build_inventory(temp_hidden,temp_hiddenprices,1)
src.build_inventory(temp_coin,temp_coin_amt, 0, 1)
-
power_change()
return
@@ -302,18 +301,21 @@ To combat this, I changed the window name. -- Doohl
FOLKS IN IRC RULED THAT THIS WAS SHITTY -- Doohl
No more delays! Go nuts~~~~~~~~~~~
- if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply)
+ A 20 second delay is stupid, a 2 second delay however, is not. -- Nodrak
+ No more greyshirts intentionally crashing clients through vended item spam!
+ */
+
+ if(((src.last_reply + (src.vend_delay + 50)) <= world.time) && src.vend_reply)
spawn(0)
src.speak(src.vend_reply)
src.last_reply = world.time
- */
use_power(5)
if (src.icon_vend) //Show the vending animation if needed
flick(src.icon_vend,src)
- // spawn(src.vend_delay) NOPE.jpg
- //src.vend_ready = 1
+ spawn(src.vend_delay)
+ src.vend_ready = 1
if(R.price <= points)
new product_path(get_turf(src))
diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm
index 24e66288dcd..c8924d62c7d 100644
--- a/code/game/magic/cultist/ritual.dm
+++ b/code/game/magic/cultist/ritual.dm
@@ -126,9 +126,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
user << "You retrace your steps, carefully undoing the lines of the rune."
del(src)
return
- else if(istype(I, /obj/item/weapon/storage/bible) && usr.mind && (usr.mind.assigned_role == "Chaplain"))
- var/obj/item/weapon/storage/bible/bible = I
- user << "\blue You banish the vile magic with the blessing of [bible.deity_name]!"
+ 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
@@ -502,7 +501,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
if(prob(C*5-105-(runedec-ticker.mode.cult.len)*5)) //including the useless rune at the secret room, shouldn't count against the limit - Urist
usr.emote("scream")
user << "\red A tear momentarily appears in reality. Before it closes, you catch a glimpse of that which lies beyond. That proves to be too much for your mind."
- usr.gib(1)
+ usr.gib()
return
if("No")
return
diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm
index 6691b3b571d..14b7a63bd95 100644
--- a/code/game/magic/cultist/runes.dm
+++ b/code/game/magic/cultist/runes.dm
@@ -306,7 +306,7 @@ var/list/sacrificed = list()
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(1)
+ body_to_sacrifice.gib()
if (ticker.mode.name == "cult")
ticker.mode:add_cultist(body_to_sacrifice.mind)
else
@@ -571,7 +571,7 @@ var/list/sacrificed = list()
if(H.mind == ticker.mode:sacrifice_target)
if(cultsinrange.len >= 3)
sacrificed += H.mind
- H.gib(1)
+ 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."
@@ -584,7 +584,7 @@ var/list/sacrificed = list()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, this soul was not enough to gain His favor."
- H.gib(1)
+ H.gib()
else
if(prob(40))
usr << "\red The Geometer of blood accepts this sacrifice."
@@ -592,7 +592,7 @@ var/list/sacrificed = list()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
- H.gib(1)
+ 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."
@@ -603,17 +603,36 @@ var/list/sacrificed = list()
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
- H.gib(1)
+ H.gib()
else
if(cultsinrange.len >= 3)
- H.gib(1)
- usr << "\red The Geometer of Blood accepts this sacrifice."
+ 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."
+ 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."
+ 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
- H.gib(1)
- usr << "\red The Geometer of blood accepts this sacrifice."
+ 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."
+ H.gib()
for(var/mob/living/carbon/monkey/M in src.loc)
if (ticker.mode.name == "cult")
if(M.mind == ticker.mode:sacrifice_target)
@@ -632,11 +651,13 @@ var/list/sacrificed = list()
usr << "\red However, a mere monkey is not enough to satisfy Him."
else
usr << "\red The Geometer of Blood accepts your meager sacrifice."
- M.gib(1)
+ 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(1) doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need.
+ 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."
@@ -661,7 +682,7 @@ var/list/sacrificed = list()
if (istype(W,/obj/item/weapon/paper/talisman))
rad = 4
go = 1
- if (istype(W,/obj/item/weapon/storage/bible))
+ if (istype(W,/obj/item/weapon/nullrod))
rad = 1
go = 1
if(go)
@@ -670,7 +691,7 @@ var/list/sacrificed = list()
R:visibility=15
S=1
if(S)
- if(istype(W,/obj/item/weapon/storage/bible))
+ 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))
@@ -770,7 +791,7 @@ var/list/sacrificed = list()
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 him shackles of blood are strong"
+ user << "\red You cannot summon the [cultist], for his shackles of blood are strong"
return fizzle()
cultist.loc = src.loc
cultist.lying = 1
@@ -793,6 +814,9 @@ var/list/sacrificed = list()
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++
@@ -809,6 +833,9 @@ var/list/sacrificed = list()
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)
@@ -827,6 +854,9 @@ var/list/sacrificed = list()
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))
@@ -846,6 +876,9 @@ var/list/sacrificed = list()
for(var/mob/living/carbon/C in viewers(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.
@@ -873,11 +906,14 @@ var/list/sacrificed = list()
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(1)
+ M.gib()
for(var/obj/effect/rune/R in view(src))
if(prob(10))
explosion(R.loc, -1, 0, 1, 5)
@@ -933,14 +969,19 @@ var/list/sacrificed = list()
del(src)
else ///When invoked as talisman, stun and mute the target mob.
usr.say("Dream sign ''Evil sealing talisman''!")
- for(var/mob/O in viewers(T, null))
- O.show_message(text("\red [] invokes a talisman at []", usr, T), 1)
- flick("e_flash", T.flash)
- if (!(T.mutations & HULK))
- T.silent += 15
- T.Weaken(25)
- T.Stun(25)
- return
+ 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)
+ flick("e_flash", T.flash)
+ if (!(T.mutations & HULK))
+ T.silent += 15
+ T.Weaken(25)
+ T.Stun(25)
+ return
/////////////////////////////////////////TWENTY-FIFTH RUNE
diff --git a/code/game/magic/cultist/talisman.dm b/code/game/magic/cultist/talisman.dm
index 30abdbe3a56..5b4498c6bc7 100644
--- a/code/game/magic/cultist/talisman.dm
+++ b/code/game/magic/cultist/talisman.dm
@@ -73,6 +73,7 @@
dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman.
"
dat += "Sa tatha najin - Allows you to summon armoured robes and an unholy blade
"
dat += "Kal om neth - Summons a soul stone
"
+ dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person.
"
usr << browse(dat, "window=id_com;size=350x200")
return
@@ -107,6 +108,8 @@
T.imbue = "armor"
if("soulstone")
new /obj/item/device/soulstone(get_turf(usr))
+ if("construct")
+ new /obj/structure/constructshell(get_turf(usr))
src.uses--
supply()
return
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index cd4a8bba15c..7d8520791ce 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -272,7 +272,7 @@
spawn_result()
..()
- feedback_inc("mecha_ripley_created",1)
+ //feedback_inc("mecha_ripley_created",1)
return
@@ -515,7 +515,7 @@
spawn_result()
..()
- feedback_inc("mecha_gygax_created",1)
+ //feedback_inc("mecha_gygax_created",1)
return
/datum/construction/mecha/firefighter_chassis
@@ -708,7 +708,7 @@
spawn_result()
..()
- feedback_inc("mecha_firefighter_created",1)
+ //feedback_inc("mecha_firefighter_created",1)
return
@@ -787,7 +787,7 @@
spawn_result()
..()
- feedback_inc("mecha_honker_created",1)
+ //feedback_inc("mecha_honker_created",1)
return
/datum/construction/mecha/durand_chassis
@@ -900,7 +900,7 @@
spawn_result()
..()
- feedback_inc("mecha_durand_created",1)
+ //feedback_inc("mecha_durand_created",1)
return
@@ -1104,5 +1104,5 @@
spawn_result()
..()
- feedback_inc("mecha_odysseus_created",1)
+ //feedback_inc("mecha_odysseus_created",1)
return
\ No newline at end of file
diff --git a/code/game/objects/alien/facehugger.dm b/code/game/objects/alien/facehugger.dm
index 5c9db1b572d..7c54a78d604 100644
--- a/code/game/objects/alien/facehugger.dm
+++ b/code/game/objects/alien/facehugger.dm
@@ -220,402 +220,3 @@ var/const
return
-/* NOPE.png -- Urist
-
-// Returns the surrounding cardinal turfs with open links
-// Including through doors openable with the ID
-// Includes spacetiles
-/turf/proc/CardinalTurfsWithAccessSpace(var/obj/item/weapon/card/id/ID)
- var/L[] = new()
- for(var/d in cardinal)
- var/turf/simulated/T = get_step(src, d)
- if((istype(T) || istype(T,/turf/space))&& !T.density)
- if(!LinkBlockedWithAccess(src, T, ID))
- L.Add(T)
- return L
-
-/obj/effect/alien/facehugger
- name = "alien"
- desc = "An alien, looks pretty scary!"
- icon_state = "facehugger"
- layer = 5.0
- density = 1
- anchored = 0
-
- var/state = 0
-
- var/list/path = new/list()
-
- var/frustration = 0
- var/mob/living/carbon/target
- var/list/path_target = new/list()
-
- var/turf/trg_idle
- var/list/path_idle = new/list()
-
- var/alive = 1 //1 alive, 0 dead
- var/health = 10
- var/maxhealth = 10
- var/lamarr = 0
- flags = 258.0
-
-
-
-
-
- New()
- ..()
- if(aliens_allowed)
- health = maxhealth
- process()
- else
- del(src)
-
- examine()
- set src in view()
- ..()
- if(!alive)
- usr << text("\red The alien is not moving.")
- else if (health > 5)
- usr << text("\red The alien looks fresh, just out of the egg.")
- else
- usr << text("\red The alien looks injured.")
- if (lamarr)
- usr << text("\red It looks like the proboscis has been removed.")
- return
-
-
- attack_hand(user as mob)
- return
-
- attackby(obj/item/weapon/W as obj, mob/user as mob)
- switch(W.damtype)
- if("fire")
- health -= W.force * 0.75
- if("brute")
- health -= W.force * 0.5
- else
- if (health <= 0)
- death()
- else if (W.force)
- if(ishuman(user) || ismonkey(user))
- target = user
- state = 1
- ..()
-
- bullet_act(var/obj/item/projectile/Proj)
- health -= round(Proj.damage / 2)
- ..()
- healthcheck()
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- death()
- if(2.0)
- health -= 15
- healthcheck()
- return
-
- meteorhit()
- death()
- return
-
- blob_act()
- if(prob(50))
- death()
- return
-
- Bumped(AM as mob|obj)
- if(ismob(AM) && (ishuman(AM) || ismonkey(AM)) )
- target = AM
- set_attack()
- else if(ismob(AM))
- spawn(0)
- var/turf/T = get_turf(src)
- AM:loc = T
-
- Bump(atom/A)
- if(ismob(A) && (ishuman(A) || ismonkey(A)))
- target = A
- set_attack()
- else if(ismob(A))
- loc = A:loc
-
- temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 300)
- health -= 5
- healthcheck()
-
-
-
-
- verb/follow()
- set src in view() //set src in get_aliens(view()) - does not work, damn shitty byond :( -- rastaf0
- set name = "Follow Me"
- set category = "Object" //"Alien" does not work perfect - humans get "Alien" tab too, that's annoying
- if(!alive) return
- if(!isalien(usr))
- usr << text("\red The alien ignores you.")
- return
- if(state != 2 || health < maxhealth)
- usr << text("\red The alien is too busy to follow you.")
- return
- usr << text("\green The alien will now try to follow you.")
- trg_idle = usr
- path_idle = new/list()
- return
-
- verb/stop()
- set src in view()
- set name = "Stop Following"
- set category = "Object"
- if(!alive) return
- if(!isalien(usr))
- usr << text("\red The alien ignores you.")
- return
- if(state != 2)
- usr << text("\red The alien is too busy to follow you.")
- return
- usr << text("\green The alien stops following you.")
- set_null()
- return
-
-
-
-
- proc/call_to(var/mob/user)
- if(!alive || !isalien(user) || state != 2) return
- trg_idle = user
- path_idle = new/list()
- return
-
- proc/set_attack()
- state = 1
- if(path_idle.len) path_idle = new/list()
- trg_idle = null
-
- proc/set_idle()
- state = 2
- if (path_target.len) path_target = new/list()
- target = null
- frustration = 0
-
- proc/set_null()
- state = 0
- if (path_target.len) path_target = new/list()
- if (path_idle.len) path_idle = new/list()
- target = null
- trg_idle = null
- frustration = 0
-
- process()
- set background = 1
- var/quick_move = 0
-
- if (!alive)
- return
-
- if (!target)
- if (path_target.len) path_target = new/list()
-
- var/last_health = INFINITY
- var/view
- if (lamarr)
- view = 1
- else
- view = viewrange-2
- for (var/mob/living/carbon/C in range(view,loc))
- if (C.stat == 2 || isalien(C) || C.alien_egg_flag || !can_see(src,C,viewrange) || istype(C, /mob/living/carbon/metroid))
- continue
- if(C:stunned || C:paralysis || C:weakened)
- target = C
-
- break
- if(C:health < last_health)
- last_health = C:health
- target = C
-
- if(target)
- if (!lamarr || prob(10))
- set_attack()
- else if(state != 2)
- set_idle()
- idle()
-
- else if(target)
- var/turf/distance = get_dist(src, target)
- if (!lamarr || prob(10))
- set_attack()
-
- if(can_see(src,target,viewrange))
- if(distance <= 1 && (!lamarr || prob(20)))
- for(var/mob/O in viewers(world.view,src))
- O.show_message("\red [target] has been leapt on by [lamarr ? name : "the alien"]!", 1, "\red You hear someone fall", 2)
- if (!lamarr)
- target:take_overall_damage(5)
- if(prob(70))
- target:paralysis = max(target:paralysis, 5)
- loc = target.loc
-
- if(!target.alien_egg_flag && ( ishuman(target) || ismonkey(target) ) )
- if (!lamarr && target)
- var/mob/trg = target
- death()
- //if(trg.virus)//Viruses are stored in a global database.
- //trg.virus.cure(0)//You need to either cure() or del() them to stop their processing.
- trg.contract_disease(new /datum/disease/alien_embryo(0))//So after that you need to infect the target anew.
- for(var/datum/disease/alien_embryo/A in trg.viruses)
- trg.alien_egg_flag = 1//We finally set their flag to 1.
- return
- else
- sleep(50)
- else
- set_null()
- spawn(cycle_pause) process()
- return
-
- step_towards(src,get_step_towards2(src , target))
- else
- if( !path_target.len )
-
- path_attack(target)
- if(!path_target.len)
- set_null()
- spawn(cycle_pause) process()
- return
- else
- var/turf/next = path_target[1]
-
- if(next in range(1,src))
- path_attack(target)
-
- if(!path_target.len)
- frustration += 5
- else
- next = path_target[1]
- path_target -= next
- step_towards(src,next)
- quick_move = 1
-
- if (get_dist(src, target) >= distance) frustration++
- else frustration--
- if(frustration >= 35 || lamarr) set_null()
-
- if(quick_move)
- spawn(cycle_pause/2)
- process()
- else
- spawn(cycle_pause)
- process()
-
- proc/idle()
- set background = 1
- var/quick_move = 0
-
- if(state != 2 || !alive || target) return
-
- if(locate(/obj/effect/alien/weeds) in loc && health < maxhealth)
- health++
- spawn(cycle_pause) idle()
- return
-
- if(!path_idle.len)
-
- if(isalien(trg_idle))
- if(can_see(src,trg_idle,viewrange))
- step_towards(src,get_step_towards2(src , trg_idle))
- else
- path_idle(trg_idle)
- if(!path_idle.len)
- trg_idle = null
- set_idle()
- spawn(cycle_pause) idle()
- return
- else
- var/obj/effect/alien/weeds/W = null
- if(health < maxhealth)
- var/list/the_weeds = new/list()
-
- find_weeds:
- for(var/obj/effect/alien/weeds/weed in range(viewrange,loc))
- if(!can_see(src,weed,viewrange)) continue
- for(var/atom/A in get_turf(weed))
- if(A.density) continue find_weeds
- the_weeds += weed
- if(the_weeds.len)
- W = pick(the_weeds)
-
- if(W)
- path_idle(W)
- if(!path_idle.len)
- trg_idle = null
- spawn(cycle_pause) idle()
- return
- else
- for(var/mob/living/carbon/alien/humanoid/H in range(1,src))
- spawn(cycle_pause) idle()
- return
- step(src,pick(cardinal))
-
- else
-
- if(can_see(src,trg_idle,viewrange))
- switch(get_dist(src, trg_idle))
- if(1)
- if(istype(trg_idle,/obj/effect/alien/weeds))
- step_towards(src,get_step_towards2(src , trg_idle))
- if(2 to INFINITY)
- step_towards(src,get_step_towards2(src , trg_idle))
- if(path_idle.len) path_idle = new/list()
- /*
- if(viewrange+1 to INFINITY)
- step_towards(src,get_step_towards2(src , trg_idle))
- if(path_idle.len) path_idle = new/list()
- quick_move = 1
- */
- else
- var/turf/next = path_idle[1]
- if(!next in range(1,src))
- path_idle(trg_idle)
-
- if(!path_idle.len)
- spawn(cycle_pause) idle()
- return
- else
- next = path_idle[1]
- path_idle -= next
- step_towards(src,next)
- quick_move = 1
-
- if(quick_move)
- spawn(cycle_pause/2)
- idle()
- else
- spawn(cycle_pause)
- idle()
-
- proc/path_idle(var/atom/trg)
- path_idle = AStar(loc, get_turf(trg), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, null, null)
- path_idle = reverselist(path_idle)
-
- proc/path_attack(var/atom/trg)
- target = trg
- path_target = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, null, null)
- path_target = reverselist(path_target)
-
-
- proc/death()
- if(!alive) return
- alive = 0
- density = 0
- icon_state = "facehugger_l"
- set_null()
- for(var/mob/O in hearers(src, null))
- O.show_message("\red [src] curls up into a ball!", 1)
-
- proc/healthcheck()
- if (health <= 0)
- death()
-
-*/
\ No newline at end of file
diff --git a/code/game/objects/closets/janitor.dm b/code/game/objects/closets/janitor.dm
index 5f2cf56a16c..f48617b2190 100644
--- a/code/game/objects/closets/janitor.dm
+++ b/code/game/objects/closets/janitor.dm
@@ -1,6 +1,7 @@
/obj/structure/closet/jcloset/New()
..()
sleep(2)
+ new /obj/item/weapon/cartridge/janitor(src)
new /obj/item/device/flashlight(src)
new /obj/item/clothing/shoes/galoshes(src)
new /obj/item/weapon/caution(src)
diff --git a/code/game/objects/closets/secure/engineering.dm b/code/game/objects/closets/secure/engineering.dm
index 55a6d9d6909..152adefcdd4 100644
--- a/code/game/objects/closets/secure/engineering.dm
+++ b/code/game/objects/closets/secure/engineering.dm
@@ -12,25 +12,26 @@
New()
..()
sleep(2)
- new /obj/item/wardrobe/chief_engineer(src)
- new /obj/item/blueprints(src)
var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src)
var/obj/item/weapon/storage/box/B = new(BPK)
+ new /obj/item/wardrobe/chief_engineer(src)
+ new /obj/item/blueprints(src)
+ new /obj/item/clothing/under/rank/chief_engineer(src)
new /obj/item/weapon/pen(B)
new /obj/item/device/pda/heads/ce(src)
- new /obj/item/device/multitool(src)
- new /obj/item/device/flash(src)
new /obj/item/clothing/head/helmet/hardhat/white(src)
new /obj/item/clothing/head/helmet/welding(src)
+ new /obj/item/clothing/gloves/yellow(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/weapon/cartridge/ce(src)
new /obj/item/weapon/storage/belt/utility/full(src)
+ new /obj/item/device/radio/headset/heads/ce(src)
new /obj/item/weapon/storage/toolbox/mechanical(src)
new /obj/item/clothing/suit/hazardvest(src)
- new /obj/item/clothing/gloves/yellow(src)
new /obj/item/clothing/mask/gas(src)
+ new /obj/item/device/multitool(src)
+ new /obj/item/device/flash(src)
new /obj/item/clothing/glasses/meson(src)
- new /obj/item/device/radio/headset/heads/ce(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/under/rank/chief_engineer(src)
return
@@ -54,6 +55,9 @@
new /obj/item/weapon/storage/toolbox/electrical(src)
new /obj/item/weapon/storage/toolbox/electrical(src)
new /obj/item/weapon/storage/toolbox/electrical(src)
+ new /obj/item/weapon/module/power_control(src)
+ new /obj/item/weapon/module/power_control(src)
+ new /obj/item/weapon/module/power_control(src)
new /obj/item/device/multitool(src)
new /obj/item/device/multitool(src)
new /obj/item/device/multitool(src)
@@ -83,6 +87,8 @@
new /obj/item/weapon/weldingtool/largetank(src)
return
+
+
/obj/structure/closet/secure_closet/engineering_personal
name = "Engineer's Locker"
req_access = list(access_engine)
@@ -93,6 +99,7 @@
icon_broken = "secureengbroken"
icon_off = "secureengoff"
+
New()
..()
sleep(2)
@@ -100,18 +107,19 @@
//
var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src)
var/obj/item/weapon/storage/box/B = new(BPK)
+ new /obj/item/clothing/under/rank/engineer(src)
+ new /obj/item/clothing/shoes/orange(src)
new /obj/item/weapon/pen(B)
new /obj/item/device/pda/engineering(src)
new /obj/item/device/t_scanner(src)
- new /obj/item/clothing/suit/hazardvest(src)
new /obj/item/weapon/storage/belt/utility/full(src)
new /obj/item/weapon/storage/toolbox/mechanical(src)
+ new /obj/item/weapon/cartridge/engineering(src)
+ new /obj/item/device/radio/headset/headset_eng(src)
+ new /obj/item/clothing/suit/hazardvest(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/head/helmet/hardhat(src)
new /obj/item/clothing/glasses/meson(src)
- new /obj/item/device/radio/headset/headset_eng(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/under/rank/engineer(src)
return
/obj/structure/closet/secure_closet/atmos_personal
diff --git a/code/game/objects/closets/secure/medical.dm b/code/game/objects/closets/secure/medical.dm
index 8680b469762..3d220fb37de 100644
--- a/code/game/objects/closets/secure/medical.dm
+++ b/code/game/objects/closets/secure/medical.dm
@@ -44,9 +44,9 @@
new /obj/item/weapon/tank/anesthetic(src)
new /obj/item/weapon/tank/anesthetic(src)
new /obj/item/weapon/tank/anesthetic(src)
- new /obj/item/clothing/mask/medical(src)
- new /obj/item/clothing/mask/medical(src)
- new /obj/item/clothing/mask/medical(src)
+ new /obj/item/clothing/mask/breath/medical(src)
+ new /obj/item/clothing/mask/breath/medical(src)
+ new /obj/item/clothing/mask/breath/medical(src)
return
@@ -82,7 +82,9 @@
new /obj/item/device/pda/medical(src)
new /obj/item/weapon/storage/firstaid/regular(src)
new /obj/item/device/flashlight/pen(src)
+ new /obj/item/weapon/cartridge/medical(src)
new /obj/item/device/radio/headset/headset_med(src)
+ return
/obj/structure/closet/secure_closet/genetics_personal
name = "Geneticist's Locker"
@@ -132,9 +134,12 @@
new /obj/item/device/pda/heads/cmo(src)
new /obj/item/weapon/storage/firstaid/regular(src)
new /obj/item/device/flashlight/pen(src)
+ new /obj/item/weapon/cartridge/cmo(src)
new /obj/item/device/radio/headset/heads/cmo(src)
return
+
+
/obj/structure/closet/secure_closet/animal
name = "Animal Control"
req_access = list(access_medical)
@@ -168,4 +173,4 @@
sleep(2)
new /obj/item/weapon/storage/pillbottlebox(src)
new /obj/item/weapon/storage/pillbottlebox(src)
- return
+ return
\ No newline at end of file
diff --git a/code/game/objects/closets/secure/personal.dm b/code/game/objects/closets/secure/personal.dm
index 6fa801c0a50..2b0b8ad3b97 100644
--- a/code/game/objects/closets/secure/personal.dm
+++ b/code/game/objects/closets/secure/personal.dm
@@ -21,6 +21,15 @@
new /obj/item/clothing/shoes/white( src )
return
+
+/obj/structure/closet/secure_closet/personal/cabinet/New()
+ ..()
+ spawn(4)
+ contents = list()
+ new /obj/item/weapon/storage/backpack/satchel( src )
+ new /obj/item/device/radio/headset( src )
+ return
+
/obj/structure/closet/secure_closet/personal/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (src.opened)
if (istype(W, /obj/item/weapon/grab))
@@ -66,4 +75,4 @@
O.show_message(text("\blue The locker has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2)
else
user << "\red Access Denied"
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm
index 15e95ba5c6a..ab98821250f 100644
--- a/code/game/objects/closets/secure/security.dm
+++ b/code/game/objects/closets/secure/security.dm
@@ -15,14 +15,15 @@
//
new /obj/item/device/pda/captain(src)
new /obj/item/weapon/storage/id_kit(src)
- new /obj/item/weapon/reagent_containers/food/drinks/flask(src)
- new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/suit/armor/vest(src)
- new /obj/item/clothing/head/helmet/swat(src)
- new /obj/item/device/radio/headset/heads/captain(src)
new /obj/item/clothing/suit/armor/captain(src)
new /obj/item/clothing/head/helmet/cap(src)
+ new /obj/item/clothing/glasses/sunglasses(src)
+ new /obj/item/clothing/suit/armor/vest(src)
+ new /obj/item/weapon/cartridge/captain(src)
+ new /obj/item/clothing/head/helmet/swat(src)
+ new /obj/item/device/radio/headset/heads/captain(src)
+ new /obj/item/weapon/reagent_containers/food/drinks/flask(src)
+ new /obj/item/weapon/gun/energy/gun(src)
return
@@ -45,12 +46,13 @@
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
var/obj/item/weapon/storage/box/B = new(BPK)
new /obj/item/weapon/pen(B)
- new /obj/item/device/flash(B)
new /obj/item/device/pda/heads/hop(src)
+ new /obj/item/weapon/cartridge/hop(src)
+ new /obj/item/device/radio/headset/heads/hop(src)
new /obj/item/weapon/storage/id_kit(src)
new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/device/flash(src)
new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/device/radio/headset/heads/hop(src)
return
@@ -74,12 +76,13 @@
var/obj/item/weapon/storage/box/B = new(BPK)
new /obj/item/weapon/pen(B)
new /obj/item/device/flash(B)
+ new /obj/item/device/pda/heads/hos(src)
+ new /obj/item/weapon/cartridge/hos(src)
+ new /obj/item/clothing/glasses/sunglasses/sechud(src)
+ new /obj/item/weapon/storage/flashbang_kit(src)
+ new /obj/item/weapon/storage/lockbox/loyalty(src)
new /obj/item/weapon/melee/baton(src)
new /obj/item/weapon/gun/energy/gun(src)
- new /obj/item/device/pda/heads/hos(src)
- new /obj/item/clothing/glasses/sunglasses/sechud(src)
- new /obj/item/weapon/storage/lockbox/loyalty(src)
- new /obj/item/weapon/storage/flashbang_kit(src)
return
/obj/structure/closet/secure_closet/warden
@@ -102,15 +105,18 @@
var/obj/item/weapon/storage/box/B = new(BPK)
new /obj/item/weapon/pen(B)
new /obj/item/device/flash(B)
- new /obj/item/weapon/melee/baton(src)
- new /obj/item/weapon/gun/energy/taser(src)
new /obj/item/device/pda/security(src)
new /obj/item/clothing/suit/armor/vest(src)
- new /obj/item/clothing/glasses/sunglasses/sechud(src)
+ new /obj/item/weapon/cartridge/security(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/weapon/storage/flashbang_kit(src)
+ new /obj/item/weapon/melee/baton(src)
+ new /obj/item/weapon/gun/energy/taser(src)
+ new /obj/item/clothing/glasses/sunglasses/sechud(src)
return
+
+
/obj/structure/closet/secure_closet/security
name = "Security Locker"
req_access = list(access_security)
@@ -130,18 +136,19 @@
var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src)
var/obj/item/weapon/storage/box/B = new(BPK)
new /obj/item/weapon/pen(B)
- new /obj/item/device/flash(B)
- new /obj/item/weapon/pepperspray(src)
- new /obj/item/weapon/melee/baton(src)
new /obj/item/policetaperoll(src)
- new /obj/item/weapon/flashbang(src)
- new /obj/item/device/pda/security(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/suit/storage/gearharness(src)
- new /obj/item/clothing/glasses/sunglasses/sechud(src)
- new /obj/item/weapon/storage/belt/security(src)
new /obj/item/clothing/head/helmet(src)
+ new /obj/item/weapon/cartridge/security(src)
+ new /obj/item/device/pda/security(src)
new /obj/item/device/radio/headset/headset_sec(src)
+ new /obj/item/weapon/storage/belt/security(src)
+ new /obj/item/weapon/flashbang(src)
+ new /obj/item/weapon/pepperspray(src)
+ new /obj/item/device/flash(src)
+ new /obj/item/weapon/melee/baton(src)
+ new /obj/item/clothing/glasses/sunglasses/sechud(src)
return
@@ -156,7 +163,6 @@
icon_broken = "cabinetdetective_broken"
icon_off = "cabinetdetective_broken"
-
New()
..()
sleep(2)
@@ -166,15 +172,16 @@
var/obj/item/weapon/storage/box/B = new(BPK)
var/obj/item/weapon/clipboard/C = new(B)
new /obj/item/weapon/pen(C)
- new /obj/item/weapon/notebook(src)
+ new /obj/item/weapon/clipboard/notebook(src)
new /obj/item/device/detective_scanner(src)
new /obj/item/policetaperoll(src)
new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/device/pda/detective(src)
new /obj/item/device/radio/headset/headset_sec(src)
+ new /obj/item/weapon/cartridge/detective(src)
//
new /obj/item/weapon/reagent_containers/food/drinks/dflask(src)
- new /obj/item/weapon/zippo(B)
+ new /obj/item/weapon/lighter/zippo(B)
new /obj/item/weapon/pepperspray/small(src)
return
diff --git a/code/game/objects/closets/syndicate.dm b/code/game/objects/closets/syndicate.dm
index 82d1b114ba9..9b8b6629d33 100644
--- a/code/game/objects/closets/syndicate.dm
+++ b/code/game/objects/closets/syndicate.dm
@@ -7,7 +7,8 @@
new /obj/item/clothing/head/helmet/space/syndicate(src)
new /obj/item/clothing/suit/space/syndicate(src)
new /obj/item/weapon/crowbar(src)
- new /obj/item/weapon/cell(src)
+ new /obj/item/weapon/cell/high(src)
new /obj/item/weapon/card/id/syndicate(src)
new /obj/item/device/multitool(src)
+ new /obj/item/weapon/shield/riot(src)
diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index 26139627de7..a5741d8e00f 100755
--- a/code/game/objects/devices/PDA/PDA.dm
+++ b/code/game/objects/devices/PDA/PDA.dm
@@ -567,7 +567,7 @@
playsound(P.loc, 'twobeep.ogg', 50, 1)
-// log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
+ log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
if("Send Honk")//Honk virus
diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm
index 2461604742a..9f8c9529d27 100644
--- a/code/game/objects/devices/PDA/cart.dm
+++ b/code/game/objects/devices/PDA/cart.dm
@@ -564,7 +564,7 @@ Code:
/obj/item/weapon/cartridge/Topic(href, href_list)
..()
- if (usr.stat || usr.restrained() || !in_range(loc, usr))
+ if (!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
usr.machine = null
usr << browse(null, "window=pda")
return
diff --git a/code/game/objects/devices/flashlight.dm b/code/game/objects/devices/flashlight.dm
index 54fef1dd26b..ddbff34c407 100644
--- a/code/game/objects/devices/flashlight.dm
+++ b/code/game/objects/devices/flashlight.dm
@@ -13,18 +13,36 @@
icon_on = "flight1"
icon_off = "flight0"
+/obj/item/device/flashlight/initialize()
+ ..()
+ if (on)
+ icon_state = icon_on
+ src.sd_SetLuminosity(brightness_on)
+ else
+ icon_state = icon_off
+ src.sd_SetLuminosity(0)
+
+/obj/item/device/flashlight/proc/update_brightness(var/mob/user = null)
+ if (on)
+ icon_state = icon_on
+ if(src.loc == user)
+ user.total_luminosity += brightness_on
+ else if (isturf(src.loc))
+ src.sd_SetLuminosity(brightness_on)
+
+ else
+ icon_state = icon_off
+ if(src.loc == user)
+ user.total_luminosity -= brightness_on
+ else if (isturf(src.loc))
+ src.sd_SetLuminosity(0)
/obj/item/device/flashlight/attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
return
on = !on
- if (on)
- icon_state = icon_on
- user.total_luminosity += brightness_on
- else
- icon_state = icon_off
- user.total_luminosity -= brightness_on
+ update_brightness(user)
return
@@ -64,8 +82,8 @@
/obj/item/device/flashlight/pickup(mob/user)
if(on)
- src.sd_SetLuminosity(0)
user.total_luminosity += brightness_on
+ src.sd_SetLuminosity(0)
/obj/item/device/flashlight/dropped(mob/user)
@@ -136,10 +154,20 @@
/obj/item/clothing/head/helmet/hardhat/pickup(mob/user)
if(on)
- src.sd_SetLuminosity(0)
user.total_luminosity += brightness_on
+ user.UpdateLuminosity()
+ src.sd_SetLuminosity(0)
/obj/item/clothing/head/helmet/hardhat/dropped(mob/user)
if(on)
user.total_luminosity -= brightness_on
+ user.UpdateLuminosity()
src.sd_SetLuminosity(brightness_on)
+
+/obj/item/device/flashlight/lamp/verb/toggle_light()
+ set name = "Toggle light"
+ set category = "Object"
+ set src in oview(1)
+
+ if(!usr.stat)
+ attack_self(usr)
\ No newline at end of file
diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm
index 103d7c2a990..f8b2c6963fd 100644
--- a/code/game/objects/devices/scanners.dm
+++ b/code/game/objects/devices/scanners.dm
@@ -280,63 +280,64 @@ MASS SPECTROMETER
origin_tech = "magnets=1;biotech=1"
var/mode = 1;
-proc/analyze_health_less_info(mob/living/carbon/M as mob, mob/user as mob)
- var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss())))
- if((M.reagents && M.reagents.has_reagent("zombiepowder")) || (M.changeling && M.changeling.changeling_fakedeath))
- user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1)
- user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1)
- else
- user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health - M.halloss))), 1)
- user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.getOxyLoss() > 50 ? "\red [M.getOxyLoss()]" : M.getOxyLoss(), M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1)
- user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
- user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- var/list/damaged = H.get_damaged_organs(1,1)
- user.show_message("\blue Localized Damage, Brute/Burn:",1)
- if(length(damaged)>0)
- for(var/datum/organ/external/org in damaged)
- user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1)
- else
- user.show_message("\blue \t Limbs are OK.",1)
- if((M.changeling && M.changeling.changeling_fakedeath) || (M.reagents && M.reagents.has_reagent("zombiepowder")))
- user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
- else
- user.show_message(text("\blue [] | [] | [] | []", M.getOxyLoss() > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
- if (M.getCloneLoss())
- user.show_message(text("\red Subject appears to have been imperfectly cloned."), 1)
- for(var/datum/disease/D in M.viruses)
- if(!D.hidden[SCANNER])
- user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]"))
- if (M.reagents && M.reagents.get_reagent_amount("inaprovaline"))
- user.show_message(text("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1)
- if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0)
- user.show_message(text("\red Subject is brain dead."), 1)
- else if (M.getBrainLoss() >= 60)
- user.show_message(text("\red Severe brain damage detected. Subject likely to have mental retardation."), 1)
- else if (M.getBrainLoss() >= 10)
- user.show_message(text("\red Significant brain damage detected. Subject may have had a concussion."), 1)
- if (M.virus2 || M.reagents.reagent_list.len > 0)
- user.show_message(text("\red Unknown substance detected in blood."), 1)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- for(var/name in H.organs)
- var/datum/organ/external/e = H.organs[name]
- if(e.broken)
- user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1)
- break
- if(ishuman(M))
- if(M:vessel)
- var/blood_volume = round(M:vessel.get_reagent_amount("blood"))
- var/blood_percent = blood_volume / 560
- blood_percent *= 100
- if(blood_volume <= 448)
- user.show_message("\red Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl")
- else if(blood_volume <= 336)
- user.show_message("\red Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl")
+ proc
+ analyze_health_less_info(mob/living/carbon/M as mob, mob/user as mob)
+ var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss())))
+ if((M.reagents && M.reagents.has_reagent("zombiepowder")) || (M.changeling && M.changeling.changeling_fakedeath))
+ user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1)
+ user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1)
else
- user.show_message("\blue Blood Level Normal: [blood_percent]% [blood_volume]cl")
- return
+ user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health - M.halloss))), 1)
+ user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.getOxyLoss() > 50 ? "\red [M.getOxyLoss()]" : M.getOxyLoss(), M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1)
+ user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
+ user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
+ if(mode == 1 && istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/list/damaged = H.get_damaged_organs(1,1)
+ user.show_message("\blue Localized Damage, Brute/Burn:",1)
+ if(length(damaged)>0)
+ for(var/datum/organ/external/org in damaged)
+ user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1)
+ else
+ user.show_message("\blue \t Limbs are OK.",1)
+ if((M.changeling && M.changeling.changeling_fakedeath) || (M.reagents && M.reagents.has_reagent("zombiepowder")))
+ user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
+ else
+ user.show_message(text("\blue [] | [] | [] | []", M.getOxyLoss() > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
+ if (M.getCloneLoss())
+ user.show_message(text("\red Subject appears to have been imperfectly cloned."), 1)
+ for(var/datum/disease/D in M.viruses)
+ if(!D.hidden[SCANNER])
+ user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]"))
+ if (M.reagents && M.reagents.get_reagent_amount("inaprovaline"))
+ user.show_message(text("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1)
+ if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0)
+ user.show_message(text("\red Subject is brain dead."), 1)
+ else if (M.getBrainLoss() >= 60)
+ user.show_message(text("\red Severe brain damage detected. Subject likely to have mental retardation."), 1)
+ else if (M.getBrainLoss() >= 10)
+ user.show_message(text("\red Significant brain damage detected. Subject may have had a concussion."), 1)
+ if (M.virus2 || M.reagents.reagent_list.len > 0)
+ user.show_message(text("\red Unknown substance detected in blood."), 1)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ for(var/name in H.organs)
+ var/datum/organ/external/e = H.organs[name]
+ if(e.broken)
+ user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1)
+ break
+ if(ishuman(M))
+ if(M:vessel)
+ var/blood_volume = round(M:vessel.get_reagent_amount("blood"))
+ var/blood_percent = blood_volume / 560
+ blood_percent *= 100
+ if(blood_volume <= 448)
+ user.show_message("\red Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl")
+ else if(blood_volume <= 336)
+ user.show_message("\red Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl")
+ else
+ user.show_message("\blue Blood Level Normal: [blood_percent]% [blood_volume]cl")
+ return
/obj/item/device/healthanalyzer/attack(mob/M as mob, mob/user as mob)
if ((user.mutations & CLUMSY || user.getBrainLoss() >= 60) && prob(50))
diff --git a/code/game/objects/devices/taperecorder.dm b/code/game/objects/devices/taperecorder.dm
index 0d6f32e97ed..1d0b58ec04f 100644
--- a/code/game/objects/devices/taperecorder.dm
+++ b/code/game/objects/devices/taperecorder.dm
@@ -13,6 +13,7 @@
var/playsleepseconds = 0.0
var/list/storedinfo = new/list()
var/list/timestamp = new/list()
+ var/canprint = 1
flags = FPRINT | TABLEPASS | CONDUCT
throwforce = 2
throw_speed = 4
@@ -197,6 +198,9 @@
set name = "Print Transcript"
set category = "Object"
+ if (!canprint)
+ usr << "\red The recorder can't print that fast!"
+ return
if (src.recording == 1 || src.playing == 1)
usr << "\red You can't print the transcript while playing or recording!"
return
@@ -208,6 +212,9 @@
P.info = t1
P.name = "paper - 'Transcript'"
P.overlays += "paper_words"
+ canprint = 0
+ sleep(300)
+ canprint = 1
/obj/item/device/taperecorder/attack_self(mob/user)
diff --git a/code/game/objects/door_assembly.dm b/code/game/objects/door_assembly.dm
index 507f571158d..67cf74849be 100644
--- a/code/game/objects/door_assembly.dm
+++ b/code/game/objects/door_assembly.dm
@@ -87,14 +87,14 @@ obj/structure/door_assembly
state = 1
glass = 0
-/* door_assembly_research
+ door_assembly_research
name = "Research Airlock Assembly"
icon_state = "door_as_res1"
airlock_type = /obj/machinery/door/airlock/research
anchored = 1
density = 1
state = 1
- glass = 0*/
+ glass = 0
door_assembly_med
name = "Medical Airlock Assembly"
diff --git a/code/game/objects/effect_system.dm b/code/game/objects/effect_system.dm
index a5e1f95527f..ee5bee86a77 100644
--- a/code/game/objects/effect_system.dm
+++ b/code/game/objects/effect_system.dm
@@ -413,9 +413,13 @@ steam.start() -- spawns the effect
R.reagents.my_atom = R
reagents.trans_to(R, reagents.total_volume/divisor)
for(var/atom/A in view(1, src))
- R.reagents.reaction(A)
- del(R)
-
+ if(reagents.has_reagent("radium")||reagents.has_reagent("uranium")||reagents.has_reagent("carbon")||reagents.has_reagent("thermite"))//Prevents unholy radium spam by reducing the number of 'greenglows' down to something reasonable -Sieve
+ if(prob(5))
+ R.reagents.reaction(A)
+ del(R)
+ else
+ R.reagents.reaction(A)
+ del(R)
return
/obj/effect/effect/chem_smoke/HasEntered(mob/living/carbon/M as mob )
@@ -910,7 +914,7 @@ steam.start() -- spawns the effect
set_up(amt=5, loca, var/datum/reagents/carry = null, var/metalfoam = 0)
- amount = round(amt/5, 1)
+ amount = round(sqrt(amt / 3), 1)
if(istype(loca, /turf/))
location = loca
else
diff --git a/code/game/objects/grille.dm b/code/game/objects/grille.dm
index 23a05cf7be3..b584f5ec996 100644
--- a/code/game/objects/grille.dm
+++ b/code/game/objects/grille.dm
@@ -117,6 +117,49 @@
for(var/mob/O in oviewers())
O << text("\red [user] [src.anchored ? "fastens" : "unfastens"] the grille.")
return
+ else if( istype(W,/obj/item/stack/sheet/rglass) || istype(W,/obj/item/stack/sheet/glass) )
+ var/dir_to_set = 1
+ if(src.loc == usr.loc)
+ dir_to_set = usr.dir
+ else
+ if( ( src.x == usr.x ) || (src.y == usr.y) ) //Only supposed to work for cardinal directions.
+ if( src.x == usr.x )
+ if( src.y > usr.y )
+ dir_to_set = 2
+ else
+ dir_to_set = 1
+ else if( src.y == usr.y )
+ if( src.x > usr.x )
+ dir_to_set = 8
+ else
+ dir_to_set = 4
+ else
+ usr << "\red You can't reach there.."
+ return //Only works for cardinal direcitons, diagonals aren't supposed to work like this.
+ for(var/obj/structure/window/WINDOW in src.loc)
+ if(WINDOW.dir == dir_to_set)
+ usr << "\red There is already a window facing this way there."
+ return
+ usr << "\blue You start placing the window"
+ if(do_after(user,20))
+ if(!src) return //Grille destroyed while waiting
+ for(var/obj/structure/window/WINDOW in src.loc)
+ if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting.
+ usr << "\red There is already a window facing this way there."
+ return
+ var/obj/structure/window/WD
+ if(istype(W,/obj/item/stack/sheet/rglass))
+ WD = new/obj/structure/window(src.loc,1) //reinforced window
+ else
+ WD = new/obj/structure/window(src.loc,0) //normal window
+ WD.dir = dir_to_set
+ WD.ini_dir = dir_to_set
+ WD.anchored = 0
+ WD.state = 0
+ var/obj/item/stack/ST = W
+ ST.use(1)
+ usr << "\blue You place the [WD] on the [src]"
+ return
else if(istype(W, /obj/item/weapon/shard))
src.health -= W.force * 0.1
else if(!shock(user, 70))
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 8b307932995..45c7100ece6 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -253,11 +253,6 @@
del(src)
return
-/obj/screen/close/DblClick()
- if (src.master)
- src.master:close(usr)
- return
-
//What the fuck is this code Looks to be the parrying code. If you're grabbing someone, it might hit them instead... or something.--SkyMarshal
/mob/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -473,7 +468,7 @@
istype(W, /obj/item/weapon/screwdriver) || \
istype(W, /obj/item/weapon/pen) || \
istype(W, /obj/item/weapon/weldingtool) && W:welding || \
- istype(W, /obj/item/weapon/zippo) && W:lit || \
+ istype(W, /obj/item/weapon/lighter/zippo) && W:lit || \
istype(W, /obj/item/weapon/match) && W:lit || \
istype(W, /obj/item/clothing/mask/cigarette) && W:lit || \
istype(W, /obj/item/weapon/wirecutters) || \
@@ -509,7 +504,7 @@
/proc/is_burn(obj/item/W as obj)
return ( \
istype(W, /obj/item/weapon/weldingtool) && W:welding || \
- istype(W, /obj/item/weapon/zippo) && W:lit || \
+ istype(W, /obj/item/weapon/lighter/zippo) && W:lit || \
istype(W, /obj/item/weapon/match) && W:lit || \
istype(W, /obj/item/clothing/mask/cigarette) && W:lit || \
istype(W,/obj/item/projectile/beam)\
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index cddb2a25e65..33a1c461ea7 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -28,7 +28,7 @@
..()
if(istype(W, /obj/item/weapon/weldingtool) && W:welding)
light("\red [user] casually lights the [name] with [W], what a badass.")
- else if(istype(W, /obj/item/weapon/zippo) && W:lit)
+ else if(istype(W, /obj/item/weapon/lighter) && W:lit)
light()
else if(istype(W, /obj/item/weapon/match) && W:lit)
light()
diff --git a/code/game/objects/items/food.dm b/code/game/objects/items/food.dm
index 8639893257c..cce942fa728 100644
--- a/code/game/objects/items/food.dm
+++ b/code/game/objects/items/food.dm
@@ -36,7 +36,7 @@ MONKEY CUBE BOX
/obj/item/kitchen/donut_box/MouseDrop(mob/user as mob)
if ((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr))))))
- if(ishuman(user))
+ if(!istype(user, /mob/living/carbon/metroid))
if (usr.hand)
if (!( usr.l_hand ))
spawn( 0 )
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 7307c525518..4eff5bf31ac 100755
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -376,9 +376,18 @@ mob/proc/flash_weak_pain()
step_away(Metroid, user)
Metroid.canmove = 1
+ var/showname = "."
+ if(user)
+ showname = " by [user]."
+ if(!(user in viewers(M, null)))
+ showname = "."
for(var/mob/O in viewers(messagesource, null))
- O.show_message(text("\red [] has been attacked with [][] ", M, src, (user ? text(" by [].", user) : ".")), 1)
+ O.show_message(text("\red [] has been attacked with [][] ", M, src, showname), 1)
+
+ if(!showname && user)
+ if(user.client)
+ user << "\red You attack [M] with [src]. "
diff --git a/code/game/objects/items/robot_parts.dm b/code/game/objects/items/robot_parts.dm
index 70b26ced7ef..c392932ff22 100644
--- a/code/game/objects/items/robot_parts.dm
+++ b/code/game/objects/items/robot_parts.dm
@@ -90,6 +90,7 @@
if(src.l_arm && src.r_arm)
if(src.l_leg && src.r_leg)
if(src.chest && src.head)
+ //feedback_inc("cyborg_frames_built",1)
return 1
return 0
@@ -105,31 +106,35 @@
user.put_in_inactive_hand(B)
del(src)
if(istype(W, /obj/item/robot_parts/l_leg))
+ if(src.l_leg) return
user.drop_item()
W.loc = src
src.l_leg = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/r_leg))
+ if(src.r_leg) return
user.drop_item()
W.loc = src
src.r_leg = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/l_arm))
+ if(src.l_arm) return
user.drop_item()
W.loc = src
src.l_arm = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/r_arm))
+ if(src.r_arm) return
user.drop_item()
W.loc = src
src.r_arm = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/chest))
-
+ if(src.chest) return
if(W:wires && W:cell)
user.drop_item()
W.loc = src
@@ -141,6 +146,7 @@
user << "\blue You need to attach a cell to it first!"
if(istype(W, /obj/item/robot_parts/head))
+ if(src.head) return
if(W:flash2 && W:flash1)
user.drop_item()
W.loc = src
@@ -163,7 +169,7 @@
return
if(M.brainmob.mind in ticker.mode.head_revolutionaries)
- user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI."
+ user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI."
return
if(jobban_isbanned(M.brainmob, "Cyborg"))
@@ -196,8 +202,8 @@
O << "You are playing a Robot. The Robot can interact with most electronic objects in its view point."
O << "You must follow the laws that the AI has. You are the AI's assistant to the station basically."
- O << "To use something, simply double-click it."
- O << {"Use say ":s to speak to fellow cyborgs and the AI through binary."}
+ O << "To use something, simply click it."
+ O << {"Use say ":b to speak to fellow cyborgs and the AI through binary."}
O.job = "Cyborg"
@@ -206,6 +212,8 @@
W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
O.mmi = W
+ //feedback_inc("cyborg_birth",1)
+
del(src)
else
user << "\blue The MMI must go in after everything else!"
diff --git a/code/game/objects/items/tk_grab.dm b/code/game/objects/items/tk_grab.dm
index 920194386fe..a506cf43087 100644
--- a/code/game/objects/items/tk_grab.dm
+++ b/code/game/objects/items/tk_grab.dm
@@ -43,7 +43,7 @@
afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)//TODO: go over this
if(!target || !user) return
- if(last_throw+4 > world.time) return
+ if(last_throw+3 > world.time) return
if(!host)
del(src)
return
@@ -51,19 +51,24 @@
del(src)
return
if(!focus)
- focus_object(target)
+ focus_object(target, user)
return
+ var/focusturf = get_turf(focus)
+ if(get_dist(focusturf, target) <= 1 && !istype(target, /turf))
+ target.attackby(focus, user, user:get_organ_target())
- if((get_dist(target, user) <= 16) && (get_dist(focus, user) <= 10))
+ else if(get_dist(focusturf, target) <= 16)
apply_focus_overlay()
focus.throw_at(target, 10, 1)
last_throw = world.time
return
- proc/focus_object(var/obj/target)
+ proc/focus_object(var/obj/target, var/mob/living/user)
if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later
- if(target.anchored) return//No throwing anchored things
+ if(target.anchored)
+ target.attack_hand(user) // you can use shit now!
+ return//No throwing anchored things
focus = target
update_icon()
apply_focus_overlay()
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index f859590eae4..b7e4f4b3d64 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -206,26 +206,28 @@ FINGERPRINT CARD
return "There are no fingerprints on this card."
return
-///obj/item/weapon/f_card/attack_hand(mob/user as mob)
+/*
+/obj/item/weapon/f_card/attack_hand(mob/user as mob)
-// if ((user.r_hand == src || user.l_hand == src))
-// add_fingerprint(user)
-// var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user )
-// F.amount = 1
-// src.amount--
-// if (user.hand)
-// user.l_hand = F
-// else
-// user.r_hand = F
-// F.layer = 20
-// F.add_fingerprint(user)
-// if (src.amount < 1)
-// //SN src = null
-// del(src)
-// return
-// else
-// ..()
-// return
+ if ((user.r_hand == src || user.l_hand == src))
+ src.add_fingerprint(user)
+ var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user )
+ F.amount = 1
+ src.amount--
+ if (user.hand)
+ user.l_hand = F
+ else
+ user.r_hand = F
+ F.layer = 20
+ F.add_fingerprint(user)
+ if (src.amount < 1)
+ //SN src = null
+ del(src)
+ return
+ else
+ ..()
+ return
+*/
/obj/item/weapon/f_card/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 12e17bac5f1..4321dcef1f7 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -3,6 +3,7 @@ CONTAINS:
MATCHES
MATCHBOXES
CIGARETTES
+CIGARS
CIG PACKET
ZIPPO
*/
@@ -34,6 +35,7 @@ ZIPPO
processing_objects.Remove(src)
return
+
dropped(mob/user as mob)
if(src.lit == 1)
spawn(10)
@@ -117,21 +119,33 @@ ZIPPO
icon_butt = "cigbutt"
lastHolder = null
smoketime = 300
- var/butt_count = 5 //count of butt sprite variations
+ butt_count = 5 //count of butt sprite variations
proc
light(var/flavor_text = "[usr] lights the [name].")
+
put_out()
+ if (src.lit == -1)
+ return
+ src.lit = -1
+ src.damtype = "brute"
+ src.icon_state = icon_butt + "[rand(0,butt_count)]"
+ src.item_state = icon_off
+ src.desc = "A [src.name] butt."
+ src.name = "[src.name] butt"
attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- if(istype(W, /obj/item/weapon/weldingtool) && W:welding)
+ if(istype(W, /obj/item/weapon/weldingtool) && W:welding)
light("\red [user] casually lights the [name] with [W], what a badass.")
- else if(istype(W, /obj/item/weapon/zippo) && (W:lit > 0))
+ else if(istype(W, /obj/item/weapon/lighter/zippo) && (W:lit > 0))
light("\red With a single flick of their wrist, [user] smoothly lights their [name] with their [W]. Damn they're cool.")
+ else if(istype(W, /obj/item/weapon/lighter) && (W:lit > 0))
+ light("\red After some fiddling, [user] manages to light their [name] with [W].")
+
else if(istype(W, /obj/item/weapon/match) && (W:lit > 0))
- light("\red [user] lights their [name] with their [W]. How poor can you get?")
+ light("\red [user] lights their [name] with their [W].")
return
@@ -145,15 +159,6 @@ ZIPPO
O.show_message(flavor_text, 1)
processing_objects.Add(src)
- put_out()
- if (src.lit == -1)
- return
- src.lit = -1
- src.damtype = "brute"
- src.icon_state = icon_butt + "[rand(0,butt_count)]"
- src.item_state = icon_off
- src.desc = "A [src.name] butt."
- src.name = "[src.name] butt"
process()
@@ -181,6 +186,7 @@ ZIPPO
return ..()
+
////////////
// CIGARS //
////////////
@@ -197,13 +203,13 @@ ZIPPO
butt_count = 0
/obj/item/clothing/mask/cigarette/cigar/cohiba
- name = "Cohiba Cigar"
+ name = "Cohiba Robusto Cigar"
desc = "There's little more you could want from a cigar."
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
-/obj/item/clothing/mask/cigarette/cigar/havanian
+/obj/item/clothing/mask/cigarette/cigar/havana
name = "Premium Havanian Cigar"
desc = "A cigar fit for only the best for the best."
icon_state = "cigar2off"
@@ -212,20 +218,19 @@ ZIPPO
smoketime = 7200
/obj/item/weapon/cigbutt
- name = "Cigarette butt"
+ name = "cigarette butt"
desc = "A manky old cigarette butt."
- icon = 'cigarettes.dmi'
+ icon = 'masks.dmi'
icon_state = "cigbutt"
w_class = 1
throwforce = 1
-/obj/item/weapon/cigarbutt
- name = "Cigar butt"
+/obj/item/weapon/cigbutt/cigarbutt
+ name = "cigar butt"
desc = "A manky old cigar butt."
- icon = 'cigarettes.dmi'
icon_state = "cigarbutt"
- w_class = 1
- throwforce = 1
+
+
////////////
@@ -269,36 +274,68 @@ ZIPPO
/////////
//ZIPPO//
/////////
-/obj/item/weapon/zippo
- name = "Zippo lighter"
- desc = "The detective's zippo."
+
+/obj/item/weapon/lighter
+ name = "cheap lighter"
+ desc = "A cheap-as-free lighter."
icon = 'items.dmi'
- icon_state = "zippo"
- item_state = "zippo"
+ icon_state = "lighter-g"
+ item_state = "lighter-g"
+ var/icon_on = "lighter-g-on"
+ var/icon_off = "lighter-g"
w_class = 1
throwforce = 4
flags = ONBELT | TABLEPASS | CONDUCT
- var
- lit = 0
+ var/lit = 0
+/obj/item/weapon/lighter/zippo
+ name = "Zippo lighter"
+ desc = "The zippo."
+ icon_state = "zippo"
+ item_state = "zippo"
+ icon_on = "zippoon"
+ icon_off = "zippo"
+
+/obj/item/weapon/lighter/random
+ New()
+ var/color = pick("r","c","y","g")
+ icon_on = "lighter-[color]-on"
+ icon_off = "lighter-[color]"
+ icon_state = icon_off
+
+/obj/item/weapon/lighter
attack_self(mob/user)
if(user.r_hand == src || user.l_hand == src)
if(!src.lit)
src.lit = 1
- src.icon_state = "zippoon"
- src.item_state = "zippoon"
- for(var/mob/O in viewers(user, null))
- O.show_message(text("\red Without even breaking stride, [] flips open and lights the [] in one smooth movement.", user, src), 1)
+ src.icon_state = icon_on
+ src.item_state = icon_on
+ if( istype(src,/obj/item/weapon/lighter/zippo) )
+ for(var/mob/O in viewers(user, null))
+ O.show_message(text("\red Without even breaking stride, [] flips open and lights the [] in one smooth movement.", user, src), 1)
+ else
+ if(prob(75))
+ for(var/mob/O in viewers(user, null))
+ O.show_message("\red After a few attempts, [user] manages to light the [src].", 1)
+ else
+ user << "\red You burn yourself while lighting the lighter."
+ user.adjustFireLoss(5)
+ for(var/mob/O in viewers(user, null))
+ O.show_message("\red After a few attempts, [user] manages to light the [src], they however burn their finger in the process.", 1)
user.total_luminosity += 2
processing_objects.Add(src)
else
src.lit = 0
- src.icon_state = "zippo"
- src.item_state = "zippo"
- for(var/mob/O in viewers(user, null))
- O.show_message(text("\red You hear a quiet click, as [] shuts off the [] without even looking what they're doing. Wow.", user, src), 1)
+ src.icon_state = icon_off
+ src.item_state = icon_off
+ if( istype(src,/obj/item/weapon/lighter/zippo) )
+ for(var/mob/O in viewers(user, null))
+ O.show_message(text("\red You hear a quiet click, as [] shuts off the [] without even looking at what they're doing. Wow.", user, src), 1)
+ else
+ for(var/mob/O in viewers(user, null))
+ O.show_message("\red [user] quietly shuts off the [src].", 1)
user.total_luminosity -= 2
processing_objects.Remove(src)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 340dcc3925d..510d2c76be4 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -211,11 +211,8 @@ the implant may become unstable and either pre-maturely inject the subject or si
if(!istype(M, /mob/living/carbon/human)) return
var/mob/living/carbon/human/H = M
if(H.mind in ticker.mode.head_revolutionaries)
- visible_message("\red [M] seems to resist the implant.", 1)
- for(var/mob/O in (viewers(M) - M))
- O.show_message("\red [M] seems to resist the implant.", 1)
- M << "\red You resist the implant."
- return
+ H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of NanoTrasen try to invade your mind!")
+ return
else if(H.mind in ticker.mode:revolutionaries)
ticker.mode:remove_revolutionary(H.mind)
H << "\blue You feel a surge of loyalty towards NanoTrasen."
diff --git a/code/game/objects/items/weapons/papers_bins.dm b/code/game/objects/items/weapons/papers_bins.dm
index 3ac09bc13c1..2aec7878b7c 100644
--- a/code/game/objects/items/weapons/papers_bins.dm
+++ b/code/game/objects/items/weapons/papers_bins.dm
@@ -701,7 +701,7 @@ NOTEBOOK
user.drop_item()
P.loc = src
else
- user << "\blue Not enough space!!!"
+ user << "\blue Not enough space!"
else
if (istype(P, /obj/item/weapon/pen))
if (!src.pen)
@@ -714,7 +714,7 @@ NOTEBOOK
return
/obj/item/weapon/clipboard/proc/update()
- src.icon_state = text("clipboard[][]", (locate(/obj/item/weapon/paper, src) ? "1" : "0"), (locate(/obj/item/weapon/pen, src) ? "1" : "0"))
+ src.icon_state = text("[src.name][][]", (locate(/obj/item/weapon/paper, src) ? "1" : "0"), (locate(/obj/item/weapon/pen, src) ? "1" : "0"))
return
@@ -764,160 +764,3 @@ NOTEBOOK
src.name = text("photo[]", (n_name ? text("- '[]'", n_name) : null))
src.add_fingerprint(user)
return
-
-// notebook
-
-/obj/item/weapon/notebook/attack_self(mob/user as mob)
- var/dat = "Notebook
"
- if (src.pen)
- dat += text("Remove Pen
", src)
- for(var/obj/item/weapon/paper/P in src)
- dat += text("[] Write Remove
", src, P, P.name, src, P, src, P)
- user << browse(dat, "window=notebook")
- onclose(user, "notebook")
- return
-
-/obj/item/weapon/notebook/Topic(href, href_list)
- ..()
- if ((usr.stat || usr.restrained()))
- return
- if (usr.contents.Find(src))
- usr.machine = src
- if (href_list["pen"])
- if (src.pen)
- if ((usr.hand && !( usr.l_hand )))
- usr.l_hand = src.pen
- src.pen.loc = usr
- src.pen.layer = 20
- src.pen = null
- usr.update_clothing()
- else
- if (!( usr.r_hand ))
- usr.r_hand = src.pen
- src.pen.loc = usr
- src.pen.layer = 20
- src.pen = null
- usr.update_clothing()
- if (src.pen)
- src.pen.add_fingerprint(usr)
- src.add_fingerprint(usr)
- if (href_list["remove"])
- var/obj/item/P = locate(href_list["remove"])
- if ((P && P.loc == src))
- if ((usr.hand && !( usr.l_hand )))
- usr.l_hand = P
- P.loc = usr
- P.layer = 20
- usr.update_clothing()
- else
- if (!( usr.r_hand ))
- usr.r_hand = P
- P.loc = usr
- P.layer = 20
- usr.update_clothing()
- P.add_fingerprint(usr)
- src.add_fingerprint(usr)
- if (href_list["write"])
- var/obj/item/P = locate(href_list["write"])
- if ((P && P.loc == src))
- if (istype(usr.r_hand, /obj/item/weapon/pen))
- P.attackby(usr.r_hand, usr)
- else
- if (istype(usr.l_hand, /obj/item/weapon/pen))
- P.attackby(usr.l_hand, usr)
- else
- if (istype(src.pen, /obj/item/weapon/pen))
- P.attackby(src.pen, usr)
- src.add_fingerprint(usr)
- if (href_list["read"])
- var/obj/item/weapon/paper/P = locate(href_list["read"])
- if ((P && P.loc == src))
- if (!( istype(usr, /mob/living/carbon/human) ))
- usr << browse(text("[][]", P.name, stars(P.info)), text("window=[]", P.name))
- onclose(usr, "[P.name]")
- else
- usr << browse(text("[][]", P.name, P.info), text("window=[]", P.name))
- onclose(usr, "[P.name]")
- if (ismob(src.loc))
- var/mob/M = src.loc
- if (M.machine == src)
- spawn( 0 )
- src.attack_self(M)
- return
- return
-
-/obj/item/weapon/notebook/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/item/weapon/notebook/attack_hand(mob/user as mob)
-
- if ((locate(/obj/item/weapon/paper, src) && (!( user.equipped() ) && (user.l_hand == src || user.r_hand == src))))
- var/obj/item/weapon/paper/P
- for(P in src)
- break
- if (P)
- if (user.hand)
- user.l_hand = P
- else
- user.r_hand = P
- P.loc = user
- P.layer = 20
- P.add_fingerprint(user)
- user.update_clothing()
- src.add_fingerprint(user)
- else
- return ..()
- return
-
-/obj/item/weapon/notebook/attackby(obj/item/weapon/P as obj, mob/user as mob)
- ..()
- if (istype(P, /obj/item/weapon/paper))
- if (src.contents.len < 15)
- user.drop_item()
- P.loc = src
- else
- user << "\blue Not enough space!!!"
- else
- if (istype(P, /obj/item/weapon/pen))
- if (!src.pen)
- user.drop_item()
- P.loc = src
- src.pen = P
- else
- return
- src.update()
- return
-
-/obj/item/weapon/notebook/proc/update()
- src.icon_state = text("notebook[][]", (locate(/obj/item/weapon/paper, src) ? "1" : "0"), (locate(/obj/item/weapon/pen, src) ? "1" : "0"))
- return
-
-
-/obj/item/weapon/notebook/MouseDrop(obj/over_object as obj) //Quick notebook fix. -Agouri
- if (ishuman(usr) || ismonkey(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~
- var/mob/M = usr
- if (!( istype(over_object, /obj/screen) ))
- return ..()
- if ((!( M.restrained() ) && !( M.stat ) /*&& M.pocket == src*/))
- if (over_object.name == "r_hand")
- if (!( M.r_hand ))
- M.u_equip(src)
- M.r_hand = src
- else
- if (over_object.name == "l_hand")
- if (!( M.l_hand ))
- M.u_equip(src)
- M.l_hand = src
- M.update_clothing()
- src.add_fingerprint(usr)
- return //
-
-/obj/item/weapon/notebook/New()
-
- ..()
- for(var/i = 1, i <= 3, i++)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
- P.loc = src
- src.pen = new /obj/item/weapon/pen(src)
- src.update()
- return
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index d1e095b8f06..997ca128d7f 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -256,8 +256,8 @@ WELDINGTOOOL
user.eye_blind = 5
user.eye_blurry = 5
user.disabilities |= 1
- spawn(100)
- user.disabilities &= ~1
+// spawn(100)
+// user.disabilities &= ~1 //Simpler to just leave them short sighted.
return
attack(mob/M as mob, mob/user as mob)
diff --git a/code/game/objects/items/weapons/wrappingpaper.dm b/code/game/objects/items/weapons/wrappingpaper.dm
new file mode 100644
index 00000000000..8d3bb9a8495
--- /dev/null
+++ b/code/game/objects/items/weapons/wrappingpaper.dm
@@ -0,0 +1,230 @@
+/*
+CONTAINS:
+WRAPPING PAPER
+GIFTS
+BEDSHEET BIN
+PHOTOGRAPHS
+
+*/
+// WRAPPING PAPER
+
+/obj/item/weapon/wrapping_paper/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if (!( locate(/obj/structure/table, src.loc) ))
+ user << "\blue You MUST put the paper on a table!"
+ if (W.w_class < 4)
+ if ((istype(user.l_hand, /obj/item/weapon/wirecutters) || istype(user.r_hand, /obj/item/weapon/wirecutters)))
+ var/a_used = 2 ** (src.w_class - 1)
+ if (src.amount < a_used)
+ user << "\blue You need more paper!"
+ return
+ else
+ src.amount -= a_used
+ user.drop_item()
+ var/obj/item/weapon/gift/G = new /obj/item/weapon/gift( src.loc )
+ G.size = W.w_class
+ G.w_class = G.size + 1
+ G.icon_state = text("gift[]", G.size)
+ G.gift = W
+ W.loc = G
+ G.add_fingerprint(user)
+ W.add_fingerprint(user)
+ src.add_fingerprint(user)
+ if (src.amount <= 0)
+ new /obj/item/weapon/c_tube( src.loc )
+ //SN src = null
+ del(src)
+ return
+ else
+ user << "\blue You need scissors!"
+ else
+ user << "\blue The object is FAR too large!"
+ return
+
+
+/obj/item/weapon/wrapping_paper/examine()
+ set src in oview(1)
+
+ ..()
+ usr << text("There is about [] square units of paper left!", src.amount)
+ return
+
+/obj/item/weapon/wrapping_paper/attack(mob/target as mob, mob/user as mob)
+ if (!istype(target, /mob/living/carbon/human)) return
+ if (istype(target:wear_suit, /obj/item/clothing/suit/straight_jacket) || target:stat)
+ if (src.amount > 2)
+ var/obj/effect/spresent/present = new /obj/effect/spresent (target:loc)
+ src.amount -= 2
+
+ if (target:client)
+ target:client:perspective = EYE_PERSPECTIVE
+ target:client:eye = present
+
+ target:loc = present
+ target.attack_log += text("\[[time_stamp()]\] Has been wrapped with [src.name] by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to wrap [target.name] ([target.ckey])")
+
+ log_attack("[user.name] ([user.ckey]) used the [src.name] to wrap [target.name] ([target.ckey])")
+
+ else
+ user << "/blue You need more paper."
+ else
+ user << "Theyre moving around too much. a Straitjacket would help."
+
+
+
+
+
+// GIFTS
+
+/obj/item/weapon/gift/attack_self(mob/user as mob)
+ if(!src.gift)
+ user << "\blue The gift was empty!"
+ del(src)
+ src.gift.loc = user
+ if (user.hand)
+ user.l_hand = src.gift
+ else
+ user.r_hand = src.gift
+ src.gift.layer = 20
+ src.gift.add_fingerprint(user)
+ del(src)
+ return
+
+/obj/item/weapon/a_gift/ex_act()
+ del(src)
+ return
+
+
+/obj/effect/spresent/relaymove(mob/user as mob)
+ if (user.stat)
+ return
+ user << "\blue You cant move."
+
+/obj/effect/spresent/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+
+ if (!istype(W, /obj/item/weapon/wirecutters))
+ user << "/blue I need wirecutters for that."
+ return
+
+ user << "\blue You cut open the present."
+
+ for(var/mob/M in src) //Should only be one but whatever.
+ M.loc = src.loc
+ if (M.client)
+ M.client.eye = M.client.mob
+ M.client.perspective = MOB_PERSPECTIVE
+
+ del(src)
+
+
+/obj/item/weapon/a_gift/attack_self(mob/M as mob)
+ switch(pick("flash", "t_gun", "l_gun", "shield", "sword", "axe"))
+ if("flash")
+ var/obj/item/device/flash/W = new /obj/item/device/flash( M )
+ if (M.hand)
+ M.l_hand = W
+ else
+ M.r_hand = W
+ W.layer = 20
+ W.add_fingerprint(M)
+ //SN src = null
+ del(src)
+ return
+ if("l_gun")
+ var/obj/item/weapon/gun/energy/laser/W = new /obj/item/weapon/gun/energy/laser( M )
+ if (M.hand)
+ M.l_hand = W
+ else
+ M.r_hand = W
+ W.layer = 20
+ W.add_fingerprint(M)
+ //SN src = null
+ del(src)
+ return
+ if("t_gun")
+ var/obj/item/weapon/gun/energy/taser/W = new /obj/item/weapon/gun/energy/taser( M )
+ if (M.hand)
+ M.l_hand = W
+ else
+ M.r_hand = W
+ W.layer = 20
+ W.add_fingerprint(M)
+ //SN src = null
+ del(src)
+ return
+ if("sword")
+ var/obj/item/weapon/melee/energy/sword/W = new /obj/item/weapon/melee/energy/sword( M )
+ if (M.hand)
+ M.l_hand = W
+ else
+ M.r_hand = W
+ W.layer = 20
+ W.add_fingerprint(M)
+ //SN src = null
+ del(src)
+ return
+ if("axe")
+ var/obj/item/weapon/melee/energy/axe/W = new /obj/item/weapon/melee/energy/axe( M )
+ if (M.hand)
+ M.l_hand = W
+ else
+ M.r_hand = W
+ W.layer = 20
+ W.add_fingerprint(M)
+ //SN src = null
+ del(src)
+ return
+ else
+ return
+
+// BEDSHEET BIN
+
+/obj/structure/bedsheetbin/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/bedsheet))
+ //W = null
+ del(W)
+ src.amount++
+ return
+
+/obj/structure/bedsheetbin/attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
+ if (src.amount >= 1)
+ src.amount--
+ new /obj/item/weapon/bedsheet( src.loc )
+ add_fingerprint(user)
+
+/obj/structure/bedsheetbin/examine()
+ set src in oview(1)
+
+ src.amount = round(src.amount)
+ if (src.amount <= 0)
+ src.amount = 0
+ usr << "There are no bed sheets in the bin."
+ else
+ if (src.amount == 1)
+ usr << "There is one bed sheet in the bin."
+ else
+ usr << text("There are [] bed sheets in the bin.", src.amount)
+ return
+
+// PHOTOGRAPH
+
+/obj/item/weapon/paper/photograph/New()
+
+ ..()
+ src.pixel_y = 0
+ src.pixel_x = 0
+ return
+
+/obj/item/weapon/paper/photograph/attack_self(mob/user as mob)
+
+ var/n_name = input(user, "What would you like to label the photo?", "Paper Labelling", null) as text
+ n_name = copytext(n_name, 1, 32)
+ if ((src.loc == user && user.stat == 0))
+ src.name = text("photo[]", (n_name ? text("- '[]'", n_name) : null))
+ src.add_fingerprint(user)
+ return
diff --git a/code/game/objects/object_procs.dm b/code/game/objects/object_procs.dm
index 92e48974f4a..7e230546fcf 100644
--- a/code/game/objects/object_procs.dm
+++ b/code/game/objects/object_procs.dm
@@ -8,12 +8,21 @@
if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh.
src.attack_ai(usr)
+ // check for TK users
+ AutoUpdateTK(src)
+ if (istype(usr, /mob/living/carbon/human))
+ if(istype(usr.l_hand, /obj/item/tk_grab) || istype(usr.r_hand, /obj/item/tk_grab/))
+ if(!(usr in nearby))
+ if(usr.client && usr.machine==src)
+ src.attack_hand(usr)
+
/obj/proc/updateDialog()
var/list/nearby = viewers(1, src)
for(var/mob/M in nearby)
if ((M.client && M.machine == src))
src.attack_hand(M)
AutoUpdateAI(src)
+ //AutoUpdateTK(src)
/obj/proc/update_icon()
return
diff --git a/code/game/objects/radio/encryptionkey.dm b/code/game/objects/radio/encryptionkey.dm
index 2758ddf9099..b7f6ff62e47 100644
--- a/code/game/objects/radio/encryptionkey.dm
+++ b/code/game/objects/radio/encryptionkey.dm
@@ -1,21 +1,125 @@
+
/obj/item/device/encryptionkey/
name = "Standard Encrpytion Key"
desc = "An encyption key for a radio headset. Has no special codes in it. WHY DOES IT EXIST? ASK NANOTRASEN."
icon = 'radio.dmi'
icon_state = "cypherkey"
item_state = ""
- var/channels = list()
- var/translate_hive = 0
var/translate_binary = 0
+ var/translate_hive = 0
+ var/list/channels = list()
+
/obj/item/device/encryptionkey/New()
/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/item/device/encryptionkey/traitor
+ icon_state = "cypherkey"
channels = list("Syndicate" = 1)
origin_tech = "syndicate=3"
+/obj/item/device/encryptionkey/binary
+ icon_state = "cypherkey"
+ translate_binary = 1
+ origin_tech = "syndicate=3"
+
+/obj/item/device/encryptionkey/headset_sec
+ name = "Security Radio Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "sec_cypherkey"
+ channels = list("Security" = 1)
+
+/obj/item/device/encryptionkey/headset_eng
+ name = "Engineering Radio Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "eng_cypherkey"
+ channels = list("Engineering" = 1)
+
+/obj/item/device/encryptionkey/headset_rob
+ name = "Robotics Radio Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "rob_cypherkey"
+ channels = list("Engineering" = 1, "Science" = 1)
+
+/obj/item/device/encryptionkey/headset_med
+ name = "Medical Radio Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "med_cypherkey"
+ channels = list("Medical" = 1)
+
+/obj/item/device/encryptionkey/headset_sci
+ name = "Science Radio Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "sci_cypherkey"
+ channels = list("Science" = 1)
+
+/obj/item/device/encryptionkey/headset_medsci
+ name = "Medical Research Radio Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "medsci_cypherkey"
+ channels = list("Medical" = 1, "Science" = 1)
+
+/obj/item/device/encryptionkey/headset_com
+ name = "Command Radio Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "com_cypherkey"
+ channels = list("Command" = 1)
+
+/obj/item/device/encryptionkey/heads/captain
+ name = "Captain's Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "cap_cypherkey"
+ channels = list("Command" = 1, "Science" = 0, "Medical" = 0, "Security" = 1, "Engineering" = 0, "Mining" = 0, "Cargo" = 0)
+
+/obj/item/device/encryptionkey/heads/rd
+ name = "Research Director's Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "rd_cypherkey"
+ channels = list("Science" = 1, "Command" = 1)
+
+/obj/item/device/encryptionkey/heads/hos
+ name = "Head of Security's Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "hos_cypherkey"
+ channels = list("Security" = 1, "Command" = 1)
+
+/obj/item/device/encryptionkey/heads/ce
+ name = "Chief Engineer's Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "ce_cypherkey"
+ channels = list("Engineering" = 1, "Command" = 1)
+
+/obj/item/device/encryptionkey/heads/cmo
+ name = "Chief Medical Officer's Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "cmo_cypherkey"
+ channels = list("Medical" = 1, "Command" = 1)
+
+/obj/item/device/encryptionkey/heads/hop
+ name = "Head of Personnel's Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "hop_cypherkey"
+ channels = list("Command" = 1, "Security" = 0, "Cargo" = 1, "Mining" = 0)
+
+/obj/item/device/encryptionkey/headset_mine
+ name = "Mining Radio Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "mine_cypherkey"
+ channels = list("Mining" = 1)
+
+/obj/item/device/encryptionkey/heads/qm
+ name = "Quartermaster's Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "qm_cypherkey"
+ channels = list("Cargo" = 1, "Mining" = 1)
+
+/obj/item/device/encryptionkey/headset_cargo
+ name = "Cargo Radio Encryption Key"
+ desc = "An encyption key for a radio headset. Contains cypherkeys."
+ icon_state = "cargo_cypherkey"
+ channels = list("Cargo" = 1)
+
/obj/item/device/encryptionkey/nuclear
channels = list("Nuclear" = 1)
origin_tech = "syndicate=3"
@@ -23,88 +127,4 @@
/obj/item/device/encryptionkey/ert
name = "NanoTrasen ERT Radio Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Mining" = 1, "Cargo" = 1,)
-
-/obj/item/device/encryptionkey/binary
- translate_binary = 1
- origin_tech = "syndicate=3"
-
-/obj/item/device/encryptionkey/headset_sec
- name = "Security Radio Encryption Key"
-
- channels = list("Security" = 1)
-
-/obj/item/device/encryptionkey/headset_eng
- name = "Engineering Radio Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Engineering" = 1)
-
-/obj/item/device/encryptionkey/headset_rob
- name = "Robotics Radio Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Engineering" = 1, "Science" = 1)
-
-/obj/item/device/encryptionkey/headset_med
- name = "Medical Radio Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Medical" = 1)
-
-/obj/item/device/encryptionkey/headset_sci
- name = "Science Radio Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Science" = 1)
-
-/obj/item/device/encryptionkey/headset_medsci
- name = "Medical Research Radio Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Medical" = 1, "Science" = 1)
-
-/obj/item/device/encryptionkey/headset_com
- name = "Command Radio Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Command" = 1)
-
-/obj/item/device/encryptionkey/heads/captain
- name = "Captain's Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Command" = 1, "Science" = 0, "Medical" = 0, "Security" = 1, "Engineering" = 0, "Mining" = 0, "Cargo" = 0)
-
-/obj/item/device/encryptionkey/heads/rd
- name = "Research Director's Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Science" = 1, "Command" = 1)
-
-/obj/item/device/encryptionkey/heads/hos
- name = "Head of Security's Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Security" = 1, "Command" = 1)
-
-/obj/item/device/encryptionkey/heads/ce
- name = "Chief Engineer's Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Engineering" = 1, "Command" = 1)
-
-/obj/item/device/encryptionkey/heads/cmo
- name = "Chief Medical Officer's Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Medical" = 1, "Command" = 1)
-
-/obj/item/device/encryptionkey/heads/hop
- name = "Head of Personnel's Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Command" = 1, "Security" = 0, "Cargo" = 1, "Mining" = 0)
-
-/obj/item/device/encryptionkey/headset_mine
- name = "Mining Radio Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Mining" = 1)
-
-/obj/item/device/encryptionkey/heads/qm
- name = "Quartermaster's Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Cargo" = 1, "Mining" = 1)
-
-/obj/item/device/encryptionkey/headset_cargo
- name = "Cargo Radio Encryption Key"
- desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Cargo" = 1)
\ No newline at end of file
+ channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Mining" = 1, "Cargo" = 1,)
\ No newline at end of file
diff --git a/code/game/objects/radio/headset.dm b/code/game/objects/radio/headset.dm
index e2aa76282e0..7e58b10f896 100644
--- a/code/game/objects/radio/headset.dm
+++ b/code/game/objects/radio/headset.dm
@@ -1,13 +1,13 @@
/obj/item/device/radio/headset
- name = "Radio Headset"
- desc = "An intercom that fits over the head."
+ name = "radio headset"
+ desc = "An updated, modular intercom that fits over the head. Takes encryption keys"
icon_state = "headset"
item_state = "headset"
g_amt = 0
m_amt = 75
subspace_transmission = 1
protective_temperature = 0
- canhear_range = 1
+ canhear_range = 1 // can't hear headsets from very far away
var
translate_binary = 0
translate_hive = 0
@@ -16,132 +16,139 @@
/obj/item/device/radio/headset/New()
..()
- keyslot1 = new /obj/item/device/encryptionkey
+ keyslot1 = new /obj/item/device/encryptionkey/
recalculateChannels()
/obj/item/device/radio/headset/traitor
origin_tech = "syndicate=3"
canhear_range = 0
-
- New()
- ..()
- del(keyslot1)
- keyslot1 = new /obj/item/device/encryptionkey/traitor
+/obj/item/device/radio/headset/traitor/New()
+ ..()
+ del(keyslot1)
+ keyslot1 = new /obj/item/device/encryptionkey/traitor
+ recalculateChannels()
/obj/item/device/radio/headset/binary
origin_tech = "syndicate=3"
canhear_range = 0
-
- New()
- ..()
- del(keyslot1)
- keyslot1 = new /obj/item/device/encryptionkey/binary
+/obj/item/device/radio/headset/binary/New()
+ ..()
+ del(keyslot1)
+ keyslot1 = new /obj/item/device/encryptionkey/binary
+ recalculateChannels()
/obj/item/device/radio/headset/headset_sec
- name = "Security Radio Headset"
+ name = "security radio headset"
desc = "This is used by your elite security force. To access the security channel, use :s."
icon_state = "sec_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/headset_sec
/obj/item/device/radio/headset/headset_eng
- name = "Engineering Radio Headset"
+ name = "engineering radio headset"
desc = "When the engineers wish to chat like girls. To access the engineering channel, use :e. "
icon_state = "eng_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/headset_eng
/obj/item/device/radio/headset/headset_rob
- name = "Robotics Radio Headset"
+ name = "robotics radio headset"
desc = "Made specifically for the roboticists who cannot decide between departments. To access the engineering channel, use :e. For research, use :n."
icon_state = "rob_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/headset_rob
/obj/item/device/radio/headset/headset_med
- name = "Medical Radio Headset"
+ name = "medical radio headset"
desc = "A headset for the trained staff of the medbay. To access the medical channel, use :m."
icon_state = "med_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/headset_med
/obj/item/device/radio/headset/headset_sci
- name = "Science Radio Headset"
+ name = "science radio headset"
desc = "A sciency headset. Like usual. To access the science channel, use :n."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/headset_sci
/obj/item/device/radio/headset/headset_medsci
- name = "Medical Research Radio Headset"
+ name = "medical research radio headset"
desc = "A headset that is a result of the mating between medical and science. To access the medical channel, use :m. For science, use :n."
icon_state = "med_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/headset_medsci
/obj/item/device/radio/headset/headset_com
- name = "Command Radio Headset"
+ name = "command radio headset"
desc = "A headset with a commanding channel. To access the command channel, use :c."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/headset_com
/obj/item/device/radio/headset/heads/captain
- name = "Captain's Headset"
+ name = "captain's headset"
desc = "The headset of the boss. Channels are as follows: :c - command, :s - security, :e - engineering, :d - mining, :q - cargo, :m - medical, :n - science."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/captain
/obj/item/device/radio/headset/heads/rd
- name = "Research Director's Headset"
+ name = "Research Director's headset"
desc = "Headset of the researching God. To access the science channel, use :n. For command, use :c."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/rd
/obj/item/device/radio/headset/heads/hos
- name = "Head of Security's Headset"
+ name = "head of security's headset"
desc = "The headset of the man who protects your worthless lifes. To access the security channel, use :s. For command, use :c."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/ce
- name = "Chief Engineer's Headset"
+ name = "chief engineer's headset"
desc = "The headset of the guy who is in charge of morons. To access the engineering channel, use :e. For command, use :c."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/ce
/obj/item/device/radio/headset/heads/cmo
- name = "Chief Medical Officer's Headset"
+ name = "chief medical officer's headset"
desc = "The headset of the highly trained medical chief. To access the medical channel, use :m. For command, use :c."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/cmo
/obj/item/device/radio/headset/heads/hop
- name = "Head of Personnel's Headset"
+ name = "head of personnel's headset"
desc = "The headset of the guy who will one day be captain. Channels are as follows: :c - command, :s - security, :q - cargo, :d - mining."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/hop
/obj/item/device/radio/headset/headset_mine
- name = "Mining Radio Headset"
+ name = "mining radio headset"
desc = "Headset used by miners. How useless. To access the mining channel, use :d."
icon_state = "mine_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/headset_mine
/obj/item/device/radio/headset/heads/qm
- name = "Quartermaster's Headset"
+ name = "quartermaster's headset"
desc = "The headset of the man who control your toiletpaper supply. To access the cargo channel, use :q. For mining, use :d."
icon_state = "cargo_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/qm
+/obj/item/device/radio/headset/headset_cargo
+ name = "cargo radio headset"
+ desc = "Headset used by the QM's slaves. To access the cargo channel, use :q."
+ icon_state = "cargo_headset"
+ item_state = "headset"
+ keyslot2 = new /obj/item/device/encryptionkey/headset_cargo
+
/obj/item/device/radio/headset/nuclear
freerange = 1
listening = 0
@@ -155,22 +162,21 @@
freerange = 1
keyslot2 = new /obj/item/device/encryptionkey/ert
-/obj/item/device/radio/headset/headset_cargo
- name = "Cargo Radio Headset"
- desc = "Headset used by the QM's slaves. To access the cargo channel, use :q."
- icon_state = "cargo_headset"
- item_state = "headset"
- keyslot2 = new /obj/item/device/encryptionkey/headset_cargo
-
/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.machine = src
- if (!istype(W, /obj/item/weapon/screwdriver) && !istype(W, /obj/item/device/encryptionkey/))
+ if (!( istype(W, /obj/item/weapon/screwdriver) || (istype(W, /obj/item/device/encryptionkey/ ))))
return
if(istype(W, /obj/item/weapon/screwdriver))
if(keyslot1 || keyslot2)
+
+ for(var/ch_name in channels)
+ radio_controller.remove_object(src, radiochannels[ch_name])
+ secure_radio_connections[ch_name] = null
+
+
if(keyslot1)
user.put_in_hands(keyslot1)
keyslot1 = null
@@ -200,7 +206,9 @@
W.loc = src
keyslot2 = W
+
recalculateChannels()
+
return
@@ -234,7 +242,7 @@
if(!radio_controller)
sleep(30) // Waiting for the radio_controller to be created.
if(!radio_controller)
- src.name = "Broken Radio Headset"
+ src.name = "broken radio headset"
return
return
\ No newline at end of file
diff --git a/code/game/objects/radio/intercom.dm b/code/game/objects/radio/intercom.dm
index 100e2c86e49..704b16bfe48 100644
--- a/code/game/objects/radio/intercom.dm
+++ b/code/game/objects/radio/intercom.dm
@@ -1,5 +1,5 @@
/obj/item/device/radio/intercom
- name = "Station Intercom (Radio)"
+ name = "station intercom"
desc = "Talk through this."
icon_state = "intercom"
anchored = 1
@@ -31,7 +31,8 @@
if (!src.listening)
return
-/* var/turf/T = get_turf(src)
+ /*
+ var/turf/T = get_turf(src)
var/list/hear = hearers(7, T)
var/list/V
//find mobs in lockers, cryo and intellycards
@@ -43,8 +44,11 @@
if (!V) //lasy initialisation
V = view(7, T)
if (get_turf(M) in V) //this slow, but I don't think we'd have a lot of wardrobewhores every round --rastaf0
- hear+=M */
- return get_mobs_in_view(4,src)
+ hear+=M
+ */
+ //return hear
+
+ return get_mobs_in_view(4, src)
hear_talk(mob/M as mob, msg)
diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm
index 9b9e1fb1710..0ab794a27a0 100644
--- a/code/game/objects/radio/radio.dm
+++ b/code/game/objects/radio/radio.dm
@@ -14,7 +14,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
last_transmission
frequency = 1459 //common chat
traitor_frequency = 0 //tune to frequency to unlock traitor supplies
- canhear_range = 3
+ canhear_range = 3 // the range which mobs can hear this radio from
obj/item/device/radio/patch_link = null
obj/item/device/uplink/radio/traitorradio = null
wires = WIRE_SIGNAL | WIRE_RECEIVE | WIRE_TRANSMIT
@@ -63,6 +63,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
checkpower()
/obj/item/device/radio/initialize()
+
if(freerange)
if(frequency < 1200 || frequency > 1600)
frequency = sanitize_frequency(frequency)
@@ -145,6 +146,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
//..()
if (usr.stat || !on)
return
+
if (!(issilicon(usr) || (usr.contents.Find(src) || ( in_range(src, usr) && istype(loc, /turf) ))))
usr << browse(null, "window=radio")
return
@@ -155,6 +157,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if(A && target)
A.ai_actual_track(target)
return
+
else if (href_list["faketrack"])
var/mob/target = locate(href_list["track"])
var/mob/living/silicon/ai/A = locate(href_list["track2"])
@@ -169,7 +172,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
usr << "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb)."
sleep(40)
continue
+
return
+
else if (href_list["freq"])
var/new_frequency = (frequency + text2num(href_list["freq"]))
if (!freerange || (frequency < 1200 || frequency > 1600))
@@ -248,6 +253,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
return
/obj/item/device/radio/talk_into(mob/M as mob, message, channel)
+
if(!on) return // the device has to be on
if(GLOBAL_RADIO_TYPE == 1) // NEW RADIO SYSTEMS: By Doohl
@@ -424,7 +430,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
sleep(rand(10,25)) // wait a little...
if(signal.data["done"])
- //we're done here.
+ // we're done here.
return
// Oh my god; the comms are down or something because the signal hasn't been broadcasted yet.
@@ -615,6 +621,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
R.show_message(rendered, 2)
/obj/item/device/radio/hear_talk(mob/M as mob, msg)
+
if (broadcasting)
talk_into(M, msg)
/*
diff --git a/code/game/objects/secstorage/secstorage.dm b/code/game/objects/secstorage/secstorage.dm
index 6e1b1d05f85..e2d6a2599f8 100644
--- a/code/game/objects/secstorage/secstorage.dm
+++ b/code/game/objects/secstorage/secstorage.dm
@@ -75,6 +75,7 @@
if (cx > mx)
cx = tx
cy--
+ //Foreach goto(56)
src.closer.screen_loc = text("[],[]", mx, my)
return
@@ -94,7 +95,7 @@
/obj/item/weapon/secstorage/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- if ((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && (src.locked == 1) && (!src.emagged))
+ if ( (istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && (src.locked == 1) && (!src.emagged))
if(istype(W, /obj/item/weapon/card/emag))
var/obj/item/weapon/card/emag/E = W
if(E.uses)
@@ -127,7 +128,7 @@
if ((istype(W, /obj/item/device/multitool)) && (src.open == 1) && (src.locked ==1) && (!src.l_hacking))
user.show_message(text("\red Now attempting to reset internal memory, please hold."), 1)
src.l_hacking = 1
- spawn(100)
+ if (do_after(usr, 100))
if (prob(40))
src.l_setshort = 1
src.l_set = 0
@@ -138,6 +139,7 @@
else
user.show_message(text("\red Unable to reset internal memory."), 1)
src.l_hacking = 0
+ else src.l_hacking = 0
return
if (src.contents.len >= 7)
return
@@ -259,7 +261,3 @@
src.orient_objs(7, 8, 10, 7)
return
return
-
-/obj/screen/storage/attackby(W, mob/user as mob)
- src.master.attackby(W, user)
- return
diff --git a/code/game/objects/shooting_range.dm b/code/game/objects/shooting_range.dm
index 4af1363c874..d678e9d88c4 100644
--- a/code/game/objects/shooting_range.dm
+++ b/code/game/objects/shooting_range.dm
@@ -174,7 +174,7 @@
bmark.pixel_x--
bmark.pixel_y--
- if(Proj.damage >= 20)
+ if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/practice))
bmark.icon_state = "scorch"
bmark.dir = pick(NORTH,SOUTH,EAST,WEST) // random scorch design
diff --git a/code/game/objects/stacks/metal.dm b/code/game/objects/stacks/metal.dm
index eb121e1195b..02d72c107fe 100644
--- a/code/game/objects/stacks/metal.dm
+++ b/code/game/objects/stacks/metal.dm
@@ -33,6 +33,9 @@ FLOOR TILES
/obj/item/stack/rods/attack_self(mob/user as mob)
src.add_fingerprint(user)
+
+ if(!istype(user.loc,/turf)) return 0
+
if (locate(/obj/structure/grille, usr.loc))
for(var/obj/structure/grille/G in usr.loc)
if (G.destroyed)
@@ -67,19 +70,19 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
- new/datum/stack_recipe("closet", /obj/structure/closet, 2, one_per_turf = 1), \
+ new/datum/stack_recipe("closet", /obj/structure/closet, 2, one_per_turf = 1, on_floor = 1), \
null, \
- new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 2, one_per_turf = 1), \
+ new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 2, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 10), \
new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
null, \
- new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, one_per_turf = 1), \
+ new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, one_per_turf = 1), \
- new/datum/stack_recipe("wall machine frame", /obj/machinery/constructable_frame/wallmount_frame, 2, one_per_turf = 1), \
- new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, one_per_turf = 1), \
+ new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("wall machine frame", /obj/machinery/constructable_frame/wallmount_frame, 2, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
new/datum/stack_recipe("tube light frame", /obj/structure/light_frame), \
@@ -87,7 +90,8 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("table lamp frame", /obj/structure/light_frame/lamp), \
null, \
new/datum/stack_recipe("grenade casing", /obj/item/weapon/chem_grenade), \
- new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20), \
+ null, \
+ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/metal
diff --git a/code/game/objects/stacks/minerals.dm b/code/game/objects/stacks/minerals.dm
index 49a28193172..5993bfc8d9a 100644
--- a/code/game/objects/stacks/minerals.dm
+++ b/code/game/objects/stacks/minerals.dm
@@ -10,7 +10,7 @@ SILVER
//Sandstone
var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
- new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10), \
+ new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \
/* new/datum/stack_recipe("sandstone wall", ???), \
new/datum/stack_recipe("sandstone floor", ???),\*/
)
@@ -22,7 +22,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
//Diamond
var/global/list/datum/stack_recipe/diamond_recipes = list ( \
- new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10), \
+ new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/diamond
@@ -32,7 +32,7 @@ var/global/list/datum/stack_recipe/diamond_recipes = list ( \
//Uranium
var/global/list/datum/stack_recipe/uranium_recipes = list ( \
- new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10), \
+ new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/uranium
@@ -42,7 +42,7 @@ var/global/list/datum/stack_recipe/uranium_recipes = list ( \
//Plasma
var/global/list/datum/stack_recipe/plasma_recipes = list ( \
- new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10), \
+ new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/plasma
@@ -52,7 +52,7 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \
//Gold
var/global/list/datum/stack_recipe/gold_recipes = list ( \
- new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10), \
+ new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/gold
@@ -62,7 +62,7 @@ var/global/list/datum/stack_recipe/gold_recipes = list ( \
//Silver
var/global/list/datum/stack_recipe/silver_recipes = list ( \
- new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10), \
+ new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/silver
diff --git a/code/game/objects/stool.dm b/code/game/objects/stool.dm
index 3fb7bf794d3..1fffa4c72c0 100644
--- a/code/game/objects/stool.dm
+++ b/code/game/objects/stool.dm
@@ -19,6 +19,13 @@
del(src)
/obj/structure/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if (src.anchored)
+ src.anchored = 0
+ user << "\blue You unfasten [src] from the floor."
+ else
+ src.anchored = 1
+ user << "\blue You fasten [src] to the floor."
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'Ratchet.ogg', 50, 1)
new /obj/item/stack/sheet/metal(src.loc)
@@ -111,7 +118,6 @@
return
/obj/structure/stool/bed/chair/New()
- src.verbs -= /atom/movable/verb/pull
if(src.dir == NORTH)
src.layer = FLY_LAYER
..()
@@ -145,11 +151,20 @@
icon_state = "down"
anchored = 0
-/obj/structure/stool/bed/roller/Move()
+//obj/structure/stool/bed/roller/Move()
+/obj/structure/stool/bed/Move()
..()
if(buckled_mob)
if(buckled_mob.buckled == src)
buckled_mob.loc = src.loc
+ buckled_mob.dir = src.dir
+
+/obj/structure/stool/bed/chair/Move()
+ ..()
+ if(src.dir == NORTH)
+ src.layer = FLY_LAYER
+ else
+ src.layer = OBJ_LAYER
/obj/structure/stool/bed/roller/buckle_mob(mob/M as mob, mob/user as mob)
if ((!( istype(M, /mob) ) || get_dist(src, user) > 1 || M.loc != src.loc || user.restrained() || usr.stat || M.buckled || istype(usr, /mob/living/silicon/pai)))
diff --git a/code/game/objects/storage/backpack.dm b/code/game/objects/storage/backpack.dm
index e3075762152..46579882f06 100644
--- a/code/game/objects/storage/backpack.dm
+++ b/code/game/objects/storage/backpack.dm
@@ -49,6 +49,7 @@
if(crit_fail)
user << "\red The Bluespace generator isn't working."
return
+ /* Remove these comments to re-enable BoH BoH Singuloths.-Hawk.
if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!"
del(W)
@@ -58,6 +59,7 @@
log_game("[key_name(user)] detonated a bag of holding")
del(src)
return
+ */
..()
proc/failcheck(mob/user as mob)
diff --git a/code/game/objects/storage/belt.dm b/code/game/objects/storage/belt.dm
index 912063f00a2..660729ec18d 100644
--- a/code/game/objects/storage/belt.dm
+++ b/code/game/objects/storage/belt.dm
@@ -50,7 +50,7 @@
/obj/item/weapon/storage/belt/utility
- name = "utility belt"
+ name = "tool-belt" //Carn: utility belt is nicer, but it bamboozles the text parsing.
desc = "Can hold various tools."
icon_state = "utilitybelt"
item_state = "utility"
@@ -77,6 +77,16 @@
new /obj/item/weapon/wirecutters(src)
new /obj/item/weapon/cable_coil(src,30,pick("red","yellow"))
+
+/obj/item/weapon/storage/belt/utility/atmostech/New()
+ ..()
+ new /obj/item/weapon/screwdriver(src)
+ new /obj/item/weapon/wrench(src)
+ new /obj/item/weapon/weldingtool(src)
+ new /obj/item/weapon/crowbar(src)
+ new /obj/item/weapon/wirecutters(src)
+ new /obj/item/device/analyzer(src)
+
/obj/item/weapon/storage/belt/security/full/New()
..()
new /obj/item/weapon/melee/baton(src)
@@ -102,7 +112,7 @@
"/obj/item/weapon/reagent_containers/syringe",
"/obj/item/weapon/reagent_containers/glass/dispenser",
"/obj/item/weapon/reagent_containers/hypospray",
- "/obj/item/weapon/zippo",
+ "/obj/item/weapon/lighter/zippo",
"/obj/item/weapon/cigpacket",
"/obj/item/weapon/storage/pill_bottle",
"/obj/item/stack/medical",
diff --git a/code/game/objects/storage/bible.dm b/code/game/objects/storage/bible.dm
index 38a22b00774..6d3a9c28dfb 100644
--- a/code/game/objects/storage/bible.dm
+++ b/code/game/objects/storage/bible.dm
@@ -16,6 +16,7 @@
new /obj/item/weapon/reagent_containers/pill/antitox/tajaran(src)
new /obj/item/clothing/suit/monk(src)
+/* // All cult functionality moved to Null Rod
/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -83,12 +84,12 @@
O.show_message(text("\red [] smacks []'s lifeless corpse with [].", user, M, src), 1)
playsound(src.loc, "punch", 25, 1, -1)
return
-
+*/
/obj/item/weapon/storage/bible/afterattack(atom/A, mob/user as mob)
- if (istype(A, /turf/simulated/floor))
- user << "\blue You hit the floor with the bible."
- if(user.mind && (user.mind.assigned_role == "Chaplain"))
- call(/obj/effect/rune/proc/revealrunes)(src)
+// if (istype(A, /turf/simulated/floor))
+// user << "\blue You hit the floor with the bible."
+// if(user.mind && (user.mind.assigned_role == "Chaplain"))
+// call(/obj/effect/rune/proc/revealrunes)(src)
if(user.mind && (user.mind.assigned_role == "Chaplain"))
if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder
user << "\blue You bless [A]."
@@ -99,3 +100,29 @@
/obj/item/weapon/storage/bible/attackby(obj/item/weapon/W as obj, mob/user as mob)
playsound(src.loc, "rustle", 50, 1, -5)
..()
+
+/obj/item/weapon/storage/bible/MouseDrop(obj/over_object as obj)
+
+ if (ishuman(usr) || ismonkey(usr))
+ var/mob/M = usr
+ if (!( istype(over_object, /obj/screen) ))
+ return ..()
+ if ((!( M.restrained() ) && !( M.stat )))
+ if (over_object.name == "r_hand")
+ if (!( M.r_hand ))
+ M.u_equip(src)
+ M.r_hand = src
+ else
+ if (over_object.name == "l_hand")
+ if (!( M.l_hand ))
+ M.u_equip(src)
+ M.l_hand = src
+ M.update_clothing()
+ src.add_fingerprint(usr)
+ return
+ if(over_object == usr && in_range(src, usr) || usr.contents.Find(src))
+ if (usr.s_active)
+ usr.s_active.close(usr)
+ src.show_to(usr)
+ return
+ return
diff --git a/code/game/objects/storage/kit.dm b/code/game/objects/storage/kit.dm
index 02cb92d93e4..b0fdf148a76 100644
--- a/code/game/objects/storage/kit.dm
+++ b/code/game/objects/storage/kit.dm
@@ -140,6 +140,17 @@
..()
return
+/obj/item/weapon/storage/seccart_kit/New()
+ new /obj/item/weapon/cartridge/security(src)
+ new /obj/item/weapon/cartridge/security(src)
+ new /obj/item/weapon/cartridge/security(src)
+ new /obj/item/weapon/cartridge/security(src)
+ new /obj/item/weapon/cartridge/security(src)
+ new /obj/item/weapon/cartridge/security(src)
+ new /obj/item/weapon/cartridge/security(src)
+ ..()
+ return
+
/obj/item/weapon/storage/donkpocket_kit/New()
new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src)
diff --git a/code/game/objects/storage/storage.dm b/code/game/objects/storage/storage.dm
index a43a1d6e6eb..b41a931346c 100644
--- a/code/game/objects/storage/storage.dm
+++ b/code/game/objects/storage/storage.dm
@@ -244,9 +244,6 @@
O.emp_act(severity)
..()
-/obj/screen/storage/attackby(W, mob/user as mob)
- src.master.attackby(W, user)
- return
// BubbleWrap - A box can be folded up to make card
/obj/item/weapon/storage/attack_self(mob/user as mob)
if ( contents.len )
@@ -291,7 +288,7 @@
..()
contents = list()
sleep(1)
- new /obj/item/clothing/mask/medical( src )
+ new /obj/item/clothing/mask/breath/medical( src )
new /obj/item/weapon/tank/emergency_oxygen/anesthetic( src )
new /obj/item/weapon/tank/emergency_oxygen/anesthetic( src )
new /obj/item/weapon/tank/emergency_oxygen/anesthetic( src )
diff --git a/code/game/objects/tables_racks.dm b/code/game/objects/tables_racks.dm
index cd6de5cd13b..904f3bb8e10 100644
--- a/code/game/objects/tables_racks.dm
+++ b/code/game/objects/tables_racks.dm
@@ -78,6 +78,25 @@ TABLE AND RACK OBJECT INTERATIONS
return
+/obj/structure/table/attack_animal(mob/living/simple_animal/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N
+ if(user.wall_smash)
+ usr << text("\red You destroy the table.")
+ for(var/mob/O in oviewers())
+ if ((O.client && !( O.blinded )))
+ O << text("\red [] smashes the table apart!", user)
+ if(istype(src, /obj/structure/table/reinforced))
+ new /obj/item/weapon/table_parts/reinforced( src.loc )
+ else if(istype(src, /obj/structure/table/woodentable))
+ new/obj/item/weapon/table_parts/wood( src.loc )
+ else
+ new /obj/item/weapon/table_parts( src.loc )
+ src.density = 0
+ del(src)
+ return
+
+
+
+
/obj/structure/table/attack_hand(mob/user as mob)
if (usr.mutations & HULK)
usr << text("\blue You destroy the table.")
diff --git a/code/game/objects/toys.dm b/code/game/objects/toys.dm
index 499d0cb1540..1100fa13a1e 100644
--- a/code/game/objects/toys.dm
+++ b/code/game/objects/toys.dm
@@ -2,7 +2,7 @@
//CONTAINS
CRAYONS
--------*/
-/obj/item/toy/crayonbox/New()
+/obj/item/weapon/storage/crayonbox/New()
..()
new /obj/item/toy/crayon/red(src)
new /obj/item/toy/crayon/orange(src)
@@ -12,13 +12,13 @@ CRAYONS
new /obj/item/toy/crayon/purple(src)
updateIcon()
-/obj/item/toy/crayonbox/proc/updateIcon()
+/obj/item/weapon/storage/crayonbox/proc/updateIcon()
overlays = list() //resets list
overlays += image('crayons.dmi',"crayonbox")
for(var/obj/item/toy/crayon/crayon in contents)
overlays += image('crayons.dmi',crayon.colourName)
-/obj/item/toy/crayonbox/attackby(obj/item/W as obj, mob/user as mob)
+/obj/item/weapon/storage/crayonbox/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W,/obj/item/toy/crayon))
switch(W:colourName)
if("mime")
@@ -27,34 +27,37 @@ CRAYONS
if("rainbow")
usr << "This crayon is too powerful to be contained in this box."
return
- else
- usr << "You add the crayon to the box."
- user.drop_item()
- W.loc = src
- add_fingerprint(user)
- updateIcon()
- return
- else
- ..()
+ ..()
+ updateIcon()
-/obj/item/toy/crayonbox/attack_hand(mob/user as mob)
- if(user.r_hand == src || user.l_hand == src)
- if(!contents.len)
- user << "\red You're out of crayons!"
+/obj/item/weapon/storage/crayonbox/attack_hand(mob/user as mob)
+ updateIcon()
+ ..()
+
+/obj/item/weapon/storage/crayonbox/MouseDrop(obj/over_object as obj)
+
+ if (ishuman(usr) || ismonkey(usr))
+ var/mob/M = usr
+ if (!( istype(over_object, /obj/screen) ))
+ return ..()
+ if ((!( M.restrained() ) && !( M.stat )))
+ if (over_object.name == "r_hand")
+ if (!( M.r_hand ))
+ M.u_equip(src)
+ M.r_hand = src
+ else
+ if (over_object.name == "l_hand")
+ if (!( M.l_hand ))
+ M.u_equip(src)
+ M.l_hand = src
+ M.update_clothing()
+ src.add_fingerprint(usr)
+ return
+ if(over_object == usr && in_range(src, usr) || usr.contents.Find(src))
+ if (usr.s_active)
+ usr.s_active.close(usr)
+ src.show_to(usr)
return
- else
- var/list/crayons = new()
- for(var/obj/item/toy/crayon/C in contents)
- crayons[C:colourName] = C
- var/choice = input(user, "Pick a color:", "Crayon Box") in crayons as text|null
- if(choice)
- var/obj/crayon = crayons[choice]
- user.put_in_hand(crayon)
- user << "You take the [crayon:colourName] crayon out of the box."
- updateIcon()
- else
- return ..()
- icon_state = "crayonbox[contents.len]"
return
/obj/item/toy/crayon/red
@@ -157,6 +160,14 @@ CRAYONS
else
..()
+/obj/item/toy/crayon/attack_hand(mob/user as mob)
+ var/obj/item/weapon/storage/crayonbox/CB
+ if(istype(src.loc, /obj/item/weapon/storage/crayonbox))
+ CB = src.loc
+ ..()
+ if(CB)
+ CB.updateIcon()
+
/obj/effect/decal/cleanable/crayon
name = "rune"
desc = "A rune drawn in crayon."
diff --git a/code/game/objects/window.dm b/code/game/objects/window.dm
index e2d53d0c6ae..34c42f24bb7 100644
--- a/code/game/objects/window.dm
+++ b/code/game/objects/window.dm
@@ -100,7 +100,14 @@
if(reinf) new /obj/item/stack/rods( src.loc)
src.density = 0
del(src)
- return
+ return
+ else
+ playsound(src.loc, 'Glassknock.ogg', 80, 1)
+ usr.visible_message("[usr.name] knocks on the [src.name].", \
+ "You knock on the [src.name].", \
+ "You hear a knocking sound.")
+ return
+
/obj/structure/window/attack_paw()
if ((usr.mutations & HULK))
@@ -315,6 +322,8 @@
health = 40
if(opacity)
icon_state = "twindow"
+ else
+ icon_state = "window"
update_nearby_tiles(need_rebuild=1)
relativewindow()
diff --git a/code/game/specops_shuttle.dm b/code/game/specops_shuttle.dm
index b2d73d36ac4..7a67f4c4cf6 100644
--- a/code/game/specops_shuttle.dm
+++ b/code/game/specops_shuttle.dm
@@ -82,6 +82,8 @@ var/specops_shuttle_timeleft = 0
var/mob/M = locate(/mob) in T
M << "\red You have arrived at Central Command. Operation has ended!"
+ specops_shuttle_at_station = 0
+
for(var/obj/machinery/computer/specops_shuttle/S in world)
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
diff --git a/code/game/turf.dm b/code/game/turf.dm
index 7b0d2324573..effb872f879 100644
--- a/code/game/turf.dm
+++ b/code/game/turf.dm
@@ -80,7 +80,7 @@
/turf/Entered(atom/movable/M as mob|obj)
-// var/loopsanity = 100
+ var/loopsanity = 100
if(ismob(M))
if(!M:lastarea)
M:lastarea = get_area(M.loc)
@@ -97,12 +97,18 @@
else if(!istype(src, /turf/space))
M:inertia_dir = 0
..()
+ var/objects = 0
for(var/atom/A as mob|obj|turf|area in src)
+ if(objects > loopsanity) break
+ objects++
spawn( 0 )
if ((A && M))
A.HasEntered(M, 1)
return
+ objects = 0
for(var/atom/A as mob|obj|turf|area in range(1))
+ if(objects > loopsanity) break
+ objects++
spawn( 0 )
if ((A && M))
A.HasProximity(M, 1)
@@ -1241,6 +1247,9 @@ turf/simulated/floor/return_siding_icon_state()
/turf/space/attackby(obj/item/C as obj, mob/user as mob)
if (istype(C, /obj/item/stack/rods))
+ var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
+ if(L)
+ return
var/obj/item/stack/rods/R = C
user << "\blue Constructing support lattice ..."
playsound(src.loc, 'Genhit.ogg', 50, 1)
diff --git a/code/game/verbs/sound.dm b/code/game/verbs/sound.dm
index 2e64eabf73b..0ba65de787d 100644
--- a/code/game/verbs/sound.dm
+++ b/code/game/verbs/sound.dm
@@ -15,6 +15,7 @@
return
/* why is something that only is usable in the lobby a mob verb?
+
/mob/verb/toggletitlemusic()
set category = "Special Verbs"
set name = "Toggle Pregame Music"
@@ -27,4 +28,4 @@
M << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jamsz
return
-*/
+*/
\ No newline at end of file
diff --git a/code/game/vials.dm b/code/game/vials.dm
deleted file mode 100644
index 9e127e4baba..00000000000
--- a/code/game/vials.dm
+++ /dev/null
@@ -1,314 +0,0 @@
-//NOTE:
-//This file contains the worst code ive ever written.
-//I dont fucking care. It looks pretty awesome.
-
-//////////////////////////////////////////////////////////
-/obj/effect/dummy/liquid
- name = "water"
- icon = 'effects.dmi'
- icon_state = "nothing"
- invisibility = 101
- var/canmove = 1
- density = 0
- anchored = 1
-
-/obj/item/weapon/vial
- name = "glass vial"
- icon = 'chemical.dmi'
- desc = "a glass vial filled with a strange liquid"
- icon_state = "vialgreen"
- item_state = "vialgreen"
- throwforce = 3.0
- throw_speed = 1
- throw_range = 8
- force = 3.0
- w_class = 1.0
-
-/obj/item/weapon/vial/green
- name = "glass vial"
- icon = 'chemical.dmi'
- desc = "a glass vial filled with a strange green liquid"
- icon_state = "vialgreen"
- item_state = "vialgreen"
-
-/obj/item/weapon/vial/blue
- name = "glass vial"
- icon = 'chemical.dmi'
- desc = "a glass vial filled with a shimmering blue liquid"
- icon_state = "vialblue"
- item_state = "vialblue"
-//////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////***
-/obj/item/weapon/vial/attack(target as mob, mob/user as mob)
- if(target == user) return attack_self(user)
- user << "\blue The vial shatters."
- src.shatter()
-/obj/item/weapon/vial/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- user << "\blue The vial shatters."
- src.shatter()
-/obj/item/weapon/vial/attack_self(mob/user as mob)
- user << "\blue You uncork the vial and drink the liquid."
- src.drink(user)
-/obj/item/weapon/vial/proc/shatter()
- return
-/obj/item/weapon/vial/proc/drink(user)
- return
-///////////////////////////////////////////////////////***
-
-/////////////////////////////////////////////////////green
-/obj/item/weapon/vial/green/drink(mob/living/user as mob)
- var/A = src
- src = null
- del(A)
- switch(pick(1,2,3))
- if(1)
- spawn(300)
- user.gib()
- if(2)
- user.Weaken(5)
- user.contract_disease(new /datum/disease/gbs,1)
- if(3)
- spawn(200)
- user.contract_disease(new /datum/disease/gbs,1)
-
-/obj/item/weapon/vial/green/shatter()
- var/A = src
- var/atom/sourceloc = get_turf(src.loc)
- src = null
- del(A)
- var/obj/effect/overlay/O = new /obj/effect/overlay( sourceloc )
- var/obj/effect/overlay/O2 = new /obj/effect/overlay( sourceloc )
- O.name = "green liquid"
- O.density = 0
- O.anchored = 1
- O.icon = 'effects.dmi'
- O.icon_state = "greenshatter"
- O2.name = "broken bits of glass"
- O2.density = 0
- O2.anchored = 1
- O2.icon = 'objects.dmi'
- O2.icon_state = "shards"
- for(var/mob/living/carbon/human/H in view(5, sourceloc))
- H.contract_disease(new /datum/disease/gbs,1)
- var/i
- for(i=0, i<5, i++)
- for(var/mob/living/carbon/human/H in view(5, sourceloc))
- H.contract_disease(new /datum/disease/gbs,1)
- sleep(20)
- flick("greenshatter2",O)
- O.icon_state = "nothing"
- sleep(5)
- del(O)
-/////////////////////////////////////////////////////green
-
-/////////////////////////////////////////////////////blue
-/obj/item/weapon/vial/blue/drink(user)
- var/A = src
- var/atom/sourceloc = get_turf(src.loc)
- src = null
- del(A)
-
- var/obj/effect/overlay/O = new /obj/effect/overlay( sourceloc )
- var/obj/effect/overlay/O2 = new /obj/effect/overlay( sourceloc )
-
- O.name = "green liquid"
- O.density = 0
- O.anchored = 1
- O.icon = 'effects.dmi'
- O.icon_state = "blueshatter"
- O2.name = "broken bits of glass"
- O2.density = 0
- O2.anchored = 1
- O2.icon = 'objects.dmi'
- O2.icon_state = "shards"
-
- liquify(user)
-
- sleep(20)
- flick("blueshatter2",O)
- O.icon_state = "nothing"
- sleep(5)
- del(O)
-
-/obj/item/weapon/vial/blue/shatter()
-
- var/A = src
- var/atom/sourceloc = get_turf(src.loc)
- src = null
- del(A)
-
- var/obj/effect/overlay/O = new /obj/effect/overlay( sourceloc )
- var/obj/effect/overlay/O2 = new /obj/effect/overlay( sourceloc )
-
- O.name = "green liquid"
- O.density = 0
- O.anchored = 1
- O.icon = 'effects.dmi'
- O.icon_state = "blueshatter"
- O2.name = "broken bits of glass"
- O2.density = 0
- O2.anchored = 1
- O2.icon = 'objects.dmi'
- O2.icon_state = "shards"
-
- for(var/mob/living/carbon/human/H in view(1, sourceloc))
- liquify(H)
-
- sleep(20)
- flick("blueshatter2",O)
- O.icon_state = "nothing"
- sleep(5)
-
- del(O)
-
-/proc/liquify(var/mob/H, time = 150)
-
- if(H.stat) return
- spawn(0)
- var/mobloc = get_turf(H.loc)
- var/obj/effect/dummy/liquid/holder = new /obj/effect/dummy/liquid( mobloc )
- var/atom/movable/overlay/animation = new /atom/movable/overlay( mobloc )
- animation.name = "water"
- animation.density = 0
- animation.anchored = 1
- animation.icon = 'mob.dmi'
- animation.icon_state = "liquify"
- animation.layer = 5
- animation.master = holder
- flick("liquify",animation)
- H.canmove = 0
- sleep(4)
- H.loc = holder
- H.canmove = 1
- H.client.eye = holder
- spawn(0)
- var/i
- for(i=0, i<10, i++)
- spawn(0)
- var/obj/effect/effect/water/water1 = new /obj/effect/effect/water( mobloc )
- var/direction = pick(alldirs)
- water1.name = "water"
- water1.density = 0
- water1.icon = 'water.dmi'
- water1.icon_state = "extinguish"
- for(i=0, iWorld will reboot in 10 seconds"
- feedback_set_details("end_error","mode vote - [winner]")
- feedback_set_details("round_end","[time2text(world.realtime)]")
+ //feedback_set_details("end_error","mode vote - [winner]")
+
if(blackbox)
blackbox.save_all_data_to_sql()
@@ -108,8 +108,8 @@
world <<"\red World will reboot in 5 seconds"
- feedback_set_details("end_error","restart vote")
- feedback_set_details("round_end","[time2text(world.realtime)]")
+ //feedback_set_details("end_error","restart vote")
+
if(blackbox)
blackbox.save_all_data_to_sql()
diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/DetectiveWork/detective_work.dm
index 7e5b2bcdfb7..70a7b60401d 100644
--- a/code/modules/DetectiveWork/detective_work.dm
+++ b/code/modules/DetectiveWork/detective_work.dm
@@ -219,7 +219,7 @@ obj/machinery/computer/forensic_scanning
temp += "Consolidated data points:
"
for(var/i = 1, i <= files.len, i++)
temp += "{Dossier [i]}
"
- temp += "
{Insert Finger Print Card}
"
+ temp += "
{Insert Finger Print Card (To complete a Dossier)}
"
else
temp = ""
if(misc && misc.len)
@@ -491,7 +491,7 @@ obj/machinery/computer/forensic_scanning
A.suit_fibers = tempsuit_fibers
backup_DNA = A.blood_DNA
A.blood_DNA = tempblood_DNA
- if((!A.fingerprints)) //No prints
+ if(!A.fingerprints) //No prints
var/merged = 0
if(!misc)
misc = list()
@@ -700,63 +700,90 @@ obj/machinery/computer/forensic_scanning
obj/item/clothing/shoes/var
track_blood = 0
mob/living/carbon/human/track_blood_mob
+ track_blood_type
mob/var
bloody_hands = 0
mob/living/carbon/human/bloody_hands_mob
track_blood
mob/living/carbon/human/track_blood_mob
+ track_blood_type
obj/item/clothing/gloves/var
transfer_blood = 0
mob/living/carbon/human/bloody_hands_mob
-obj/effect/decal/cleanable/blood/var
- track_amt = 2
+obj/effect/decal/cleanable/var
+ track_amt = 3
mob/blood_owner
turf/Exited(mob/living/carbon/human/M)
if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
if(!istype(src, /turf/space)) // Bloody tracks code starts here
- if(M.track_blood > 0)
- M.track_blood--
- src.add_bloody_footprints(M.track_blood_mob,1,M.dir,get_tracks(M))
- else if(istype(M,/mob/living/carbon/human))
- if(M.shoes)
- if(M.shoes.track_blood > 0)
- M.shoes.track_blood--
- src.add_bloody_footprints(M.shoes.track_blood_mob,1,M.dir,M.shoes.name) // And bloody tracks end here
- . = ..()
+ var/dofoot = 1
+ if(istype(M,/mob/living/simple_animal))
+ if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
+ dofoot = 0
+
+ if(dofoot)
+
+ if(!istype(src, /turf/space)) // Bloody tracks code starts here
+ if(M.track_blood > 0)
+ M.track_blood--
+ src.add_bloody_footprints(M.track_blood_mob,1,M.dir,get_tracks(M),M.track_blood_type)
+ else if(istype(M,/mob/living/carbon/human))
+ if(M.shoes)
+ if(M.shoes.track_blood > 0)
+ M.shoes.track_blood--
+ src.add_bloody_footprints(M.shoes.track_blood_mob,1,M.dir,M.shoes.name,M.shoes.track_blood_type) // And bloody tracks end here
+ . = ..()
turf/Entered(mob/living/carbon/human/M)
if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
- if(M.track_blood > 0)
- M.track_blood--
- src.add_bloody_footprints(M.track_blood_mob,0,M.dir,get_tracks(M))
- else if(istype(M,/mob/living/carbon/human))
- if(M.shoes && !istype(src,/turf/space))
- if(M.shoes.track_blood > 0)
- M.shoes.track_blood--
- src.add_bloody_footprints(M.shoes.track_blood_mob,0,M.dir,M.shoes.name)
+ var/dofoot = 1
+ if(istype(M,/mob/living/simple_animal))
+ if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
+ dofoot = 0
+
+ if(dofoot)
+
+ if(M.track_blood > 0)
+ M.track_blood--
+ src.add_bloody_footprints(M.track_blood_mob,0,M.dir,get_tracks(M),M.track_blood_type)
+ else if(istype(M,/mob/living/carbon/human))
+ if(M.shoes && !istype(src,/turf/space))
+ if(M.shoes.track_blood > 0)
+ M.shoes.track_blood--
+ src.add_bloody_footprints(M.shoes.track_blood_mob,0,M.dir,M.shoes.name,M.shoes.track_blood_type)
- for(var/obj/effect/decal/cleanable/blood/B in src)
- if(B.track_amt <= 0) continue
- if(B.type != /obj/effect/decal/cleanable/blood/tracks)
- if(istype(M,/mob/living/carbon/human))
- if(M.shoes)
- M.shoes.add_blood(B.blood_owner)
- M.shoes.track_blood_mob = B.blood_owner
- M.shoes.track_blood = max(M.shoes.track_blood,8)
- else
- M.add_blood(B.blood_owner)
- M.track_blood_mob = B.blood_owner
- M.track_blood = max(M.track_blood,rand(4,8))
- B.track_amt--
- break
+ for(var/obj/effect/decal/cleanable/B in src)
+ if(B:track_amt <= 0) continue
+ if(B.type != /obj/effect/decal/cleanable/blood/tracks)
+ if(istype(B, /obj/effect/decal/cleanable/xenoblood) || istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/oil) || istype(B, /obj/effect/decal/cleanable/robot_debris))
+
+ var/track_type = "blood"
+ if(istype(B, /obj/effect/decal/cleanable/xenoblood))
+ track_type = "xeno"
+ else if(istype(B, /obj/effect/decal/cleanable/oil) || istype(B, /obj/effect/decal/cleanable/robot_debris))
+ track_type = "oil"
+
+ if(istype(M,/mob/living/carbon/human))
+ if(M.shoes)
+ M.shoes.add_blood(B.blood_owner)
+ M.shoes.track_blood_mob = B.blood_owner
+ M.shoes.track_blood = max(M.shoes.track_blood,8)
+ M.shoes.track_blood_type = track_type
+ else
+ M.add_blood(B.blood_owner)
+ M.track_blood_mob = B.blood_owner
+ M.track_blood = max(M.track_blood,rand(4,8))
+ M.track_blood_type = track_type
+ B.track_amt--
+ break
. = ..()
-turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
+turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info,bloodcolor)
for(var/obj/effect/decal/cleanable/blood/tracks/T in src)
- if(T.dir == d)
+ if(T.dir == d && findtext(T.icon, bloodcolor))
if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
T.desc = "These bloody footprints appear to have been made by [info]."
if(T.blood_DNA)
@@ -770,12 +797,29 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
return
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
this.icon = 'footprints.dmi'
+
+ var/preiconstate = ""
+
+ if(info == "animal paws")
+ preiconstate = "paw"
+ else if(info == "alien claws")
+ preiconstate = "claw"
+ else if(info == "small alien feet")
+ preiconstate = "paw"
+
if(leaving)
- this.icon_state = "blood2"
+ this.icon_state = "[bloodcolor][preiconstate]2"
else
- this.icon_state = "blood1"
+ this.icon_state = "[bloodcolor][preiconstate]1"
this.dir = d
- this.desc = "These bloody footprints appear to have been made by [info]."
+
+ if(bloodcolor == "blood")
+ this.desc = "These bloody footprints appear to have been made by [info]."
+ else if(bloodcolor == "xeno")
+ this.desc = "These acidic bloody footprints appear to have been made by [info]."
+ else if(bloodcolor == "oil")
+ this.desc = "These oil footprints appear to have been made by [info]."
+
if(istype(M,/mob/living/carbon/human))
if(this.blood_DNA.len)
this.blood_DNA.len++
@@ -787,15 +831,18 @@ proc/get_tracks(mob/M)
if(istype(M,/mob/living))
if(istype(M,/mob/living/carbon/human))
. = "human feet"
- else if(istype(M,/mob/living/carbon/monkey))
- . = "monkey paws"
+ else if(istype(M,/mob/living/carbon/monkey) || istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/crab))
+ . = "animal paws"
else if(istype(M,/mob/living/silicon/robot))
. = "robot feet"
- else if(istype(M,/mob/living/carbon/alien))
+ else if(istype(M,/mob/living/carbon/alien/humanoid))
. = "alien claws"
+ else if(istype(M,/mob/living/carbon/alien/larva))
+ . = "small alien feet"
else
. = "an unknown creature"
+
proc/blood_incompatible(donor,receiver)
var
donor_antigen = copytext(donor,1,lentext(donor))
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 93483db048b..5bcfd466285 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -189,7 +189,7 @@ var/global/BSACooldown = 0
Banlist["minutes"] << (mins + CMinutes)
Banlist["bannedby"] << usr.ckey
Banlist.cd = "/base"
- feedback_inc("ban_edit",1)
+ //feedback_inc("ban_edit",1)
unbanpanel()
/////////////////////////////////////new ban stuff
@@ -253,7 +253,7 @@ var/global/BSACooldown = 0
log_admin("[key_name(usr)] unbanned [key_name(M)] from [job]")
ban_unban_log_save("[key_name(usr)] unjobbanned [key_name(M)] from [job]")
M << "\redYou have been un-jobbanned by [usr.client.ckey] from [job]."
- feedback_inc("ban_job_unban",1)
+ //feedback_inc("ban_job_unban",1)
message_admins("\blue [key_name_admin(usr)] unbanned [key_name_admin(M)] from [job]", 1)
jobban_unban(M, job)
href_list["jobban2"] = 1
@@ -263,7 +263,7 @@ var/global/BSACooldown = 0
return
ban_unban_log_save("[key_name(usr)] jobbanned [key_name(M)] from [job]. reason: [reason]")
log_admin("[key_name(usr)] banned [key_name(M)] from [job]")
- feedback_inc("ban_job",1)
+ //feedback_inc("ban_job",1)
M << "\redYou have been jobbanned by [usr.client.ckey] from [job]."
M << "\red The reason is: [reason]"
M << "\red Jobban can be lifted only on demand."
@@ -320,7 +320,8 @@ var/global/BSACooldown = 0
ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.")
M << "\redYou have been banned by [usr.client.ckey].\nReason: [reason]."
M << "\red This is a temporary ban, it will be removed in [mins] minutes."
- feedback_inc("ban_tmp",1)
+ //feedback_inc("ban_tmp",1)
+ //feedback_inc("ban_tmp_mins",mins)
if(config.appeal_address)
M << "\red You may try to appeal this at [config.appeal_address]"
else
@@ -344,7 +345,7 @@ var/global/BSACooldown = 0
ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.")
log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.")
message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.")
- feedback_inc("ban_perma",1)
+ //feedback_inc("ban_perma",1)
del(M.client)
//del(M)
@@ -422,7 +423,8 @@ var/global/BSACooldown = 0
else
M << "\red No ban appeals URL has been set."
ban_unban_log_save("[usr.client.ckey] has jobbanned [M.ckey] from [job]. - Reason: [reason] - This will be removed in [mins] minutes.")
- feedback_inc("ban_job",1)
+ //feedback_inc("ban_job",1)
+ //feedback_add_details("ban_job","- [job]")
log_admin("[usr.client.ckey] has banned [M.ckey] from [job].\nReason: [reason]\nThis will be removed in [mins] minutes.")
message_admins("\blue[usr.client.ckey] has banned [M.ckey] from [job].\nReason: [reason]\nThis will be removed in [mins] minutes.")
@@ -440,7 +442,8 @@ var/global/BSACooldown = 0
else
M << "\red No ban appeals URL has been set."
ban_unban_log_save("[usr.client.ckey] has banned [M.ckey] from [job]. - Reason: [reason] - This is a permanent ban.")
- feedback_inc("ban_job_tmp",1)
+ //feedback_inc("ban_job_tmp",1)
+ //feedback_add_details("ban_job_tmp","- [job]")
log_admin("[usr.client.ckey] has banned [M.ckey] from [job].\nReason: [reason]\nThis is a permanent ban.")
message_admins("\blue[usr.client.ckey] has banned [M.ckey] from [job].\nReason: [reason]\nThis is a permanent ban.")
@@ -1263,14 +1266,20 @@ var/global/BSACooldown = 0
var/ok = 0
switch(href_list["secretsfun"])
if("sec_clothes")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","SC")
for(var/obj/item/clothing/under/O in world)
del(O)
ok = 1
if("sec_all_clothes")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","SAC")
for(var/obj/item/clothing/O in world)
del(O)
ok = 1
if("sec_classic1")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","SC1")
for(var/obj/item/clothing/suit/fire/O in world)
del(O)
for(var/obj/structure/grille/O in world)
@@ -1284,7 +1293,10 @@ var/global/BSACooldown = 0
del(O)
ok = 1*/
if("toxic")
- /* for(var/obj/machinery/atmoalter/siphs/fullairsiphon/O in world)
+ /*
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","T")
+ for(var/obj/machinery/atmoalter/siphs/fullairsiphon/O in world)
O.t_status = 3
for(var/obj/machinery/atmoalter/siphs/scrubbers/O in world)
O.t_status = 1
@@ -1298,26 +1310,34 @@ var/global/BSACooldown = 0
*/
usr << "HEH"
if("monkey")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","M")
for(var/mob/living/carbon/human/H in world)
spawn(0)
H.monkeyize()
ok = 1
if("corgi")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","M")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","M")
for(var/mob/living/carbon/human/H in world)
spawn(0)
H.corgize()
ok = 1
if("power")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","P")
log_admin("[key_name(usr)] made all areas powered", 1)
message_admins("\blue [key_name_admin(usr)] made all areas powered", 1)
power_restore()
if("unpower")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","UP")
log_admin("[key_name(usr)] made all areas unpowered", 1)
message_admins("\blue [key_name_admin(usr)] made all areas unpowered", 1)
power_failure()
if("activateprison")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","AP")
world << "\blue Transit signature detected."
world << "\blue Incoming shuttle."
/*
@@ -1329,6 +1349,8 @@ var/global/BSACooldown = 0
message_admins("\blue [key_name_admin(usr)] sent the prison shuttle to the station.", 1)
if("deactivateprison")
/*
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","DP")
var/A = locate(/area/shuttle_prison)
for(var/atom/movable/AM as mob|obj in A)
AM.z = 2
@@ -1336,6 +1358,8 @@ var/global/BSACooldown = 0
*/
message_admins("\blue [key_name_admin(usr)] sent the prison shuttle back.", 1)
if("toggleprisonstatus")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","TPS")
for(var/obj/machinery/computer/prison_shuttle/PS in world)
PS.allowedtocall = !(PS.allowedtocall)
message_admins("\blue [key_name_admin(usr)] toggled status of prison shuttle to [PS.allowedtocall].", 1)
@@ -1343,6 +1367,8 @@ var/global/BSACooldown = 0
if(!ticker)
alert("The game hasn't started yet!", null, null, null, null, null)
return
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","PW")
message_admins("\blue [key_name_admin(usr)] teleported all players to the prison station.", 1)
for(var/mob/living/carbon/human/H in world)
var/turf/loc = find_loc(H)
@@ -1385,6 +1411,8 @@ var/global/BSACooldown = 0
var/objective = input("Enter an objective")
if(!objective)
return
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","TA([objective])")
for(var/mob/living/carbon/human/H in world)
if(H.stat == 2 || !H.client || !H.mind) continue
if(is_special_character(H)) continue
@@ -1415,6 +1443,8 @@ var/global/BSACooldown = 0
if ((src.rank in list( "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master" )))
if(mining_shuttle_moving)
return
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","ShM")
move_mining_shuttle()
message_admins("\blue [key_name_admin(usr)] moved mining shuttle", 1)
log_admin("[key_name(usr)] moved the mining shuttle")
@@ -1422,6 +1452,8 @@ var/global/BSACooldown = 0
alert("You're not of a high enough rank to do this")
if("moveadminshuttle")
if ((src.rank in list( "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master" )))
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","ShA")
move_admin_shuttle()
message_admins("\blue [key_name_admin(usr)] moved the centcom administration shuttle", 1)
log_admin("[key_name(usr)] moved the centcom administration shuttle")
@@ -1429,6 +1461,8 @@ var/global/BSACooldown = 0
alert("You're not of a high enough rank to do this")
if("moveferry")
if ((src.rank in list( "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master" )))
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","ShF")
move_ferry()
message_admins("\blue [key_name_admin(usr)] moved the centcom ferry", 1)
log_admin("[key_name(usr)] moved the centcom ferry")
@@ -1436,12 +1470,41 @@ var/global/BSACooldown = 0
alert("You're not of a high enough rank to do this")
if("movealienship")
if ((src.rank in list( "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master" )))
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","ShX")
move_alien_ship()
message_admins("\blue [key_name_admin(usr)] moved the alien dinghy", 1)
log_admin("[key_name(usr)] moved the alien dinghy")
else
alert("You're not of a high enough rank to do this")
+ if("togglebombcap")
+ if (src.rank in list( "Game Admin", "Game Master" ))
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","BC")
+ switch(MAX_EXPLOSION_RANGE)
+ if(14)
+ MAX_EXPLOSION_RANGE = 16
+ if(16)
+ MAX_EXPLOSION_RANGE = 20
+ if(20)
+ MAX_EXPLOSION_RANGE = 28
+ if(28)
+ MAX_EXPLOSION_RANGE = 56
+ if(56)
+ MAX_EXPLOSION_RANGE = 128
+ if(128)
+ MAX_EXPLOSION_RANGE = 14
+ var/range_dev = MAX_EXPLOSION_RANGE *0.25
+ var/range_high = MAX_EXPLOSION_RANGE *0.5
+ var/range_low = MAX_EXPLOSION_RANGE
+ message_admins("\red [key_name_admin(usr)] changed the bomb cap to [range_dev], [range_high], [range_low]", 1)
+ log_admin("[key_name_admin(usr)] changed the bomb cap to [MAX_EXPLOSION_RANGE]")
+ else
+ alert("No way. You're not of a high enough rank to do this.")
+
if("flicklights")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","FL")
while(!usr.stat)
//knock yourself out to stop the ghosts
for(var/mob/M in world)
@@ -1513,6 +1576,8 @@ var/global/BSACooldown = 0
sleep(rand(30,400))
Wall.ex_act(rand(2,1)) */
if("wave")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","MW")
if ((src.rank in list("Trial Admin", "Badmin", "Game Admin", "Game Master" )))
meteor_wave()
message_admins("[key_name_admin(usr)] has spawned meteors", 1)
@@ -1522,6 +1587,8 @@ var/global/BSACooldown = 0
alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null)
return
if("gravanomalies")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","GA")
command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
world << sound('granomalies.ogg')
var/turf/T = pick(blobstart)
@@ -1551,41 +1618,61 @@ var/global/BSACooldown = 0
spawn(rand(300,600))
del(P)
if("goblob")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","BL")
mini_blob_event()
message_admins("[key_name_admin(usr)] has spawned blob", 1)
if("aliens")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","AL")
if(aliens_allowed)
Force_Event(/datum/event/alieninfestation)
message_admins("[key_name_admin(usr)] has spawned aliens", 1)
if("spaceninja")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","SN")
if(toggle_space_ninja)
if(space_ninja_arrival())//If the ninja is actually spawned. They may not be depending on a few factors.
message_admins("[key_name_admin(usr)] has sent in a space ninja", 1)
if("carp")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","C")
var/choice = input("You sure you want to spawn carp?") in list("Badmin", "Cancel")
if(choice == "Badmin")
message_admins("[key_name_admin(usr)] has spawned carp.", 1)
Force_Event(/datum/event/spacecarp)
if("radiation")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","R")
message_admins("[key_name_admin(usr)] has has irradiated the station", 1)
Force_Event(/datum/event/radiation)
if("immovable")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","IR")
message_admins("[key_name_admin(usr)] has sent an immovable rod to the station", 1)
immovablerod()
if("prison_break")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","PB")
message_admins("[key_name_admin(usr)] has allowed a prison break", 1)
Force_Event(/datum/event/prisonbreak)
if("electric")
message_admins("[key_name_admin(usr)] has triggered an electrical storm", 1)
Force_Event(/datum/event/electricalstorm)
if("lightsout")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","LO")
message_admins("[key_name_admin(usr)] has broke a lot of lights", 1)
lightsout(1,2)
if("blackout")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","BO")
message_admins("[key_name_admin(usr)] broke all lights", 1)
SpawnEvent()
lightsout(0,0)
if("virus")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","V")
var/answer = alert("Do you want this to be a random disease or do you have something in mind?",,"Virus2","Random","Choose")
if(answer=="Random")
Force_Event(/datum/event/viralinfection)
@@ -1608,6 +1695,8 @@ var/global/BSACooldown = 0
trigger_armed_response_team(1)
if("retardify")
if (src.rank in list("Badmin", "Game Admin", "Game Master"))
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","RET")
for(var/mob/living/carbon/human/H in world)
if(H.client)
H << "\red You suddenly feel stupid."
@@ -1618,6 +1707,8 @@ var/global/BSACooldown = 0
return
if("fakeguns")
if (src.rank in list("Badmin", "Game Admin", "Game Master"))
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","FG")
for(var/obj/item/W in world)
if(istype(W, /obj/item/clothing) || istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/weapon/disk) || istype(W, /obj/item/weapon/tank))
continue
@@ -1636,6 +1727,8 @@ var/global/BSACooldown = 0
return*/
if("dorf")
if (src.rank in list("Badmin","Game Admin", "Game Master"))
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","DF")
for(var/mob/living/carbon/human/B in world)
B.face_icon_state = "facial_wise"
B.update_face()
@@ -1645,6 +1738,8 @@ var/global/BSACooldown = 0
return
if("ionstorm")
if (src.rank in list("Badmin","Game Admin", "Game Master"))
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","I")
Force_Event(/datum/event/ionstorm)
message_admins("[key_name_admin(usr)] triggered an ion storm")
var/show_log = alert(usr, "Show ion message?", "Message", "Yes", "No")
@@ -1654,6 +1749,11 @@ var/global/BSACooldown = 0
else
alert("You cannot perform this action. You must be of a higher administrative rank!")
return
+ if("spacevines")
+ //feedback_inc("admin_secrets_fun_used",1)
+ //feedback_add_details("admin_secrets_fun_used","K")
+ spacevine_infestation()
+ message_admins("[key_name_admin(usr)] has spawned spacevines", 1)
if (usr)
log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]")
if (ok)
@@ -1922,7 +2022,7 @@ var/global/BSACooldown = 0
log_admin("[user.ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.")
ban_unban_log_save("[user.ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.")
message_admins("\blue [user.ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.")
- feedback_inc("ban_warn",1)
+ //feedback_inc("ban_warn",1)
del(M.client)
@@ -1989,6 +2089,7 @@ var/global/BSACooldown = 0
foo += text("Jobban")
dat += text("[foo]