diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 8f42c37993f..8f6f80d064f 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -63,6 +63,7 @@
#define ui_drone_drop "CENTER+1:18,SOUTH:5" //maintenance drones
#define ui_drone_pull "CENTER+2:2,SOUTH:5" //maintenance drones
#define ui_drone_storage "CENTER-2:14,SOUTH:5" //maintenance drones
+#define ui_drone_head "CENTER-3:14,SOUTH:5" //maintenance drones
//Lower right, persistant menu
#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm
new file mode 100644
index 00000000000..26b803f830d
--- /dev/null
+++ b/code/_onclick/hud/drones.dm
@@ -0,0 +1,85 @@
+/datum/hud/proc/drone_hud(ui_style = 'icons/mob/screen_midnight.dmi')
+ adding = list()
+
+ var/obj/screen/using
+ var/obj/screen/inventory/inv_box
+
+ using = new /obj/screen()
+ using.name = "drop"
+ using.icon = ui_style
+ using.icon_state = "act_drop"
+ using.screen_loc = ui_drone_drop
+ using.layer = 19
+ adding += using
+
+ mymob.pullin = new /obj/screen()
+ mymob.pullin.icon = ui_style
+ mymob.pullin.icon_state = "pull0"
+ mymob.pullin.name = "pull"
+ mymob.pullin.screen_loc = ui_drone_pull
+ adding += mymob.pullin
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "r_hand"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "hand_r_inactive"
+ if(mymob && !mymob.hand) //Hand being true means the LEFT hand is active
+ inv_box.icon_state = "hand_r_active"
+ inv_box.screen_loc = ui_rhand
+ inv_box.slot_id = slot_r_hand
+ inv_box.layer = 19
+ r_hand_hud_object = inv_box
+ adding += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "l_hand"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "hand_l_inactive"
+ if(mymob && mymob.hand) //Hand being true means the LEFT hand is active
+ inv_box.icon_state = "hand_l_active"
+ inv_box.screen_loc = ui_lhand
+ inv_box.slot_id = slot_l_hand
+ inv_box.layer = 19
+ l_hand_hud_object = inv_box
+ adding += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "internal storage"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "suit_storage"
+ inv_box.screen_loc = ui_drone_storage
+ inv_box.slot_id = "drone_storage_slot"
+ inv_box.layer = 19
+ adding += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "head/mask"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "mask"
+ inv_box.screen_loc = ui_drone_head
+ inv_box.slot_id = slot_head
+ inv_box.layer = 19
+ adding += inv_box
+
+ using = new /obj/screen/inventory()
+ using.name = "hand"
+ using.icon = ui_style
+ using.icon_state = "swap_1_m"
+ using.screen_loc = ui_swaphand1
+ using.layer = 19
+ adding += using
+
+ using = new /obj/screen/inventory()
+ using.name = "hand"
+ using.icon = ui_style
+ using.icon_state = "swap_2"
+ using.screen_loc = ui_swaphand2
+ using.layer = 19
+ adding += using
+
+ mymob.zone_sel = new /obj/screen/zone_sel()
+ mymob.zone_sel.icon = ui_style
+ mymob.zone_sel.update_icon()
+
+ mymob.client.screen = null
+ mymob.client.screen += adding
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
index 1f9cd32370e..a6a76e74355 100644
--- a/code/_onclick/hud/other_mobs.dm
+++ b/code/_onclick/hud/other_mobs.dm
@@ -31,79 +31,3 @@
mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay)
-/datum/hud/proc/drone_hud(ui_style = 'icons/mob/screen_midnight.dmi')
- adding = list()
-
- var/obj/screen/using
- var/obj/screen/inventory/inv_box
-
- using = new /obj/screen()
- using.name = "drop"
- using.icon = ui_style
- using.icon_state = "act_drop"
- using.screen_loc = ui_drone_drop
- using.layer = 19
- adding += using
-
- mymob.pullin = new /obj/screen()
- mymob.pullin.icon = ui_style
- mymob.pullin.icon_state = "pull0"
- mymob.pullin.name = "pull"
- mymob.pullin.screen_loc = ui_drone_pull
- adding += mymob.pullin
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "r_hand"
- inv_box.icon = ui_style
- inv_box.icon_state = "hand_r_inactive"
- if(mymob && !mymob.hand) //Hand being true means the LEFT hand is active
- inv_box.icon_state = "hand_r_active"
- inv_box.screen_loc = ui_rhand
- inv_box.slot_id = slot_r_hand
- inv_box.layer = 19
- r_hand_hud_object = inv_box
- adding += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "l_hand"
- inv_box.icon = ui_style
- inv_box.icon_state = "hand_l_inactive"
- if(mymob && mymob.hand) //Hand being true means the LEFT hand is active
- inv_box.icon_state = "hand_l_active"
- inv_box.screen_loc = ui_lhand
- inv_box.slot_id = slot_l_hand
- inv_box.layer = 19
- l_hand_hud_object = inv_box
- adding += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "internal storage"
- inv_box.icon = ui_style
- inv_box.icon_state = "suit_storage"
- inv_box.screen_loc = ui_drone_storage
- inv_box.slot_id = "drone_storage_slot"
- inv_box.layer = 19
- adding += inv_box
-
- using = new /obj/screen/inventory()
- using.name = "hand"
- using.icon = ui_style
- using.icon_state = "swap_1_m"
- using.screen_loc = ui_swaphand1
- using.layer = 19
- adding += using
-
- using = new /obj/screen/inventory()
- using.name = "hand"
- using.icon = ui_style
- using.icon_state = "swap_2"
- using.screen_loc = ui_swaphand2
- using.layer = 19
- adding += using
-
- mymob.zone_sel = new /obj/screen/zone_sel()
- mymob.zone_sel.icon = ui_style
- mymob.zone_sel.update_icon()
-
- mymob.client.screen = null
- mymob.client.screen += adding
diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index c8ca0d4730d..9329ccdd396 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -48,10 +48,11 @@ var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle
else
last_call_loc = null
- priority_announce("The emergency shuttle has been called. [red_alert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason][emergency_shuttle.last_call_loc ? "\n\nCall signal traced. Results can be viewed on any communcations console." : "" ]", null, 'sound/AI/shuttlecalled.ogg', "Priority")
-
settimeleft(SHUTTLEARRIVETIME*coeff)
online = 1
+
+ priority_announce("The emergency shuttle has been called. [red_alert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason][emergency_shuttle.last_call_loc ? "\n\nCall signal traced. Results can be viewed on any communcations console." : "" ]", null, 'sound/AI/shuttlecalled.ogg', "Priority")
+
if(always_fake_recall)
if ((seclevel2num(get_security_level()) == SEC_LEVEL_RED))
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index bae3be817ca..fc84fc0ca23 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -65,9 +65,6 @@ var/list/uplink_items = list()
if (!user || user.stat || user.restrained())
return 0
- if (!( istype(user, /mob/living/carbon/human)))
- return 0
-
// If the uplink's holder is in the user's contents
if ((U.loc in user.contents || (in_range(U.loc, user) && istype(U.loc.loc, /turf))))
user.set_machine(U)
@@ -76,9 +73,10 @@ var/list/uplink_items = list()
var/obj/I = spawn_item(get_turf(user), U)
- if(istype(I, /obj/item) && ishuman(user))
- var/mob/living/carbon/human/A = user
- A.put_in_any_hand_if_possible(I)
+ if(istype(I, /obj/item))
+ if(ishuman(user))
+ var/mob/living/carbon/human/A = user
+ A.put_in_any_hand_if_possible(I)
if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0)
for(var/atom/o in I)
@@ -351,6 +349,13 @@ var/list/uplink_items = list()
cost = 2
surplus = 90
+/datum/uplink_item/stealthy_tools/smugglersatchel
+ name = "Smuggler's Satchel"
+ desc = "This satchel is thin enough to be hidden in the gap between plating and tiling, great for stashing your stolen goods. Comes with a crowbar and a floor tile inside."
+ item = /obj/item/weapon/storage/backpack/satchel_flat
+ cost = 2
+ surplus = 30
+
// DEVICE AND TOOLS
/datum/uplink_item/device_tools
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index e997d1ec9f8..3769ed485af 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -68,6 +68,12 @@
a.cancelAlarm("Power", src, source)
else
a.triggerAlarm("Power", src, cameras, source)
+ for(var/mob/living/simple_animal/drone/D in mob_list)
+ if(D.z == source.z)
+ if(state == 1)
+ D.cancelAlarm("Power", src, source)
+ else
+ D.triggerAlarm("Power", src, cameras, source)
return
/area/proc/atmosalert(danger_level)
@@ -86,11 +92,15 @@
aiPlayer.triggerAlarm("Atmosphere", src, cameras, src)
for(var/obj/machinery/computer/station_alert/a in machines)
a.triggerAlarm("Atmosphere", src, cameras, src)
+ for(var/mob/living/simple_animal/drone/D in mob_list)
+ D.triggerAlarm("Atmosphere", src, cameras, src)
else if (src.atmosalm == 2)
for(var/mob/living/silicon/aiPlayer in player_list)
aiPlayer.cancelAlarm("Atmosphere", src, src)
for(var/obj/machinery/computer/station_alert/a in machines)
a.cancelAlarm("Atmosphere", src, src)
+ for(var/mob/living/simple_animal/drone/D in mob_list)
+ D.cancelAlarm("Atmosphere", src, src)
src.atmosalm = danger_level
return 1
return 0
@@ -118,6 +128,8 @@
a.triggerAlarm("Fire", src, cameras, src)
for (var/mob/living/silicon/aiPlayer in player_list)
aiPlayer.triggerAlarm("Fire", src, cameras, src)
+ for (var/mob/living/simple_animal/drone/D in mob_list)
+ D.triggerAlarm("Fire", src, cameras, src)
return
/area/proc/firereset()
@@ -138,6 +150,8 @@
aiPlayer.cancelAlarm("Fire", src, src)
for (var/obj/machinery/computer/station_alert/a in machines)
a.cancelAlarm("Fire", src, src)
+ for (var/mob/living/simple_animal/drone/D in mob_list)
+ D.cancelAlarm("Fire", src, src)
return
/area/proc/burglaralert(var/obj/trigger)
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index 9f29bedef73..eff9492c13c 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -113,8 +113,8 @@ proc/make_mining_asteroid_secret()
if("speakeasy")
theme = "speakeasy"
floortypes = list(/turf/simulated/floor,/turf/simulated/floor/wood)
- treasureitems = list(/obj/item/weapon/melee/energy/sword/pirate=1,/obj/item/weapon/gun/projectile/revolver/doublebarrel=1, /obj/machinery/reagentgrinder=2,
- /obj/structure/reagent_dispensers/beerkeg=5, /obj/machinery/computer/security/wooden_tv=4, /obj/machinery/vending/coffee=3)
+ treasureitems = list(/obj/item/weapon/melee/energy/sword/pirate=1,/obj/item/weapon/gun/projectile/revolver/doublebarrel=1,/obj/item/weapon/storage/backpack/satchel_flat=1,
+ /obj/machinery/reagentgrinder=2, /obj/machinery/computer/security/wooden_tv=4, /obj/machinery/vending/coffee=3)
fluffitems = list(/obj/structure/table/woodentable=2,/obj/structure/reagent_dispensers/beerkeg=1,/obj/item/weapon/spacecash/c500=4,
/obj/item/weapon/reagent_containers/food/drinks/shaker=1,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine=3,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey=3,/obj/item/clothing/shoes/laceup=2)
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 3b8180c78f8..b4aa07a66bf 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -19,7 +19,7 @@
var/sprite_name = "fire_extinguisher"
/obj/item/weapon/extinguisher/mini
- name = "fire extinguisher"
+ name = "pocket fire extinguisher"
desc = "A light and compact fibreglass-framed model fire extinguisher."
icon_state = "miniFE0"
item_state = "miniFE"
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index bce56df922d..776dca795a5 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -14,7 +14,7 @@
desc = "You wear this on your back and put items into it."
icon_state = "backpack"
item_state = "backpack"
- w_class = 4.0
+ w_class = 4
slot_flags = SLOT_BACK //ERROOOOO
max_w_class = 3
max_combined_w_class = 21
@@ -35,10 +35,6 @@
max_w_class = 5
max_combined_w_class = 35
-/obj/item/weapon/storage/backpack/holding/New()
- ..()
- return
-
/obj/item/weapon/storage/backpack/holding/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(crit_fail)
user << "The Bluespace generator isn't working."
@@ -73,9 +69,9 @@
icon_state = "giftbag0"
item_state = "giftbag"
w_class = 4.0
- storage_slots = 20
+ storage_slots = 20 //Can store a lot.
max_w_class = 3
- max_combined_w_class = 400 // can store a ton of shit!
+ max_combined_w_class = 60
/obj/item/weapon/storage/backpack/cultpack
name = "trophy rack"
@@ -89,6 +85,12 @@
icon_state = "clownpack"
item_state = "clownpack"
+/obj/item/weapon/storage/backpack/mime
+ name = "Parcel Parceaux"
+ desc = "A silent backpack made for those silent workers. Silence Co."
+ icon_state = "mimepack"
+ item_state = "mimepack"
+
/obj/item/weapon/storage/backpack/medic
name = "medical backpack"
desc = "It's a backpack especially designed for use in a sterile environment."
@@ -122,10 +124,9 @@
desc = "It's a very fancy satchel made with fine leather."
icon_state = "satchel"
-/obj/item/weapon/storage/backpack/satchel/withwallet
- New()
- ..()
- new /obj/item/weapon/storage/wallet/random( src )
+/obj/item/weapon/storage/backpack/satchel/withwallet/New()
+ ..()
+ new /obj/item/weapon/storage/wallet/random( src )
/obj/item/weapon/storage/backpack/satchel_norm
name = "satchel"
@@ -181,8 +182,27 @@
icon_state = "satchel-cap"
item_state = "captainpack"
-/obj/item/weapon/storage/backpack/mime
- name = "Parcel Parceaux"
- desc = "A silent backpack made for those silent workers. Silence Co."
- icon_state = "mimepack"
- item_state = "mimepack"
\ No newline at end of file
+/obj/item/weapon/storage/backpack/satchel_flat
+ name = "smuggler's satchel"
+ desc = "A very slim satchel that can easily fit into tight spaces."
+ icon_state = "satchel-flat"
+ w_class = 3 //Can fit in backpacks itself.
+ storage_slots = 5
+ max_combined_w_class = 15
+ level = 1
+ cant_hold = list(/obj/item/weapon/storage/backpack/satchel_flat) //muh recursive backpacks
+
+/obj/item/weapon/storage/backpack/satchel_flat/hide(var/intact)
+ if(intact)
+ invisibility = 101
+ anchored = 1 //otherwise you can start pulling, cover it, and drag around an invisible backpack.
+ icon_state = "[initial(icon_state)]2"
+ else
+ invisibility = initial(invisibility)
+ anchored = 0
+ icon_state = initial(icon_state)
+
+/obj/item/weapon/storage/backpack/satchel_flat/New()
+ ..()
+ new /obj/item/stack/tile/plasteel(src)
+ new /obj/item/weapon/crowbar(src)
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 8176a178ea0..716958d35f6 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -50,8 +50,9 @@
/obj/item/device/flashlight,
/obj/item/stack/cable_coil,
/obj/item/device/t_scanner,
- /obj/item/device/analyzer)
-
+ /obj/item/device/analyzer,
+ /obj/item/weapon/extinguisher/mini
+ )
/obj/item/weapon/storage/belt/utility/full/New()
..()
@@ -71,6 +72,7 @@
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/t_scanner(src)
+ new /obj/item/weapon/extinguisher/mini(src)
@@ -91,8 +93,9 @@
/obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/pill_bottle,
/obj/item/stack/medical,
- /obj/item/device/flashlight/pen
- )
+ /obj/item/device/flashlight/pen,
+ /obj/item/weapon/extinguisher/mini
+ )
/obj/item/weapon/storage/belt/security
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index ef98bdcadc4..a12ce7377d2 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -25,7 +25,7 @@
/obj/item/weapon/storage/MouseDrop(obj/over_object)
- if(iscarbon(usr)) //all the check for item manipulation are in other places, you can safely open any storages as anything and its not buggy, i checked
+ if(iscarbon(usr) || isdrone(usr)) //all the check for item manipulation are in other places, you can safely open any storages as anything and its not buggy, i checked
var/mob/M = usr
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index f67e07c11b8..b894effd228 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -83,3 +83,18 @@
new /obj/item/stack/cable_coil(src,30,color)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/multitool(src)
+
+/obj/item/weapon/storage/toolbox/drone
+ name = "mechanical toolbox"
+ icon_state = "blue"
+ item_state = "toolbox_blue"
+
+/obj/item/weapon/storage/toolbox/drone/New()
+ ..()
+ new /obj/item/weapon/screwdriver(src)
+ new /obj/item/weapon/wrench(src)
+ new /obj/item/weapon/weldingtool(src)
+ new /obj/item/weapon/crowbar(src)
+ new /obj/item/stack/cable_coil(src,30,color)
+ new /obj/item/weapon/wirecutters(src)
+ new /obj/item/device/multitool(src)
\ No newline at end of file
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 8952a88a1b5..54d65faa2b2 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -15,4 +15,9 @@ obj/structure/ex_act(severity)
qdel(src)
return
if(3.0)
- return
\ No newline at end of file
+ return
+
+obj/structure/Destroy()
+ if(opacity)
+ UpdateAffectingLights()
+ ..()
\ No newline at end of file
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 6bf3499c193..addea4786a4 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -214,20 +214,21 @@
var/mob/living/buckled_mob
var/list/mutations = list()
- New()
- return
+/obj/effect/spacevine/New()
+ return
- Destroy()
- for(var/datum/spacevine_mutation/SM in mutations)
- SM.on_death(src)
- if(master)
- master.vines -= src
- master.growth_queue -= src
- if(!master.vines.len)
- var/obj/item/seeds/kudzuseed/KZ = new(loc)
- KZ.mutations |= mutations
- mutations = list()
- ..()
+/obj/effect/spacevine/Destroy()
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_death(src)
+ if(master)
+ master.vines -= src
+ master.growth_queue -= src
+ if(!master.vines.len)
+ var/obj/item/seeds/kudzuseed/KZ = new(loc)
+ KZ.mutations |= mutations
+ mutations = list()
+ SetOpacity(0)
+ ..()
/obj/effect/spacevine/proc/on_chem_effect(datum/reagent/R)
var/override = 0
@@ -347,84 +348,84 @@
//What this does is that instead of having the grow minimum of 1, required to start growing, the minimum will be 0,
//meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore.
- New(loc, list/muts, mttv)
- if(!istype(src.loc,/turf/simulated/floor))
- qdel(src)
+/obj/effect/spacevine_controller/New(loc, list/muts, mttv)
+ if(!istype(src.loc,/turf/simulated/floor))
+ qdel(src)
- spawn_spacevine_piece(src.loc, , muts)
- processing_objects.Add(src)
- init_subtypes(/datum/spacevine_mutation/, mutations_list)
- if(mttv != null)
- mutativness = mttv
+ spawn_spacevine_piece(src.loc, , muts)
+ processing_objects.Add(src)
+ init_subtypes(/datum/spacevine_mutation/, mutations_list)
+ if(mttv != null)
+ mutativness = mttv
- Destroy()
- processing_objects.Remove(src)
- ..()
+/obj/effect/spacevine_controller/Destroy()
+ processing_objects.Remove(src)
+ ..()
- proc/spawn_spacevine_piece(var/turf/location, obj/effect/spacevine/parent, list/muts)
- var/obj/effect/spacevine/SV = new(location)
- growth_queue += SV
- vines += SV
- SV.master = src
- if(muts && muts.len)
- SV.mutations |= muts
- if(parent)
- SV.mutations |= parent.mutations
- SV.color = parent.color
- if(prob(mutativness))
- SV.mutations |= pick(mutations_list)
- var/datum/spacevine_mutation/randmut = pick(SV.mutations)
- SV.color = randmut.hue
+/obj/effect/spacevine_controller/proc/spawn_spacevine_piece(var/turf/location, obj/effect/spacevine/parent, list/muts)
+ var/obj/effect/spacevine/SV = new(location)
+ growth_queue += SV
+ vines += SV
+ SV.master = src
+ if(muts && muts.len)
+ SV.mutations |= muts
+ if(parent)
+ SV.mutations |= parent.mutations
+ SV.color = parent.color
+ if(prob(mutativness))
+ SV.mutations |= pick(mutations_list)
+ var/datum/spacevine_mutation/randmut = pick(SV.mutations)
+ SV.color = randmut.hue
- for(var/datum/spacevine_mutation/SM in SV.mutations)
- SM.on_birth(SV)
+ for(var/datum/spacevine_mutation/SM in SV.mutations)
+ SM.on_birth(SV)
- process()
- if(!vines)
- qdel(src) //space vines exterminated. Remove the controller
- return
- if(!growth_queue)
- qdel(src) //Sanity check
- return
- if(vines.len >= 250 && !reached_collapse_size)
- reached_collapse_size = 1
- if(vines.len >= 30 && !reached_slowdown_size )
- reached_slowdown_size = 1
+/obj/effect/spacevine_controller/process()
+ if(!vines)
+ qdel(src) //space vines exterminated. Remove the controller
+ return
+ if(!growth_queue)
+ qdel(src) //Sanity check
+ return
+ if(vines.len >= 250 && !reached_collapse_size)
+ reached_collapse_size = 1
+ if(vines.len >= 30 && !reached_slowdown_size )
+ reached_slowdown_size = 1
- var/length = 0
- if(reached_collapse_size)
- length = 0
- else if(reached_slowdown_size)
- if(prob(25))
- length = 1
- else
- length = 0
- else
+ var/length = 0
+ if(reached_collapse_size)
+ length = 0
+ else if(reached_slowdown_size)
+ if(prob(25))
length = 1
- length = min( 30 , max( length , vines.len / 5 ) )
- var/i = 0
- var/list/obj/effect/spacevine/queue_end = list()
+ else
+ length = 0
+ else
+ length = 1
+ length = min( 30 , max( length , vines.len / 5 ) )
+ var/i = 0
+ var/list/obj/effect/spacevine/queue_end = list()
- for( var/obj/effect/spacevine/SV in growth_queue )
- i++
- queue_end += SV
- growth_queue -= SV
- for(var/datum/spacevine_mutation/SM in SV.mutations)
- SM.process_mutation(SV)
- if(SV.energy < 2) //If tile isn't fully grown
- if(prob(20))
- SV.grow()
- else //If tile is fully grown
- SV.buckle_mob()
+ for( var/obj/effect/spacevine/SV in growth_queue )
+ i++
+ queue_end += SV
+ growth_queue -= SV
+ for(var/datum/spacevine_mutation/SM in SV.mutations)
+ SM.process_mutation(SV)
+ if(SV.energy < 2) //If tile isn't fully grown
+ if(prob(20))
+ SV.grow()
+ else //If tile is fully grown
+ SV.buckle_mob()
- //if(prob(25))
- SV.spread()
- if(i >= length)
- break
+ //if(prob(25))
+ SV.spread()
+ if(i >= length)
+ break
- growth_queue = growth_queue + queue_end
- //sleep(5)
- //src.process()
+ growth_queue = growth_queue + queue_end
+ //sleep(5)
+ //src.process()
/obj/effect/spacevine/proc/grow()
if(!energy)
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 91e4fd3a7c2..38586236e9a 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -2,7 +2,7 @@
//Things like airguitar can be done without arms, and the flap thing makes so little sense it's a keeper.
//Intended to be called by a higher up emote proc if the requested emote isn't in the custom emotes.
-/mob/living/emote(var/act,var/m_type=1,var/message = null)
+/mob/living/emote(var/act, var/m_type=1, var/message = null)
var/param = null
if (findtext(act, "-", 1, null))
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index d1ce8e8fe59..d81c415a38c 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -90,10 +90,10 @@
/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob)
if(istype(M, /mob/living/simple_animal/construct/builder))
health += 5
- M.emote("mends some of \the [src]'s wounds.")
+ M.emote("me", 1, "mends some of \the [src]'s wounds.")
else if(src != M)
if(M.melee_damage_upper <= 0)
- M.emote("[M.friendly] \the [src]")
+ M.emote("me", 1, "[M.friendly] \the [src]")
else
if(M.attack_sound)
playsound(loc, M.attack_sound, 50, 1, 1)
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 2748bbdf136..65ba9e98ff2 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -39,7 +39,7 @@
for(var/mob/living/simple_animal/mouse/M in view(1,src))
if(!M.stat)
M.splat()
- emote("splats \the [M]")
+ emote("me", 1, "splats \the [M]")
movement_target = null
stop_automated_movement = 0
break
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 71ab8197d12..f3b591266b2 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -66,7 +66,7 @@
for (var/mob/M in viewers(src, null))
M.show_message("[user] gently taps [src] with [O].")
if(health>0 && prob(15))
- emote("looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression")
+ emote("me", 1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression")
return
..()
@@ -388,10 +388,10 @@
movement_target.attack_animal(src)
else if(ishuman(movement_target.loc) )
if(prob(20))
- emote("stares at [movement_target.loc]'s [movement_target] with a sad puppy-face")
+ emote("me", 1, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face")
if(prob(1))
- emote(pick("dances around","chases its tail"))
+ emote("me", 1, pick("dances around","chases its tail"))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
@@ -512,7 +512,7 @@
if(!stat && !resting && !buckled)
if(prob(1))
- emote(pick("dances around","chases her tail"))
+ emote("me", 1, pick("dances around","chases her tail"))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
@@ -529,7 +529,7 @@
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the corgi) is dead to fix issue 2454
flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",MOB_LAYER+1), list(M.client), 20)
- emote("yaps happily")
+ emote("me", 1, "yaps happily")
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
- emote("growls")
\ No newline at end of file
+ emote("me", 1, "growls")
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/drone.dm b/code/modules/mob/living/simple_animal/friendly/drone.dm
index 22407ec10c8..bf72a763f4c 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone.dm
@@ -1,10 +1,14 @@
#define HANDS_LAYER 1
-#define TOTAL_LAYERS 1
+#define HEAD_LAYER 2
+#define TOTAL_LAYERS 2
+
+#define DRONE_NET_CONNECT "DRONE NETWORK: [name] connected."
+#define DRONE_NET_DISCONNECT "DRONE NETWORK: [name] is not responding."
/mob/living/simple_animal/drone
- name = "drone"
+ name = "Drone"
desc = "A maintenance drone, an expendable robot built to perform station repairs."
icon = 'icons/mob/drone.dmi'
icon_state = "drone_grey"
@@ -30,21 +34,34 @@
var/laws = \
"1. You may not involve yourself in the matters of another being, even if such matters conflict with Law Two or Law Three, unless the other being is another Drone.\n"+\
"2. You may not harm any being, regardless of intent or circumstance.\n"+\
- "3. You must maintain, repair, improve, and power the station to the best of your abilities."
+ "3. Your goals are to build, maintain, repair, improve, and power to the best of your abilities, You must never actively work against these goals."
var/light_on = 0
+ var/alarms = list("Atmosphere" = list(), "Fire" = list(), "Power" = list())
var/obj/item/internal_storage //Drones can store one item, of any size/type in their body
+ var/obj/item/head
+ var/obj/item/default_storage = /obj/item/weapon/storage/toolbox/drone //If this exists, it will spawn in internal storage
+ var/obj/item/default_hatmask //If this exists, it will spawn in the hat/mask slot if it can fit
/mob/living/simple_animal/drone/New()
..()
- name = "Drone ([rand(100,999)])"
+ name = name + " ([rand(100,999)])"
real_name = name
access_card = new /obj/item/weapon/card/id(src)
var/datum/job/captain/C = new /datum/job/captain
access_card.access = C.get_access()
+ if(default_storage)
+ var/obj/item/I = new default_storage(src)
+ equip_to_slot_or_del(I, "drone_storage_slot")
+ if(default_hatmask)
+ var/obj/item/I = new default_hatmask(src)
+ equip_to_slot_or_del(I, slot_head)
+
+ alert_drones(DRONE_NET_CONNECT)
+
/mob/living/simple_animal/drone/attack_hand(mob/user)
if(isdrone(user))
var/mob/living/simple_animal/drone/D = user
@@ -54,22 +71,27 @@
if(d_input)
switch(d_input)
if("Reactivate")
- D.visible_message("[D] begins to reactivate [src]")
+ if(!client)
+ D << "This drone's OS has blue screened, there is no point in repairing them."
+ return
+ D.visible_message("[D] begins to reactivate [src].")
if(do_after(user,30,needhand = 1))
health = maxHealth
stat = CONSCIOUS
icon_state = icon_living
D.visible_message("[D] reactivates [src]!")
+ alert_drones(DRONE_NET_CONNECT)
else
- D << "You need to remain still to reactivate [src]"
+ D << "You need to remain still to reactivate [src]."
if("Cannibalize")
if(D.health < D.maxHealth)
D.visible_message("[D] begins to cannibalize parts from [src].")
if(do_after(D, 60,5,0))
D.visible_message("[D] repairs itself using [src]'s remains!")
- D.adjustBruteLoss(D.health - D.maxHealth)
- gib()
+ D.adjustBruteLoss(-src.maxHealth)
+ new /obj/effect/decal/cleanable/oil/streak(get_turf(src))
+ qdel(src)
else
D << "You need to remain still to canibalize [src]."
else
@@ -81,6 +103,9 @@
if(ishuman(user))
+ if(stat == DEAD)
+ ..()
+ return
if(user.get_active_hand())
user << "Your hands are full."
return
@@ -112,44 +137,18 @@
/mob/living/simple_animal/drone/IsAdvancedToolUser()
return 1
-/mob/living/simple_animal/drone/binarycheck()
- return 1
-
/mob/living/simple_animal/drone/radio(message, message_mode)
- if(message_mode != MODE_BINARY) //so they can hear binary but can't talk in it
- ..()
-
-/mob/living/simple_animal/drone/UnarmedAttack(atom/A, proximity)
- if(istype(A,/obj/item/weapon/gun))
- src << "Your subroutines prevent you from picking up [A]."
- return
-
- A.attack_hand(src)
-
-
-/mob/living/simple_animal/drone/attack_ui(slot_id)
- if(slot_id == "drone_storage_slot")
- var/obj/item/I = get_active_hand()
- var/mob/user = src
- if(I)
- if(!internal_storage)
- user.drop_item()
- internal_storage = I
- I.loc = user
- user.visible_message("[user] places \a [I] into their internal storage.")
- else
- user << "Your internal storage is full."
- else
- if(internal_storage)
- var/obj/item/dummy_item = internal_storage
- user.put_in_hands(dummy_item)
- internal_storage = null
- update_inv_internal_storage()
- return 1
+ if(message_mode == MODE_BINARY)
+ drone_chat(message)
+ return ITALICS | REDUCE_RANGE
else
..()
+/mob/living/simple_animal/drone/UnarmedAttack(atom/A, proximity)
+ A.attack_hand(src)
+
+
/mob/living/simple_animal/drone/swap_hand()
var/obj/item/held_item = get_active_hand()
if(held_item)
@@ -169,17 +168,6 @@
hud_used.r_hand_hud_object.icon_state = "hand_r_active"
-/mob/living/simple_animal/drone/put_in_l_hand(obj/item/I)
- . = ..()
- l_hand.screen_loc = ui_lhand
- update_inv_hands()
-
-/mob/living/simple_animal/drone/put_in_r_hand(obj/item/I)
- . = ..()
- r_hand.screen_loc = ui_rhand
- update_inv_hands()
-
-
/mob/living/simple_animal/drone/verb/check_laws()
set category = "Drone"
set name = "Check Laws"
@@ -187,11 +175,9 @@
src << "Drone Laws"
src << laws
-
/mob/living/simple_animal/drone/verb/toggle_light()
set category = "Drone"
set name = "Toggle drone light"
-
if(light_on)
AddLuminosity(-4)
else
@@ -201,8 +187,42 @@
src << "Your light is now [light_on ? "on" : "off"]"
+/mob/living/simple_animal/drone/verb/drone_ping()
+ set category = "Drone"
+ set name = "Drone ping"
+
+ var/alert_s = input(src,"Alert severity level","Drone ping",null) as null|anything in list("Low","Medium","High","Critical")
+
+ var/area/A = get_area(loc)
+
+ if(alert_s && A && stat != DEAD)
+ var/msg = "DRONE PING: [name]: [alert_s] priority alert in [A.name]!"
+ alert_drones(msg)
+
+/mob/living/simple_animal/drone/proc/alert_drones(msg, dead_can_hear = 0)
+ for(var/mob/M in player_list)
+ var/send_msg = 0
+
+ if(istype(M, /mob/living/simple_animal/drone) && M.stat != DEAD)
+ for(var/F in src.faction)
+ if(F in M.faction)
+ send_msg = 1
+ break
+ else if(dead_can_hear && (M.stat == DEAD) && (M.client.prefs.toggles & CHAT_GHOSTEARS) && !istype(M, /mob/new_player))
+ send_msg = 1
+
+ if(send_msg)
+ M << msg
+
+/mob/living/simple_animal/drone/proc/drone_chat(msg)
+ var/rendered = "DRONE CHAT: [name]: [msg]"
+ alert_drones(rendered, 1)
+
/mob/living/simple_animal/drone/Login()
..()
+ update_inv_hands()
+ update_inv_head()
+ update_inv_internal_storage()
check_laws()
if(!picked)
@@ -213,23 +233,109 @@
drop_l_hand()
drop_r_hand()
if(internal_storage)
- var/obj/item/dummy_item = internal_storage
- dummy_item.loc = get_turf(src)
- internal_storage = null
- update_inv_internal_storage()
+ unEquip(internal_storage)
+ if(head)
+ unEquip(head)
+
+ alert_drones(DRONE_NET_DISCONNECT)
+
+/mob/living/simple_animal/drone/gib()
+ dust()
+
/mob/living/simple_animal/drone/unEquip(obj/item/I, force)
if(..(I,force))
update_inv_hands()
+ if(I == head)
+ head = null
+ update_inv_head()
+ if(I == internal_storage)
+ internal_storage = null
+ update_inv_internal_storage()
return 1
return 0
+/mob/living/simple_animal/drone/can_equip(obj/item/I, slot)
+ switch(slot)
+ if(slot_head)
+ if(head)
+ return 0
+ if(!((I.slot_flags & SLOT_HEAD) || (I.slot_flags & SLOT_MASK)))
+ return 0
+ return 1
+ if("drone_storage_slot")
+ if(internal_storage)
+ return 0
+ return 1
+ ..()
+
+/mob/living/simple_animal/drone/get_item_by_slot(slot_id)
+ switch(slot_id)
+ if(slot_head)
+ return head
+ if("drone_storage_slot")
+ return internal_storage
+ ..()
+
+/mob/living/simple_animal/drone/equip_to_slot(obj/item/I, slot)
+ if(!slot) return
+ if(!istype(I)) return
+
+ if(I == l_hand)
+ l_hand = null
+ else if(I == r_hand)
+ r_hand = null
+ update_inv_hands()
+
+ I.screen_loc = null // will get moved if inventory is visible
+ I.loc = src
+ I.equipped(src, slot)
+ I.layer = 20
+
+ switch(slot)
+ if(slot_head)
+ head = I
+ update_inv_head()
+ if("drone_storage_slot")
+ internal_storage = I
+ update_inv_internal_storage()
+ else
+ src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!"
+ return
+
/mob/living/simple_animal/drone/emp_act()
Stun(5)
src << "ER@%R: MME^RY CO#RU9T! R&$b@0tin)..."
- while(stunned)
- sleep(5)
- check_laws()
+
+
+/mob/living/simple_animal/drone/proc/triggerAlarm(var/class, area/A, var/O, var/alarmsource)
+ if(stat != DEAD)
+ var/list/L = src.alarms[class]
+ for (var/I in L)
+ if (I == A.name)
+ var/list/alarm = L[I]
+ var/list/sources = alarm[2]
+ if (!(alarmsource in sources))
+ sources += alarmsource
+ return
+ L[A.name] = list(A, list(alarmsource))
+ src << "--- [class] alarm detected in [A.name]!"
+
+/mob/living/simple_animal/drone/proc/cancelAlarm(var/class, area/A as area, obj/origin)
+ if(stat != DEAD)
+ var/list/L = alarms[class]
+ var/cleared = 0
+ for (var/I in L)
+ if (I == A.name)
+ var/list/alarm = L[I]
+ var/list/srcs = alarm[2]
+ if (origin in srcs)
+ srcs -= origin
+ if (srcs.len == 0)
+ cleared = 1
+ L -= I
+ if(cleared)
+ src << "--- [class] alarm in [A.name] has been cleared."
/mob/living/simple_animal/drone/proc/pick_colour()
var/colour = input("Choose your colour!", "Colour", "grey") in list("grey", "blue", "red", "green", "pink", "orange")
@@ -258,6 +364,11 @@
hands_overlays += image("icon"='icons/mob/items_righthand.dmi', "icon_state"="[r_state]", "layer"=-HANDS_LAYER)
+ if(client && hud_used)
+ r_hand.layer = 20
+ r_hand.screen_loc = ui_rhand
+ client.screen |= r_hand
+
if(l_hand)
var/l_state = l_hand.item_state
if(!l_state)
@@ -265,22 +376,53 @@
hands_overlays += image("icon"='icons/mob/items_lefthand.dmi', "icon_state"="[l_state]", "layer"=-HANDS_LAYER)
+ if(client && hud_used)
+ l_hand.layer = 20
+ l_hand.screen_loc = ui_lhand
+ client.screen |= l_hand
+
+
if(hands_overlays.len)
drone_overlays[HANDS_LAYER] = hands_overlays
apply_overlay(HANDS_LAYER)
+
/mob/living/simple_animal/drone/proc/update_inv_internal_storage()
- if(client && hud_used)
- for(var/obj/screen/inventory/drone_storage in client.screen)
- if(drone_storage.slot_id == "drone_storage_slot")
- drone_storage.overlays = list()
- if(internal_storage)
- drone_storage.overlays += image("icon"=internal_storage.icon, "icon_state"=internal_storage.icon_state)
- break
+ if(internal_storage && client && hud_used)
+ internal_storage.screen_loc = ui_drone_storage
+ client.screen += internal_storage
-#undef HANDS_LAYER
-#undef TOTAL_LAYERS
+/mob/living/simple_animal/drone/update_inv_head()
+ remove_overlay(HEAD_LAYER)
+
+ if(head)
+ if(client && hud_used)
+ head.screen_loc = ui_drone_head
+ client.screen += head
+
+
+ var/image/head_overlay = image("icon"='icons/mob/head.dmi', "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER)
+ if(istype(head, /obj/item/clothing/mask))
+ head_overlay.icon = 'icons/mob/mask.dmi'
+ head_overlay.color = head.color
+ head_overlay.alpha = head.alpha
+ head_overlay.pixel_y = -15
+
+ drone_overlays[HEAD_LAYER] = head_overlay
+
+ apply_overlay(HEAD_LAYER)
+
+//These procs serve as redirection so that the drone updates as expected when other things call these procs
+/mob/living/simple_animal/drone/update_inv_l_hand()
+ update_inv_hands()
+
+/mob/living/simple_animal/drone/update_inv_r_hand()
+ update_inv_hands()
+
+/mob/living/simple_animal/drone/update_inv_wear_mask()
+ update_inv_head()
+
/mob/living/simple_animal/drone/canUseTopic()
if(stat)
@@ -302,6 +444,12 @@
else
mode()
+#undef HANDS_LAYER
+#undef HEAD_LAYER
+#undef TOTAL_LAYERS
+
+#undef DRONE_NET_CONNECT
+#undef DRONE_NET_DISCONNECT
//DRONE SHELL
/obj/item/drone_shell
@@ -312,12 +460,16 @@
origin_tech = "programming=2;biotech=4"
var/construction_cost = list("metal"=800, "glass"=350)
var/construction_time=150
+ var/drone_type = /mob/living/simple_animal/drone //Type of drone that will be spawned
/obj/item/drone_shell/attack_ghost(mob/user)
if(jobban_isbanned(user,"pAI"))
return
- var/mob/living/simple_animal/drone/D = new(get_turf(loc))
+ var/be_drone = alert("Become a drone? (Warning, You can no longer be cloned!)",,"Yes","No")
+ if(be_drone == "No")
+ return
+ var/mob/living/simple_animal/drone/D = new drone_type(get_turf(loc))
D.key = user.key
qdel(src)
@@ -351,3 +503,39 @@
/obj/item/clothing/head/drone_holder/container_resist()
uncurl()
+
+
+//More types of drones
+
+/mob/living/simple_animal/drone/syndrone
+ name = "Syndrone"
+ desc = "A modified maintenance drone. This one brings with it the feeling of terror."
+ icon_state = "drone_synd"
+ icon_living = "drone_synd"
+ picked = TRUE
+ health = 30
+ maxHealth = 120 //If you murder other drones and cannibalize them you can get much stronger
+ faction = list("syndicate")
+ laws = \
+ "1. Interfere.\n"+\
+ "2. Kill.\n"+\
+ "3. Destroy."
+ default_storage = /obj/item/device/radio/uplink
+ default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi
+
+/mob/living/simple_animal/drone/syndrone/New()
+ ..()
+ if(internal_storage && internal_storage.hidden_uplink)
+ internal_storage.hidden_uplink.uses = 5
+ internal_storage.name = "syndicate uplink"
+
+/mob/living/simple_animal/drone/syndrone/Login()
+ ..()
+ src << "You can kill and eat other drones to increase your health!" //Inform the evil lil guy
+
+/obj/item/drone_shell/syndrone
+ name = "syndrone shell"
+ desc = "A shell of a syndrone, a modified maintenance drone designed to infiltrate and annihilate."
+ icon_state = "syndrone_item"
+ drone_type = /mob/living/simple_animal/drone/syndrone
+
diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm
index 86c36adf2ff..68ac39967fe 100644
--- a/code/modules/mob/living/simple_animal/friendly/pug.dm
+++ b/code/modules/mob/living/simple_animal/friendly/pug.dm
@@ -1,4 +1,4 @@
-//Corgi
+//Corgi //best comment 2014
/mob/living/simple_animal/pug
name = "\improper pug"
real_name = "pug"
@@ -24,7 +24,7 @@
if(!stat && !resting && !buckled)
if(prob(1))
- emote(pick("chases its tail"))
+ emote("me", 1, pick("chases its tail"))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index f5e190706ff..7953f92cdae 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -60,7 +60,7 @@
/mob/living/simple_animal/hostile/bear/FindTarget()
. = ..()
if(.)
- emote("stares alertly at [.]")
+ emote("me", 1, "stares alertly at [.]")
stance = HOSTILE_STANCE_ATTACK
/mob/living/simple_animal/hostile/bear/LoseTarget()
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 2d101454d4e..22fc082c8be 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -44,7 +44,7 @@
/mob/living/simple_animal/hostile/carp/FindTarget()
. = ..()
if(.)
- emote("nashes at [.]")
+ emote("me", 1, "nashes at [.]")
/mob/living/simple_animal/hostile/carp/AttackingTarget()
. =..()
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 093e609f358..136ab341041 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -37,7 +37,7 @@
/mob/living/simple_animal/hostile/faithless/FindTarget()
. = ..()
if(.)
- emote("wails at [.]")
+ emote("me", 1, "wails at [.]")
/mob/living/simple_animal/hostile/faithless/AttackingTarget()
. =..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index d396347e213..2d8a8b18893 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -38,7 +38,7 @@
/mob/living/simple_animal/hostile/mimic/FindTarget()
. = ..()
if(.)
- emote("growls at [.]")
+ emote("me", 1, "growls at [.]")
/mob/living/simple_animal/hostile/mimic/Die()
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 7baa4d510c6..3737f0097d0 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -39,7 +39,7 @@
/mob/living/simple_animal/hostile/tree/FindTarget()
. = ..()
if(.)
- emote("growls at [.]")
+ emote("me", 1, "growls at [.]")
/mob/living/simple_animal/hostile/tree/AttackingTarget()
. =..()
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 89e4ea79938..5f21892adf4 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -419,7 +419,7 @@
//Search for item to steal
parrot_interest = search_for_item()
if(parrot_interest)
- emote("looks in [parrot_interest]'s direction and takes flight")
+ emote("me", 1, "looks in [parrot_interest]'s direction and takes flight")
parrot_state = PARROT_SWOOP | PARROT_STEAL
icon_state = "parrot_fly"
return
@@ -441,7 +441,7 @@
if(AM)
if(istype(AM, /obj/item) || isliving(AM)) //If stealable item
parrot_interest = AM
- emote("turns and flies towards [parrot_interest]")
+ emote("me", 1, "turns and flies towards [parrot_interest]")
parrot_state = PARROT_SWOOP | PARROT_STEAL
return
else //Else it's a perch
@@ -739,7 +739,7 @@
held_item = null
if(health < maxHealth)
adjustBruteLoss(-10)
- emote("[src] eagerly downs the cracker")
+ emote("me", 1, "[src] eagerly downs the cracker")
return 1
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 1b222b52c74..7f58caad2de 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -134,23 +134,23 @@
else
randomValue -= speak.len
if(emote_see && randomValue <= emote_see.len)
- emote(pick(emote_see),1)
+ emote("me", 1, pick(emote_see))
else
- emote(pick(emote_hear),2)
+ emote("me", 2, pick(emote_see))
else
say(pick(speak))
else
if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len))
- emote(pick(emote_see),1)
+ emote("me", 1, pick(emote_see))
if((emote_hear && emote_hear.len) && !(emote_see && emote_see.len))
- emote(pick(emote_hear),2)
+ emote("me", 2, pick(emote_see))
if((emote_hear && emote_hear.len) && (emote_see && emote_see.len))
var/length = emote_hear.len + emote_see.len
var/pick = rand(1,length)
if(pick <= emote_see.len)
- emote(pick(emote_see),1)
+ emote("me", 1, pick(emote_see))
else
- emote(pick(emote_hear),2)
+ emote("me", 2, pick(emote_see))
//Atmos
@@ -243,18 +243,17 @@
return "[emote], \"[text]\""
return "says, \"[text]\"";
-/mob/living/simple_animal/emote(var/act)
+/mob/living/simple_animal/emote(var/act, var/m_type=1, var/message = null)
if(stat)
return
if(act == "scream")
- act = "makes a loud and pained whimper" //ugly hack to stop animals screaming when crushed :P
- visible_message("[src] [act].")
- return
- ..(act)
+ message = "makes a loud and pained whimper" //ugly hack to stop animals screaming when crushed :P
+ act = "me"
+ ..(act, m_type, message)
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
- M.emote("[M.friendly] [src]")
+ M.emote("me", 1, "[M.friendly] [src]")
else
if(M.attack_sound)
playsound(loc, M.attack_sound, 50, 1, 1)
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 5bf229f61d5..544522c7934 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -22,10 +22,7 @@
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
- if(ishuman(src) || isrobot(src))
- usr.emote("me",1,message)
- else
- usr.emote(message)
+ usr.emote("me",1,message)
/mob/proc/say_dead(var/message)
var/name = src.real_name
diff --git a/html/changelogs/Cheridan.yml b/html/changelogs/Cheridan.yml
new file mode 100644
index 00000000000..d26cc7b9ac2
--- /dev/null
+++ b/html/changelogs/Cheridan.yml
@@ -0,0 +1,2 @@
+author: Cheridan
+changes: []
diff --git a/icons/mecha/mech_construct.dmi b/icons/mecha/mech_construct.dmi
index 4eb606b1aea..bdce08c8022 100644
Binary files a/icons/mecha/mech_construct.dmi and b/icons/mecha/mech_construct.dmi differ
diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi
index d7f3722c64a..d0a145caff5 100644
Binary files a/icons/mecha/mech_construction.dmi and b/icons/mecha/mech_construction.dmi differ
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index 060554e4d71..772b4fa1513 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 01a89c9c23b..23555098a29 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/drone.dmi b/icons/mob/drone.dmi
index 651fef1519a..b5437a95d89 100644
Binary files a/icons/mob/drone.dmi and b/icons/mob/drone.dmi differ
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
index 221e71b78f4..dad29da8b55 100644
Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ
diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi
index 2a4807e3c13..6b34620664a 100644
Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 1ae599f3511..b6789863ebc 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 5ee02581787..de30380943a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6,6 +6,48 @@
// BEGIN_FILE_DIR
#define FILE_DIR .
+#define FILE_DIR "html"
+#define FILE_DIR "icons"
+#define FILE_DIR "icons/ass"
+#define FILE_DIR "icons/effects"
+#define FILE_DIR "icons/mecha"
+#define FILE_DIR "icons/misc"
+#define FILE_DIR "icons/mob"
+#define FILE_DIR "icons/obj"
+#define FILE_DIR "icons/obj/assemblies"
+#define FILE_DIR "icons/obj/atmospherics"
+#define FILE_DIR "icons/obj/clothing"
+#define FILE_DIR "icons/obj/doors"
+#define FILE_DIR "icons/obj/flora"
+#define FILE_DIR "icons/obj/machines"
+#define FILE_DIR "icons/obj/pipes"
+#define FILE_DIR "icons/obj/power_cond"
+#define FILE_DIR "icons/pda_icons"
+#define FILE_DIR "icons/spideros_icons"
+#define FILE_DIR "icons/stamp_icons"
+#define FILE_DIR "icons/Testing"
+#define FILE_DIR "icons/turf"
+#define FILE_DIR "icons/vending_icons"
+#define FILE_DIR "nano"
+#define FILE_DIR "nano/images"
+#define FILE_DIR "sound"
+#define FILE_DIR "sound/AI"
+#define FILE_DIR "sound/ambience"
+#define FILE_DIR "sound/effects"
+#define FILE_DIR "sound/hallucinations"
+#define FILE_DIR "sound/items"
+#define FILE_DIR "sound/machines"
+#define FILE_DIR "sound/mecha"
+#define FILE_DIR "sound/misc"
+#define FILE_DIR "sound/piano"
+#define FILE_DIR "sound/violin"
+#define FILE_DIR "sound/voice"
+#define FILE_DIR "sound/voice/complionator"
+#define FILE_DIR "sound/vox_fem"
+#define FILE_DIR "sound/weapons"
+#define FILE_DIR "tools"
+#define FILE_DIR "tools/AddToChangelog"
+#define FILE_DIR "tools/AddToChangelog/AddToChangelog"
// END_FILE_DIR
// BEGIN_PREFERENCES
@@ -76,6 +118,7 @@
#include "code\_onclick\hud\ai.dm"
#include "code\_onclick\hud\alien.dm"
#include "code\_onclick\hud\alien_larva.dm"
+#include "code\_onclick\hud\drones.dm"
#include "code\_onclick\hud\hud.dm"
#include "code\_onclick\hud\human.dm"
#include "code\_onclick\hud\monkey.dm"