diff --git a/baystation12.dme b/baystation12.dme
index 5ff82050716..efd7852bf96 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -134,6 +134,13 @@
#define FILE_DIR "code/modules/projectiles/projectile"
#define FILE_DIR "code/modules/recycling"
#define FILE_DIR "code/modules/research"
+#define FILE_DIR "code/modules/scripting"
+#define FILE_DIR "code/modules/scripting/AST"
+#define FILE_DIR "code/modules/scripting/AST/Operators"
+#define FILE_DIR "code/modules/scripting/Implementations"
+#define FILE_DIR "code/modules/scripting/Interpreter"
+#define FILE_DIR "code/modules/scripting/Parser"
+#define FILE_DIR "code/modules/scripting/Scanner"
#define FILE_DIR "code/modules/security levels"
#define FILE_DIR "code/unused"
#define FILE_DIR "code/unused/beast"
@@ -163,6 +170,7 @@
#define FILE_DIR "code/WorkInProgress/Wrongnumber"
#define FILE_DIR "html"
#define FILE_DIR "icons"
+#define FILE_DIR "icons/48x48"
#define FILE_DIR "icons/effects"
#define FILE_DIR "icons/misc"
#define FILE_DIR "icons/mob"
@@ -493,6 +501,7 @@
#include "code\game\machinery\teleporter.dm"
#include "code\game\machinery\turrets.dm"
#include "code\game\machinery\vending.dm"
+#include "code\game\machinery\walllockers.dm"
#include "code\game\machinery\atmoalter\canister.dm"
#include "code\game\machinery\atmoalter\meter.dm"
#include "code\game\machinery\atmoalter\portable_atmospherics.dm"
@@ -520,7 +529,7 @@
#include "code\game\machinery\computer\id.dm"
#include "code\game\machinery\computer\lockdown.dm"
#include "code\game\machinery\computer\medical.dm"
-#include "code\game\machinery\computer\operating.dm"
+#include "code\game\machinery\computer\Operating.dm"
#include "code\game\machinery\computer\power.dm"
#include "code\game\machinery\computer\robot.dm"
#include "code\game\machinery\computer\security.dm"
@@ -549,6 +558,7 @@
#include "code\game\machinery\telecomms\machine_interactions.dm"
#include "code\game\machinery\telecomms\telecommunications.dm"
#include "code\game\machinery\telecomms\telemonitor.dm"
+#include "code\game\machinery\telecomms\traffic_control.dm"
#include "code\game\magic\archived_book.dm"
#include "code\game\magic\library.dm"
#include "code\game\magic\musician.dm"
@@ -702,6 +712,7 @@
#include "code\game\objects\items\weapons\implants\implantpad.dm"
#include "code\game\objects\radio\beacon.dm"
#include "code\game\objects\radio\electropack.dm"
+#include "code\game\objects\radio\encryptionkey.dm"
#include "code\game\objects\radio\headset.dm"
#include "code\game\objects\radio\intercom.dm"
#include "code\game\objects\radio\radio.dm"
@@ -729,7 +740,6 @@
#include "code\game\objects\tanks\oxygen.dm"
#include "code\game\player\news.dm"
#include "code\game\verbs\AI_status.dm"
-#include "code\game\verbs\checkkarma.dm"
#include "code\game\verbs\ooc.dm"
#include "code\game\verbs\sound.dm"
#include "code\game\verbs\suicide.dm"
@@ -744,6 +754,7 @@
#include "code\modules\admin\create_turf.dm"
#include "code\modules\admin\NewBan.dm"
#include "code\modules\admin\newbanjob.dm"
+#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\adminsay.dm"
@@ -956,6 +967,7 @@
#include "code\modules\mob\new_player\preferences.dm"
#include "code\modules\mob\new_player\preferences_setup.dm"
#include "code\modules\mob\new_player\savefile.dm"
+#include "code\modules\mob\new_player\skill.dm"
#include "code\modules\mob\new_player\sprite_accessories.dm"
#include "code\modules\mob\organ\organ.dm"
#include "code\modules\mob\organ\organ_external.dm"
@@ -1010,6 +1022,7 @@
#include "code\modules\projectiles\guns\projectile\shotgun.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
+#include "code\modules\projectiles\projectile\change.dm"
#include "code\modules\projectiles\projectile\energy.dm"
#include "code\modules\projectiles\projectile\special.dm"
#include "code\modules\recycling\conveyor2.dm"
@@ -1026,12 +1039,33 @@
#include "code\modules\research\rdmachines.dm"
#include "code\modules\research\research.dm"
#include "code\modules\research\server.dm"
+#include "code\modules\scripting\Errors.dm"
+#include "code\modules\scripting\IDE.dm"
+#include "code\modules\scripting\Options.dm"
+#include "code\modules\scripting\stack.dm"
+#include "code\modules\scripting\AST\AST Nodes.dm"
+#include "code\modules\scripting\AST\Blocks.dm"
+#include "code\modules\scripting\AST\Statements.dm"
+#include "code\modules\scripting\AST\Operators\Binary Operators.dm"
+#include "code\modules\scripting\AST\Operators\Unary Operators.dm"
+#include "code\modules\scripting\Implementations\_Logic.dm"
+#include "code\modules\scripting\Implementations\Telecomms.dm"
+#include "code\modules\scripting\Interpreter\Evaluation.dm"
+#include "code\modules\scripting\Interpreter\Interaction.dm"
+#include "code\modules\scripting\Interpreter\Interpreter.dm"
+#include "code\modules\scripting\Interpreter\Scope.dm"
+#include "code\modules\scripting\Parser\Expressions.dm"
+#include "code\modules\scripting\Parser\Keywords.dm"
+#include "code\modules\scripting\Parser\Parser.dm"
+#include "code\modules\scripting\Scanner\Scanner.dm"
+#include "code\modules\scripting\Scanner\Tokens.dm"
#include "code\modules\security levels\keycard authentication.dm"
#include "code\modules\security levels\security levels.dm"
#include "code\WorkInProgress\AI_Visibility.dm"
#include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\explosion_particles.dm"
#include "code\WorkInProgress\Cael_Aislinn\Tajara\examine.dm"
+#include "code\WorkInProgress\Cael_Aislinn\Tajara\tajara_transformation.dm"
#include "code\WorkInProgress\Cael_Aislinn\Tajara\tajaran.dm"
#include "code\WorkInProgress\mapload\dmm_suite.dm"
#include "code\WorkInProgress\mapload\reader.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm
index 7f89c66afe1..2c57d87e929 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm
@@ -16,8 +16,8 @@
t_him = "her"
if (src.w_uniform)
- if (src.w_uniform.blood_DNA)
- usr << "\red [src.name] is wearing a[src.w_uniform.blood_DNA ? " bloody " : " "] \icon[src.w_uniform] [src.w_uniform.name]!"
+ if (src.w_uniform.blood_DNA.len)
+ usr << "\red [src.name] is wearing a[src.w_uniform.blood_DNA.len ? " bloody " : " "] \icon[src.w_uniform] [src.w_uniform.name]!"
else
usr << "\blue [src.name] is wearing a \icon[src.w_uniform] [src.w_uniform.name]."
@@ -25,8 +25,8 @@
usr << "\blue [src.name] is \icon[src.handcuffed] handcuffed!"
if (src.wear_suit)
- if (src.wear_suit.blood_DNA)
- usr << "\red [src.name] has a[src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name] on!"
+ if (src.wear_suit.blood_DNA.len)
+ usr << "\red [src.name] has a[src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name] on!"
else
usr << "\blue [src.name] has a \icon[src.wear_suit] [src.wear_suit.name] on."
@@ -37,39 +37,39 @@
usr << "\blue [src.name] has a \icon[src.r_ear] [src.r_ear.name] on [t_his] right ear."
if (src.wear_mask)
- if (src.wear_mask.blood_DNA)
- usr << "\red [src.name] has a[src.wear_mask.blood_DNA ? " bloody " : " "] \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face!"
+ if (src.wear_mask.blood_DNA.len)
+ usr << "\red [src.name] has a[src.wear_mask.blood_DNA.len ? " bloody " : " "] \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face!"
else
usr << "\blue [src.name] has a \icon[src.wear_mask] [src.wear_mask.name] on [t_his] face."
if (src.l_hand)
- if (src.l_hand.blood_DNA)
- usr << "\red [src.name] has a[src.l_hand.blood_DNA ? " bloody " : " "] \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand!"
+ if (src.l_hand.blood_DNA.len)
+ usr << "\red [src.name] has a[src.l_hand.blood_DNA.len ? " bloody " : " "] \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand!"
else
usr << "\blue [src.name] has a \icon[src.l_hand] [src.l_hand.name] in [t_his] left hand."
if (src.r_hand)
- if (src.r_hand.blood_DNA)
- usr << "\red [src.name] has a[src.r_hand.blood_DNA ? " bloody " : " "] \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand!"
+ if (src.r_hand.blood_DNA.len)
+ usr << "\red [src.name] has a[src.r_hand.blood_DNA.len ? " bloody " : " "] \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand!"
else
usr << "\blue [src.name] has a \icon[src.r_hand] [src.r_hand.name] in [t_his] right hand."
if (src.belt)
- if (src.belt.blood_DNA)
- usr << "\red [src.name] has a[src.belt.blood_DNA ? " bloody " : " "] \icon[src.belt] [src.belt.name] on [t_his] belt!"
+ if (src.belt.blood_DNA.len)
+ usr << "\red [src.name] has a[src.belt.blood_DNA.len ? " bloody " : " "] \icon[src.belt] [src.belt.name] on [t_his] belt!"
else
usr << "\blue [src.name] has a \icon[src.belt] [src.belt.name] on [t_his] belt."
if(src.s_store)
- if(src.s_store.blood_DNA)
- usr << "\red [src.name] has a[src.s_store.blood_DNA ? " bloody " : " "] \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]!"
+ if(src.s_store.blood_DNA.len)
+ usr << "\red [src.name] has a[src.s_store.blood_DNA.len ? " bloody " : " "] \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]!"
else
- usr << "\blue [src.name] has a \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]."
+ usr << "\blue [src.name] has a \icon[src.s_store] [src.s_store.name] on [t_his][src.wear_suit.blood_DNA.len ? " bloody " : " "] \icon[src.wear_suit] [src.wear_suit.name]."
if (src.shoes)
- usr << "[src.shoes.blood_DNA ? "\red" : "\blue"][src.name] has a[src.shoes.blood_DNA ? " bloody " : " "] \icon[src.shoes] [src.shoes.name] on [t_his] feet."
+ usr << "[src.shoes.blood_DNA.len ? "\red" : "\blue"][src.name] has a[src.shoes.blood_DNA.len ? " bloody " : " "] \icon[src.shoes] [src.shoes.name] on [t_his] feet."
if (src.gloves)
- if (src.gloves.blood_DNA)
+ if (src.gloves.blood_DNA.len)
usr << "\red [src.name] has bloody \icon[src.gloves] [src.gloves.name] on [t_his] hands!"
else
usr << "\blue [src.name] has \icon[src.gloves] [src.gloves.name] on [t_his] hands."
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm
new file mode 100644
index 00000000000..62c1877b7da
--- /dev/null
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm
@@ -0,0 +1,55 @@
+/mob/living/carbon/human/proc/Tajaraize()
+ if (monkeyizing)
+ return
+ for(var/obj/item/W in src)
+ drop_from_slot(W)
+ update_clothing()
+ monkeyizing = 1
+ canmove = 0
+ icon = null
+ invisibility = 101
+ for(var/name in organs)
+ del(organs[name])
+
+ var/atom/movable/overlay/animation = new /atom/movable/overlay( loc )
+ animation.icon_state = "blank"
+ animation.icon = 'mob.dmi'
+ animation.master = src
+ flick("h2monkey", animation)
+ sleep(48)
+ //animation = null
+ var/mob/living/carbon/human/tajaran/O = new /mob/living/carbon/human/tajaran( loc )
+ del(animation)
+
+ O.real_name = real_name
+ O.name = name
+ O.dna = dna
+ updateappearance(O,O.dna.uni_identity)
+ O.loc = loc
+ O.viruses = viruses
+ viruses = list()
+ for(var/datum/disease/D in O.viruses)
+ D.affected_mob = O
+ O.flavor_text = flavor_text
+
+ if (client)
+ client.mob = O
+ if(mind)
+ mind.transfer_to(O)
+
+ O << "You are now a Tajara."
+ spawn(0)//To prevent the proc from returning null.
+ del(src)
+ return
+
+/client/proc/make_tajaran(mob/living/carbon/human/H as mob)
+ set category = "Fun"
+ set name = "Make Tajaran"
+ set desc = "Make (mob) into a tajaran."
+
+ if (!holder)
+ src << "Only administrators may use this command."
+ return
+
+ if(istype(H))
+ H:Tajaraize()
\ No newline at end of file
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
index 0281c6a923c..b07f634aa9d 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
@@ -10,31 +10,6 @@
/mob/living/carbon/human/tajaran/New()
tajspeak_letters = new/list("~","*","-")
- var/datum/reagents/R = new/datum/reagents(1000)
- reagents = R
- R.my_atom = src
-
- if(!dna) dna = new /datum/dna(null)
-
- new /datum/organ/external/chest(src)
- new /datum/organ/external/groin(src)
- new /datum/organ/external/head(src)
- new /datum/organ/external/l_arm(src)
- new /datum/organ/external/r_arm(src)
- new /datum/organ/external/r_leg(src)
- new /datum/organ/external/l_leg(src)
-
- var/datum/organ/external/part = new /datum/organ/external/l_hand(src)
- part.parent = organs["l_arm"]
- part = new /datum/organ/external/l_foot(src)
- part.parent = organs["l_leg"]
- part = new /datum/organ/external/r_hand(src)
- part.parent = organs["r_arm"]
- part = new /datum/organ/external/r_foot(src)
- part.parent = organs["r_leg"]
-
- debug_leftarm = organs["l_arm"]
- debug_lefthand = organs["l_hand"]
var/g = "m"
if (gender == FEMALE)
@@ -475,6 +450,8 @@
last_b_state = stat
/mob/living/carbon/human/tajaran/update_body()
+ return
+
if(stand_icon)
del(stand_icon)
if(lying_icon)
@@ -557,7 +534,7 @@
del(face_lying)
return
- if(!facial_hair_style || !hair_style) return//Seems people like to lose their icons, this should stop the runtimes for now
+ //if(!facial_hair_style || !hair_style) return//Seems people like to lose their icons, this should stop the runtimes for now
del(face_standing)
del(face_lying)
@@ -575,31 +552,31 @@
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
- var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
- var/icon/hair_l = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l")
- hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
- hair_l.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
+ //var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
+ //var/icon/hair_l = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l")
+ //hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
+ //hair_l.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
- var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- var/icon/facial_l = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l")
- facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
- facial_l.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
+ //var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
+ //var/icon/facial_l = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l")
+ //facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
+ //facial_l.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
var/icon/mouth_s = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "mouth_[g]_s")
var/icon/mouth_l = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "mouth_[g]_l")
// if the head or mask has the flag BLOCKHAIR (equal to 5), then do not apply hair
- if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR)))
- eyes_s.Blend(hair_s, ICON_OVERLAY)
- eyes_l.Blend(hair_l, ICON_OVERLAY)
+ //if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ //eyes_s.Blend(hair_s, ICON_OVERLAY)
+ //eyes_l.Blend(hair_l, ICON_OVERLAY)
eyes_s.Blend(mouth_s, ICON_OVERLAY)
eyes_l.Blend(mouth_l, ICON_OVERLAY)
// if BLOCKHAIR, do not apply facial hair
- if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR)))
- eyes_s.Blend(facial_s, ICON_OVERLAY)
- eyes_l.Blend(facial_l, ICON_OVERLAY)
+ //if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ //eyes_s.Blend(facial_s, ICON_OVERLAY)
+ //eyes_l.Blend(facial_l, ICON_OVERLAY)
face_standing = new /image()
@@ -611,10 +588,10 @@
del(mouth_l)
del(mouth_s)
- del(facial_l)
- del(facial_s)
- del(hair_l)
- del(hair_s)
+ //del(facial_l)
+ //del(facial_s)
+ //del(hair_l)
+ //del(hair_s)
del(eyes_l)
del(eyes_s)
diff --git a/code/WorkInProgress/SkyMarshal/wardrobes.dm b/code/WorkInProgress/SkyMarshal/wardrobes.dm
index b9658601246..94993b7eab2 100755
--- a/code/WorkInProgress/SkyMarshal/wardrobes.dm
+++ b/code/WorkInProgress/SkyMarshal/wardrobes.dm
@@ -1,5 +1,5 @@
/obj/item/wardrobe
- name = "wardrobe"
+ name = "\improper Wardrobe"
desc = "A standard-issue bag for clothing and equipment. Usually comes sealed, stocked with everything you need for a particular job."
icon = 'suits.dmi'
icon_state = "wardrobe_sealed"
@@ -22,7 +22,7 @@
return
attackby(var/obj/item/I as obj, var/mob/user as mob)
- if(istype(I, /obj/item/wardrobe))
+ if(istype(I, /obj/item/wardrobe) || istype(I, /obj/item/weapon/evidencebag))
return
if(contents.len < 20)
if(istype(I, /obj/item/weapon/grab))
@@ -37,14 +37,38 @@
user << "\red There's not enough space to fit that!"
return
- examine()
- set src in usr
- ..()
- usr << "It claims to contain [contents.len ? descriptor : descriptor + "... but it looks empty"]."
- if(seal_torn && !contents.len)
- usr << "The seal on the bag is broken."
+ afterattack(atom/A as obj|turf, mob/user as mob)
+ if(A in user)
+ return
+ if(!istype(A.loc,/turf))
+ user << "It's got to be on the ground to do that!"
+ return
+ var/could_fill = 1
+ for (var/obj/O in locate(A.x,A.y,A.z))
+ if (contents.len < 20)
+ if(istype(O,/obj/item/wardrobe))
+ continue
+ if(O.anchored || O.density || istype(O,/obj/structure))
+ continue
+ contents += O;
+ else
+ could_fill = 0
+ break
+ if(could_fill)
+ user << "\blue You pick up all the items."
else
- usr << "The seal on the bag is[seal_torn ? ", however, not intact" : " intact"]."
+ user << "\blue You try to pick up all of the items, but run out of space in the bag."
+ user.visible_message("\blue [user] gathers up[could_fill ? " " : " most of "]the pile of items and puts it into [src].")
+ update_icon()
+
+ examine()
+ ..()
+ if(src in usr)
+ usr << "It claims to contain [contents.len ? descriptor : descriptor + "... but it looks empty"]."
+ if(seal_torn && !contents.len)
+ usr << "The seal on the bag is broken."
+ else
+ usr << "The seal on the bag is[seal_torn ? ", however, not intact" : " intact"]."
return
update_icon()
@@ -60,7 +84,7 @@
pixel_y = rand(0,4) -2
/obj/item/wardrobe/assistant
- name = "assistant wardrobe"
+ name = "\improper Assistant Wardrobe"
descriptor = "clothing and basic equipment for an assistant"
New()
@@ -74,7 +98,7 @@
new /obj/item/clothing/under/color/grey(src)
/obj/item/wardrobe/chief_engineer
- name = "Chief Engineer wardrobe"
+ name = "\improper Chief Engineer Wardrobe"
descriptor = "clothing and basic equipment for a Chief Engineer"
New()
@@ -98,7 +122,7 @@
new /obj/item/clothing/under/rank/chief_engineer(src)
/obj/item/wardrobe/engineer
- name = "Station Engineer wardrobe"
+ name = "\improper Station Engineer Wardrobe"
descriptor = "clothing and basic equipment for a Station Engineer"
New()
@@ -119,7 +143,7 @@
new /obj/item/clothing/under/rank/engineer(src)
/obj/item/wardrobe/atmos
- name = "Atmospheric Technician wardrobe"
+ name = "\improper Atmospheric Technician Wardrobe"
descriptor = "clothing and basic equipment for an Atmospheric Technician"
New()
@@ -134,7 +158,7 @@
new /obj/item/clothing/under/rank/atmospheric_technician(src)
/obj/item/wardrobe/roboticist
- name = "Roboticist wardrobe"
+ name = "\improper Roboticist Wardrobe"
descriptor = "clothing and basic equipment for a Roboticist"
New()
@@ -151,7 +175,7 @@
new /obj/item/clothing/under/rank/roboticist(src)
/obj/item/wardrobe/chaplain
- name = "Chaplain wardrobe"
+ name = "\improper Chaplain Wardrobe"
descriptor = "clothing and basic equipment for a Chaplain"
New()
@@ -166,7 +190,7 @@
new /obj/item/clothing/under/rank/chaplain(src)
/obj/item/wardrobe/captain
- name = "Captain wardrobe"
+ name = "\improper Captain Wardrobe"
descriptor = "clothing and basic equipment for a Captain"
New()
@@ -189,7 +213,7 @@
new /obj/item/clothing/under/rank/captain(src)
/obj/item/wardrobe/hop
- name = "Head of Personnel wardrobe"
+ name = "\improper Head of Personnel Wardrobe"
descriptor = "clothing and basic equipment for a Head of Personnel"
New()
@@ -210,7 +234,7 @@
new /obj/item/clothing/under/rank/head_of_personnel(src)
/obj/item/wardrobe/cmo
- name = "Chief Medical Officer wardrobe"
+ name = "\improper Chief Medical Officer Wardrobe"
descriptor = "clothing and basic equipment for a Chief Medical Officer"
New()
@@ -230,7 +254,7 @@
new /obj/item/clothing/under/rank/chief_medical_officer(src)
/obj/item/wardrobe/doctor
- name = "Medical Doctor wardrobe"
+ name = "\improper Medical Doctor Wardrobe"
descriptor = "clothing and basic equipment for a Medical Doctor"
New()
@@ -250,7 +274,7 @@
new /obj/item/clothing/under/rank/medical(src)
/obj/item/wardrobe/geneticist
- name = "Geneticist wardrobe"
+ name = "\improper Geneticist Wardrobe"
descriptor = "clothing and basic equipment for a Geneticist"
New()
@@ -266,7 +290,7 @@
new /obj/item/clothing/under/rank/geneticist(src)
/obj/item/wardrobe/virologist
- name = "Virologist wardrobe"
+ name = "\improper Virologist Wardrobe"
descriptor = "clothing and basic equipment for a Virologist"
New()
@@ -283,7 +307,7 @@
new /obj/item/clothing/under/rank/medical(src)
/obj/item/wardrobe/rd
- name = "Research Director wardrobe"
+ name = "\improper Research Director Wardrobe"
descriptor = "clothing and basic equipment for a Research Director"
New()
@@ -304,7 +328,7 @@
new /obj/item/clothing/under/rank/research_director(src)
/obj/item/wardrobe/scientist
- name = "Scientist wardrobe"
+ name = "\improper Scientist Wardrobe"
descriptor = "clothing and basic equipment for a Scientist"
New()
@@ -321,7 +345,7 @@
new /obj/item/clothing/under/rank/scientist(src)
/obj/item/wardrobe/chemist
- name = "Chemist wardrobe"
+ name = "\improper Chemist Wardrobe"
descriptor = "clothing and basic equipment for a Chemist"
New()
@@ -336,7 +360,7 @@
new /obj/item/clothing/suit/storage/labcoat/chemist(src)
/obj/item/wardrobe/hos
- name = "Head of Security wardrobe"
+ name = "\improper Head of Security Wardrobe"
descriptor = "clothing and basic equipment for a Head of Security"
New()
@@ -359,7 +383,7 @@
new /obj/item/clothing/under/rank/head_of_security(src)
/obj/item/wardrobe/warden
- name = "Warden wardrobe"
+ name = "\improper Warden Wardrobe"
descriptor = "clothing and basic equipment for a Warden"
New()
@@ -382,7 +406,7 @@
new /obj/item/clothing/under/rank/warden(src)
/obj/item/wardrobe/detective
- name = "Detective wardrobe"
+ name = "\improper Detective Wardrobe"
descriptor = "clothing and basic equipment for a Detective"
New()
@@ -391,6 +415,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/device/detective_scanner(src)
new /obj/item/policetaperoll(src)
new /obj/item/weapon/storage/box/evidence(src)
@@ -404,7 +429,7 @@
new /obj/item/clothing/under/det(src)
/obj/item/wardrobe/officer
- name = "Security Officer wardrobe"
+ name = "\improper Security Officer Wardrobe"
descriptor = "clothing and basic equipment for a Security Officer"
New()
@@ -432,7 +457,7 @@
/obj/item/wardrobe/bartender
- name = "Bartender wardrobe"
+ name = "\improper Bartender Wardrobe"
descriptor = "clothing and basic equipment for a Bartender"
New()
@@ -450,7 +475,7 @@
new /obj/item/clothing/under/rank/bartender(src)
/obj/item/wardrobe/chef
- name = "Chef wardrobe"
+ name = "\improper Chef Wardrobe"
descriptor = "clothing and basic equipment for a Chef"
New()
@@ -465,7 +490,7 @@
new /obj/item/clothing/under/rank/chef(src)
/obj/item/wardrobe/hydro
- name = "Botanist wardrobe"
+ name = "\improper Botanist Wardrobe"
descriptor = "clothing and basic equipment for a Botanist"
New()
@@ -481,7 +506,7 @@
new /obj/item/clothing/under/rank/hydroponics(src)
/obj/item/wardrobe/qm
- name = "Quartermaster wardrobe"
+ name = "\improper Quartermaster Wardrobe"
descriptor = "clothing and basic equipment for a Quartermaster"
New()
@@ -497,7 +522,7 @@
new /obj/item/clothing/under/rank/cargo(src)
/obj/item/wardrobe/cargo_tech
- name = "Cargo Technician wardrobe"
+ name = "\improper Cargo Technician Wardrobe"
descriptor = "clothing and basic equipment for a Cargo Technician"
New()
@@ -511,7 +536,7 @@
new /obj/item/clothing/under/rank/cargo(src)
/obj/item/wardrobe/mining
- name = "Shaft Miner wardrobe"
+ name = "\improper Shaft Miner Wardrobe"
descriptor = "clothing and basic equipment for a Shaft Miner"
New()
@@ -531,7 +556,7 @@
new /obj/item/clothing/under/rank/miner(src)
/obj/item/wardrobe/janitor
- name = "Janitor wardrobe"
+ name = "\improper Janitor Wardrobe"
descriptor = "clothing and basic equipment for a Janitor"
New()
@@ -544,7 +569,7 @@
new /obj/item/clothing/under/rank/janitor(src)
/obj/item/wardrobe/librarian
- name = "Librarian wardrobe"
+ name = "\improper Librarian Wardrobe"
descriptor = "clothing and basic equipment for a Librarian"
New()
@@ -557,7 +582,7 @@
new /obj/item/clothing/under/suit_jacket/red(src)
/obj/item/wardrobe/lawyer
- name = "Lawyer wardrobe"
+ name = "\improper Lawyer Wardrobe"
descriptor = "clothing and basic equipment for a Lawyer"
New()
diff --git a/code/WorkInProgress/Tastyfish/livestock.dm b/code/WorkInProgress/Tastyfish/livestock.dm
index f13e5b52918..a88c4f50e9d 100644
--- a/code/WorkInProgress/Tastyfish/livestock.dm
+++ b/code/WorkInProgress/Tastyfish/livestock.dm
@@ -103,7 +103,7 @@
// Cow
/mob/living/simple_animal/livestock/cow
- name = "cow"
+ name = "\improper Cow"
icon_state = "cow"
icon_living = "cow"
icon_dead = "cow_d"
@@ -137,7 +137,7 @@
// Chicken
/mob/living/simple_animal/livestock/chicken
- name = "chicken"
+ name = "\improper Chicken"
icon_state = "chick"
icon_living = "chick"
icon_dead = "chick_d"
@@ -163,7 +163,7 @@
desc = "Tasty!"
/obj/structure/closet/critter
- desc = "A critter crate."
+ desc = "\improper Critter crate."
name = "Critter Crate"
icon = 'storage.dmi'
icon_state = "critter"
@@ -172,7 +172,7 @@
icon_closed = "critter"
/datum/supply_packs/chicken
- name = "Chicken crate"
+ name = "\improper Chicken crate"
contains = list("/mob/living/simple_animal/livestock/chicken",
"/obj/item/weapon/reagent_containers/food/snacks/grown/corn")
cost = 10
@@ -181,7 +181,7 @@
group = "Hydroponics"
/datum/supply_packs/cow
- name = "Cow crate"
+ name = "\improper Cow crate"
contains = list("/mob/living/simple_animal/livestock/cow",
"/obj/item/weapon/reagent_containers/food/snacks/grown/corn")
cost = 50
diff --git a/code/WorkInProgress/Wrongnumber/weldbackpack.dm b/code/WorkInProgress/Wrongnumber/weldbackpack.dm
index 0490ea6109a..d59708f9dfc 100644
--- a/code/WorkInProgress/Wrongnumber/weldbackpack.dm
+++ b/code/WorkInProgress/Wrongnumber/weldbackpack.dm
@@ -2,6 +2,7 @@
name = "Welding kit"
desc = "A heavy-duty, portable welding fluid carrier."
flags = ONBACK
+ icon = 'storage.dmi'
icon_state = "engiepack"
w_class = 4.0
var/max_fuel = 350
diff --git a/code/WorkInProgress/virus2/base.dm b/code/WorkInProgress/virus2/base.dm
index d5520802310..e66a8828f09 100644
--- a/code/WorkInProgress/virus2/base.dm
+++ b/code/WorkInProgress/virus2/base.dm
@@ -427,12 +427,6 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
mob.toxloss += 15
-/*/datum/disease2/effect/greater/hallucinations
- name = "Hallucinational Syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.hallucination += 25*/
-
/datum/disease2/effect/greater/sleepy
name = "Resting syndrome"
stage = 3
@@ -514,12 +508,6 @@ proc/airborne_can_reach(turf/source, turf/target)
var/obj/effect/decal/cleanable/mucus/this = new(mob.loc)
this.virus2 = mob.virus2
-/*/datum/disease2/effect/lesser/hallucinations
- name = "Hallucinational Syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.hallucination += 5*/
-
/*/datum/disease2/effect/lesser/arm
name = "Disarming Syndrome"
stage = 4
diff --git a/code/WorkInProgress/virus2/diseasesplicer.dm b/code/WorkInProgress/virus2/diseasesplicer.dm
index 5fae22e7335..5a558546e44 100644
--- a/code/WorkInProgress/virus2/diseasesplicer.dm
+++ b/code/WorkInProgress/virus2/diseasesplicer.dm
@@ -158,11 +158,12 @@
dish = null
else if(href_list["splice"])
- for(var/datum/disease2/effectholder/e in dish.virus2.effects)
- if(e.stage == memorybank.stage)
- e.effect = memorybank.effect
- splicing = 10
- dish.virus2.spreadtype = "Blood"
+ if(dish)
+ for(var/datum/disease2/effectholder/e in dish.virus2.effects)
+ if(e.stage == memorybank.stage)
+ e.effect = memorybank.effect
+ splicing = 10
+ dish.virus2.spreadtype = "Blood"
else if(href_list["disk"])
burning = 10
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 39967ecd5ca..c37cd040c0e 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -3,6 +3,10 @@
new /datum/teleport/instant/science(arglist(args))
return
+/proc/do_teleport_stealth(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
+ new /datum/teleport/instant(arglist(args))
+ return
+
/datum/teleport
var/atom/movable/teleatom //atom to teleport
var/atom/destination //destination to teleport to
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 5457a2832c3..afd7e566b97 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -560,7 +560,7 @@ datum/mind
if(!(src in ticker.mode.wizards))
ticker.mode.wizards += src
special_role = "Wizard"
- ticker.mode.learn_basic_spells(current)
+ //ticker.mode.learn_basic_spells(current)
current << "\red You are the Space Wizard!"
if("lair")
current.loc = pick(wizardstart)
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 03a334e7e9b..75403bef9df 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -10,9 +10,15 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
opacity = 0
var/school = "evocation" //not relevant at now, but may be important later if there are changes to how spells work. the ones I used for now will probably be changed... maybe spell presets? lacking flexibility but with some other benefit?
- var/charge_type = "recharge" //can be recharge or charges, see charge_max and charge_counter descriptions
+
+ var/charge_type = "recharge" //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that
+
var/charge_max = 100 //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges"
var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = "recharge" or -- each cast if charge_type = "charges"
+
+ var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var"
+ var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used
+
var/clothes_req = 1 //see if it requires clothes
var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells
var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell
@@ -71,6 +77,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
charge_counter = 0 //doesn't start recharging until the targets selecting ends
if("charges")
charge_counter-- //returns the charge if the targets selecting fails
+ if("holdervar")
+ adjust_var(user, holder_var_type, holder_var_amount)
return 1
@@ -164,15 +172,36 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell/proc/critfail(list/targets)
return
-/obj/effect/proc_holder/spell/proc/revert_cast() //resets recharge or readds a charge
+/obj/effect/proc_holder/spell/proc/revert_cast(mob/user = usr) //resets recharge or readds a charge
switch(charge_type)
if("recharge")
charge_counter = charge_max
if("charges")
charge_counter++
+ if("holdervar")
+ adjust_var(user, holder_var_type, -holder_var_amount)
return
+/obj/effect/proc_holder/spell/proc/adjust_var(mob/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types
+ switch(type)
+ if("bruteloss")
+ target.adjustBruteLoss(amount)
+ if("fireloss")
+ target.adjustFireLoss(amount)
+ if("toxloss")
+ target.adjustToxLoss(amount)
+ if("oxyloss")
+ target.adjustOxyLoss(amount)
+ if("stunned")
+ target.AdjustStunned(amount)
+ if("weakened")
+ target.AdjustWeakened(amount)
+ if("paralysis")
+ target.AdjustParalysis(amount)
+ else
+ target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existant vars
+ return
/obj/effect/proc_holder/spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob
var/max_targets = 1 //leave 0 for unlimited targets in range, 1 for one selectable target in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range
@@ -185,65 +214,37 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell/targeted/choose_targets(mob/user = usr)
var/list/targets = list()
- switch(selection_type)
- if("range")
- switch(max_targets)
- if(0)
- for(var/mob/target in range(user,range))
- targets += target
- if(1)
- if(range < 0)
- targets += user
- else
- var/possible_targets = range(user,range)
- if(!include_user && user in possible_targets)
- possible_targets -= user
- targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets
+ switch(max_targets)
+ if(0) //unlimited
+ for(var/mob/target in view_or_range(range, user, selection_type))
+ targets += target
+ if(1) //single target can be picked
+ if(range < 0)
+ targets += user
+ else
+ var/possible_targets = view_or_range(range, user, selection_type)
+ if(!include_user && user in possible_targets)
+ possible_targets -= user
+ targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets
+ else
+ var/list/possible_targets = list()
+ for(var/mob/target in view_or_range(range, user, selection_type))
+ possible_targets += target
+ for(var/i=1,i<=max_targets,i++)
+ if(!possible_targets.len)
+ break
+ if(target_ignore_prev)
+ var/target = pick(possible_targets)
+ possible_targets -= target
+ targets += target
else
- var/list/possible_targets = list()
- for(var/mob/target in range(user,range))
- possible_targets += target
- for(var/i=1,i<=max_targets,i++)
- if(!possible_targets.len)
- break
- if(target_ignore_prev)
- var/target = pick(possible_targets)
- possible_targets -= target
- targets += target
- else
- targets += pick(possible_targets)
- if("view")
- switch(max_targets)
- if(0)
- for(var/mob/target in view(user,range))
- targets += target
- if(1)
- if(range < 0)
- targets += user
- else
- var/possible_targets = view(user,range)
- if(!include_user && user in possible_targets)
- possible_targets -= user
- targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets
- else
- var/list/possible_targets = list()
- for(var/mob/target in view(usr,range))
- possible_targets += target
- for(var/i=1,i<=max_targets,i++)
- if(!possible_targets.len)
- break
- if(target_ignore_prev)
- var/target = pick(possible_targets)
- possible_targets -= target
- targets += target
- else
- targets += pick(possible_targets)
+ targets += pick(possible_targets)
if(!include_user && (user in targets))
targets -= user
if(!targets.len) //doesn't waste the spell
- revert_cast()
+ revert_cast(user)
return
perform(targets)
@@ -253,15 +254,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell/aoe_turf/choose_targets(mob/user = usr)
var/list/targets = list()
- switch(selection_type)
- if("range")
- for(var/turf/target in range(user,range))
- if(!(target in range(user,inner_radius)))
- targets += target
- if("view")
- for(var/turf/target in view(user,range))
- if(!(target in view(user,inner_radius)))
- targets += target
+ for(var/turf/target in view_or_range(range,user,selection_type))
+ if(!(target in view_or_range(inner_radius,user,selection_type)))
+ targets += target
if(!targets.len) //doesn't waste the spell
revert_cast()
diff --git a/code/defines/area/Space Station 13 areas.dm b/code/defines/area/Space Station 13 areas.dm
index 2a10f1d8e86..aea01c734c4 100755
--- a/code/defines/area/Space Station 13 areas.dm
+++ b/code/defines/area/Space Station 13 areas.dm
@@ -33,6 +33,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
var/eject = null
var/requires_power = 1
+ var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
var/power_equip = 1
var/power_light = 1
var/power_environ = 1
diff --git a/code/defines/client.dm b/code/defines/client.dm
index d246ad89521..177ae1dcdd5 100644
--- a/code/defines/client.dm
+++ b/code/defines/client.dm
@@ -27,8 +27,6 @@
var/played = 0
var/team = null
var/warned = 0
- var/karma = 0
- var/karma_spent = 0
var/STFU_ghosts //80+ people rounds are fun to admin when text flies faster than airport security
var/STFU_radio //80+ people rounds are fun to admin when text flies faster than airport security
diff --git a/code/defines/mob/living/living.dm b/code/defines/mob/living/living.dm
index d4709674483..3badf77ed34 100644
--- a/code/defines/mob/living/living.dm
+++ b/code/defines/mob/living/living.dm
@@ -4,4 +4,4 @@
var/t_sl_gas = null
var/t_n2 = null
var/now_pushing = null
- var/cameraFollow = null
+ var/cameraFollow = null
\ No newline at end of file
diff --git a/code/defines/mob/mob.dm b/code/defines/mob/mob.dm
index d498b149e23..6bc1b6de22d 100644
--- a/code/defines/mob/mob.dm
+++ b/code/defines/mob/mob.dm
@@ -254,6 +254,9 @@ the mob is also allowed to move without any sort of restriction. For instance, i
var/hallucination = 0
//Singularity wants you!
var/grav_delay = 0
+ var/being_strangled = 0
+
+ var/original_name = null //Original name is only used in ghost chat! It is not to be edited by anything!
/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1)
// world << "Contract_disease called by [src] with virus [virus]"
diff --git a/code/defines/mob/simple_animal/corgi.dm b/code/defines/mob/simple_animal/corgi.dm
index 9ede05f0a7d..f86729daec0 100644
--- a/code/defines/mob/simple_animal/corgi.dm
+++ b/code/defines/mob/simple_animal/corgi.dm
@@ -7,9 +7,9 @@
icon_state = "corgi"
icon_living = "corgi"
icon_dead = "corgi_dead"
- speak = list("YAP","Woof!","Bark!","AUUUUUU")
+ speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
speak_emote = list("barks", "woofs")
- emote_hear = list("barks","woofs","yaps")
+ emote_hear = list("barks", "woofs", "yaps","pants")
emote_see = list("shakes it's head", "shivers")
speak_chance = 1
turns_per_move = 5
@@ -20,6 +20,7 @@
response_harm = "kicks the"
var/obj/item/inventory_head
var/obj/item/inventory_back
+ var/obj/item/inventory_mouth
/mob/living/simple_animal/corgi/update_clothing()
overlays = list()
@@ -92,21 +93,25 @@
switch(remove_from)
if("head")
if(inventory_head)
-
- if(inventory_head.type == /obj/item/clothing/head/caphat)
- name = real_name
-
+ name = real_name
+ desc = initial(desc)
+ speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
+ speak_emote = list("barks", "woofs")
+ emote_hear = list("barks", "woofs", "yaps","pants")
+ emote_see = list("shakes it's head", "shivers")
+ desc = "It's a corgi."
+ src.sd_SetLuminosity(0)
inventory_head.loc = src.loc
inventory_head = null
else
- usr << "\red There is nothing on this slot."
+ usr << "\red There is nothing on its [remove_from]."
return
if("back")
if(inventory_back)
inventory_back.loc = src.loc
inventory_back = null
else
- usr << "\red There is nothing on this slot."
+ usr << "\red There is nothing on its [remove_from]."
return
show_inv(usr)
@@ -131,16 +136,42 @@
//Corgis are supposed to be simpler, so only a select few objects can actually be put
//to be compatible with them. The objects are below.
+ //Many hats added, Some will probably be removed, just want to see which ones are popular.
var/list/allowed_types = list(
/obj/item/clothing/head/helmet,
/obj/item/clothing/glasses/sunglasses,
/obj/item/clothing/head/caphat,
- /obj/item/clothing/head/that
+ /obj/item/clothing/head/collectable/captain,
+ /obj/item/clothing/head/that,
+ /obj/item/clothing/head/helmet/that,
+ /obj/item/clothing/head/kitty,
+ /obj/item/clothing/head/collectable/kitty,
+ /obj/item/clothing/head/rabbitears,
+ /obj/item/clothing/head/collectable/rabbitears,
+ /obj/item/clothing/head/beret,
+ /obj/item/clothing/head/collectable/beret,
+ /obj/item/clothing/head/det_hat,
+ /obj/item/clothing/head/nursehat,
+ /obj/item/clothing/head/pirate,
+ /obj/item/clothing/head/collectable/pirate,
+ /obj/item/clothing/head/ushanka,
+ /obj/item/clothing/head/chefhat,
+ /obj/item/clothing/head/collectable/chef,
+ /obj/item/clothing/head/collectable/police,
+ /obj/item/clothing/head/wizard/fake,
+ /obj/item/clothing/head/wizard,
+ /obj/item/clothing/head/collectable/wizard,
+ /obj/item/clothing/head/helmet/hardhat,
+ /obj/item/clothing/head/collectable/hardhat,
+ /obj/item/clothing/head/helmet/hardhat/white,
+ /obj/item/weapon/bedsheet,
+ /obj/item/clothing/head/helmet/space/santahat,
+ /obj/item/clothing/head/collectable/paper
)
if( ! ( item_to_add.type in allowed_types ) )
- usr << "\red The object cannot fit on this animal."
+ usr << "\red The corgi doesn't seem too keen on wearing that item."
return
usr.drop_item()
@@ -148,6 +179,64 @@
src.inventory_head = item_to_add
update_clothing()
+ //Various hats and items (worn on his head) change Ian's behaviour. His attributesare reset when a HAT is removed.
+
+
+ switch(inventory_head && inventory_head.type)
+ if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain)
+ name = "Captain [real_name]"
+ desc = "Probably better than the last captain."
+ if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty)
+ name = "Runtime"
+ emote_see = list("coughs up a furball", "stretches")
+ emote_hear = list("purrs")
+ speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW")
+ desc = "It's a cute little kitty-cat! ... wait ... what the hell?"
+ if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
+ name = "Hoppy"
+ emote_see = list("twitches his nose", "hops around a bit")
+ desc = "This is hoppy. It's a corgi-...urmm... bunny rabbit"
+ if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
+ name = "Yann"
+ desc = "mon dieu! C'est un chien!"
+ speak = list("le woof!", "le bark!", "JAPPE!!")
+ emote_see = list("cowers in fear", "surrenders", "plays dead")
+ if(/obj/item/clothing/head/det_hat)
+ name = "Detective [real_name]"
+ desc = "[name] sees through your lies..."
+ emote_see = list("investigates the area","sniffs around for clues","searches for scooby snacks")
+ if(/obj/item/clothing/head/nursehat)
+ name = "Nurse [real_name]"
+ desc = "[name] needs 100cc of beef jerky...STAT!"
+ if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate)
+ name = "'[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibbles","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]'"
+ desc = "Yaarghh!! Thar' be a scurvy dog!"
+ emote_see = list("hunts for treasure","stares coldly...","gnashes his tiny corgi teeth")
+ emote_hear = list("growls ferociously", "snarls")
+ speak = list("Arrrrgh!!","Grrrrrr!")
+ if(/obj/item/clothing/head/ushanka)
+ name = "[pick("Comrade","Commissar")] [real_name]"
+ desc = "A follower of Karl Barx."
+ emote_see = list("contemplates the failings of the capitalist economic model", "ponders the pros and cons of vangaurdism")
+ if(/obj/item/clothing/head/collectable/police)
+ name = "Officer [real_name]"
+ emote_see = list("drools","looks for donuts")
+ desc = "Stop right there criminal scum!"
+ if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
+ name = "Grandwizard [real_name]"
+ speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!")
+ if(/obj/item/weapon/bedsheet)
+ name = "The ghost"
+ speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU")
+ emote_see = list("stumbles around", "shivers")
+ emote_hear = list("howls","groans")
+ desc = "Spooky!"
+ if(/obj/item/clothing/head/helmet/space/santahat)
+ name = "Rudolph the Red-Nosed Corgi"
+ emote_hear = list("barks christmas songs", "yaps")
+ desc = "He has a very shiny nose."
+ src.sd_SetLuminosity(6)
+
if("back")
if(inventory_back)
usr << "\red The [inventory_back] is already in this slot."
@@ -161,7 +250,8 @@
//to be compatible with them. The objects are below.
var/list/allowed_types = list(
- /obj/item/clothing/suit/armor/vest
+ /obj/item/clothing/suit/armor/vest,
+ /obj/item/device/radio
)
if( ! ( item_to_add.type in allowed_types ) )
@@ -173,7 +263,7 @@
src.inventory_back = item_to_add
update_clothing()
- show_inv(usr)
+ //show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying.
else
..()
@@ -181,7 +271,7 @@
/mob/living/simple_animal/corgi/Ian
name = "Ian"
real_name = "Ian" //Intended to hold the name without altering it.
- desc = "It's Ian, what else do you need to know?"
+ desc = "It's a corgi."
var/turns_since_scan = 0
var/obj/movement_target
response_help = "pets"
@@ -192,7 +282,7 @@
..()
//Feeding, chasing food, FOOOOODDDD
- if(alive && !restrained() )
+ if(alive && !resting && !buckled)
turns_since_scan++
if(turns_since_scan > 5)
turns_since_scan = 0
@@ -239,77 +329,44 @@
dir = i
sleep(1)
-/mob/living/simple_animal/corgi/Ian/restrained()
- if(resting || buckled)
- return 1
- return 0
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/corgi
+ name = "Corgi meat"
+ desc = "Tastes like... well you know..."
-/mob/living/simple_animal/corgi/Ian/verb/stoppull()
- set name = "Stop pulling"
- set category = "IC"
+/mob/living/simple_animal/corgi/Ian/Bump(atom/movable/AM as mob|obj, yes)
- pulling = null
+ spawn( 0 )
+ if ((!( yes ) || now_pushing))
+ return
+ now_pushing = 1
+ if(ismob(AM))
+ var/mob/tmob = AM
+ if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
+ if(prob(70))
+ for(var/mob/M in viewers(src, null))
+ if(M.client)
+ M << "\red [src] fails to push [tmob]'s fat ass out of the way."
+ now_pushing = 0
+ return
-/mob/living/simple_animal/corgi/Ian/Move()
- if(restrained())
- pulling = null
+ tmob.LAssailant = src
+ now_pushing = 0
+ ..()
+ if (!( istype(AM, /atom/movable) ))
+ return
+ if (!( now_pushing ))
+ now_pushing = 1
+ if (!( AM.anchored ))
+ var/t = get_dir(src, AM)
+ if (istype(AM, /obj/structure/window))
+ if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
+ for(var/obj/structure/window/win in get_step(AM,t))
+ now_pushing = 0
+ return
+ step(AM, t)
+ now_pushing = null
return
-
- var/turf/old_loc
- var/turf/new_loc
-
- if(isturf(loc))
- old_loc = src.loc
- else
- return //in a container, cannot move
-
- ..()
-
- if(isturf(loc))
- new_loc = src.loc
- else
- return //in a container, cannot move
-
- if(old_loc == new_loc)
- return //has not moved
-
- if(pulling)
-
- if(isturf(old_loc) && isturf(pulling.loc))
- if(get_dist(src.loc,old_loc) > 1)
- world << "get_dist(src.loc,pulling.loc)"
- pulling = null
- return
- else
- pulling = null
- return
-
- if(istype(pulling,/obj/item))
- var/obj/item/I = pulling
- if(I.w_class > 4)
- pulling = null
- return
- if(I.anchored)
- pulling = null
- return
-
- I.loc = old_loc
- return
-
- if(ismob(pulling))
- var/mob/M = pulling
- if(!M.stat)
- pulling = null
- return //cannot drag live people
- if(M.anchored)
- pulling = null
- return
- if(M.restrained())
- pulling = null
- return
-
- M.loc = old_loc
- return
+ return
/obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/corgi
name = "Corgi meat"
diff --git a/code/defines/mob/simple_animal/life.dm b/code/defines/mob/simple_animal/life.dm
index cc8a746abb6..599daa6ba37 100644
--- a/code/defines/mob/simple_animal/life.dm
+++ b/code/defines/mob/simple_animal/life.dm
@@ -4,8 +4,8 @@
var/icon_dead = ""
var/max_health = 20
var/alive = 1
- var/list/speak = null
- var/list/speak_emote = null//list() Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable.
+ var/list/speak = list()
+ var/list/speak_emote = list()// Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable.
var/speak_chance = 0
var/list/emote_hear = list() //EHearable emotes
var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index c574a8285ed..5b7420fdcd2 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -107,6 +107,111 @@
//This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
var/locked[] = list()
+ proc/get_manifest(monochrome)
+ var/list/heads = new()
+ var/list/sec = new()
+ var/list/eng = new()
+ var/list/med = new()
+ var/list/sci = new()
+ var/list/civ = new()
+ var/list/bot = new()
+ var/list/misc = new()
+
+ var/dat = {"
+
+
+ | Name | Rank |
+ "}
+ var/even = 0
+
+ // sort mobs
+ for(var/datum/data/record/t in data_core.general)
+ var/name = t.fields["name"]
+ var/rank = t.fields["rank"]
+ var/real_rank = t.fields["real_rank"]
+
+ //world << "[name]: [rank]"
+
+ if(real_rank in command_positions)
+ heads[name] = rank
+ if(real_rank in security_positions)
+ sec[name] = rank
+ continue
+ if(real_rank in engineering_positions)
+ eng[name] = rank
+ continue
+ if(real_rank in medical_positions)
+ med[name] = rank
+ continue
+ if(real_rank in science_positions)
+ sci[name] = rank
+ continue
+ if(real_rank in civilian_positions)
+ civ[name] = rank
+ continue
+ if(real_rank in nonhuman_positions)
+ bot[name] = rank
+ continue
+
+ if(!(name in heads))
+ misc[name] = rank
+
+ if(heads.len > 0)
+ dat += "| Heads |
"
+ for(name in heads)
+ dat += "| [name] | [heads[name]] |
"
+ even = !even
+ if(sec.len > 0)
+ dat += "| Security |
"
+ for(name in sec)
+ dat += "| [name] | [sec[name]] |
"
+ even = !even
+ if(eng.len > 0)
+ dat += "| Engineering |
"
+ for(name in eng)
+ dat += "| [name] | [eng[name]] |
"
+ even = !even
+ if(med.len > 0)
+ dat += "| Medical |
"
+ for(name in med)
+ dat += "| [name] | [med[name]] |
"
+ even = !even
+ if(sci.len > 0)
+ dat += "| Science |
"
+ for(name in sci)
+ dat += "| [name] | [sci[name]] |
"
+ even = !even
+ if(civ.len > 0)
+ dat += "| Civilian |
"
+ for(name in civ)
+ dat += "| [name] | [civ[name]] |
"
+ even = !even
+ // in case somebody is insane and added them to the manifest, why not
+ if(bot.len > 0)
+ dat += "| Silicon |
"
+ for(name in bot)
+ dat += "| [name] | [bot[name]] |
"
+ even = !even
+ // misc guys
+ if(misc.len > 0)
+ dat += "| Miscellaneous |
"
+ for(name in misc)
+ dat += "| [name] | [misc[name]] |
"
+ even = !even
+
+
+ dat += "
"
+ dat = dd_replacetext(dat, "\n", "") // so it can be placed on paper correctly
+ dat = dd_replacetext(dat, "\t", "")
+ return dat
+
/obj/effect/equip_e
name = "equip e"
var/mob/source = null
diff --git a/code/defines/obj/clothing/costume.dm b/code/defines/obj/clothing/costume.dm
index 76c50714ed5..b073230443f 100644
--- a/code/defines/obj/clothing/costume.dm
+++ b/code/defines/obj/clothing/costume.dm
@@ -12,6 +12,12 @@
new /obj/item/clothing/suit/chickensuit(src.loc)
del(src)
+/obj/effect/landmark/costume/justice/New()
+ new /obj/item/clothing/suit/justice(src.loc)
+ var/CHOICE = pick( /obj/item/clothing/head/justice , /obj/item/clothing/head/justice/blue , /obj/item/clothing/head/justice/yellow , /obj/item/clothing/head/justice/green , /obj/item/clothing/head/justice/pink )
+ new CHOICE(src.loc)
+ del(src)
+
/obj/effect/landmark/costume/madscientist/New()
new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
new /obj/item/clothing/head/flatcap(src.loc)
@@ -48,8 +54,8 @@
new /obj/item/clothing/gloves/white(src.loc)
new /obj/item/clothing/shoes/white(src.loc)
new /obj/item/clothing/under/scratch(src.loc)
- if (prob(30))
- new /obj/item/clothing/head/helmet/cueball(src.loc)
+// if (prob(30))
+// new /obj/item/clothing/head/helmet/cueball(src.loc)
del(src)
/obj/effect/landmark/costume/highlander/New()
diff --git a/code/defines/obj/clothing/gimmick.dm b/code/defines/obj/clothing/gimmick.dm
index 7d192490c6e..303ce52062d 100644
--- a/code/defines/obj/clothing/gimmick.dm
+++ b/code/defines/obj/clothing/gimmick.dm
@@ -511,6 +511,43 @@
color = "sexymime"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
+/obj/item/clothing/head/bowler
+ name = "bowler-hat"
+ desc = "Gentleman, elite aboard!"
+ icon_state = "bowler"
+ item_state = "bowler"
+ flags = FPRINT | TABLEPASS
+
+/obj/item/clothing/head/justice
+ name = "justice hat"
+ desc = "fight for what's righteous!"
+ icon_state = "justicered"
+ item_state = "justicered"
+ flags = FPRINT|TABLEPASS|SUITSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
+
+/obj/item/clothing/head/justice/blue
+ icon_state = "justiceblue"
+ item_state = "justiceblue"
+
+/obj/item/clothing/head/justice/yellow
+ icon_state = "justiceyellow"
+ item_state = "justiceyellow"
+
+/obj/item/clothing/head/justice/green
+ icon_state = "justicegreen"
+ item_state = "justicegreen"
+
+/obj/item/clothing/head/justice/pink
+ icon_state = "justicepink"
+ item_state = "justicepink"
+
+obj/item/clothing/suit/justice
+ name = "justice suit"
+ desc = "this pretty much looks ridiculous"
+ icon_state = "justice"
+ item_state = "justice"
+ flags = FPRINT | TABLEPASS
+
//stylish new hats
/obj/item/clothing/head/bowlerhat
diff --git a/code/defines/obj/clothing/jumpsuit.dm b/code/defines/obj/clothing/jumpsuit.dm
index 960e194248c..c260df17670 100644
--- a/code/defines/obj/clothing/jumpsuit.dm
+++ b/code/defines/obj/clothing/jumpsuit.dm
@@ -183,7 +183,16 @@
name = "Chemist Jumpsuit"
icon_state = "genetics"
item_state = "w_suit"
- color = "geneticswhite"
+ color = "chemistrywhite"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/virologist
+ desc = "Made of a special fiber that gives special protection against biohazards. Has a virologist rank stripe on it."
+ name = "Virology Jumpsuit"
+ icon_state = "virology"
+ item_state = "w_suit"
+ color = "virologywhite"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index cd0aaf6b0bf..f805613ea59 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -490,6 +490,19 @@
throw_range = 10
flags = ONBELT
+/obj/item/weapon/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
name = "cable coil"
@@ -939,7 +952,7 @@
throw_range = 5
w_class = 1.0
flags = FPRINT | TABLEPASS
- var/uses = 4.0
+ var/uses = 5.0
var/temp = null
var/spell_type = "verb"
var/max_uses = 5
diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm
index 6ee01b884fc..69c99ee19d7 100644
--- a/code/defines/procs/helpers.dm
+++ b/code/defines/procs/helpers.dm
@@ -1453,6 +1453,21 @@ proc/safepick(list/list)
return
return pick(list)
+proc/view_or_range(distance = world.view , center = usr , type)
+ switch(type)
+ if("view")
+ . = view(distance,center)
+ if("range")
+ . = range(distance,center)
+ return
+
+proc/oview_or_orange(distance = world.view , center = usr , type)
+ switch(type)
+ if("view")
+ . = oview(distance,center)
+ if("range")
+ . = orange(distance,center)
+ return
proc/get_opposite(var/checkdir)
switch(checkdir)
if(NORTH)
diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm
index 824f8ac57d8..5cb93676266 100644
--- a/code/defines/procs/statistics.dm
+++ b/code/defines/procs/statistics.dm
@@ -46,75 +46,6 @@ proc/sql_report_round_end()
if(!sqllogging)
return
-proc/sql_report_karma(var/mob/spender, var/mob/receiver, var/isnegative = 1)
- if(!sqllogging)
- return
- var/sqlspendername = spender.name
- var/sqlspenderkey = spender.key
- var/sqlreceivername = receiver.name
- var/sqlreceiverkey = receiver.key
- var/sqlreceiverrole = "None"
- var/sqlreceiverspecial = "None"
- var/sqlisnegative = "TRUE"
-
- if(isnegative)
- sqlisnegative = "TRUE"
- else
- sqlisnegative = "FALSE"
-
- var/sqlspenderip = spender.client.address
-
- if(receiver.mind)
- if(receiver.mind.special_role)
- sqlreceiverspecial = receiver.mind.special_role
- if(receiver.mind.assigned_role)
- sqlreceiverrole = receiver.mind.assigned_role
-
- var/DBConnection/dbcon = new()
- dbcon.Connect("dbi:mysql:[sqldb]:[sqladdress]:[sqlport]","[sqllogin]","[sqlpass]")
- if(!dbcon.IsConnected())
- log_game("SQL ERROR during karma logging. Failed to connect.")
- else
- var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
- var/DBQuery/query = dbcon.NewQuery("INSERT INTO karma (spendername, spenderkey, receivername, receiverkey, receiverrole, receiverspecial, isnegative, spenderip, time) VALUES ('[sqlspendername]', '[sqlspenderkey]', '[sqlreceivername]', '[sqlreceiverkey]', '[sqlreceiverrole]', '[sqlreceiverspecial]', [sqlisnegative], '[sqlspenderip]', '[sqltime]')")
- if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during karma logging. Error : \[[err]\]\n")
-
-
- query = dbcon.NewQuery("SELECT * FROM karmatotals WHERE byondkey='[receiver.key]'")
- query.Execute()
-
- var/karma
- var/id
- while(query.NextRow())
- id = query.item[1]
- karma = text2num(query.item[3])
- if(karma == null)
- if(isnegative)
- karma = -1
- else
- karma = 1
- query = dbcon.NewQuery("INSERT INTO karmatotals (byondkey, karma) VALUES ('[receiver.key]', [karma])")
- if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during karmatotal logging (adding new key). Error : \[[err]\]\n")
- else
- if(isnegative && sqlreceiverspecial != "None") // Toss out negative karma applied to traitors/wizards/etc.
- dbcon.Disconnect()
- return
- if(isnegative)
- karma -= 1
- else
- karma += 1
-
- query = dbcon.NewQuery("UPDATE karmatotals SET karma=[karma] WHERE id=[id]")
- if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during karmatotal logging (updating existing entry). Error : \[[err]\]\n")
- dbcon.Disconnect()
-
-
proc/sql_report_death(var/mob/living/carbon/human/H)
if(!sqllogging)
return
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index d0cfb86e57a..2b541c16587 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -22,6 +22,7 @@
// update_lights()
if(name == "Space") // override defaults for space
requires_power = 1
+ always_unpowered = 1
sd_SetLuminosity(1)
power_light = 0
power_equip = 0
@@ -218,6 +219,8 @@
if(!master.requires_power)
return 1
+ if(master.always_unpowered)
+ return 0
switch(chan)
if(EQUIP)
return master.power_equip
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index 7580989d5ae..4bb876a11f9 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -91,51 +91,52 @@
src.fingerprintslast = M.key
return 0
var/mob/living/carbon/human/H = M
- if (!istype(H.dna, /datum/dna))
- return 0
+ 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()
if (H.gloves && H.gloves != src)
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
H.gloves.add_fingerprint(M)
- if (H.dna.uni_identity)
- 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))
- return 0
- if(src.fingerprintslast != H.key)
- src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
- src.fingerprintslast = H.key
- var/new_prints = 0
- var/prints
- for(var/i = 1, i <= src.fingerprints.len, i++)
- var/list/L = params2list(src.fingerprints[i])
- if(L[num2text(1)] == md5(H.dna.uni_identity))
- new_prints = i
- prints = L[num2text(2)]
- break
- else
- var/test_print = stars(L[num2text(2)], rand(80,90))
- if(stringpercent(test_print) == 32)
- if(src.fingerprints.len == 1)
- src.fingerprints = list()
- else
- for(var/j = (i + 1), j < (src.fingerprints.len), j++)
- src.fingerprints[j-1] = src.fingerprints[j]
- src.fingerprints.len--
+ 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))
+ return 0
+ if(src.fingerprintslast != H.key)
+ src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
+ src.fingerprintslast = H.key
+ var/new_prints = 0
+ var/prints
+ for(var/i = 1, i <= src.fingerprints.len, i++)
+ var/list/L = params2list(src.fingerprints[i])
+ if(L[num2text(1)] == md5(H.dna.uni_identity))
+ new_prints = i
+ prints = L[num2text(2)]
+ break
+ else
+ var/test_print = stars(L[num2text(2)], rand(80,90))
+ if(stringpercent(test_print) == 32)
+ if(src.fingerprints.len == 1)
+ src.fingerprints = list()
else
- src.fingerprints[i] = "1=" + L[num2text(1)] + "&2=" + test_print
- if(new_prints)
- src.fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40)))))
- else if(new_prints == 0)
- if(!src.fingerprints)
- src.fingerprints = list(text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40))))
- src.fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))
- for(var/i = 1, i <= src.fingerprints.len, i++)
- if(length(src.fingerprints[i]) != 69)
- src.fingerprints.Remove(src.fingerprints[i])
- return 1
+ for(var/j = (i + 1), j < (src.fingerprints.len), j++)
+ src.fingerprints[j-1] = src.fingerprints[j]
+ src.fingerprints.len--
+ else
+ src.fingerprints[i] = "1=" + L[num2text(1)] + "&2=" + test_print
+ if(new_prints)
+ src.fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40)))))
+ else if(new_prints == 0)
+ if(!src.fingerprints)
+ src.fingerprints = list(text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40))))
+ src.fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))
+ for(var/i = 1, i <= src.fingerprints.len, i++)
+ if(length(src.fingerprints[i]) != 69)
+ src.fingerprints.Remove(src.fingerprints[i])
+ return 1
else
if(src.fingerprintslast != M.key)
src.fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
@@ -146,6 +147,9 @@
/atom/proc/add_blood(mob/living/carbon/human/M as mob)
if (!( istype(M, /mob/living/carbon/human) ))
return 0
+ if (!istype(M.dna, /datum/dna))
+ M.dna = new /datum/dna(null)
+ M.check_dna()
if (!( src.flags ) & 256)
return
if(!blood_DNA)
@@ -177,6 +181,14 @@
if(objsonturf)
for(var/i=1, i<=objsonturf.len, i++)
if(istype(objsonturf[i],/obj/effect/decal/cleanable/blood))
+ var/obj/effect/decal/cleanable/blood/this = objsonturf[i]
+ this.blood_DNA.len++
+ this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes, M.dna.b_type)
+ this.virus2 += M.virus2
+ for(var/datum/disease/D in M.viruses)
+ var/datum/disease/newDisease = new D.type
+ this.viruses += newDisease
+ newDisease.holder = this
return
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source2)
var/list/blood_DNA_temp[1]
@@ -202,7 +214,7 @@
else
var/list/blood_DNA_temp[1]
blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.dna.b_type)
- src.blood_DNA = blood_DNA_temp
+ src.blood_DNA = blood_DNA_temp
return
/atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0)
@@ -233,6 +245,7 @@
if( istype(src, /turf/simulated) )
var/turf/simulated/source2 = src
var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(source2)
+ this.blood_DNA = list(list("UNKNOWN BLOOD","X*"))
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
this.viruses += newDisease
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 771c1d1409f..3c990e03af3 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -14,7 +14,7 @@
if(length(uni_identity) != 39)
//Lazy.
var/temp
- var/hair
+ var/hair = 0
var/beard
// determine DNA fragment from hairstyle
@@ -23,11 +23,10 @@
var/list/styles = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
var/hrange = round(4095 / styles.len)
- var/style = styles.Find(character.hair_style.type)
- if(style)
- hair = style * hrange - rand(1,hrange-1)
- else
- hair = 0
+ if(character.hair_style)
+ var/style = styles.Find(character.hair_style.type)
+ if(style)
+ hair = style * hrange - rand(1,hrange-1)
// Beard dna code - mostly copypasted from hair code to allow for more dynamic facial hair style additions
var/list/face_styles = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair
diff --git a/code/game/events/EventProcs/miniblob.dm b/code/game/events/EventProcs/miniblob.dm
index db3df423c99..019be9cc2c4 100644
--- a/code/game/events/EventProcs/miniblob.dm
+++ b/code/game/events/EventProcs/miniblob.dm
@@ -1,22 +1,23 @@
/proc/mini_blob_event()
//command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
//world << sound('outbreak5.ogg')
- var/turf/T = pick(blobstart)
- var/obj/effect/blob/bl = new /obj/effect/blob( T.loc, 30 )
- spawn(0)
- bl.Life()
- bl.Life()
- bl.Life()
- bl.Life()
- bl.blobdebug = 1
- bl.Life()
- blobevent = 1
- spawn(0)
- dotheblobbaby()
+ if(prob(33)) //33% chance of making a blob.
+ var/turf/T = pick(blobstart)
+ var/obj/effect/blob/bl = new /obj/effect/blob( T.loc, 30 )
+ spawn(0)
+ bl.Life()
+ bl.Life()
+ bl.Life()
+ bl.Life()
+ bl.blobdebug = 1
+ bl.Life()
+ blobevent = 1
+ spawn(0)
+ dotheblobbaby()
spawn(15000)
blobevent = 0
spawn(rand(30, 60)) //Delayed announcements to keep the crew on their toes.
- command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
+ command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()].", "Biohazard Alert")
world << sound('outbreak5.ogg')
/proc/dotheblobbaby()
diff --git a/code/game/events/Events/PowerOffline.dm b/code/game/events/Events/PowerOffline.dm
index f71d9b4096e..92f4c9e643f 100644
--- a/code/game/events/Events/PowerOffline.dm
+++ b/code/game/events/Events/PowerOffline.dm
@@ -1,8 +1,10 @@
/datum/event/power_offline
+ var/list/protected_areas = list(/area/ai_monitored/storage/eva, /area/engine, /area/toxins/xenobiology, /area/turret_protected/ai)
+
Announce()
for(var/obj/machinery/power/apc/a in world)
if(!a.crit && a.z == 1)
- if(istype(a.area, /area/engine) || istype(a.area, /area/toxins/xenobiology) || istype(a.area, /area/turret_protected/ai))
+ if(a.area in protected_areas)
continue
a.eventoff = 1
a.update()
diff --git a/code/game/events/EventsMain.dm b/code/game/events/EventsMain.dm
index 64ec9414232..9de8b5f56bd 100644
--- a/code/game/events/EventsMain.dm
+++ b/code/game/events/EventsMain.dm
@@ -8,7 +8,7 @@
var/list/DisallowedEvents = list(/datum/event/spaceninja, /datum/event/prisonbreak, /datum/event/immovablerod, /datum/event/gravitationalanomaly, /datum/event/alieninfestation)
var/list/EventTypes = typesof(/datum/event) - /datum/event - DisallowedEvents
-var/list/OneTimeEvents = list(/datum/event/spacecarp, /datum/event/miniblob)
+var/list/OneTimeEvents = list(/datum/event/spacecarp)
var/datum/event/ActiveEvent = null
var/datum/event/LongTermEvent = null
var/is_ninjad_yet = 0
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index a4900fb0670..c3bc296f684 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -147,7 +147,7 @@
/datum/game_mode/proc/grant_runeword(mob/living/carbon/human/cult_mob, var/word)
- if(!wordtravel)
+ /*if(!wordtravel)
runerandom()
if (!word)
word=pick(allwords)
@@ -176,9 +176,9 @@
// if("free")
// wordexp = "[wordfree] is free..."
if("hide")
- wordexp = "[wordhide] is hide..."
- cult_mob << "\red You remember one thing from the dark teachings of your master... [wordexp]"
- cult_mob.mind.store_memory("You remember that [wordexp]", 0, 0)
+ wordexp = "[wordhide] is hide..."*/
+ cult_mob << "\red You remember the basics from the dark teachings of your master... [wordblood] is blood,[wordjoin] is join, and [wordself] is self..."
+ cult_mob.mind.store_memory("You remember that [wordblood] is blood,[wordjoin] is join, and [wordself] is self", 0, 0)
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 60bc235f938..f3c08a7b67d 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -27,3 +27,22 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
+
+/obj/item/clothing/head/magus
+ name = "magus helm"
+ icon_state = "magus"
+ item_state = "magus"
+ desc = "A helm worn by the followers of Nar-Sie."
+ see_face = 0
+ flags = FPRINT|TABLEPASS|SUITSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
+ armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/suit/magusred
+ name = "magus robes"
+ desc = "A set of armored robes worn by the followers of Nar-Sie"
+ icon_state = "magusred"
+ item_state = "magusred"
+ flags = FPRINT | TABLEPASS | ONESIZEFITSALL
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
+ armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
\ No newline at end of file
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index df605dd7d09..2bd03a3bd13 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -51,12 +51,15 @@ Devices and Tools;
/obj/item/weapon/card/emag:4:Cryptographic Sequencer (Limited uses, almost full access);
/obj/item/device/hacktool:3:Hacktool (Slow, but stealthy. Unlimited uses);
/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox;
+/obj/item/device/encryptionkey/traitor:3:Traitor Radio Key;
+/obj/item/device/encryptionkey/binary:3:Binary Translator Key;
+/obj/item/weapon/storage/syndie_kit/space:3:Space Suit;
/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module;
-/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator;
/obj/item/weapon/plastique:2:C-4 (Destroys walls);
/obj/item/weapon/syndie/c4explosive:4:Low Power Explosive Charge, with Detonator;
/obj/item/device/powersink:5:Powersink (DANGER!);
/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!);
+/obj/item/weapon/circuitboard/teleporter:20:Teleporter Circuit Board;
Whitespace:Seperator;
Implants;
/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant;
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index f077dc9b5a1..2eb032eacaf 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -43,8 +43,10 @@
agent_number = possible_syndicates.len
var/n_players = num_players()
- if(agent_number > n_players)
- agent_number = n_players/2
+ if(agent_number > (n_players - agent_number))
+ agent_number = (n_players - agent_number)/2
+ if(agent_number < required_enemies)
+ agent_number = required_enemies
while(agent_number > 0)
var/datum/mind/new_syndicate = pick(possible_syndicates)
@@ -216,10 +218,7 @@
return tempfreq
/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob,radio_freq)
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset(synd_mob)
- R.freerange = 1
- R.listening = 0
- R.config(list("Nuclear" = 1))
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset/nuclear(synd_mob)
synd_mob.equip_if_possible(R, synd_mob.slot_ears)
synd_mob.equip_if_possible(new /obj/item/clothing/under/syndicate(synd_mob), synd_mob.slot_w_uniform)
synd_mob.equip_if_possible(new /obj/item/clothing/shoes/black(synd_mob), synd_mob.slot_shoes)
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 26139859a8a..7a60d10ecd1 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -6,7 +6,8 @@
density = 1
var/deployable = 0.0
var/extended = 0.0
- var/timeleft = 60.0
+ var/timeleft = 1200
+ var/time_actual = 0
var/timing = 0.0
var/r_code = "ADMIN"
var/code = ""
@@ -22,8 +23,7 @@
/obj/machinery/nuclearbomb/process()
if (src.timing)
- src.timeleft--
- if (src.timeleft <= 0)
+ if((time_actual <= world.timeofday) && ((world.timeofday + (time_actual - world.timeofday)) <= 864000) )
explode()
for(var/mob/M in viewers(1, src))
if ((M.client && M.machine == src))
@@ -35,18 +35,23 @@
/obj/machinery/nuclearbomb/attack_hand(mob/user as mob)
if (src.extended)
+ var/time_left = time2text(time_actual-world.timeofday, "mm:ss")
+ if(world.timeofday + (time_actual - world.timeofday) >= 864000)
+ time_left = time2text(time_actual-(864000 - world.timeofday), "mm:ss")
+ if(!timing)
+ time_left = time2text(timeleft, "mm:ss")
user.machine = src
var/dat = text("Nuclear Fission Explosive
\nAuth. Disk: []
", src, (src.auth ? "++++++++++" : "----------"))
if (src.auth)
if (src.yes_code)
- dat += text("\nStatus: []-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: - - [] + +
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.timing ? "Func/Set" : "Functional"), (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src, src, src, src.timeleft, src, src, (src.safety ? "On" : "Off"), src, (src.anchored ? "Engaged" : "Off"), src)
+ dat += text("\nStatus: []-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: --- [] +++
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.timing ? "Func/Set" : "Functional"), (src.safety ? "Safe" : "Engaged"), time_left, (src.timing ? "On" : "Off"), src, src, src, src, time_left, src, src, src, (src.safety ? "On" : "Off"), src, (src.anchored ? "Engaged" : "Off"), src)
else
- dat += text("\nStatus: Auth. S2-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: - - [] + +
\n
\n[] Safety: Toggle
\nAnchor: [] Toggle
\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
+ dat += text("\nStatus: Auth. S2-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: --- [] +++
\n
\n[] Safety: Toggle
\nAnchor: [] Toggle
\n", (src.safety ? "Safe" : "Engaged"), time_left, (src.timing ? "On" : "Off"), time_left, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
else
if (src.timing)
- dat += text("\nStatus: Set-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: - - [] + +
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
+ dat += text("\nStatus: Set-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: --- [] +++
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.safety ? "Safe" : "Engaged"), time_left, (src.timing ? "On" : "Off"), time_left, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
else
- dat += text("\nStatus: Auth. S1-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: - - [] + +
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
+ dat += text("\nStatus: Auth. S1-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: --- [] +++
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.safety ? "Safe" : "Engaged"), time_left, (src.timing ? "On" : "Off"), time_left, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
var/message = "AUTH"
if (src.auth)
message = text("[]", src.code)
@@ -111,17 +116,22 @@
if (src.yes_code)
if (href_list["time"])
var/time = text2num(href_list["time"])
- src.timeleft += time
- src.timeleft = min(max(round(src.timeleft), 5), 600)
+ timeleft = min(max(time + (timeleft/10), 120), 900) * 10
if (href_list["timer"])
- if (src.timing == -1.0)
+ if (timing == -1.0)
return
- src.timing = !( src.timing )
- if (src.timing)
+ timing = !( timing )
+ if (timing)
+ time_actual = world.timeofday + timeleft
+ if(time_actual >= 864000)
+ time_actual -= 864000
src.icon_state = "nuclearbomb2"
if(!src.safety)
bomb_set = 1//There can still be issues with this reseting when there are multiple bombs. Not a big deal tho for Nuke/N
else
+ timeleft = time_actual - world.timeofday
+ if(timeleft < 0)
+ timeleft += 864000
src.icon_state = "nuclearbomb1"
bomb_set = 0
if (href_list["safety"])
@@ -153,6 +163,7 @@
/obj/machinery/nuclearbomb/proc/explode()
if (src.safety)
src.timing = 0
+ timeleft = 0
return
src.timing = -1.0
src.yes_code = 0
diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm
index a83a5e88904..e6f51b9dacb 100644
--- a/code/game/gamemodes/sandbox/sandbox.dm
+++ b/code/game/gamemodes/sandbox/sandbox.dm
@@ -4,6 +4,9 @@
required_players = 0
votable = 0
+ uplink_welcome = "Syndicate Uplink Console:"
+ uplink_uses = 10
+
/datum/game_mode/sandbox/announce()
world << "The current game mode is - Sandbox!"
world << "Build your own station with the sandbox-panel command!"
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index dca6d7b4b41..8ed3f5ac66d 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -5,7 +5,7 @@
/datum/game_mode/traitor
name = "traitor"
config_tag = "traitor"
- restricted_jobs = list("Cyborg")//Approved by headmins for a week test, if you see this it would be nice if you didn't spread it everywhere
+ 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
required_players = 0
required_enemies = 1
@@ -349,6 +349,7 @@
T.icon = R.icon
T.w_class = R.w_class
T.icon_state = R.icon_state
+ T.item_state = R.item_state
T.origradio = R
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
traitor_mob.mind.store_memory("Radio Freq: [format_frequency(freq)] ([R.name] [loc]).")
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 9da0da4711b..ec02105063f 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -13,7 +13,7 @@
dat += "Memorize which spell:
"
dat += "The number after the spell name is the cooldown time.
"
dat += "Magic Missile (10)
"
- dat += "Fireball (10)
"
+ dat += "Fireball (20)
"
// dat += "Disintegrate (60)
"
dat += "Disable Technology (60)
"
dat += "Smoke (10)
"
@@ -26,7 +26,12 @@
dat += "Ethereal Jaunt (60)
"
dat += "Knock (10)
"
dat += "
"
- dat += "Re-memorize Spells
"
+ dat += "Artefacts:
"
+ dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of spells.
"
+ dat += "
"
+ dat += "Staff of Change
"
+ dat += "
"
+ dat += "Re-memorize Spells
"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
@@ -97,6 +102,10 @@
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")
+ 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--
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/already_knows = 0
@@ -147,7 +156,11 @@
if ("13")
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 (href_list["spell_choice"] == "14")
+ if ("14")
+ 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 (href_list["spell_choice"] == "15")
var/area/wizard_station/A = locate()
if(usr in A.contents)
src.uses = src.max_uses
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 08c6654f2d9..3105aeb210b 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -50,7 +50,7 @@
/datum/game_mode/wizard/post_setup()
for(var/datum/mind/wizard in wizards)
forge_wizard_objectives(wizard)
- learn_basic_spells(wizard.current)
+ //learn_basic_spells(wizard.current)
equip_wizard(wizard.current)
name_wizard(wizard.current)
greet_wizard(wizard)
@@ -141,7 +141,7 @@
return
-/datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob)
+/*/datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob)
if (!istype(wizard_mob))
return
if(!config.feature_object_spell_system)
@@ -149,7 +149,7 @@
wizard_mob.mind.special_verbs += /client/proc/jaunt
else
wizard_mob.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(usr)
-
+*/
/datum/game_mode/proc/equip_wizard(mob/living/carbon/human/wizard_mob)
if (!istype(wizard_mob))
@@ -178,7 +178,7 @@
wizard_mob.equip_if_possible(new /obj/item/weapon/spellbook(wizard_mob), wizard_mob.slot_r_hand)
wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully."
- wizard_mob << "In your pockets you will find two more important, magical artifacts. Use them as needed."
+ wizard_mob << "In your pockets you will find a teleport scroll. Use it as needed."
wizard_mob.mind.store_memory("Remember: do not forget to prepare your spells.")
return 1
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index efda6bc526d..dc513705e96 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -504,6 +504,12 @@
if(jobName in get_all_jobs())
return jobName
+ // hack for alt titles
+ if(istype(loc, /mob))
+ var/mob/M = loc
+ if(M.mind.role_alt_title == jobName && M.mind.assigned_role in get_all_jobs())
+ return M.mind.assigned_role
+
var/centcom = 0
for(var/i = 1, i <= accesses.len, i++)
if(accesses[i] > 100)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 0b93d51d4a7..7cf86a03ed5 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -164,6 +164,7 @@
for(var/mob/V in viewers(src, null))
V.show_message(text("\red [user] hits the [src] with a [W]!"))
src.health -= W.force
+ src.add_fingerprint(user)
healthcheck()
..()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index d7243176648..889e529e540 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -35,8 +35,6 @@
var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything.
var/wantsscan = 1
var/wantspod = 1
- var/poddir = 8 //Which dir relative to the computer it is in.
- var/scandir = 8
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
@@ -105,7 +103,7 @@
//..()
//world << "SEARCHING FOR SCANNER"
var/obj/machinery/dna_scannernew/scannerf = null
- for(dir in list(NORTH,EAST,SOUTH,WEST))
+ 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))
@@ -119,7 +117,7 @@
//..()
//world << "SEARCHING FOR POD"
var/obj/machinery/clonepod/podf = null
- for(dir in list(NORTH,EAST,SOUTH,WEST))
+ 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))
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 7a168c4d4e5..4db4bb8280e 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -147,11 +147,14 @@ Pod/Blast Doors computer
var/obj/item/weapon/card/id/C = H.wear_id
if (C)
G.fields["rank"] = C.assignment
+ G.fields["real_rank"] = H.mind.assigned_role
else
- if(H.job)
- G.fields["rank"] = H.job
+ if(H.mind && H.mind.assigned_role)
+ G.fields["rank"] = H.mind.role_alt_title ? H.mind.role_alt_title : H.mind.assigned_role
+ G.fields["real_rank"] = H.mind.assigned_role
else
G.fields["rank"] = "Unassigned"
+ G.fields["real_rank"] = G.fields["rank"]
G.fields["name"] = H.real_name
G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
M.fields["name"] = G.fields["name"]
@@ -190,6 +193,7 @@ Pod/Blast Doors computer
L.fields["age"] = H.age
L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]")
L.fields["rank"] = H.mind.role_alt_title ? H.mind.role_alt_title : H.mind.assigned_role
+ L.fields["real_rank"] = H.mind.assigned_role
L.fields["b_type"] = H.dna.b_type
L.fields["b_dna"] = H.dna.unique_enzymes
L.fields["enzymes"] = H.dna.struc_enzymes
@@ -213,6 +217,8 @@ Pod/Blast Doors computer
if(foundrecord)
foundrecord.fields["rank"] = assignment
+ if(assignment in get_all_jobs())
+ foundrecord.fields["real_rank"] = assignment
/obj/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
@@ -224,11 +230,14 @@ Pod/Blast Doors computer
var/obj/item/weapon/card/id/C = H.wear_id
if (C)
G.fields["rank"] = C.assignment
+ G.fields["real_rank"] = H.job
else
- if(H.job)
- G.fields["rank"] = H.job
+ if(H.mind && H.mind.assigned_role)
+ G.fields["rank"] = H.mind.assigned_role
+ G.fields["real_rank"] = H.mind.assigned_role
else
G.fields["rank"] = "Unassigned"
+ G.fields["real_rank"] = G.fields["rank"]
G.fields["name"] = H.real_name
G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
M.fields["name"] = G.fields["name"]
@@ -267,6 +276,7 @@ Pod/Blast Doors computer
L.fields["age"] = H.age
L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]")
L.fields["rank"] = H.mind.role_alt_title ? H.mind.role_alt_title : H.mind.assigned_role
+ L.fields["real_rank"] = H.mind.assigned_role
L.fields["b_type"] = H.dna.b_type
L.fields["b_dna"] = H.dna.unique_enzymes
L.fields["enzymes"] = H.dna.struc_enzymes
diff --git a/code/game/machinery/computer/id.dm b/code/game/machinery/computer/id.dm
index 05cc6749c91..6583bc5f416 100644
--- a/code/game/machinery/computer/id.dm
+++ b/code/game/machinery/computer/id.dm
@@ -52,9 +52,7 @@
if (!( ticker ))
return
if (mode) // accessing crew manifest
- var/crew = ""
- for(var/datum/data/record/t in data_core.general)
- crew += "[t.fields["name"]] - [t.fields["rank"]]
"
+ var/crew = data_core.get_manifest()
dat = "Crew Manifest:
Please use the security record computer to modify entries.
[crew]Print
Access ID modification console.
"
else
var/header = "Identification Card Modifier
"
@@ -245,10 +243,7 @@
printing = 1
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
- var/t1 = "Crew Manifest:
"
- for(var/datum/data/record/t in data_core.general)
- t1 += "[t.fields["name"]] - [t.fields["rank"]]
"
- P.info = t1
+ P.info = "Crew Manifest:
" + data_core.get_manifest()
P.name = "paper - 'Crew Manifest'"
printing = null
if (modify)
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index b1886dc2065..afa39cbdf3a 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -487,6 +487,8 @@ What a mess.*/
if ("Change Rank")
if (active1)
active1.fields["rank"] = href_list["rank"]
+ if(href_list["rank"] in get_all_jobs())
+ active1.fields["real_rank"] = href_list["real_rank"]
if ("Change Criminal Status")
if (active2)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 62af9606a3c..12d038aa1e5 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1256,6 +1256,8 @@ About the new airlock wires panel:
src.updateUsrDialog()
if((istype(usr.equipped(), /obj/item/device/hacktool)))
return attack_ai(usr, usr.equipped())
+ else if(issilicon(usr))
+ return attack_ai(usr)
return
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index fe46d91232e..128b01d9eef 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -131,7 +131,7 @@
/obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/device/detective_scanner))
return ..()
- if (src.operating)
+ if (src.operating || isrobot(user))
return
src.add_fingerprint(user)
if (!src.requiresID())
diff --git a/code/game/machinery/kitchen/juicer.dm b/code/game/machinery/kitchen/juicer.dm
index c329a4a883b..0a32cd32242 100644
--- a/code/game/machinery/kitchen/juicer.dm
+++ b/code/game/machinery/kitchen/juicer.dm
@@ -21,6 +21,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/lime = "limejuice",
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice = "watermelonjuice",
/obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries = "poisonberryjuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/grapes = "grapejuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes = "grapejuice",
)
/obj/machinery/juicer/New()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index a22cbfddb6f..81e106bc1d1 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -500,6 +500,21 @@ Neutralize All Unidentified Life Signs: []
"},
if(!emagged) use_power(700)
else use_power(1400)
+ else if(istype(E, /obj/item/weapon/gun/energy/staff))
+ A = new /obj/item/projectile/change( loc )
+ A.original = target.loc
+ icon_state = "target_prism"
+ if(!emagged) use_power(700)
+ else use_power(1400)
+
+ else if(istype(E, /obj/item/weapon/gun/energy/ionrifle))
+ A = new /obj/item/projectile/ion( loc )
+ A.original = target.loc
+ icon_state = "target_prism"
+ if(!emagged) use_power(700)
+ else use_power(1400)
+
+
else if(istype(E, /obj/item/weapon/gun/energy/taser) || istype(E, /obj/item/weapon/gun/energy/stunrevolver))
A = new /obj/item/projectile/energy/electrode( loc )
icon_state = "target_prism"
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index ccc8bfb2d3b..bfb5c85678b 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -18,6 +18,9 @@ obj/machinery/recharger
if (istype(G, /obj/item/weapon/gun/energy/gun/nuclear) || istype(G, /obj/item/weapon/gun/energy/crossbow))
user << "Your gun's recharge port was removed to make room for a miniaturized reactor."
return
+ if (istype(G, /obj/item/weapon/gun/energy/staff))
+ user << "It's a wooden staff, not a gun!"
+ return
user.drop_item()
G.loc = src
src.charging = G
diff --git a/code/game/machinery/scanner.dm b/code/game/machinery/scanner.dm
index 3488d1f610c..6eb79664598 100644
--- a/code/game/machinery/scanner.dm
+++ b/code/game/machinery/scanner.dm
@@ -87,6 +87,7 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user)
var/datum/data/record/S = new()
var/datum/data/record/L = new()
G.fields["rank"] = "Unassigned"
+ G.fields["real_rank"] = G.fields["rank"]
G.fields["name"] = mname
G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
M.fields["name"] = G.fields["name"]
@@ -125,6 +126,7 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user)
L.fields["age"] = age
L.fields["id"] = md5("[mname][user.mind.assigned_role]")
L.fields["rank"] = "Unknown"
+ L.fields["real_rank"] = L.fields["rank"]
L.fields["b_type"] = bloodtype
L.fields["b_dna"] = dna
L.fields["enzymes"] = user.dna.struc_enzymes
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 7f0ce6dbf90..0a923bf1108 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -8,6 +8,7 @@
var
list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam
+
/obj/machinery/telecomms/broadcaster
name = "Subspace Broadcaster"
icon = 'stationobjs.dmi'
@@ -21,16 +22,21 @@ var
heatgen = 60
delay = 7
circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster"
+
receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
+ // Don't broadcast rejected signals
+ if(signal.data["reject"])
+ return
if(signal.data["message"])
- // Kind of lame way to prevent MASSIVE RADIO SPAM but it works
+ // Prevents massive radio spam
if("[signal.data["message"]]:[signal.data["realname"]]" in recentmessages)
return
recentmessages.Add( "[signal.data["message"]]:[signal.data["realname"]]" )
+
signal.data["done"] = 1 // mark the signal as being broadcasted
// Search for the original signal and mark it as done as well
@@ -41,19 +47,48 @@ var
if(signal.data["slow"] > 0)
sleep(signal.data["slow"]) // simulate the network lag if necessary
- /* ###### Broadcast a message using signal.data ###### */
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
- signal.data["radio"], signal.data["message"],
- signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"],, signal.data["compression"])
- /* --- Do a snazzy animation! --- */
- flick("broadcaster_send", src)
+ /** #### - Normal Broadcast - #### **/
+
+ if(signal.data["type"] == 0)
+
+ /* ###### Broadcast a message using signal.data ###### */
+ Broadcast_Message(signal.data["connection"], signal.data["mob"],
+ signal.data["vmask"], signal.data["vmessage"],
+ signal.data["radio"], signal.data["message"],
+ signal.data["name"], signal.data["job"],
+ signal.data["realname"], signal.data["vname"],, signal.data["compression"])
+
+
+ /** #### - Simple Broadcast - #### **/
+
+ if(signal.data["type"] == 1)
+
+ /* ###### Broadcast a message using signal.data ###### */
+ Broadcast_SimpleMessage(signal.data["name"], signal.frequency,
+ signal.data["message"],null, null,
+ signal.data["compression"])
+
+
+ /** #### - Artificial Broadcast - #### **/
+ // (Imitates a mob)
+
+ if(signal.data["type"] == 2)
+
+ /* ###### Broadcast a message using signal.data ###### */
+ // Parameter "data" as 4: AI can't track this person/mob
+
+ Broadcast_Message(signal.data["connection"], signal.data["mob"],
+ signal.data["vmask"], signal.data["vmessage"],
+ signal.data["radio"], signal.data["message"],
+ signal.data["name"], signal.data["job"],
+ signal.data["realname"], signal.data["vname"], 4, signal.data["compression"])
spawn(1)
recentmessages = list()
+ /* --- Do a snazzy animation! --- */
+ flick("broadcaster_send", src)
/*
Basically just an empty shell for receiving and broadcasting radio messages. Not
@@ -72,8 +107,8 @@ var
machinetype = 6
heatgen = 0
var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel
- var/frequency = 1439
var/nuke = 0
+ var/frequency = 1439
receive_signal(datum/signal/signal)
@@ -104,19 +139,19 @@ var
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"],, signal.data["compression"])
- else if(connection.frequency == NUKE_FREQ && !nuke)
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
- signal.data["radio"], signal.data["message"],
- signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"],, signal.data["compression"])
else
- if(nuke)
+ if(nuke && connection.frequency != NUKE_FREQ)
Broadcast_Message(signal.data["connection"], signal.data["mob"],
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"], 3, signal.data["compression"])
+ else if(nuke)
+ Broadcast_Message(signal.data["connection"], signal.data["mob"],
+ signal.data["vmask"], signal.data["vmessage"],
+ signal.data["radio"], signal.data["message"],
+ signal.data["name"], signal.data["job"],
+ signal.data["realname"], signal.data["vname"],, signal.data["compression"])
else
Broadcast_Message(signal.data["connection"], signal.data["mob"],
signal.data["vmask"], signal.data["vmessage"],
@@ -169,6 +204,7 @@ var
1 -- Will only broadcast to intercoms
2 -- Will only broadcast to intercoms and station-bounced radios
3 -- Broadcast to syndicate frequency
+ 4 -- AI can't track down this person. Useful for imitation broadcasts where you can't find the actual mob
@param compression:
If 0, the signal is audible
@@ -211,22 +247,21 @@ var
// --- Broadcast to syndicate radio! ---
else if(data == 3)
- var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(NUKE_FREQ)
+ var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ)
for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"])
- receive |= R.send_hear(NUKE_FREQ)
+ receive |= R.send_hear(SYND_FREQ)
// --- Broadcast to response team radio! ---
- else if(data == 4)
+ else if(data == 5)
var/datum/radio_frequency/interceptconnection = radio_controller.return_frequency(intercept_frequency)
for (var/obj/item/device/radio/R in interceptconnection.devices["[RADIO_CHAT]"])
receive |= R.send_hear(intercept_frequency)
-
// --- Broadcast to ALL radio devices ---
else
@@ -281,7 +316,6 @@ var
// - Just display a garbled message -
else
heard_garbled += R
-
for(var/obj/item/weapon/implant/imp in R)
imp.hear(message,M)
@@ -312,8 +346,6 @@ var
freq_text = "Mining"
if(1347)
freq_text = "Cargo"
- if(1439)
- freq_text = "Response Team"
if(connection.frequency == NUKE_FREQ)
freq_text = "Agent"
@@ -335,12 +367,12 @@ var
if (display_freq==SYND_FREQ)
part_a = ""
- else if (display_freq==NUKE_FREQ)
- part_a = ""
else if (display_freq==COMM_FREQ)
part_a = ""
else if (display_freq in DEPT_FREQS)
part_a = ""
+ else if (display_freq==NUKE_FREQ)
+ part_a = ""
// --- Filter the message; place it in quotes apply a verb ---
@@ -384,6 +416,8 @@ var
//End of research and feedback code.
+ var/aitrack = ""
+
/* ###### Send the message ###### */
@@ -394,19 +428,27 @@ var
var/J = job
var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_masked)
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][N] ([J]) [part_b][quotedmsg][part_c]", 2)
+ aitrack = ""
+ if(data == 4)
+ aitrack = ""
+
+ if(istype(R, /mob/living/silicon/ai) && job != "Automated Announcement")
+ R.show_message("[part_a][aitrack][N] ([J]) [part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
/* --- Process all the mobs that heard the voice normally (understood) --- */
if (length(heard_normal))
- var/rendered = "[part_a][M.real_name][part_b][quotedmsg][part_c]"
+ var/rendered = "[part_a][realname][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_normal)
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][realname] ([job]) [part_b][quotedmsg][part_c]", 2)
+ aitrack = ""
+ if(data == 4)
+ aitrack = ""
+
+ if(istype(R, /mob/living/silicon/ai) && job != "Automated Announcement")
+ R.show_message("[part_a][aitrack][realname] ([job]) [part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -414,13 +456,16 @@ var
// Does not display message; displayes the mob's voice_message (ie "chimpers")
if (length(heard_voice))
- var/rendered = ""
- if(M)
- rendered = "[part_a][vname][part_b][M.voice_message][part_c]"
+ var/rendered = "[part_a][vname][part_b][M.voice_message][part_c]"
for (var/mob/R in heard_voice)
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][vname] ([job]) [part_b][vmessage]][part_c]", 2)
+ aitrack = ""
+ if(data == 4)
+ aitrack = ""
+
+
+ if(istype(R, /mob/living/silicon/ai) && job != "Automated Announcement")
+ R.show_message("[part_a][aitrack][vname] ([job]) [part_b][vmessage]][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -428,15 +473,17 @@ var
// Displays garbled message (ie "f*c* **u, **i*er!")
if (length(heard_garbled))
- if(M)
- quotedmsg = M.say_quote(stars(message))
- else
- quotedmsg = "\"" + stars(message) + "\""
+ quotedmsg = M.say_quote(stars(message))
var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_garbled)
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][vname][part_b][quotedmsg][part_c]", 2)
+ aitrack = ""
+ if(data == 4)
+ aitrack = ""
+
+
+ if(istype(R, /mob/living/silicon/ai) && job != "Automated Announcement")
+ R.show_message("[part_a][aitrack][vname][part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -444,16 +491,239 @@ var
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
if (length(heard_gibberish))
- if(M)
- quotedmsg = M.say_quote(Gibberish(message, compression + 50))
- else
- quotedmsg = "\"" + Gibberish(message, compression + 50) + "\""
+ quotedmsg = M.say_quote(Gibberish(message, compression + 50))
var/rendered = "[part_a][Gibberish(M.real_name, compression + 50)][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_gibberish)
- if(istype(R, /mob/living/silicon/ai))
- R.show_message("[part_a][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) [part_b][quotedmsg][part_c]", 2)
+ aitrack = ""
+ if(data == 4)
+ aitrack = ""
+
+
+ if(istype(R, /mob/living/silicon/ai) && job != "Automated Announcement")
+ R.show_message("[part_a][aitrack][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) [part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
+
+/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression)
+
+
+ /* ###### Prepare the radio connection ###### */
+
+ if(!M)
+ var/mob/living/carbon/human/H = new
+ M = H
+
+ var/datum/radio_frequency/connection = radio_controller.return_frequency(frequency)
+
+ var/display_freq = connection.frequency
+
+ var/list/receive = list()
+
+
+ // --- Broadcast only to intercom devices ---
+
+ if(data == 1)
+ for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
+
+ receive |= R.send_hear(display_freq)
+
+
+ // --- Broadcast only to intercoms and station-bounced radios ---
+
+ else if(data == 2)
+ for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
+
+ if(istype(R, /obj/item/device/radio/headset))
+ continue
+
+ receive |= R.send_hear(display_freq)
+
+
+ // --- Broadcast to syndicate radio! ---
+
+ else if(data == 3)
+ var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ)
+
+ for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"])
+
+ receive |= R.send_hear(SYND_FREQ)
+
+
+ // --- Broadcast to ALL radio devices ---
+
+ else
+ for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
+
+ receive |= R.send_hear(display_freq)
+
+
+ /* ###### Organize the receivers into categories for displaying the message ###### */
+
+ // Understood the message:
+ var/list/heard_normal = list() // normal message
+
+ // Did not understand the message:
+ var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
+ var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
+
+ for (var/mob/R in receive)
+
+ /* --- Loop through the receivers and categorize them --- */
+
+ 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
+
+
+ // --- Check for compression ---
+ if(compression > 0)
+
+ heard_gibberish += R
+ continue
+
+ // --- Can understand the speech ---
+
+ if (R.say_understands(M))
+
+ heard_normal += R
+
+ // --- Can't understand the speech ---
+
+ else
+ // - Just display a garbled message -
+
+ heard_garbled += R
+ for(var/obj/item/weapon/implant/imp in R)
+ imp.hear(text,M)
+
+
+ /* ###### Begin formatting and sending the message ###### */
+ if (length(heard_normal) || length(heard_garbled) || length(heard_gibberish))
+
+ /* --- Some miscellaneous variables to format the string output --- */
+ var/part_a = "" // goes in the actual output
+ var/freq_text // the name of the channel
+
+ // --- Set the name of the channel ---
+ switch(display_freq)
+
+ if(SYND_FREQ)
+ freq_text = "#unkn"
+ if(COMM_FREQ)
+ freq_text = "Command"
+ if(1351)
+ freq_text = "Science"
+ if(1355)
+ freq_text = "Medical"
+ if(1357)
+ freq_text = "Engineering"
+ if(1359)
+ freq_text = "Security"
+ if(1349)
+ freq_text = "Mining"
+ if(1347)
+ freq_text = "Cargo"
+
+ if(connection.frequency == NUKE_FREQ)
+ freq_text = "Agent"
+ //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
+
+
+ // --- If the frequency has not been assigned a name, just use the frequency as the name ---
+
+ if(!freq_text)
+ freq_text = format_frequency(display_freq)
+
+ // --- Some more pre-message formatting ---
+
+ var/part_b_extra = ""
+ if(data == 3) // intercepted radio message
+ part_b_extra = " (Intercepted)"
+
+ // Create a radio headset for the sole purpose of using its icon
+ var/obj/item/device/radio/headset/radio = new
+
+ var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE
+ var/part_c = ""
+
+ if (display_freq==SYND_FREQ)
+ part_a = ""
+ else if (display_freq==COMM_FREQ)
+ part_a = ""
+ else if (display_freq in DEPT_FREQS)
+ part_a = ""
+ else if (display_freq==NUKE_FREQ)
+ part_a = ""
+
+ // --- This following recording is intended for research and feedback in the use of department radio channels ---
+
+ var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE
+ var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]"
+ //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
+ for (var/obj/machinery/blackbox_recorder/BR in world)
+ //BR.messages_admin += blackbox_admin_msg
+ switch(display_freq)
+ if(1459)
+ BR.msg_common += blackbox_msg
+ if(1351)
+ BR.msg_science += blackbox_msg
+ if(1353)
+ BR.msg_command += blackbox_msg
+ if(1355)
+ BR.msg_medical += blackbox_msg
+ if(1357)
+ BR.msg_engineering += blackbox_msg
+ if(1359)
+ BR.msg_security += blackbox_msg
+ if(1441)
+ BR.msg_deathsquad += blackbox_msg
+ if(1213)
+ BR.msg_syndicate += blackbox_msg
+ if(1349)
+ BR.msg_mining += blackbox_msg
+ if(1347)
+ BR.msg_cargo += blackbox_msg
+ else
+ BR.messages += blackbox_msg
+
+ //End of research and feedback code.
+
+ /* ###### Send the message ###### */
+
+ /* --- Process all the mobs that heard the voice normally (understood) --- */
+
+ if (length(heard_normal))
+ var/rendered = "[part_a][source][part_b]\"[text]\"[part_c]"
+ if(M.job == "Automated Announcement")
+ rendered = "[part_a][source][part_b][text][part_c]"
+
+ for (var/mob/R in heard_normal)
+ R.show_message(rendered, 2)
+
+ /* --- Process all the mobs that heard a garbled voice (did not understand) --- */
+ // Displays garbled message (ie "f*c* **u, **i*er!")
+
+ if (length(heard_garbled))
+ var/quotedmsg = "\"[stars(text)]\""
+ if(M.job == "Automated Announcement")
+ quotedmsg = "[stars(text)]"
+ var/rendered = "[part_a][source][part_b][quotedmsg][part_c]"
+
+ for (var/mob/R in heard_garbled)
+ R.show_message(rendered, 2)
+
+
+ /* --- Complete gibberish. Usually happens when there's a compressed message --- */
+
+ if (length(heard_gibberish))
+ var/quotedmsg = "\"[Gibberish(text, compression + 50)]\""
+ if(M.job == "Automated Announcement")
+ quotedmsg = "[Gibberish(text, compression + 50)]"
+ var/rendered = "[part_a][Gibberish(source, compression + 50)][part_b][quotedmsg][part_c]"
+
+ for (var/mob/R in heard_gibberish)
+ R.show_message(rendered, 2)
+
+
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 03665dda37f..a9934dd7b78 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -27,7 +27,7 @@
if(0)
dat += "
[temp]
"
- dat += "
Current Network: [network]
"
+ dat += "
Current Network: [network]
"
if(servers.len)
dat += "
Detected Telecommunication Servers:"
for(var/obj/machinery/telecomms/T in servers)
@@ -60,56 +60,64 @@
dat += "- [C.name] \[X\]
"
- // -- Determine race of orator --
+ // If the log is a speech file
+ if(C.input_type == "Speech File")
+ // -- Determine race of orator --
- var/race // The actual race of the mob
- var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human
- var/mobtype = C.parameters["mobtype"]
- var/mob/M = new mobtype
+ var/race // The actual race of the mob
+ var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human
+ var/mobtype = C.parameters["mobtype"]
+ var/mob/M = new mobtype
- if(ishuman(M) || isbrain(M))
- race = "Human"
+ if(ishuman(M) || isbrain(M))
+ race = "Human"
- else if(ismonkey(M))
- race = "Monkey"
- language = race
+ else if(ismonkey(M))
+ race = "Monkey"
+ language = race
- else if(issilicon(M) || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job
- race = "Artificial Life"
+ else if(issilicon(M) || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job
+ race = "Artificial Life"
- else if(ismetroid(M)) // NT knows a lot about metroids, but not aliens. Can identify metroids
- race = "Metroid"
- language = race
+ else if(ismetroid(M)) // NT knows a lot about metroids, but not aliens. Can identify metroids
+ race = "Metroid"
+ language = race
- else if(isanimal(M))
- race = "Domestic Animal"
- language = race
+ else if(isanimal(M))
+ race = "Domestic Animal"
+ language = race
- else
- race = "Unidentifiable"
- language = race
+ else
+ race = "Unidentifiable"
+ language = race
- del(M)
+ del(M)
- // -- If the orator is a human, or universal translate is active, OR mob has universal speech on --
+ // -- If the orator is a human, or universal translate is active, OR mob has universal speech on --
- if(language == "Human" || universal_translate || C.parameters["uspeech"])
+ if(language == "Human" || universal_translate || C.parameters["uspeech"])
+ dat += "Data type: [C.input_type]
"
+ dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
"
+ dat += "Class: [race]
"
+ dat += "Contents: \"[C.parameters["message"]]\"
"
+
+
+ // -- Orator is not human and universal translate not active --
+
+ else
+ dat += "Data type: Audio File
"
+ dat += "Source: Unidentifiable
"
+ dat += "Class: [race]
"
+ dat += "Contents: Unintelligble
"
+
+ dat += "
"
+
+ else if(C.input_type == "Execution Error")
dat += "Data type: [C.input_type]
"
- dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
"
- dat += "Class: [race]
"
+ dat += "Source: Internal server code
"
dat += "Contents: \"[C.parameters["message"]]\"
"
- // -- Orator is not human and universal translate not active --
-
- else
- dat += "Data type: Audio File
"
- dat += "Source: Unidentifiable
"
- dat += "Class: [race]
"
- dat += "Contents: Unintelligble
"
-
- dat += "
"
-
dat += ""
@@ -128,9 +136,6 @@
add_fingerprint(usr)
usr.machine = src
- if(!src.allowed(usr) && !emagged)
- usr << "\red ACCESS DENIED."
- return
if(href_list["viewserver"])
screen = 1
@@ -166,6 +171,11 @@
screen = 0
if(href_list["delete"])
+
+ if(!src.allowed(usr) && !emagged)
+ usr << "\red ACCESS DENIED."
+ return
+
if(SelectedServer)
var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])]
@@ -178,11 +188,11 @@
else
temp = "- FAILED: NO SELECTED MACHINE -"
- if(href_list["input"])
+ if(href_list["network"])
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
- if(newnet && usr in range(1, src) && newnet != network)
+ if(newnet && usr in range(1, src))
if(length(newnet) > 15)
temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -"
@@ -224,11 +234,6 @@
A.anchored = 1
del(src)
else if(istype(D, /obj/item/weapon/card/emag) && !emagged)
- var/obj/item/weapon/card/emag/E = D
- if(E.uses)
- E.uses--
- else
- return
playsound(src.loc, 'sparks4.ogg', 75, 1)
emagged = 1
user << "\blue You you disable the security protocols"
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 2fc5a6c975c..2ead66f3eb7 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -139,13 +139,13 @@
dat += "
\[Add Filter\]"
dat += "
"
if(P.buffer)
- dat += "
MULTITOOL BUFFER: \ref[P.buffer] [P.buffer] \[Link\] \[Flush\]"
+ dat += "
MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]"
else
dat += "
MULTITOOL BUFFER: \[Add Machine\]"
dat += ""
temp = ""
- user << browse(dat, "window=[src.name];size=520x500;can_resize=0")
+ user << browse(dat, "window=tcommachine;size=520x500;can_resize=0")
onclose(user, "dormitory")
Topic(href, href_list)
diff --git a/code/game/machinery/telecomms/telecommunications.dm b/code/game/machinery/telecomms/telecommunications.dm
index e1a8bab184e..a84aff8bede 100644
--- a/code/game/machinery/telecomms/telecommunications.dm
+++ b/code/game/machinery/telecomms/telecommunications.dm
@@ -83,7 +83,10 @@
"connection" = signal.data["connection"],
"radio" = signal.data["radio"],
"slow" = signal.data["slow"],
- "traffic" = signal.data["traffic"]
+ "traffic" = signal.data["traffic"],
+ "type" = signal.data["type"],
+ "server" = signal.data["server"],
+ "reject" = signal.data["reject"]
)
// Keep the "original" signal constant
@@ -137,6 +140,11 @@
if(!(T in links) && machinetype != T.machinetype)
links.Add(T)
+ if(istype(src, /obj/machinery/telecomms/server))
+ var/obj/machinery/telecomms/server/S = src
+ S.Compiler = new()
+ S.Compiler.Holder = src
+
update_icon()
if(on)
@@ -355,8 +363,21 @@
circuitboard = "/obj/item/weapon/circuitboard/telecomms/server"
var
list/log_entries = list()
+ list/stored_names = list()
+ list/TrafficActions = list()
+ logs = 0 // number of logs
totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes)
+ list/memory = list() // stored memory
+ rawcode = "" // the code to compile (raw text)
+ datum/TCS_Compiler/Compiler // the compiler that compiles and runs the code
+ autoruncode = 0 // 1 if the code is set to run every time a signal is picked up
+
+ encryption = "null" // encryption key: ie "password"
+ salt = "null" // encryption salt: ie "123comsat"
+ // would add up to md5("password123comsat")
+ language = "human"
+
receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(signal.data["message"])
@@ -382,10 +403,7 @@
log.parameters["message"] = signal.data["message"]
log.parameters["name"] = signal.data["name"]
log.parameters["realname"] = signal.data["realname"]
- if(M)
- log.parameters["uspeech"] = M.universal_speak
- else
- log.parameters["uspeech"] = 0
+ log.parameters["uspeech"] = M.universal_speak
// If the signal is still compressed, make the log entry gibberish
if(signal.data["compression"] > 0)
@@ -396,25 +414,50 @@
log.parameters["vname"] = Gibberish(signal.data["vname"], signal.data["compression"] + 50)
log.input_type = "Corrupt File"
+ // Log and store everything that needs to be logged
log_entries.Add(log)
+ if(!(signal.data["name"] in stored_names))
+ stored_names.Add(signal.data["name"])
+ logs++
+ signal.data["server"] = src
+ // Give the log a name
var/identifier = num2text( rand(-1000,1000) + world.time )
log.name = "data packet ([md5(identifier)])"
- relay_information(signal, "/obj/machinery/telecomms/broadcaster") // send to all broadcasters
+ if(Compiler && autoruncode)
+ Compiler.Run(signal) // execute the code
+
+ relay_information(signal, "/obj/machinery/telecomms/broadcaster")
+
+
+ proc/setcode(var/t)
+ if(t)
+ if(istext(t))
+ rawcode = t
+
+ proc/compile()
+ if(Compiler)
+ return Compiler.Compile(rawcode)
proc/update_logs()
- // deletes all logs when there are 100
- if(log_entries.len >= 100)
- var/list/restore = list()
- for(var/datum/comm_log_entry/log in log_entries)
- if(log.garbage_collector) // if garbage collector is set to 1, delete
- del(log)
- else
- restore.Add(log)
+ // start deleting the very first log entry
+ if(logs >= 400)
+ for(var/i = 1, i <= logs, i++) // locate the first garbage collectable log entry and remove it
+ var/datum/comm_log_entry/L = log_entries[i]
+ if(L.garbage_collector)
+ log_entries.Remove(L)
+ logs--
+ break
+
+ proc/add_entry(var/content, var/input)
+ var/datum/comm_log_entry/log = new
+ var/identifier = num2text( rand(-1000,1000) + world.time )
+ log.name = "data packet ([md5(identifier)])"
+ log.input_type = input
+ log.parameters["message"] = content
+
- log_entries.len = 0
- log_entries.Add(restore)
// Simple log entry datum
@@ -493,42 +536,42 @@
network = "tcommsat"
science
- id = "science server"
+ id = "Science Server"
freq_listening = list(1351)
autolinkers = list("science", "broadcasterA")
medical
- id = "medical server"
+ id = "Medical Server"
freq_listening = list(1355)
autolinkers = list("medical", "broadcasterA")
cargo
- id = "cargo server"
+ id = "Cargo Server"
freq_listening = list(1347)
autolinkers = list("cargo", "broadcasterA")
mining
- id = "mining server"
+ id = "Mining Server"
freq_listening = list(1349)
autolinkers = list("mining", "broadcasterA")
common
- id = "common server"
+ id = "Common Server"
freq_listening = list(1459)
autolinkers = list("common", "broadcasterB")
command
- id = "command server"
+ id = "Command Server"
freq_listening = list(1353)
autolinkers = list("command", "broadcasterB")
engineering
- id = "engineering server"
+ id = "Engineering Server"
freq_listening = list(1357)
autolinkers = list("engineering", "broadcasterB")
security
- id = "security server"
+ id = "Security Server"
freq_listening = list(1359)
autolinkers = list("security", "broadcasterB")
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index a7ee7e827e8..1866477d7a8 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -18,8 +18,6 @@
temp = "" // temporary feedback messages
- req_access = list(access_tcomsat)
-
attack_hand(mob/user as mob)
if(stat & (BROKEN|NOPOWER))
return
@@ -33,7 +31,7 @@
if(0)
dat += "
[temp]
"
- dat += "
Current Network: [network]
"
+ dat += "
Current Network: [network]
"
if(machines.len)
dat += "
Detected Network Entities:"
for(var/obj/machinery/telecomms/T in machines)
@@ -72,9 +70,6 @@
add_fingerprint(usr)
usr.machine = src
- if(!src.allowed(usr) && !emagged)
- usr << "\red ACCESS DENIED."
- return
if(href_list["viewmachine"])
screen = 1
@@ -110,10 +105,10 @@
screen = 0
- if(href_list["input"])
+ if(href_list["network"])
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
- if(newnet && usr in range(1, src) && newnet != network)
+ if(newnet && usr in range(1, src))
if(length(newnet) > 15)
temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -"
@@ -154,11 +149,6 @@
A.anchored = 1
del(src)
else if(istype(D, /obj/item/weapon/card/emag) && !emagged)
- var/obj/item/weapon/card/emag/E = D
- if(E.uses)
- E.uses--
- else
- return
playsound(src.loc, 'sparks4.ogg', 75, 1)
emagged = 1
user << "\blue You you disable the security protocols"
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
new file mode 100644
index 00000000000..1014a2b62ea
--- /dev/null
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -0,0 +1,236 @@
+
+
+
+
+/obj/machinery/computer/telecomms/traffic
+ name = "Telecommunications Traffic Control"
+ icon_state = "computer_generic"
+
+ var
+ screen = 0 // the screen number:
+ list/servers = list() // the servers located by the computer
+ mob/editingcode
+ list/viewingcode = list()
+ obj/machinery/telecomms/server/SelectedServer
+
+ network = "NULL" // the network to probe
+ temp = "" // temporary feedback messages
+
+ storedcode = "" // code stored
+
+
+ proc/update_ide()
+
+ // loop if there's someone manning the keyboard
+ while(editingcode)
+ if(!editingcode.client)
+ editingcode = null
+ break
+
+ // For the typer, the input is enabled. Buffer the typed text
+ if(editingcode)
+ storedcode = "[winget(editingcode, "tcscode", "text")]"
+ if(editingcode) // double if's to work around a runtime error
+ winset(editingcode, "tcscode", "is-disabled=false")
+
+ // If the player's not manning the keyboard anymore, adjust everything
+ if(!(editingcode in range(1, src)) || editingcode.machine != src)
+ if(editingcode)
+ winshow(editingcode, "Telecomms IDE", 0) // hide the window!
+ editingcode = null
+ break
+
+ // For other people viewing the typer type code, the input is disabled and they can only view the code
+ // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once)
+
+ if(length(viewingcode))
+ // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element
+ var/showcode = dd_replacetext(storedcode, "\\\"", "\\\\\"")
+ showcode = dd_replacetext(storedcode, "\"", "\\\"")
+
+ for(var/mob/M in viewingcode)
+ if(M.machine == src && M in view(1, src))
+ 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!
+
+ sleep(5)
+
+ if(length(viewingcode) > 0)
+ editingcode = pick(viewingcode)
+ viewingcode.Remove(editingcode)
+ update_ide()
+
+
+
+ req_access = list(access_tcomsat)
+
+ attack_hand(mob/user as mob)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ user.machine = src
+ var/dat = "Telecommunication Traffic ControlTelecommunications Traffic Control"
+
+ switch(screen)
+
+
+ // --- Main Menu ---
+
+ if(0)
+ dat += "
[temp]
"
+ dat += "
Current Network: [network]
"
+ if(servers.len)
+ dat += "
Detected Telecommunication Servers:"
+ for(var/obj/machinery/telecomms/T in servers)
+ dat += "- \ref[T] [T.name] ([T.id])
"
+ dat += "
"
+ dat += "
\[Flush Buffer\]"
+
+ else
+ dat += "
No servers detected. Scan for servers: \[Scan\]"
+
+
+ // --- Viewing Server ---
+
+ if(1)
+ dat += "
[temp]
"
+ dat += "\[Main Menu\] \[Refresh\]"
+ dat += "
Current Network: [network]"
+ dat += "
Selected Server: [SelectedServer.id]
"
+ dat += "
\[Edit Code\]"
+ dat += "
Signal Execution: "
+ if(SelectedServer.autoruncode)
+ dat += "ALWAYS"
+ else
+ dat += "NEVER"
+
+
+ user << browse(dat, "window=traffic_control;size=575x400")
+ onclose(user, "server_control")
+
+ temp = ""
+ return
+
+
+ Topic(href, href_list)
+ if(..())
+ return
+
+
+ add_fingerprint(usr)
+ usr.machine = src
+ if(!src.allowed(usr) && !emagged)
+ usr << "\red ACCESS DENIED."
+ return
+
+ if(href_list["viewserver"])
+ screen = 1
+ for(var/obj/machinery/telecomms/T in servers)
+ if(T.id == href_list["viewserver"])
+ SelectedServer = T
+ break
+
+ if(href_list["operation"])
+ switch(href_list["operation"])
+
+ if("release")
+ servers = list()
+ screen = 0
+
+ if("mainmenu")
+ screen = 0
+
+ if("scan")
+ if(servers.len > 0)
+ temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -"
+
+ else
+ for(var/obj/machinery/telecomms/server/T in range(25, src))
+ if(T.network == network)
+ servers.Add(T)
+
+ if(!servers.len)
+ temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -"
+ else
+ temp = "- [servers.len] SERVERS PROBED & BUFFERED -"
+
+ screen = 0
+
+ if("editcode")
+ if(editingcode == usr) return
+ if(usr in viewingcode) return
+
+ if(!editingcode)
+ editingcode = usr
+ winshow(editingcode, "Telecomms IDE", 1) // show the IDE
+ winset(editingcode, "tcscode", "is-disabled=false")
+ var/showcode = dd_replacetext(storedcode, "\\\"", "\\\\\"")
+ showcode = dd_replacetext(storedcode, "\"", "\\\"")
+ winset(editingcode, "tcscode", "text=\"[showcode]\"")
+ spawn()
+ update_ide()
+
+ else
+ viewingcode.Add(usr)
+ winshow(usr, "Telecomms IDE", 1) // show the IDE
+ winset(usr, "tcscode", "is-disabled=true")
+ var/showcode = dd_replacetext(storedcode, "\"", "\\\"")
+ winset(usr, "tcscode", "text=\"[showcode]\"")
+
+ if("togglerun")
+ SelectedServer.autoruncode = !(SelectedServer.autoruncode)
+
+ if(href_list["network"])
+
+ 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(length(newnet) > 15)
+ temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -"
+
+ else
+
+ network = newnet
+ screen = 0
+ machines = list()
+ temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -"
+
+ updateUsrDialog()
+ return
+
+ attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
+ if(istype(D, /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/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( 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/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ A.circuit = M
+ A.state = 4
+ A.icon_state = "4"
+ A.anchored = 1
+ del(src)
+ else if(istype(D, /obj/item/weapon/card/emag) && !emagged)
+ playsound(src.loc, 'sparks4.ogg', 75, 1)
+ emagged = 1
+ user << "\blue You you disable the security protocols"
+ src.updateUsrDialog()
+ return
\ No newline at end of file
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 8e33bebe72e..22bac2a5936 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -83,10 +83,11 @@
areaindex[tmpname] = 1
L[tmpname] = I
- var/desc = input("Please select a location to lock in.", "Locking Computer") in L
- src.locked = L[desc]
- for(var/mob/O in hearers(src, null))
- O.show_message("\blue Locked In", 2)
+ var/desc = input("Please select a location to lock in.", "Locking Computer") in L|null
+ if(desc)
+ src.locked = L[desc]
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\blue Locked In", 2)
src.add_fingerprint(usr)
return
diff --git a/code/game/machinery/walllockers.dm b/code/game/machinery/walllockers.dm
index ec50aaf504c..3ffd862fb74 100644
--- a/code/game/machinery/walllockers.dm
+++ b/code/game/machinery/walllockers.dm
@@ -1,11 +1,11 @@
-/obj/walllocker
+/obj/structure/walllocker
name = "Wall Locker"
icon = 'lockwall.dmi'
icon_state = "emerg"
var/list/spawnitems = list()
anchored = 1
var/amount = 3 // spawns each items X times.
-/obj/walllocker/attack_hand(mob/user as mob)
+/obj/structure/walllocker/attack_hand(mob/user as mob)
if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to
return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc)
if(!amount)
@@ -16,18 +16,18 @@
new path(src.loc)
amount--
return
-/obj/walllocker/emerglocker
+/obj/structure/walllocker/emerglocker
name = "Emergency Locker"
spawnitems = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar)
-/obj/walllocker/emerglocker/north
+/obj/structure/walllocker/emerglocker/north
pixel_y = 32
dir = SOUTH
-/obj/walllocker/emerglocker/south
+/obj/structure/walllocker/emerglocker/south
pixel_y = -32
dir = NORTH
-/obj/walllocker/emerglocker/west
+/obj/structure/walllocker/emerglocker/west
pixel_x = -32
dir = WEST
-/obj/walllocker/emerglocker/east
+/obj/structure/walllocker/emerglocker/east
pixel_x = 32
dir = EAST
\ No newline at end of file
diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm
index 43ce87f50c5..bb4a1bb858c 100644
--- a/code/game/magic/cultist/runes.dm
+++ b/code/game/magic/cultist/runes.dm
@@ -19,7 +19,7 @@ var/list/sacrificed = list()
for(var/obj/effect/rune/R in world)
if(R == src)
continue
- if(R.word1 == wordtravel && R.word2 == wordself && R.word3 == key)
+ if(R.word1 == wordtravel && R.word2 == wordself && R.word3 == key && R.z != 2)
index++
allrunesloc.len = index
allrunesloc[index] = R.loc
@@ -951,11 +951,13 @@ var/list/sacrificed = list()
usr.whisper("N'ath reth sh'yro eth d'raggathnor!")
usr.visible_message("\red Rune disappears with a flash of red light, and a set of armor appears on you..", \
"\red You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.")
- user.equip_if_possible(new /obj/item/clothing/shoes/jackboots(user), user.slot_shoes)
- user.equip_if_possible(new /obj/item/clothing/suit/cultrobes(user), user.slot_wear_suit)
- user.equip_if_possible(new /obj/item/clothing/head/culthood(user), user.slot_head)
+ //user.equip_if_possible(new /obj/item/clothing/shoes/jackboots(user), user.slot_shoes)
+ //user.equip_if_possible(new /obj/item/clothing/suit/cultrobes(user), user.slot_wear_suit)
+ //user.equip_if_possible(new /obj/item/clothing/head/culthood(user), user.slot_head)
+ //user.equip_if_possible(new /obj/item/clothing/gloves/black(user), user.slot_gloves)
+ user.equip_if_possible(new /obj/item/clothing/suit/magusred(user), user.slot_wear_suit)
+ user.equip_if_possible(new /obj/item/clothing/head/magus(user), user.slot_head)
user.equip_if_possible(new /obj/item/weapon/melee/cultblade(user), user.slot_r_hand)
- user.equip_if_possible(new /obj/item/clothing/gloves/black(user), user.slot_gloves)
user.equip_if_possible(new /obj/item/weapon/storage/backpack/cultpack(user), user.slot_back)
del(src)
return
diff --git a/code/game/magic/cultist/talisman.dm b/code/game/magic/cultist/talisman.dm
index 6cd5434259c..7f5b8fefbbf 100644
--- a/code/game/magic/cultist/talisman.dm
+++ b/code/game/magic/cultist/talisman.dm
@@ -71,6 +71,7 @@
dat += "Kla'atu barada nikt'o! - Allows you to conceal the runes you placed on the floor.
"
dat += "O bidai nabora se'sma! - Allows you to coordinate with others of your cult.
"
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
"
usr << browse(dat, "window=id_com;size=350x200")
return
@@ -100,6 +101,9 @@
if("runestun")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
T.imbue = "runestun"
+ if("armor")
+ var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
+ T.imbue = "armor"
src.uses--
supply()
return
@@ -107,4 +111,4 @@
/obj/item/weapon/paper/talisman/supply
imbue = "supply"
- uses = 3
\ No newline at end of file
+ uses = 5
\ No newline at end of file
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 7f35b5c2681..1b0503a40a7 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -213,13 +213,14 @@
return output
proc/remove_resources(var/obj/item/mecha_parts/part)
- for(var/resource in part.construction_cost)
- if(resource in src.resources)
- src.resources[resource] -= get_resource_cost_w_coeff(part,resource)
+ if(istype(part, /obj/item/mecha_parts/part))
+ for(var/resource in part.construction_cost)
+ if(resource in src.resources)
+ src.resources[resource] -= get_resource_cost_w_coeff(part,resource)
return
proc/check_resources(var/obj/item/mecha_parts/part)
- if(istype(part, /obj/item))
+ if(istype(part, /obj/item/mecha_parts/part))
for(var/resource in part.construction_cost)
if(resource in src.resources)
if(src.resources[resource] < get_resource_cost_w_coeff(part,resource))
diff --git a/code/game/objects/blood.dm b/code/game/objects/blood.dm
index 26c01049058..3581860518a 100644
--- a/code/game/objects/blood.dm
+++ b/code/game/objects/blood.dm
@@ -34,6 +34,7 @@
sleep(3)
if (i > 0)
var/obj/effect/decal/cleanable/xenoblood/b = new /obj/effect/decal/cleanable/xenoblood/xsplatter(src.loc)
+ b.blood_DNA = blood_DNA
for(var/datum/disease/D in src.viruses)
b.viruses += D
if (step_to(src, get_step(src, direction), 0))
diff --git a/code/game/objects/closets.dm b/code/game/objects/closets.dm
index 9e8b1e3431b..3f431081f97 100644
--- a/code/game/objects/closets.dm
+++ b/code/game/objects/closets.dm
@@ -6,7 +6,7 @@
return (!density)
/obj/structure/closet/proc/can_open()
- if(src.welded || istype(src.loc,/obj/effect/bigDelivery))
+ if(src.welded || istype(src.loc,/obj/structure/bigDelivery))
return 0
return 1
@@ -117,20 +117,7 @@
del(src)
/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/packageWrap))
- var/obj/item/weapon/packageWrap/O = W
- if (O.amount > 3)
- src.close()
- var/obj/effect/bigDelivery/P = new /obj/effect/bigDelivery(get_turf(src.loc))
- P.wrapped = src
- P.waswelded = welded
- src.welded = 0
- src.loc = P
- src.opened = 0
- O.amount -= 3
- else
- user << "\blue You need more paper."
- else if(src.opened)
+ if(src.opened)
if(istype(W, /obj/item/weapon/grab))
src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
@@ -147,6 +134,9 @@
if(isrobot(user))
return
+ if(istype(W, /obj/item/weapon/packageWrap))
+ return
+
usr.drop_item()
if(W)
@@ -187,8 +177,8 @@
return
if(!src.open())
- if(istype(src.loc,/obj/effect/bigDelivery) && lasttry == 0)
- var/obj/effect/bigDelivery/Pack = src.loc
+ if(istype(src.loc,/obj/structure/bigDelivery) && lasttry == 0)
+ var/obj/structure/bigDelivery/Pack = src.loc
if(istype(Pack.loc,/turf) && Pack.waswelded == 0)
for (var/mob/M in hearers(src.loc, null))
M << text("BANG, bang, rrrrrip!", max(0, 5 - get_dist(src, M)))
@@ -199,7 +189,7 @@
src.open()
spawn(30)
lasttry = 0
- else if(!istype(src.loc,/obj/effect/bigDelivery))
+ else if(!istype(src.loc,/obj/structure/bigDelivery))
user << "\blue It won't budge!"
if(!lastbang)
lastbang = 1
diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm
index 4dc926d2251..839951b8ee9 100644
--- a/code/game/objects/closets/secure/security.dm
+++ b/code/game/objects/closets/secure/security.dm
@@ -137,6 +137,7 @@
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/device/detective_scanner(src)
new /obj/item/policetaperoll(src)
new /obj/item/weapon/storage/box/evidence(src)
diff --git a/code/game/objects/closets/wardrobe.dm b/code/game/objects/closets/wardrobe.dm
index 8f6776402c8..fc702dd65cb 100644
--- a/code/game/objects/closets/wardrobe.dm
+++ b/code/game/objects/closets/wardrobe.dm
@@ -339,9 +339,9 @@ obj/structure/closet/wardrobe/hop/New()
new /obj/item/clothing/suit/storage/labcoat/virologist(src)
new /obj/item/clothing/suit/storage/labcoat/virologist(src)
new /obj/item/clothing/suit/storage/labcoat/virologist(src)
- new /obj/item/clothing/under/rank/medical(src)
- new /obj/item/clothing/under/rank/medical(src)
- new /obj/item/clothing/under/rank/medical(src)
+ new /obj/item/clothing/under/rank/virologist(src)
+ new /obj/item/clothing/under/rank/virologist(src)
+ new /obj/item/clothing/under/rank/virologist(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/shoes/white(src)
\ No newline at end of file
diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index 340d32c8475..e8783ac589a 100755
--- a/code/game/objects/devices/PDA/PDA.dm
+++ b/code/game/objects/devices/PDA/PDA.dm
@@ -176,12 +176,11 @@
dat += ""
@@ -317,6 +316,13 @@
dat += "OTHER: [round(unknown_level)]%
"
dat += "Temperature: [round(environment.temperature-T0C)]°C
"
dat += "
"
+ if (41) //crew manifest
+
+ dat += "
Crew Manifest
"
+ dat += "Entries cannot be modified from this terminal.
"
+
+ dat += data_core.get_manifest(1)
+ dat += "
"
else//Else it links to the cart menu proc. Although, it really uses menu hub 4--menu 4 doesn't really exist as it simply redirects to hub.
dat += cart
@@ -577,7 +583,6 @@
difficulty += P.cartridge.access_engine
difficulty += P.cartridge.access_clown
difficulty += P.cartridge.access_janitor
- difficulty += P.cartridge.access_manifest * 2
else
difficulty += 2
diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm
index b3e9698f6de..ef012e92fdd 100644
--- a/code/game/objects/devices/PDA/cart.dm
+++ b/code/game/objects/devices/PDA/cart.dm
@@ -10,7 +10,6 @@
var/access_security = 0
var/access_engine = 0
var/access_medical = 0
- var/access_manifest = 1
var/access_clown = 0
var/access_mime = 0
var/access_janitor = 0
@@ -167,7 +166,6 @@
name = "Detomatix Cartridge"
icon_state = "cart"
access_remote_door = 1
- access_manifest = 0
remote_door_id = "syndicate" //Make sure this matches the syndicate shuttle's shield/door id!!
var/shock_charges = 4
@@ -230,14 +228,6 @@ Code:
[radio:code]
+
+
"}
- if (41) //crew manifest
-
- menu = "
Crew Manifest
"
- menu += "Entries cannot be modified from this terminal.
"
-
- for (var/datum/data/record/t in data_core.general)
- menu += "[t.fields["name"]] - [t.fields["rank"]]
"
- menu += "
"
if (42) //status displays
diff --git a/code/game/objects/gibs.dm b/code/game/objects/gibs.dm
index f8815de6ff8..e3325833eef 100644
--- a/code/game/objects/gibs.dm
+++ b/code/game/objects/gibs.dm
@@ -54,6 +54,10 @@
gib.blood_DNA = list(list(MobDNA.unique_enzymes, MobDNA.b_type))
if(MobDNA.original_name != "Unknown")
gib.OriginalMob = MobDNA.original_name
+ else if(istype(src, /obj/effect/gibspawner/xeno))
+ gib.blood_DNA = list(list("UNKNOWN DNA", "X*"))
+ else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
+ gib.blood_DNA = list(list("Non-human DNA", "A+"))
var/list/directions = gibdirections[i]
if(directions.len)
gib.streak(directions)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 81e8d63dad0..18d2e7c5d6f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -30,49 +30,52 @@
if ((usr.mutations & CLUMSY) && prob(50))
usr << "\red Uh ... how do those things work?!"
if (istype(M, /mob/living/carbon/human))
- var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
- O.source = user
- O.target = user
- O.item = user.equipped()
- O.s_loc = user.loc
- O.t_loc = user.loc
- O.place = "handcuff"
- M.requests += O
- spawn( 0 )
- O.process()
- return
+ if(!M.handcuffed)
+ var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
+ O.source = user
+ O.target = user
+ O.item = user.equipped()
+ O.s_loc = user.loc
+ O.t_loc = user.loc
+ O.place = "handcuff"
+ M.requests += O
+ spawn( 0 )
+ O.process()
+ return
return
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
usr << "\red You don't have the dexterity to do this!"
return
if (istype(M, /mob/living/carbon/human))
- M.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [M.name] ([M.ckey])")
- var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
- O.source = user
- O.target = M
- O.item = user.equipped()
- O.s_loc = user.loc
- O.t_loc = M.loc
- O.place = "handcuff"
- M.requests += O
- spawn( 0 )
- playsound(src.loc, 'handcuffs.ogg', 30, 1, -2)
- O.process()
- return
+ if(!M.handcuffed)
+ M.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [M.name] ([M.ckey])")
+ var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
+ O.source = user
+ O.target = M
+ O.item = user.equipped()
+ O.s_loc = user.loc
+ O.t_loc = M.loc
+ O.place = "handcuff"
+ M.requests += O
+ spawn( 0 )
+ playsound(src.loc, 'handcuffs.ogg', 30, 1, -2)
+ O.process()
+ return
else
- var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( )
- O.source = user
- O.target = M
- O.item = user.equipped()
- O.s_loc = user.loc
- O.t_loc = M.loc
- O.place = "handcuff"
- M.requests += O
- spawn( 0 )
- playsound(src.loc, 'handcuffs.ogg', 30, 1, -2)
- O.process()
- return
+ if(!M.handcuffed)
+ var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( )
+ O.source = user
+ O.target = M
+ O.item = user.equipped()
+ O.s_loc = user.loc
+ O.t_loc = M.loc
+ O.place = "handcuff"
+ M.requests += O
+ spawn( 0 )
+ playsound(src.loc, 'handcuffs.ogg', 30, 1, -2)
+ O.process()
+ return
return
@@ -228,11 +231,8 @@
return
/obj/effect/manifest/proc/manifest()
- var/dat = "Crew Manifest:
"
- for(var/mob/living/carbon/human/M in world)
- dat += text(" [] - []
", M.name, M.get_assignment())
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
- P.info = dat
+ P.info = "Crew Manifest:
" + data_core.get_manifest()
P.name = "paper - 'Crew Manifest'"
//SN src = null
del(src)
@@ -500,4 +500,4 @@
if(exposed_temperature >= 373.15)
for(var/mob/M in viewers(5, src))
M << "\red \the [src] burns up."
- del(src)
\ No newline at end of file
+ del(src)
diff --git a/code/game/objects/items/clothing.dm b/code/game/objects/items/clothing.dm
index cd62e7f3961..82332e2287b 100644
--- a/code/game/objects/items/clothing.dm
+++ b/code/game/objects/items/clothing.dm
@@ -266,6 +266,7 @@ THERMAL GLASSES
src.flags &= ~HEADCOVERSEYES
icon_state = "weldingup"
usr << "You push the mask up out of your face."
+ usr.update_clothing()
/obj/item/clothing/shoes/magboots/verb/toggle()
set name = "Toggle Magboots"
@@ -304,6 +305,7 @@ THERMAL GLASSES
usr << "You unbutton the suit jacket."
else
usr << "Sorry! The suit you're wearing doesn't have buttons!"
+ usr.update_clothing()
/obj/item/clothing/suit/storage/labcoat/verb/toggle()
set name = "Toggle Labcoat Buttons"
@@ -365,6 +367,7 @@ THERMAL GLASSES
else
usr << "Sorry! The suit you're wearing doesn't have buttons!"
+ usr.update_clothing()
/obj/item/clothing/head/ushanka/attack_self(mob/user as mob)
if(src.icon_state == "ushankadown")
diff --git a/code/game/objects/items/food.dm b/code/game/objects/items/food.dm
index 37d0b54cf0c..8639893257c 100644
--- a/code/game/objects/items/food.dm
+++ b/code/game/objects/items/food.dm
@@ -36,16 +36,17 @@ 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 (usr.hand)
- if (!( usr.l_hand ))
- spawn( 0 )
- src.attack_hand(usr, 1, 1)
- return
- else
- if (!( usr.r_hand ))
- spawn( 0 )
- src.attack_hand(usr, 0, 1)
- return
+ if(ishuman(user))
+ if (usr.hand)
+ if (!( usr.l_hand ))
+ spawn( 0 )
+ src.attack_hand(usr, 1, 1)
+ return
+ else
+ if (!( usr.r_hand ))
+ spawn( 0 )
+ src.attack_hand(usr, 0, 1)
+ return
return
/obj/item/kitchen/donut_box/attack_paw(mob/user as mob)
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 0cd654e7ba7..a124ad211d0 100755
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -105,6 +105,7 @@
var/turf/Z = get_turf(src)
message_admins("\red ERROR: [src] at [Z.x], [Z.y], [Z.z] is missing it's blood_DNA list!")
log_game("\red ERROR: [src] at [Z.x], [Z.y], [Z.z] is missing it's blood_DNA list!")
+ blood_DNA = list()
return
usr << text("This is a []\icon[][]. It is a [] item.", !src.blood_DNA.len ? "" : "bloody ",src, src.name, t)
if(src.desc)
@@ -118,6 +119,14 @@
if (M.s_active == src.loc)
if (M.client)
M.client.screen -= src
+ if(istype(src.loc, /obj/item/weapon/storage/backpack/santabag))
+ if(src.loc.contents.len < 5)
+ src.loc.icon_state = "giftbag0"
+ else if(src.loc.contents.len >= 5 && src.loc.contents.len < 15)
+ src.loc.icon_state = "giftbag1"
+ else if(src.loc.contents.len >= 15)
+ src.loc.icon_state = "giftbag2"
+
src.throwing = 0
if (src.loc == user)
//canremove==0 means that object may not be removed. You can still wear it. This only applies to clothing. /N
@@ -200,54 +209,10 @@
user.update_clothing()
return
+
/obj/item/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/device/detective_scanner))
return
- if (istype(W, /obj/item/weapon/packageWrap))
- var/location = get_turf(src.loc)
- if(istype(src,/obj/item/weapon/storage) && istype(src.loc, /mob)) //Put it into the bag
- return
- if(istype(src.loc,/obj/item/weapon/storage)) //Taking stuff out of storage duplicates it.
- var/obj/item/weapon/storage/U = src.loc
- user.client.screen -= src //Fixed!
- U.contents.Remove(src)
- if(istype(src.loc,/obj/item/clothing/suit/storage/))
- var/obj/item/clothing/suit/storage/X = src.loc
- user.client.screen -= src
- X.contents.Remove(src)
- if(src in user)
- user.remove_from_mob(src)
- var/obj/item/weapon/packageWrap/O = W
- if (O.amount > 1)
- var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(location)
- P.wrapped = src
- src.loc = P
- O.amount -= 1
- else if(istype(W,/obj/item/wardrobe))
- if(src in user)
- return
- if(!istype(src.loc,/turf))
- user << "It's got to be on the ground to do that!"
- return
- var/obj/item/wardrobe/I = W
- var/could_fill = 1
- for (var/obj/O in locate(src.x,src.y,src.z))
- if (I.contents.len < 20)
- if(istype(O,/obj/item/wardrobe))
- continue
- if(O.anchored || O.density || istype(O,/obj/structure))
- continue
- I.contents += O;
- else
- could_fill = 0
- break
-
- if(could_fill)
- user << "\blue You pick up all the items."
- else
- user << "\blue You try to pick up all of the items, but run out of space in the bag."
- user.visible_message("\blue [user] gathers up[could_fill ? " " : " most of "]the pile of items and puts it into the [W].")
- I.update_icon()
/obj/item/attack_self(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 fbd2e010a2c..a0aab9d9c1b 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -117,10 +117,10 @@ ZIPPO
icon_butt = "cigbutt"
lastHolder = null
smoketime = 300
+ var/butt_count = 5 //count of butt sprite variations
proc
light(var/flavor_text = "[usr] lights the [name].")
-
attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if(istype(W, /obj/item/weapon/weldingtool) && W:welding)
@@ -151,7 +151,7 @@ ZIPPO
if(src.smoketime < 1)
src.lit = -1
src.damtype = "brute"
- src.icon_state = icon_butt
+ 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"
@@ -171,14 +171,13 @@ ZIPPO
O.show_message(text("\red [] calmly drops and treads on the lit [], putting it out instantly.", user,src.name), 1)
src.lit = -1
src.damtype = "brute"
- src.icon_state = icon_butt
+ 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"
return ..()
-
////////////
// CIGARS //
////////////
@@ -192,6 +191,7 @@ ZIPPO
throw_speed = 0.5
item_state = "cigaroff"
smoketime = 1500
+ butt_count = 0
/obj/item/clothing/mask/cigarette/cigar/cohiba
name = "Cohiba Cigar"
@@ -199,7 +199,6 @@ ZIPPO
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
- icon_butt = "cigarbutt"
/obj/item/clothing/mask/cigarette/cigar/havanian
name = "Premium Havanian Cigar"
@@ -207,7 +206,6 @@ ZIPPO
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
- icon_butt = "cigarbutt"
smoketime = 7200
/obj/item/weapon/cigbutt
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 328953f011f..37f7ac4086c 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -52,6 +52,8 @@
uses--
spawn(0)//this prevents the collapse of space-time continuum
+ spawn(5)
+ usr.update_clothing()
del(src)
return uses
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index 161fcab6d3f..b634e20692f 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -20,7 +20,7 @@
-
+