diff --git a/baystation12.dme b/baystation12.dme
index 3535be0509..ed3c7a8d35 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -127,6 +127,7 @@
#define FILE_DIR "code/modules/projectiles/projectile"
#define FILE_DIR "code/modules/recycling"
#define FILE_DIR "code/modules/research"
+#define FILE_DIR "code/modules/security levels"
#define FILE_DIR "code/unused"
#define FILE_DIR "code/unused/beast"
#define FILE_DIR "code/unused/computer2"
@@ -170,7 +171,6 @@
#define FILE_DIR "sound/mecha"
#define FILE_DIR "sound/misc"
#define FILE_DIR "sound/piano"
-#define FILE_DIR "sound/spells"
#define FILE_DIR "sound/voice"
#define FILE_DIR "sound/weapons"
// END_FILE_DIR
@@ -790,6 +790,7 @@
#include "code\modules\mob\living\say.dm"
#include "code\modules\mob\living\blob\blob.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
+#include "code\modules\mob\living\carbon\alien\alien.dm"
#include "code\modules\mob\living\carbon\alien\say.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\death.dm"
@@ -966,6 +967,7 @@
#include "code\modules\research\rdmachines.dm"
#include "code\modules\research\research.dm"
#include "code\modules\research\server.dm"
+#include "code\modules\security levels\security levels.dm"
#include "code\WorkInProgress\AI_Visibility.dm"
#include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\detective_work.dm"
diff --git a/code/defines/mob/living/carbon/alien.dm b/code/defines/mob/living/carbon/alien.dm
index 9f2f3f4069..7ed371f5d9 100644
--- a/code/defines/mob/living/carbon/alien.dm
+++ b/code/defines/mob/living/carbon/alien.dm
@@ -6,7 +6,7 @@
icon = 'alien.dmi'
gender = NEUTER
- toxloss = 250
+ var/storedPlasma = 250
var/alien_invis = 0.0
var/max_plasma = 500
diff --git a/code/defines/mob/living/carbon/alien_humanoid.dm b/code/defines/mob/living/carbon/alien_humanoid.dm
index c48c0fee3b..6a880121b4 100644
--- a/code/defines/mob/living/carbon/alien_humanoid.dm
+++ b/code/defines/mob/living/carbon/alien_humanoid.dm
@@ -22,7 +22,7 @@
name = "alien hunter"
health = 150
- toxloss = 100
+ storedPlasma = 100
max_plasma = 150
icon_state = "alien_s"
@@ -30,7 +30,7 @@
name = "alien sentinel"
health = 125
- toxloss = 100
+ storedPlasma = 100
max_plasma = 250
icon_state = "alien_s"
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 70e15a20f6..6d593d5dc2 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -1068,9 +1068,9 @@
flags = FPRINT | TABLEPASS | CONDUCT
/obj/item/stack/sheet/r_metal
- name = "reinforced metal"
- singular_name = "reinforced metal sheet"
- desc = "A very heavy sheet of metal."
+ name = "steel"
+ singular_name = "steel sheet"
+ desc = "This sheet is an alloy of iron and plasma."
icon_state = "sheet-r_metal"
item_state = "sheet-metal"
m_amt = 7500
@@ -1079,8 +1079,8 @@
origin_tech = "materials=2"
/obj/item/stack/tile/steel
- name = "Steel floor tile"
- singular_name = "S teel floor tile"
+ name = "Metal floor tile"
+ singular_name = "Steel floor tile"
desc = "Those could work as a pretty decent throwing weapon"
icon_state = "tile"
w_class = 3.0
diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index 39dc7f10cb..3a8737b4a3 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -1093,6 +1093,7 @@
reagents.add_reagent("coco", 4+round((potency / 5), 1))
bitesize = 1+round(reagents.total_volume / 2, 1)
+//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"
@@ -1100,8 +1101,8 @@
icon_state = "grass"
potency = 20
New()
- ..()
- reagents.add_reagent("nutriment", round((potency / 20), 1))
+ new/obj/item/stack/tile/grass(src.loc)
+ del(src)
/obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane
seed = "/obj/item/seeds/sugarcaneseed"
diff --git a/code/defines/obj/vending.dm b/code/defines/obj/vending.dm
index afb3f20ee2..5835062136 100644
--- a/code/defines/obj/vending.dm
+++ b/code/defines/obj/vending.dm
@@ -185,6 +185,8 @@
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_hidden = "/obj/item/seeds/amanitamycelium;/obj/item/seeds/glowshroom;/obj/item/seeds/libertymycelium;/obj/item/seeds/nettleseed;/obj/item/seeds/plumpmycelium"
product_hideamt = "2;2;2;2;2"
+ product_coin = "/obj/item/toy/waterflower"
+ product_coin_amt = "1"
charge_type = "hydroponics"
/obj/machinery/vending/magivend
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 77944bba59..d0c014248b 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -524,6 +524,18 @@
throw_range = 10
origin_tech = "combat=3;materials=3;engineering=3"
+/obj/item/weapon/pepperspray
+ desc = "Manufactred by UhangInc., used to blind and down an opponent quickly."
+ icon = 'weapons.dmi'
+ name = "pepperspray"
+ icon_state = "pepperspray"
+ item_state = "pepperspray"
+ flags = ONBELT|TABLEPASS|OPENCONTAINER|FPRINT|USEDELAY
+ throwforce = 3
+ w_class = 2.0
+ throw_speed = 2
+ throw_range = 10
+
/obj/item/weapon/clipboard
name = "clipboard"
desc = "Apply paper to this to write better. Can also hold pens."
diff --git a/code/defines/turf.dm b/code/defines/turf.dm
index 8c53007de9..87c7f68286 100644
--- a/code/defines/turf.dm
+++ b/code/defines/turf.dm
@@ -102,6 +102,10 @@
name = "floor"
icon_state = "floor"
+/turf/simulated/shuttle/floor4 // Added this floor tile so that I have a seperate turf to check in the shuttle -- Polymorph
+ name = "Brig floor" // Also added it into the 2x3 brig area of the shuttle.
+ icon_state = "floor4"
+
/turf/unsimulated
intact = 1
name = "command"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index a91fcfd922..d0cfb86e57 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -19,9 +19,13 @@
src.icon = 'alert.dmi'
src.layer = 10
-// update_lights()
+ // update_lights()
if(name == "Space") // override defaults for space
- requires_power = 0
+ requires_power = 1
+ sd_SetLuminosity(1)
+ power_light = 0
+ power_equip = 0
+ power_environ = 0
if(!requires_power)
power_light = 0//rastaf0
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index bc2deaf3dc..e0e0cdf70b 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -71,7 +71,7 @@
if ((O.client && !( O.blinded )))
O << text("\red [src] has been scanned by [user] with the [W]")
else
- if (!( istype(W, /obj/item/weapon/grab) ) && !(istype(W, /obj/item/weapon/plastique)) &&!(istype(W, /obj/item/weapon/cleaner)) &&!(istype(W, /obj/item/weapon/chemsprayer)) && !(istype(W, /obj/item/weapon/plantbgone)) )
+ if (!( istype(W, /obj/item/weapon/grab) ) && !(istype(W, /obj/item/weapon/plastique)) &&!(istype(W, /obj/item/weapon/cleaner)) &&!(istype(W, /obj/item/weapon/chemsprayer)) &&!(istype(W, /obj/item/weapon/pepperspray)) && !(istype(W, /obj/item/weapon/plantbgone)) )
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O << text("\red [] has been hit by [] with []", src, user, W)
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 80fe93360e..94e6c516e3 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -190,6 +190,7 @@
// command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.")
// world << sound('intercept.ogg')
+// set_security_level(1)
/datum/game_mode/blob/proc/check_quarantine()
var/numDead = 0
var/numAlive = 0
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index c81652a2e9..ce1efeb37c 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -401,7 +401,7 @@
/client/proc/changeling_boost_range()
set category = "Changeling"
set name = "Ranged Sting (10)"
- set desc="Your next sting ability can be used against targets 3 squares away."
+ set desc="Your next sting ability can be used against targets 2 squares away."
if(!usr.changeling)
usr << "\red You're not a changeling, something's wrong!"
@@ -418,7 +418,7 @@
usr.changeling.chem_charges -= 10
usr << "\blue Your throat adjusts to launch the sting."
- usr.changeling.sting_range = 3
+ usr.changeling.sting_range = 2
usr.verbs -= /client/proc/changeling_boost_range
@@ -440,7 +440,7 @@
for(var/mob/living/carbon/C in oview(usr.changeling.sting_range))
victims += C
var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims
- if(T)
+ if(T && T in view(usr.changeling.sting_range))
if(usr.stat)
usr << "\red Not when we are incapacitated."
@@ -481,7 +481,7 @@
for(var/mob/living/carbon/C in oview(usr.changeling.sting_range))
victims += C
var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims
- if(T)
+ if(T && T in view(usr.changeling.sting_range))
if(usr.stat)
usr << "\red Not when we are incapacitated."
return
@@ -536,7 +536,7 @@
victims += C
var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims
- if(T)
+ if(T && T in view(usr.changeling.sting_range))
if(usr.stat)
usr << "\red Not when we are incapacitated."
return
@@ -576,7 +576,7 @@
victims += C
var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims
- if(T)
+ if(T && T in view(usr.changeling.sting_range))
if(usr.stat)
usr << "\red Not when we are incapacitated."
@@ -620,7 +620,7 @@
victims += C
var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims
- if(T)
+ if(T && T in view(usr.changeling.sting_range))
if(usr.stat)
usr << "\red Not when we are incapacitated."
return
@@ -672,7 +672,7 @@
victims += C
var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims
- if(T)
+ if(T && T in view(usr.changeling.sting_range))
if(usr.stat)
usr << "\red Not when we are incapacitated."
return
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 3c7e5dc6b4..b52959fdaa 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -113,6 +113,7 @@
command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.")
world << sound('intercept.ogg')
+ set_security_level(1)
/datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=1)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 419061b9fb..9537de5be1 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -219,6 +219,10 @@ datum/objective/escape
var/turf/location = get_turf(owner.current.loc)
if(!location)
return 0
+
+ if(istype(location, /turf/simulated/shuttle/floor4)) // Fails tratiors if they are in the shuttle brig -- Polymorph
+ return 0
+
var/area/check_area = location.loc
if(istype(check_area, /area/shuttle/escape/centcom))
return 1
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index d26928f17c..750537d11e 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -166,16 +166,26 @@
update_rev_icons_added(rev_mind)
return 1
//////////////////////////////////////////////////////////////////////////////
-//Deals with players being converted from the revolution (Not a rev anymore)//
+//Deals with players being converted from the revolution (Not a rev anymore)// // Modified to handle borged MMIs. Accepts another var if the target is being borged at the time -- Polymorph.
//////////////////////////////////////////////////////////////////////////////
-/datum/game_mode/proc/remove_revolutionary(datum/mind/rev_mind)
+/datum/game_mode/proc/remove_revolutionary(datum/mind/rev_mind , beingborged)
if(rev_mind in revolutionaries)
revolutionaries -= rev_mind
rev_mind.special_role = null
- rev_mind.current << "\red You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you..."
+
+ if(beingborged)
+ rev_mind.current << "\red The frame's firmware detects and deletes your neural reprogramming! You remember nothing from the moment you were flashed until now."
+
+ else
+ rev_mind.current << "\red You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you..."
+
update_rev_icons_removed(rev_mind)
for(var/mob/living/M in view(rev_mind.current))
- M << "[rev_mind.current] looks like they just remembered their real allegiance!"
+ if(beingborged)
+ M << "The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it."
+
+ else
+ M << "[rev_mind.current] looks like they just remembered their real allegiance!"
/////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index b1c57a8d61..4c83f8a76f 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -9,7 +9,7 @@
var/direction_out = 0 //0 = siphoning, 1 = releasing
var/target_pressure = 100
- volume = 750
+ volume = 2500
/obj/machinery/portable_atmospherics/pump/update_icon()
src.overlays = 0
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index e94cee774f..d01e0b9088 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -238,7 +238,6 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/weapon/airlock_electronics(), \
new /obj/item/stack/sheet/metal(), \
new /obj/item/stack/sheet/glass(), \
- new /obj/item/stack/sheet/r_metal(), \
new /obj/item/stack/sheet/rglass(), \
new /obj/item/stack/rods(), \
new /obj/item/weapon/rcd_ammo(), \
diff --git a/code/game/machinery/computer/AIcore.dm b/code/game/machinery/computer/AIcore.dm
index 97addf88d0..43d670c5c5 100644
--- a/code/game/machinery/computer/AIcore.dm
+++ b/code/game/machinery/computer/AIcore.dm
@@ -122,6 +122,11 @@
if(P:brainmob.stat == 2)
user << "\red Sticking a dead brain into the frame would sort of defeat the purpose."
return
+
+ if(P: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."
+ return
+
if(jobban_isbanned(P:brainmob, "AI"))
user << "\red This MMI does not seem to fit."
return
@@ -153,6 +158,9 @@
playsound(loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
+ if(P:brainmob.mind in ticker.mode:revolutionaries)
+ ticker.mode:remove_revolutionary(P:brainmob.mind , 1)
+
new /mob/living/silicon/ai ( loc, laws, brain )
del(src)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 093804317c..fcfaeeb851 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -14,6 +14,7 @@
var/state = STATE_DEFAULT
var/aistate = STATE_DEFAULT
var/message_cooldown = 0
+ var/tmp_alertlevel = 0
var/const
STATE_DEFAULT = 1
STATE_CALLSHUTTLE = 2
@@ -22,6 +23,8 @@
STATE_VIEWMESSAGE = 5
STATE_DELMESSAGE = 6
STATE_STATUSDISPLAY = 7
+ STATE_ALERT_LEVEL = 8
+ STATE_CONFIRM_LEVEL = 9
var/status_display_freq = "1435"
var/stat_msg1
@@ -59,6 +62,31 @@
if("logout")
authenticated = 0
+ if("swipeidseclevel")
+ var/mob/M = usr
+ var/obj/item/weapon/card/id/I = M.equipped()
+ if (istype(I, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = I
+ I = pda.id
+ if (I && istype(I))
+ if(access_captain in I.access)
+ var/old_level = security_level
+ if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN
+ if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN
+ if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this
+ set_security_level(tmp_alertlevel)
+ if(security_level != old_level)
+ //Only notify the admins if an actual change happened
+ log_game("[key_name(usr)] has changed the security level to [get_security_level()].")
+ message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].", 1)
+ tmp_alertlevel = 0
+ else:
+ usr << "You are not authorized to do this."
+ tmp_alertlevel = 0
+ state = STATE_DEFAULT
+ else
+ usr << "You need to swipe your ID."
+
if("announce")
if(src.authenticated==2)
if(message_cooldown) return
@@ -168,6 +196,17 @@
src.aistate = STATE_MESSAGELIST
if("ai-status")
src.aistate = STATE_STATUSDISPLAY
+
+ if("securitylevel")
+ src.tmp_alertlevel = text2num( href_list["newalertlevel"] )
+ if(!tmp_alertlevel) tmp_alertlevel = 0
+ state = STATE_CONFIRM_LEVEL
+
+ if("changeseclevel")
+ state = STATE_ALERT_LEVEL
+
+
+
src.updateUsrDialog()
@@ -203,6 +242,7 @@
dat += "
\[ Log Out \]"
if (src.authenticated==2)
dat += "
\[ Make An Announcement \]"
+ dat += "
\[ Change alert level \]"
if(emergency_shuttle.location==0)
if (emergency_shuttle.online)
dat += "
\[ Cancel Shuttle Call \]"
@@ -248,7 +288,17 @@
dat += " Red Alert |"
dat += " Lockdown |"
dat += " Biohazard \]
"
-
+ if(STATE_ALERT_LEVEL)
+ dat += "Current alert level: [get_security_level()]
"
+ if(security_level == SEC_LEVEL_DELTA)
+ dat += "The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate."
+ else
+ dat += "Blue
"
+ dat += "Green"
+ if(STATE_CONFIRM_LEVEL)
+ dat += "Current alert level: [get_security_level()]
"
+ dat += "Confirm the change to: [num2seclevel(tmp_alertlevel)]
"
+ dat += "Main Menu | " : ""]Close \]"
user << browse(dat, "window=communications;size=400x500")
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index a9c3cb1a8c..3b2a8aefeb 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -243,7 +243,7 @@ obj/machinery/hydroponics/proc/mutate() // Mutates the current seed
src.myseed.yield = 1 // Mushrooms always have a minimum yield of 1.
if(src.myseed.potency != -1) //Not all plants have a potency
- src.myseed.potency += rand(-10,10)
+ src.myseed.potency += rand(-25,25)
if(src.myseed.potency < 0)
src.myseed.potency = 0
else if(src.myseed.potency > 100)
@@ -282,7 +282,7 @@ obj/machinery/hydroponics/proc/hardmutate() // Strongly mutates the current seed
src.myseed.yield = 1 // Mushrooms always have a minimum yield of 1.
if(src.myseed.potency != -1) //Not all plants have a potency
- src.myseed.potency += rand(-20,20)
+ src.myseed.potency += rand(-50,50)
if(src.myseed.potency < 0)
src.myseed.potency = 0
else if(src.myseed.potency > 100)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 34e0fc4d05..c2caca9730 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -77,7 +77,6 @@
var/datum/data/vending_product/R = new /datum/data/vending_product( )
R.product_name = capitalize(temp.name)
R.product_path = path_list[p]
- R.display_color = pick("red","blue","green")
R.amount = text2num(amt_list[p])
R.charge_amount = R.amount
@@ -102,6 +101,10 @@
winset(user, "vendingslot[i].buy", "command=\"skincmd vending;buy[i-1]\"")
winset(user, "vendingwindow.title", "text=\"[src.name]\"")
var/list/products = src.product_records
+ if(extended_inventory)
+ products |= src.hidden_records
+ if(coin)
+ products |= src.coin_records
var/pages = -round(-products.len / 6)
if (page > pages)
page = pages
@@ -128,6 +131,10 @@
if (get_dist(user, src) > 1)
return
var/list/products = src.product_records
+ if(extended_inventory)
+ products |= src.hidden_records
+ if(coin)
+ products |= src.coin_records
var/pages = -round(-products.len / 6)
switch(data)
if ("pagen")
@@ -151,6 +158,24 @@
if (!src.vend_ready)
return
+ if ((!src.allowed(usr)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH
+ usr << "\red Access denied." //Unless emagged of course
+ flick(src.icon_deny,src)
+ return
+
+ if (R in coin_records)
+ if(!coin)
+ usr << "\blue You need to insert a coin to get this item."
+ return
+ if(coin.string_attached)
+ if(prob(50))
+ usr << "\blue You successfully pull the coin out before the [src] could swallow it."
+ else
+ usr << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all."
+ del(coin)
+ else
+ del(coin)
+
R.amount--
src.vend_ready = 0
@@ -172,7 +197,7 @@
/obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/card/emag))
src.emagged = 1
- user << "You short out the product lock on [src]"
+ user << "You short out the ID lock on [src]"
return
else if(istype(W, /obj/item/weapon/screwdriver))
src.panel_open = !src.panel_open
@@ -191,6 +216,7 @@
W.loc = src
coin = W
user << "\blue You insert the [W] into the [src]"
+ updateWindow(user)
return
else if(istype(W,/obj/item/weapon/vending_charge/))
DoCharge(W,user)
@@ -226,6 +252,13 @@
winshow(user, "vendingwindow", 1)
user.skincmds["vending"] = src
+ var/dat = "[src.name]"
+
+ if(coin)
+ dat += "
There is a [coin.name] in the slot!"
+ else
+ dat += "
The coin slot is empty."
+
if(panel_open)
var/list/vendwires = list(
"Violet" = 1,
@@ -233,7 +266,7 @@
"Goldenrod" = 3,
"Green" = 4,
)
- var/dat = "
Access Panel
"
+ dat += "
Access Panel
"
for(var/wiredesc in vendwires)
var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]]
dat += "[wiredesc] wire: "
@@ -250,12 +283,11 @@
dat += "The green light is [src.extended_inventory ? "on" : "off"].
"
dat += "The [(src.wires & WIRE_SCANID) ? "purple" : "yellow"] light is on.
"
- if (product_slogans != "")
+ if(product_slogans != "")
dat += "The speaker switch is [src.shut_up ? "off" : "on"]. Toggle"
- user << browse(dat, "")
- onclose(user, "")
- return
+ user << browse(dat, "")
+ onclose(user, "")
/obj/machinery/vending/Topic(href, href_list)
if(stat & (BROKEN|NOPOWER))
@@ -283,6 +315,8 @@
usr.put_in_hand(coin)
usr << "\blue You remove the [coin] from the [src]"
coin = null
+ updateWindow(usr)
+ usr.skincmds["vending"] = src
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
@@ -349,6 +383,8 @@
src.mend(twire)
else
src.cut(twire)
+ updateWindow(usr)
+ usr.skincmds["vending"] = src
else if ((href_list["pulsewire"]) && (src.panel_open))
var/twire = text2num(href_list["pulsewire"])
@@ -360,6 +396,8 @@
return
else
src.pulse(twire)
+ updateWindow(usr)
+ usr.skincmds["vending"] = src
else if ((href_list["togglevoice"]) && (src.panel_open))
src.shut_up = !src.shut_up
diff --git a/code/game/objects/alien/facehugger.dm b/code/game/objects/alien/facehugger.dm
index b68f9aed11..dfb45df957 100644
--- a/code/game/objects/alien/facehugger.dm
+++ b/code/game/objects/alien/facehugger.dm
@@ -2,8 +2,8 @@ var/const
MIN_IMPREGNATION_TIME = 100 //time it takes to impregnate someone
MAX_IMPREGNATION_TIME = 150
- MIN_ACTIVE_TIME = 30 //time between being dropped and going idle
- MAX_ACTIVE_TIME = 50
+ MIN_ACTIVE_TIME = 300 //time between being dropped and going idle
+ MAX_ACTIVE_TIME = 600
/obj/item/clothing/mask/facehugger
name = "alien"
@@ -13,7 +13,7 @@ var/const
w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4
flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH|MASKCOVERSEYES
- var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
+ var/stat = UNCONSCIOUS //UNCONSCIOUS is the idle state in this case
var/sterile = 0
@@ -177,6 +177,11 @@ var/const
stat = CONSCIOUS
+ for(var/mob/living/carbon/alien/alien in world)
+ var/image/activeIndicator = image('alien.dmi', loc = src, icon_state = "facehugger_active")
+ activeIndicator.override = 1
+ alien.client.images += activeIndicator
+
spawn(rand(MIN_ACTIVE_TIME,MAX_ACTIVE_TIME))
GoIdle()
@@ -186,6 +191,8 @@ var/const
if(stat == DEAD || stat == UNCONSCIOUS)
return
+ RemoveActiveIndicators()
+
stat = UNCONSCIOUS
return
@@ -194,6 +201,8 @@ var/const
if(stat == DEAD)
return
+ RemoveActiveIndicators()
+
icon_state = "facehugger_dead"
stat = DEAD
@@ -202,7 +211,13 @@ var/const
return
+ proc/RemoveActiveIndicators() //removes the "active" facehugger indicator from all aliens in the world for this hugger
+ for(var/mob/living/carbon/alien/alien in world)
+ for(var/image/image in alien.client.images)
+ if(image.icon_state == "facehugger_active" && image.loc == src)
+ del(image)
+ return
/* NOPE.png -- Urist
diff --git a/code/game/objects/closets/secure/secure_closets.dm b/code/game/objects/closets/secure/secure_closets.dm
index 64c3689ac5..1923e0cf84 100644
--- a/code/game/objects/closets/secure/secure_closets.dm
+++ b/code/game/objects/closets/secure/secure_closets.dm
@@ -4,6 +4,12 @@
return 0
return 1
+/obj/structure/closet/secure_closet/close()
+ ..()
+ if(broken)
+ icon_state = src.icon_off
+ return 1
+
/obj/structure/closet/secure_closet/emp_act(severity)
for(var/obj/O in src)
O.emp_act(severity)
@@ -35,7 +41,8 @@
broken = 1
locked = 0
desc = "It appears to be broken."
- icon_state = src.icon_broken
+ icon_state = icon_off
+ flick(icon_broken, src)
if(istype(W, /obj/item/weapon/melee/energy/blade))
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src.loc)
diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm
index 253dd3cb92..d6e5518fec 100644
--- a/code/game/objects/closets/secure/security.dm
+++ b/code/game/objects/closets/secure/security.dm
@@ -100,6 +100,7 @@
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/weapon/gun/energy/taser(src)
diff --git a/code/game/objects/items/robot_parts.dm b/code/game/objects/items/robot_parts.dm
index e929121ceb..8a906142aa 100644
--- a/code/game/objects/items/robot_parts.dm
+++ b/code/game/objects/items/robot_parts.dm
@@ -162,6 +162,10 @@
user << "\red Sticking a dead brain into the frame would sort of defeat the purpose."
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."
+ return
+
if(jobban_isbanned(M.brainmob, "Cyborg"))
user << "\red This MMI does not seem to fit."
return
@@ -183,6 +187,10 @@
G.corpse.mind.transfer_to(O)
del(G)
break
+
+ if(O.mind in ticker.mode:revolutionaries)
+ ticker.mode:remove_revolutionary(O.mind , 1)
+
if(O.mind && O.mind.special_role)
O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 131cd9b099..7958372d6a 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -130,18 +130,7 @@ RCD
user << "The RCD now holds [matter]/30 matter-units."
desc = "A RCD. It currently holds [matter]/30 matter-units."
return
- if(istype(A, /turf/simulated/wall/r_wall) && matter >= 8)
- user << "Deconstructing RWall (8)..."
- playsound(src.loc, 'click.ogg', 50, 1)
- if(do_after(user, 60))
- if(!disabled && matter >= 8)
- spark_system.set_up(5, 0, src)
- src.spark_system.start()
- A:ReplaceWithWall()
- playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- matter -= 8
- user << "The RCD now holds [matter]/30 matter-units."
- desc = "A RCD. It currently holds [matter]/30 matter-units."
+ if(istype(A, /turf/simulated/wall/r_wall))
return
if(istype(A, /turf/simulated/floor) && matter >= 5)
user << "Deconstructing Floor (5)..."
diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm
index 28090a66ec..afbdc68891 100644
--- a/code/game/objects/items/weapons/grenades.dm
+++ b/code/game/objects/items/weapons/grenades.dm
@@ -26,6 +26,7 @@ FLASHBANG
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container
+ if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..()
if((user.equipped() == src)&&(!active)&&(clown_check(user)))
user << "\red You prime the emp grenade! [det_time/10] seconds!"
src.active = 1
@@ -93,6 +94,7 @@ FLASHBANG
active = 0
det_time = 30
proc
+ bang(var/turf/T , var/mob/living/carbon/M)
prime()
clown_check(var/mob/living/user)
@@ -119,6 +121,7 @@ FLASHBANG
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container
+ if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..()
if((user.equipped() == src)&&(!active)&&(clown_check(user)))
user << "\red You prime the flashbang! [det_time/10] seconds!"
src.active = 1
@@ -143,81 +146,92 @@ FLASHBANG
..()
return
+ bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged.
+ if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging
+ for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions.
+ S.active = 0 // -- Polymorph
+ S.icon_state = "shield0"
- prime()
+ M << "\red BANG"
playsound(src.loc, 'bang.ogg', 25, 1)
+
+//Checking for protections
+ var/eye_safety = 0
+ var/ear_safety = 0
+ if(iscarbon(M))
+ eye_safety = M.eyecheck()
+ if(ishuman(M))
+ if(istype(M:ears, /obj/item/clothing/ears/earmuffs))
+ ear_safety += 2
+ if(M.mutations & HULK)
+ ear_safety += 1
+ if(istype(M:head, /obj/item/clothing/head/helmet))
+ ear_safety += 1
+
+//Flashing everyone
+ if(eye_safety < 1)
+ flick("e_flash", M.flash)
+ M.eye_stat += rand(1, 3)
+ M.stunned = max(M.stunned,2)
+ M.weakened = max(M.weakened,10)
+
+
+
+//Now applying sound
+ if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M))
+ if(ear_safety > 0)
+ M.stunned = max(M.stunned,2)
+ M.weakened = max(M.weakened,1)
+ else
+ M.stunned = max(M.stunned,10)
+ M.weakened = max(M.weakened,3)
+ if ((prob(14) || (M == src.loc && prob(70))))
+ M.ear_damage += rand(1, 10)
+ else
+ M.ear_damage += rand(0, 5)
+ M.ear_deaf = max(M.ear_deaf,15)
+
+ else if(get_dist(M, T) <= 5)
+ if(!ear_safety)
+ M.stunned = max(M.stunned,8)
+ M.ear_damage += rand(0, 3)
+ M.ear_deaf = max(M.ear_deaf,10)
+
+ else if(!ear_safety)
+ M.stunned = max(M.stunned,4)
+ M.ear_damage += rand(0, 1)
+ M.ear_deaf = max(M.ear_deaf,5)
+
+//This really should be in mob not every check
+ if (M.eye_stat >= 20)
+ M << "\red Your eyes start to burn badly!"
+ M.disabilities |= 1
+ if (prob(M.eye_stat - 20 + 1))
+ M << "\red You can't see anything!"
+ M.sdisabilities |= 1
+ if (M.ear_damage >= 15)
+ M << "\red Your ears start to ring badly!"
+ if (prob(M.ear_damage - 10 + 5))
+ M << "\red You can't hear anything!"
+ M.sdisabilities |= 4
+ else
+ if (M.ear_damage >= 5)
+ M << "\red Your ears start to ring!"
+
+ prime() // Prime now just handles the two loops that query for people in lockers and people who can see it.
var/turf/T = get_turf(src)
if(T)
T.hotspot_expose(700,125)
+ for(var/obj/structure/closet/L in view(T, null))
+ if(locate(/mob/living/carbon/, L))
+ for(var/mob/living/carbon/M in L)
+ bang(T, M)
+
+
for(var/mob/living/carbon/M in viewers(T, null))
- if (locate(/obj/item/weapon/cloaking_device, M))
- for(var/obj/item/weapon/cloaking_device/S in M)
- S.active = 0
- S.icon_state = "shield0"
+ bang(T, M)
- M << "\red BANG"
-
-//Checking for protections
- var/eye_safety = 0
- var/ear_safety = 0
- if(iscarbon(M))
- eye_safety = M.eyecheck()
- if(ishuman(M))
- if(istype(M:ears, /obj/item/clothing/ears/earmuffs))
- ear_safety += 2
- if(M.mutations & HULK)
- ear_safety += 1
- if(istype(M:head, /obj/item/clothing/head/helmet))
- ear_safety += 1
-
-//Flashing everyone
- if(eye_safety < 1)
- flick("e_flash", M.flash)
- M.eye_stat += rand(1, 3)
- M.stunned = max(M.stunned,2)
- M.weakened = max(M.weakened,10)
-
-//Now applying sound
- if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M))
- if(ear_safety > 0)
- M.stunned = max(M.stunned,2)
- M.weakened = max(M.weakened,1)
- else
- M.stunned = max(M.stunned,10)
- M.weakened = max(M.weakened,3)
- if ((prob(14) || (M == src.loc && prob(70))))
- M.ear_damage += rand(1, 10)
- else
- M.ear_damage += rand(0, 5)
- M.ear_deaf = max(M.ear_deaf,15)
-
- else if(get_dist(M, T) <= 5)
- if(!ear_safety)
- M.stunned = max(M.stunned,8)
- M.ear_damage += rand(0, 3)
- M.ear_deaf = max(M.ear_deaf,10)
-
- else if(!ear_safety)
- M.stunned = max(M.stunned,4)
- M.ear_damage += rand(0, 1)
- M.ear_deaf = max(M.ear_deaf,5)
-
-//This really should be in mob not every check
- if (M.eye_stat >= 20)
- M << "\red Your eyes start to burn badly!"
- M.disabilities |= 1
- if (prob(M.eye_stat - 20 + 1))
- M << "\red You can't see anything!"
- M.sdisabilities |= 1
- if (M.ear_damage >= 15)
- M << "\red Your ears start to ring badly!"
- if (prob(M.ear_damage - 10 + 5))
- M << "\red You can't hear anything!"
- M.sdisabilities |= 4
- else
- if (M.ear_damage >= 5)
- M << "\red Your ears start to ring!"
//Blob damage here
for(var/obj/effect/blob/B in view(8,T))
@@ -251,3 +265,16 @@ FLASHBANG
prime()
return 0
return 1
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/game/objects/items/weapons/mops_cleaners.dm b/code/game/objects/items/weapons/mops_cleaners.dm
index 473c0b90d2..c6e2c98eab 100644
--- a/code/game/objects/items/weapons/mops_cleaners.dm
+++ b/code/game/objects/items/weapons/mops_cleaners.dm
@@ -14,7 +14,7 @@ MOP
return
/obj/item/weapon/cleaner/afterattack(atom/A as mob|obj, mob/user as mob)
- if (istype(A, /obj/item/weapon/storage/backpack ))
+ if (istype(A, /obj/item/weapon/storage ))
return
if (istype(A, /obj/effect/proc_holder/spell ))
return
@@ -91,7 +91,7 @@ MOP
return
/obj/item/weapon/chemsprayer/afterattack(atom/A as mob|obj, mob/user as mob)
- if (istype(A, /obj/item/weapon/storage/backpack ))
+ if (istype(A, /obj/item/weapon/storage ))
return
if (istype(A, /obj/effect/proc_holder/spell ))
return
@@ -165,7 +165,95 @@ MOP
return
-/obj/item/weapon/chemsprayer/examine()
+/obj/item/weapon/pepperspray/New()
+ var/datum/reagents/R = new/datum/reagents(45)
+ reagents = R
+ R.my_atom = src
+ R.add_reagent("condensedcapsaicin", 45)
+
+/obj/item/weapon/pepperspray/attack(mob/living/carbon/human/M as mob, mob/user as mob)
+ return
+
+/obj/item/weapon/pepperspray/afterattack(atom/A as mob|obj, mob/user as mob)
+ if (istype(A, /obj/item/weapon/storage ))
+ return
+ if (istype(A, /obj/effect/proc_holder/spell ))
+ return
+ else if (istype(A, /obj/structure/reagent_dispensers/peppertank) && get_dist(src,A) <= 1)
+ A.reagents.trans_to(src, 45)
+ user << "\blue Pepper spray refilled"
+ playsound(src.loc, 'refill.ogg', 50, 1, -6)
+ return
+ else if (src.reagents.total_volume < 1)
+ user << "\blue [src] is empty!"
+ return
+ playsound(src.loc, 'spray2.ogg', 50, 1, -6)
+
+ var/Sprays[3]
+ for(var/i=1, i<=3, i++) // intialize sprays
+ if(src.reagents.total_volume < 1) break
+ var/obj/effect/decal/D = new/obj/effect/decal(get_turf(src))
+ D.name = "chemicals"
+ D.icon = 'chempuff.dmi'
+ D.create_reagents(15)
+ src.reagents.trans_to(D, 15)
+
+ var/rgbcolor[3]
+ var/finalcolor
+ for(var/datum/reagent/re in D.reagents.reagent_list)
+ if(!finalcolor)
+ rgbcolor = GetColors(re.color)
+ finalcolor = re.color
+ else
+ var/newcolor[3]
+ var/prergbcolor[3]
+ prergbcolor = rgbcolor
+ newcolor = GetColors(re.color)
+
+ rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2
+ rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2
+ rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2
+
+ finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3])
+
+ D.icon += finalcolor
+
+ Sprays[i] = D
+
+ var/direction = get_dir(src, A)
+ var/turf/T = get_turf(A)
+ var/turf/T1 = get_step(T,turn(direction, 90))
+ var/turf/T2 = get_step(T,turn(direction, -90))
+ var/list/the_targets = list(T,T1,T2)
+
+ for(var/i=1, i<=Sprays.len, i++)
+ spawn()
+ var/obj/effect/decal/D = Sprays[i]
+ if(!D) continue
+
+ // Spreads the sprays a little bit
+ var/turf/my_target = pick(the_targets)
+ the_targets -= my_target
+
+ for(var/j=1, j<=rand(6,8), j++)
+ step_towards(D, my_target)
+ D.reagents.reaction(get_turf(D))
+ for(var/atom/t in get_turf(D))
+ D.reagents.reaction(t)
+ sleep(2)
+ del(D)
+ sleep(1)
+
+ if(isrobot(user)) //Cyborgs can clean forever if they keep charged
+ var/mob/living/silicon/robot/janitor = user
+ janitor.cell.charge -= 20
+ var/refill = src.reagents.get_master_reagent_id()
+ spawn(600)
+ src.reagents.add_reagent(refill, 10)
+
+ return
+
+/obj/item/weapon/pepperspray/examine()
set src in usr
usr << text("\icon[] [] units of cleaner left!", src, src.reagents.total_volume)
..()
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index ade36179d4..a6f00c091a 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -21,12 +21,6 @@ WELDINGTOOOL
origin_tech = "materials=1;engineering=1"
- New()
- if (prob(75))
- src.pixel_x = rand(0, 16)
- return
-
-
// SCREWDRIVER
/obj/item/weapon/screwdriver/New()
diff --git a/code/game/objects/stacks/metal.dm b/code/game/objects/stacks/metal.dm
index a0f8738fd7..ad936cf566 100644
--- a/code/game/objects/stacks/metal.dm
+++ b/code/game/objects/stacks/metal.dm
@@ -68,7 +68,6 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
null, \
new/datum/stack_recipe("floor tile", /obj/item/stack/tile/steel, 1, 4, 10), \
new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
- new/datum/stack_recipe("reinforced sheet", /obj/item/stack/sheet/r_metal, 2, 1, 50), \
null, \
new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, one_per_turf = 1), \
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
@@ -92,7 +91,6 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
// /datum/stack_recipe/New(title, result_type, req_amount, res_amount, max_res_amount, time, one_per_turf, on_floor = 0)
var/global/list/datum/stack_recipe/r_metal_recipes = list ( \
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/reinforced, 2), \
- new/datum/stack_recipe("metal sheet", /obj/item/stack/sheet/metal, 1, 2, 50), \
new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, one_per_turf = 1), \
)
diff --git a/code/game/objects/stacks/stack.dm b/code/game/objects/stacks/stack.dm
index 8fdf69357f..3ca6fc7dce 100644
--- a/code/game/objects/stacks/stack.dm
+++ b/code/game/objects/stacks/stack.dm
@@ -191,7 +191,8 @@
return
if (src.amount < R.req_amount*multiplier)
return
- var/O = new R.result_type( usr.loc )
+ var/atom/O = new R.result_type( usr.loc )
+ O.dir = usr.dir
if (R.max_res_amount>1)
var/obj/item/stack/new_item = O
new_item.amount = R.res_amount*multiplier
diff --git a/code/game/objects/storage/belt.dm b/code/game/objects/storage/belt.dm
index 84267da77c..5a51aa630d 100644
--- a/code/game/objects/storage/belt.dm
+++ b/code/game/objects/storage/belt.dm
@@ -108,6 +108,7 @@
//storage_slots = 6
can_hold = list(
"/obj/item/weapon/flashbang",
+ "/obj/item/weapon/pepperspray",
"/obj/item/weapon/handcuffs",
"/obj/item/device/flash",
"/obj/item/clothing/glasses",
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 7d9914a220..e917242ade 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -18,7 +18,7 @@
if (vary)
S.frequency = rand(32000, 55000)
- for (var/mob/M in range(world.view+extrarange, source))
+ for (var/mob/M in range(world.view+extrarange, source)) // Plays for people in range.
if (M.client)
if(M.ear_deaf <= 0 || !M.ear_deaf)
if(isturf(source))
@@ -27,6 +27,12 @@
M << S
+ for(var/obj/structure/closet/L in range(world.view+extrarange, source))
+ if(locate(/mob/, L))
+ for(var/mob/Ml in L)
+ Ml << S
+ // Now plays for people in lockers! -- Polymorph
+
/mob/proc/playsound_local(var/atom/source, soundin, vol as num, vary, extrarange as num)
if(!src.client || ear_deaf > 0) return
switch(soundin)
@@ -75,31 +81,27 @@ client/verb/Toggle_Soundscape()
if (!A:client) return
//if (A:ear_deaf) return
- if (A && A:client && !A:client:ambience_playing && !A:client:no_ambi) // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! - LastyScratch
+ if (A && A:client && !A:client:ambience_playing && !A:client:no_ambi) // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas next to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
A:client:ambience_playing = 1
A << sound('shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)
switch(src.name)
if ("Chapel") sound = pick('ambicha1.ogg','ambicha2.ogg','ambicha3.ogg','ambicha4.ogg')
- if ("Morgue") sound = pick('ambimo1.ogg','ambimo2.ogg','ambistat.ogg')
- if ("Space") sound = pick('ambispace.ogg','ambistat.ogg',)
+ if ("Morgue") sound = pick('ambimo1.ogg','ambimo2.ogg','title2.ogg')
+ if ("Space") sound = pick('ambispace.ogg','title2.ogg',)
if ("Engine Control") sound = pick('ambisin1.ogg','ambisin2.ogg','ambisin3.ogg','ambisin4.ogg')
if ("Atmospherics") sound = pick('ambiatm1.ogg')
- if ("Medbay") sound = pick('ambistat.ogg')
- if ("Bridge") sound = pick('ambistat.ogg')
- if ("Arrival Shuttle Hallway") sound = pick('ambistat.ogg','ambiruntime.ogg')
if ("AI Sat Ext") sound = pick('ambiruntime.ogg','ambimalf.ogg')
if ("AI Satellite") sound = pick('ambimalf.ogg')
if ("AI Satellite Teleporter Room") sound = pick('ambiruntime.ogg','ambimalf.ogg')
- if ("Central Primary Hallway") sound = pick('ambiruntime.ogg')
- if ("Aft Primary Hallway") sound = pick('ambiruntime.ogg')
- if ("AI Upload Foyer") sound = pick('ambimalf.ogg', 'null.ogg', 'null.ogg')
- if ("AI Upload Chamber") sound = pick('ambimalf.ogg','null.ogg','null.ogg')
+ if ("Bar") sound = pick('title1.ogg')
+ if ("AI Upload Foyer") sound = pick('ambimalf.ogg', 'null.ogg')
+ if ("AI Upload Chamber") sound = pick('ambimalf.ogg','null.ogg')
if ("Mine")
sound = pick('ambimine.ogg')
musVolume = 25
else
- sound = pick('ambigen1.ogg','ambigen3.ogg','ambigen4.ogg','ambigen5.ogg','ambigen6.ogg','ambigen7.ogg','ambigen8.ogg','ambigen9.ogg','ambigen10.ogg','ambigen11.ogg','ambigen12.ogg','ambigen14.ogg')
+ sound = pick('ambiruntime.ogg','ambigen1.ogg','ambigen3.ogg','ambigen4.ogg','ambigen5.ogg','ambigen6.ogg','ambigen7.ogg','ambigen8.ogg','ambigen9.ogg','ambigen10.ogg','ambigen11.ogg','ambigen12.ogg','ambigen14.ogg')
if (prob(35))
diff --git a/code/game/turf.dm b/code/game/turf.dm
index 8446c1a4d1..e2d55d8104 100644
--- a/code/game/turf.dm
+++ b/code/game/turf.dm
@@ -33,6 +33,12 @@
..()
return 0
+/turf/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj ,/obj/item/projectile/bullet/gyro))
+ explosion(src, -1, 0, 2)
+ ..()
+ return 0
+
/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area)
if (!mover || !isturf(mover.loc))
return 1
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index 49b3873af6..1d12bd7c9c 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -1687,6 +1687,37 @@ datum
..()
return
+ condensedcapsaicin
+ name = "Condensed Capsaicin"
+ id = "condensedcapsaicin"
+ description = "This shit goes in pepperspray."
+ reagent_state = LIQUID
+ color = "#B31008" // rgb: 179, 16, 8
+
+ reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ if(!istype(M, /mob/living))
+ return
+ if(method == TOUCH)
+ if(istype(M, /mob/living/carbon/human))
+ if(M:wear_mask)
+
+ M << "\red Your mask protects you from the pepperspray!"
+ return
+ if(M:head)
+ M << "\red Your helmet protects you from the pepperspray!"
+ return
+ if(M:glasses)
+ M << "\red Your glasses protect you from most of the pepperspray!"
+ M:emote("scream")
+ M.eye_blurry = max(M.eye_blurry, 1)
+ return
+ M:emote("scream")
+ M << "\red You're sprayed directly in the eyes with pepperspray!"
+ M.eye_blurry = max(M.eye_blurry, 5)
+ M.eye_blind = max(M.eye_blind, 2)
+ M:paralysis = max(M:paralysis, 1)
+ M.drop_item()
+
frostoil
name = "Frost Oil"
id = "frostoil"
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 16f0fe07c7..036444e475 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -173,6 +173,7 @@
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
if (istype(target, /obj/item/weapon/storage)) return ..()
+ if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..()
if (!src.state && stage == 2 && !crit_fail)
user << "\red You prime the grenade! 3 seconds!"
message_admins("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
@@ -322,6 +323,105 @@
reagents = R
R.my_atom = src
+/obj/item/weapon/gun/grenadelauncher
+ name = "grenade launcher"
+ icon = 'gun.dmi'
+ icon_state = "riotgun"
+ item_state = "riotgun"
+ w_class = 4.0
+ throw_speed = 2
+ throw_range = 10
+ force = 5.0
+ var/list/grenades = new/list()
+ var/max_grenades = 3
+ m_amt = 2000
+
+ examine()
+ set src in view()
+ ..()
+ if (!(usr in view(2)) && usr!=src.loc) return
+ usr << "\icon [src] Grenade launcher:"
+ usr << "\blue [grenades] / [max_grenades] Grenades."
+
+ attackby(obj/item/I as obj, mob/user as mob)
+ if((istype(I, /obj/item/weapon/chem_grenade)) || (istype(I, /obj/item/weapon/flashbang)) || (istype(I, /obj/item/weapon/smokebomb)) || (istype(I, /obj/item/weapon/mustardbomb)) || (istype(I, /obj/item/weapon/empgrenade)))
+ if(grenades.len < max_grenades)
+ user.drop_item()
+ I.loc = src
+ grenades += I
+ user << "\blue You put the grenade in the grenade launcher."
+ user << "\blue [grenades.len] / [max_grenades] Grenades."
+ else
+ usr << "\red The grenade launcher cannot hold more grenades."
+
+ afterattack(obj/target, mob/user , flag)
+ if(target == user) return
+
+ if(grenades.len)
+ spawn(0) fire_grenade(target,user)
+ else
+ usr << "\red The grenade launcher is empty."
+
+ proc
+ fire_grenade(atom/target, mob/user)
+ if (locate (/obj/structure/table, src.loc))
+ return
+ else
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("\red [] fired a grenade!", user), 1)
+ user << "\red You fire the grenade launcher!"
+ if (istype(grenades[1], /obj/item/weapon/chem_grenade))
+ var/obj/item/weapon/chem_grenade/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ message_admins("[key_name_admin(user)] fired a chemistry grenade from a grenade launcher ([src.name]).")
+ log_game("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
+ F.state = 1
+ F.icon_state = initial(icon_state)+"_armed"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.explode()
+ else if (istype(grenades[1], /obj/item/weapon/flashbang))
+ var/obj/item/weapon/flashbang/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ F.active = 1
+ F.icon_state = "flashbang1"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
+ else if (istype(grenades[1], /obj/item/weapon/smokebomb))
+ var/obj/item/weapon/smokebomb/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ F.icon_state = "flashbang1"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
+ else if (istype(grenades[1], /obj/item/weapon/mustardbomb))
+ var/obj/item/weapon/mustardbomb/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ F.icon_state = "flashbang1"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
+ else if (istype(grenades[1], /obj/item/weapon/empgrenade))
+ var/obj/item/weapon/empgrenade/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ F.active = 1
+ F.icon_state = "empar"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
+
+
/obj/item/weapon/gun/syringe
name = "syringe gun"
icon = 'gun.dmi'
@@ -2633,6 +2733,18 @@
..()
reagents.add_reagent("fuel",1000)
+/obj/structure/reagent_dispensers/peppertank
+ name = "Pepper Spray Refiller"
+ desc = "Refill pepper spray canisters."
+ icon = 'objects.dmi'
+ icon_state = "peppertank"
+ anchored = 1
+ density = 0
+ amount_per_transfer_from_this = 45
+ New()
+ ..()
+ reagents.add_reagent("condensedcapsaicin",1000)
+
/obj/structure/reagent_dispensers/fueltank/blob_act()
explosion(src.loc,0,1,5,7,10)
if(src)
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index bb39895542..57c7c756e9 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -1,5 +1,5 @@
/obj/item/clothing/suit/armor
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
+ allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
flags = FPRINT | TABLEPASS
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 1dee25d94d..ff5ae0d818 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -254,6 +254,13 @@
else
on = 0
continue
+ if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_adamantine == 0)
+ if (ore_glass > 0)
+ ore_glass--;
+ new /obj/item/stack/sheet/rglass(output.loc)
+ else
+ on = 0
+ continue
if (selected_glass == 0 && selected_gold == 1 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_adamantine == 0)
if (ore_gold > 0)
ore_gold--;
@@ -296,10 +303,10 @@
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_adamantine == 0)
+ if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_adamantine == 0)
if (ore_iron > 0)
ore_iron--;
- new /obj/item/stack/sheet/metal(output.loc)
+ new /obj/item/stack/sheet/r_metal(output.loc)
else
on = 0
continue
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
new file mode 100644
index 0000000000..1fad304014
--- /dev/null
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -0,0 +1,18 @@
+/mob/living/carbon/alien/adjustToxLoss(amount)
+ storedPlasma = min(max(storedPlasma + amount,0),max_plasma) //upper limit of max_plasma, lower limit of 0
+ return
+
+/mob/living/carbon/alien/proc/getPlasma()
+ return storedPlasma
+
+/mob/living/carbon/alien/eyecheck()
+ return 2
+
+/mob/living/carbon/alien/New()
+ ..()
+
+ for(var/obj/item/clothing/mask/facehugger/facehugger in world)
+ if(facehugger.stat == CONSCIOUS)
+ var/image/activeIndicator = image('alien.dmi', loc = facehugger, icon_state = "facehugger_active")
+ activeIndicator.override = 1
+ client.images += activeIndicator
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index 81fa6ab7b3..f45a231b45 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -10,10 +10,10 @@ Doesn't work on other aliens/AI.*/
if(stat)
src << "\green You must be conscious to do this."
return 0
- else if(X&&getToxLoss() < X)
+ else if(X && getPlasma() < X)
src << "\green Not enough plasma stored."
return 0
- else if(Y&&(!isturf(src.loc) || istype(src.loc, /turf/space)))
+ else if(Y && (!isturf(src.loc) || istype(src.loc, /turf/space)))
src << "\green Bad place for a garden!"
return 0
else return 1
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 30579f5ff4..394206158c 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -72,7 +72,7 @@
stat(null, "Move Mode: [m_intent]")
if (client.statpanel == "Status")
- stat(null, "Plasma Stored: [getToxLoss()]")
+ stat(null, "Plasma Stored: [getPlasma()]")
///mob/living/carbon/alien/humanoid/bullet_act(var/obj/item/projectile/Proj) taken care of in living
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index 8aac91fec4..3695cac651 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -63,7 +63,7 @@
if (client.statpanel == "Status")
stat(null, "Progress: [amount_grown]/200")
- stat(null, "Plasma Stored: [getToxLoss()]")
+ stat(null, "Plasma Stored: [getPlasma()]")
///mob/living/carbon/alien/larva/bullet_act(var/obj/item/projectile/Proj) taken care of in living
diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm
index 277c0d2a01..63cad04442 100644
--- a/code/modules/mob/living/carbon/alien/say.dm
+++ b/code/modules/mob/living/carbon/alien/say.dm
@@ -1,6 +1,3 @@
-/mob/living/carbon/alien/eyecheck()
- return 2
-
/mob/living/carbon/alien/say_understands(var/other)
if (istype(other, /mob/living/carbon/alien))
return 1
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index f1988a6cad..13dbb7d3f0 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -219,8 +219,8 @@
if ((stat & BROKEN) || malfhack)
user.visible_message(\
"\red [user.name] has broken the power control board inside [src.name]!",\
- "You broke the charred power control board and remove remains.",
- "You hear crack")
+ "You broke the charred power control board and remove the remains.",
+ "You hear a crack!")
//ticker.mode:apcs-- //XSI said no and I agreed. -rastaf0
else
user.visible_message(\
@@ -274,7 +274,7 @@
return
updateicon()
else if(emagged || malfhack)
- user << "The interface is broken"
+ user << "The interface is broken."
else
wiresexposed = !wiresexposed
user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
@@ -315,7 +315,7 @@
user << "You fail to [ locked ? "unlock" : "lock"] the APC interface."
else if (istype(W, /obj/item/weapon/cable_coil) && !terminal && opened && has_electronics!=2)
if (src.loc:intact)
- user << "\red You must remove the floor plating first."
+ user << "\red You must remove the floor plating in front of the APC first."
return
var/obj/item/weapon/cable_coil/C = W
if(C.amount < 10)
@@ -339,7 +339,7 @@
terminal.connect_to_network()
else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2)
if (src.loc:intact)
- user << "\red You must remove the floor plating first."
+ user << "\red You must remove the floor plating in front of the APC first."
return
user << "You begin to cut cables..."
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
@@ -378,7 +378,7 @@
new /obj/item/stack/sheet/metal(loc)
user.visible_message(\
"\red [src] has been cut apart by [user.name] with the weldingtool.",\
- "You disassembled brocken APC frame.",\
+ "You disassembled the broken APC frame.",\
"\red You hear welding.")
else
new /obj/item/apc_frame(loc)
@@ -394,13 +394,13 @@
if (opened==2)
opened = 1
user.visible_message(\
- "\red [user.name] has replaced the damaged APC frontal panel with new one.",\
- "You replace the damaged APC frontal panel with new one.")
+ "\red [user.name] has replaced the damaged APC frontal panel with a new one.",\
+ "You replace the damaged APC frontal panel with a new one.")
del(W)
updateicon()
else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack))
if (has_electronics)
- user << "You cannot repair this heavy damaged APC until broken electronics stills inside."
+ user << "You cannot repair this APC until you remove the electronics still inside."
return
user << "You begin to replace the damaged APC frame..."
if(do_after(user, 50))
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 65af7edf66..e3177e7438 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -63,6 +63,7 @@
process()
charge_tick++
if(charge_tick < 4) return 0
+ charge_tick = 0
if(!power_supply) return 0
power_supply.give(100)
return 1
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 2d7da580fe..74d2e4ce73 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -34,12 +34,6 @@
damage = 20
-/obj/item/projectile/bullet/gyro
- name ="gyro"
- icon_state= "bolter"
- damage = 50
-
-
/obj/item/projectile/bullet/stunshot
name = "stunshot"
damage = 5
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 530dd7f0f7..052c237146 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -12,6 +12,18 @@
return 1
+/obj/item/projectile/bullet/gyro
+ name ="gyro"
+ icon_state= "bolter"
+ damage = 50
+ flag = "bullet"
+
+
+ on_hit(var/atom/target, var/blocked = 0)
+ explosion(target, -1, 0, 2)
+ return 1
+
+
/obj/item/projectile/temp
name = "freeze beam"
diff --git a/code/modules/security levels/security levels.dm b/code/modules/security levels/security levels.dm
new file mode 100644
index 0000000000..ee34115779
--- /dev/null
+++ b/code/modules/security levels/security levels.dm
@@ -0,0 +1,113 @@
+/var/security_level = 0
+//0 = code green
+//1 = code blue
+//2 = code red
+//3 = code delta
+
+/proc/set_security_level(var/level)
+ switch(level)
+ if("green")
+ level = SEC_LEVEL_GREEN
+ if("blue")
+ level = SEC_LEVEL_BLUE
+ if("red")
+ level = SEC_LEVEL_RED
+ if("delta")
+ level = SEC_LEVEL_DELTA
+
+ //Will not be announced if you try to set to the same level as it already is
+ if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level)
+ switch(level)
+ if(SEC_LEVEL_GREEN)
+ world << "Attention! security level lowered to green"
+ world << "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
+ security_level = SEC_LEVEL_GREEN
+ for(var/obj/machinery/firealarm/FA in world)
+ if(FA.z == 1)
+ FA.overlays = list()
+ FA.overlays += image('monitors.dmi', "overlay_green")
+ if(SEC_LEVEL_BLUE)
+ if(security_level < SEC_LEVEL_BLUE)
+ world << "Attention! security level elevated to blue"
+ world << "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted."
+ else
+ world << "Attention! security level lowered to blue"
+ world << "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed."
+ security_level = SEC_LEVEL_BLUE
+ for(var/obj/machinery/firealarm/FA in world)
+ if(FA.z == 1)
+ FA.overlays = list()
+ FA.overlays += image('monitors.dmi', "overlay_blue")
+ if(SEC_LEVEL_RED)
+ if(security_level < SEC_LEVEL_RED)
+ world << "Attention! Code red!"
+ world << "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised."
+ else
+ world << "Attention! Code red!"
+ world << "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised."
+ security_level = SEC_LEVEL_RED
+
+ /* - At the time of commit, setting status displays didn't work properly
+ var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world)
+ if(CC)
+ CC.post_status("alert", "redalert")*/
+
+ for(var/obj/machinery/firealarm/FA in world)
+ if(FA.z == 1)
+ FA.overlays = list()
+ FA.overlays += image('monitors.dmi', "overlay_red")
+ if(SEC_LEVEL_DELTA)
+ world << "Attention! Delta security level reached!"
+ world << "The ship's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
+ security_level = SEC_LEVEL_DELTA
+ for(var/obj/machinery/firealarm/FA in world)
+ if(FA.z == 1)
+ FA.overlays = list()
+ FA.overlays += image('monitors.dmi', "overlay_delta")
+ else
+ return
+
+/proc/get_security_level()
+ switch(security_level)
+ if(SEC_LEVEL_GREEN)
+ return "green"
+ if(SEC_LEVEL_BLUE)
+ return "blue"
+ if(SEC_LEVEL_RED)
+ return "red"
+ if(SEC_LEVEL_DELTA)
+ return "delta"
+
+/proc/num2seclevel(var/num)
+ switch(num)
+ if(SEC_LEVEL_GREEN)
+ return "green"
+ if(SEC_LEVEL_BLUE)
+ return "blue"
+ if(SEC_LEVEL_RED)
+ return "red"
+ if(SEC_LEVEL_DELTA)
+ return "delta"
+
+/proc/seclevel2num(var/seclevel)
+ switch( lowertext(seclevel) )
+ if("green")
+ return SEC_LEVEL_GREEN
+ if("blue")
+ return SEC_LEVEL_BLUE
+ if("red")
+ return SEC_LEVEL_RED
+ if("delta")
+ return SEC_LEVEL_DELTA
+
+
+/*DEBUG
+/mob/verb/set_thing0()
+ set_security_level(0)
+/mob/verb/set_thing1()
+ set_security_level(1)
+/mob/verb/set_thing2()
+ set_security_level(2)
+/mob/verb/set_thing3()
+ set_security_level(3)
+*/
\ No newline at end of file
diff --git a/code/setup.dm b/code/setup.dm
index e5156e5f46..3b276602e7 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -195,7 +195,11 @@ var/const
GAS_N2O = 1 << 4
-var/list/accessable_z_levels = list("1" = 10, "3" = 15, "4" = 60, "5" = 15) //This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there. (Exceptions: extended, sandbox and nuke) -Errorage
+var/list/accessable_z_levels = list("3" = 30, "4" = 70)
+//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there.
+//(Exceptions: extended, sandbox and nuke) -Errorage
+//Was list("1" = 10, "3" = 15, "4" = 60, "5" = 15); changed it to list("3" = 30, "4" = 70).
+//Spacing should be a reliable method of getting rid of a body -- Urist.
#define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE))))
@@ -221,3 +225,9 @@ var/list/global_mutations = list() // list of hidden mutation things
#define DROWSY "drowsy"
var/static/list/scarySounds = list('thudswoosh.ogg','Taser.ogg','armbomb.ogg','hiss1.ogg','hiss2.ogg','hiss3.ogg','hiss4.ogg','hiss5.ogg','hiss6.ogg','Glassbr1.ogg','Glassbr2.ogg','Glassbr3.ogg','Welder.ogg','Welder2.ogg','airlock.ogg','clownstep1.ogg','clownstep2.ogg')
+
+//Security levels
+#define SEC_LEVEL_GREEN 0
+#define SEC_LEVEL_BLUE 1
+#define SEC_LEVEL_RED 2
+#define SEC_LEVEL_DELTA 3
\ No newline at end of file
diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi
index 83d07fdcdc..d3de781e6c 100644
Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
index 7b50e12688..9f531da8f6 100644
Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ
diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi
index fafb296b63..386ce97659 100644
Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index feecdc5eaf..72c15c78e7 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index a451a7b7e3..6613b68e39 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index ad37113771..1371eb3bb0 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/icons/obj/monitors.dmi b/icons/obj/monitors.dmi
index 48d1fdeeac..69fa56f50f 100644
Binary files a/icons/obj/monitors.dmi and b/icons/obj/monitors.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 11d0c1c54b..8afb398fd4 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi
index 0862939d24..e77570de6a 100644
Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index c5b07d9864..73ba7d9fed 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 33ed78b1b8..11e4b73558 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -227,18 +227,18 @@ menu "menu"
group = "size"
is-disabled = false
saved-params = "is-checked"
- elem "icon32"
- name = "&32x32"
- command = ".winset \"mapwindow.map.icon-size=32\""
+ elem "icon64"
+ name = "&64x64 (2x)"
+ command = ".winset \"mapwindow.map.icon-size=64\""
category = "&Icons"
is-checked = false
can-check = true
group = "size"
is-disabled = false
saved-params = "is-checked"
- elem "icon16"
- name = "&16x16"
- command = ".winset \"mapwindow.map.icon-size=16\""
+ elem "icon32"
+ name = "&32x32"
+ command = ".winset \"mapwindow.map.icon-size=32\""
category = "&Icons"
is-checked = false
can-check = true
@@ -680,7 +680,7 @@ window "mainwindow"
elem "mainvsplit"
type = CHILD
pos = 3,0
- size = 634x400
+ size = 634x416
anchor1 = 0,0
anchor2 = 100,100
font-family = ""
@@ -1335,8 +1335,8 @@ window "vendingslot"
anchor1 = none
anchor2 = none
font-family = ""
- font-size = 14
- font-style = ""
+ font-size = 11
+ font-style = "bold"
text-color = #000000
background-color = none
is-visible = true
@@ -1348,12 +1348,12 @@ window "vendingslot"
right-click = false
saved-params = ""
on-size = ""
- text = "HoNK"
+ text = "Cuban Pete's Double Bearded Wine LOL LINES"
image = ""
image-mode = center
keep-aspect = false
align = center
- text-wrap = false
+ text-wrap = true
window "vendingwindow"
elem "vendingwindow"
diff --git a/sound/ambience/title1.ogg b/sound/ambience/title1.ogg
new file mode 100644
index 0000000000..9138683d14
Binary files /dev/null and b/sound/ambience/title1.ogg differ
diff --git a/sound/ambience/ambistat.ogg b/sound/ambience/title2.ogg
similarity index 100%
rename from sound/ambience/ambistat.ogg
rename to sound/ambience/title2.ogg
diff --git a/sound/ambience/traitor.ogg b/sound/ambience/traitor.ogg
deleted file mode 100644
index 383d1edbe4..0000000000
Binary files a/sound/ambience/traitor.ogg and /dev/null differ
diff --git a/sound/spells/brucebanner.ogg b/sound/spells/brucebanner.ogg
deleted file mode 100644
index e981ea28ca..0000000000
Binary files a/sound/spells/brucebanner.ogg and /dev/null differ
diff --git a/sound/spells/einath.ogg b/sound/spells/einath.ogg
deleted file mode 100644
index cfb9149efa..0000000000
Binary files a/sound/spells/einath.ogg and /dev/null differ
diff --git a/sound/spells/fortigyama.ogg b/sound/spells/fortigyama.ogg
deleted file mode 100644
index 74c470ab2e..0000000000
Binary files a/sound/spells/fortigyama.ogg and /dev/null differ
diff --git a/sound/spells/neccantio.ogg b/sound/spells/neccantio.ogg
deleted file mode 100644
index cf805cf462..0000000000
Binary files a/sound/spells/neccantio.ogg and /dev/null differ
diff --git a/sound/spells/onisoma.ogg b/sound/spells/onisoma.ogg
deleted file mode 100644
index e1bcf39419..0000000000
Binary files a/sound/spells/onisoma.ogg and /dev/null differ
diff --git a/sound/spells/scyarnila.ogg b/sound/spells/scyarnila.ogg
deleted file mode 100644
index cfdd0b5c60..0000000000
Binary files a/sound/spells/scyarnila.ogg and /dev/null differ
diff --git a/sound/spells/stikaly.ogg b/sound/spells/stikaly.ogg
deleted file mode 100644
index 7bb706e169..0000000000
Binary files a/sound/spells/stikaly.ogg and /dev/null differ
diff --git a/sound/spells/tarcolminti.ogg b/sound/spells/tarcolminti.ogg
deleted file mode 100644
index 4e1cc3f885..0000000000
Binary files a/sound/spells/tarcolminti.ogg and /dev/null differ
diff --git a/sound/voice/malf.ogg b/sound/voice/malf.ogg
deleted file mode 100644
index 86d6179e21..0000000000
Binary files a/sound/voice/malf.ogg and /dev/null differ