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"