diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm index 29591915c7..e259f51891 100644 --- a/code/game/objects/items/robot/robot_frame.dm +++ b/code/game/objects/items/robot/robot_frame.dm @@ -21,7 +21,7 @@ else for(var/part in required_parts) if(!parts[part]) - var/obj/item/part_type = part + var/obj/item/part_type = required_parts[part] . += SPAN_WARNING("It is missing \a [initial(part_type.name)]") /obj/item/robot_parts/frame/update_model_info(var/model) @@ -85,36 +85,38 @@ var/obj/item/mmi/M = W var/mob/living/carbon/brain/B = M.brainmob - if(!B) - to_chat(user, SPAN_WARNING("Sticking an empty [W.name] into the frame would sort of defeat the purpose.")) - return + if(!istype(M, /obj/item/mmi/inert)) + if(!B) + to_chat(user, SPAN_WARNING("Sticking an empty [W.name] into the frame would sort of defeat the purpose.")) + return - if(jobban_isbanned(B, "Robot")) - to_chat(user, SPAN_WARNING("\The [W] does not seem to fit.")) - return + if(jobban_isbanned(B, "Cyborg")) + to_chat(user, SPAN_WARNING("\The [W] does not seem to fit.")) + return - if(B.stat == DEAD) - to_chat(user, SPAN_WARNING("Sticking a dead [W.name] into the frame would sort of defeat the purpose.")) - return + if(B.stat == DEAD) + to_chat(user, SPAN_WARNING("Sticking a dead [W.name] into the frame would sort of defeat the purpose.")) + return - var/ghost_can_reenter = 0 - if(B.mind) - if(B.key) - ghost_can_reenter = TRUE - else - for(var/mob/observer/dead/G in player_list) - if(G.can_reenter_corpse && G.mind == B.mind) - ghost_can_reenter = TRUE - //Jamming a ghosted brain into a borg is likely detrimental, and may result in some problems. - to_chat(user, SPAN_NOTICE("\The [W] is completely unresponsive, but it may be able to auto-resuscitate if you leave it be for awhile.")) - break + var/ghost_can_reenter = 0 + if(B.mind) + if(B.key) + ghost_can_reenter = TRUE + else + for(var/mob/observer/dead/G in player_list) + if(G.can_reenter_corpse && G.mind == B.mind) + ghost_can_reenter = TRUE + //Jamming a ghosted brain into a borg is likely detrimental, and may result in some problems. + to_chat(user, SPAN_NOTICE("\The [W] is completely unresponsive, but it may be able to auto-resuscitate if you leave it be for awhile.")) + break - if(!ghost_can_reenter) - to_chat(user, SPAN_WARNING("\The [W] is completely unresponsive; there's no point.")) - return + if(!ghost_can_reenter) + to_chat(user, SPAN_WARNING("\The [W] is completely unresponsive; there's no point.")) + return if(!user.unEquip(W)) return + var/mob/living/silicon/robot/O = new product(get_turf(loc)) if(!O) return @@ -123,7 +125,8 @@ O.invisibility = 0 O.custom_name = created_name O.updatename("Default") - B.mind.transfer_to(O) + if(B) + B.mind.transfer_to(O) if(O.mind && O.mind.assigned_role) O.job = O.mind.assigned_role else diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 9642dc1e34..442ce46160 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -123,7 +123,9 @@ /obj/structure/catwalk/Crossed(atom/movable/AM) . = ..() if(isliving(AM) && !AM.is_incorporeal()) - playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1) + var/mob/living/M = AM + if(!M.is_floating) + playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1) /obj/effect/catwalk_plated name = "plated catwalk spawner" diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index a315708717..6e0cab6785 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -113,7 +113,6 @@ note dizziness decrements automatically in the mob's Life() proc. stop_floating() return floatiness = n - if(floatiness && !is_floating) start_floating() else if(!floatiness && is_floating) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index ee6d8435f4..7e221bd6ba 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -29,7 +29,7 @@ module_category = ROBOT_MODULE_TYPE_FLYING can_be_pushed = TRUE sprites = list( - "Drone" = "drone-standard", + "Drone" = "robot", "Pyralis" = "Glitterfly-Standard", "Cabeiri" = "eyebot-standard" ) @@ -463,8 +463,8 @@ LANGUAGE_ZADDAT = 1, ) -/obj/item/robot_module/robot/clerical/butler - display_name = "Butler" +/obj/item/robot_module/robot/clerical/service + display_name = "Service" sprites = list( "M-USE NanoTrasen" = "robotServ", "Haruka" = "marinaSV", @@ -504,7 +504,7 @@ ) emag = /obj/item/reagent_containers/food/drinks/bottle/small/beer -/obj/item/robot_module/robot/clerical/butler/flying +/obj/item/robot_module/robot/clerical/service/flying module_category = ROBOT_MODULE_TYPE_FLYING can_be_pushed = TRUE sprites = list( @@ -514,7 +514,7 @@ "Hydroponics Drone" = "drone-hydro" ) -/obj/item/robot_module/robot/clerical/butler/finalize_emag() +/obj/item/robot_module/robot/clerical/service/finalize_emag() . = ..() if(!emag.reagents) emag.create_reagents(50) @@ -523,7 +523,7 @@ emag.reagents.add_reagent("beer2", 50) emag.name = "Mickey Finn's Special Brew" -/obj/item/robot_module/robot/clerical/butler/finalize_equipment() +/obj/item/robot_module/robot/clerical/service/finalize_equipment() . = ..() var/obj/item/rsf/M = locate() in modules M.stored_matter = 30 diff --git a/code/modules/mob/living/silicon/robot/robot_remote_control.dm b/code/modules/mob/living/silicon/robot/robot_remote_control.dm index b99a141163..f0735d3428 100644 --- a/code/modules/mob/living/silicon/robot/robot_remote_control.dm +++ b/code/modules/mob/living/silicon/robot/robot_remote_control.dm @@ -7,12 +7,17 @@ GLOBAL_LIST_EMPTY(available_ai_shells) var/deployed = FALSE var/mob/living/silicon/ai/mainframe = null -// Premade AI shell, for roundstart shells. +// Premade AI shells, for roundstart landmark spawn. /mob/living/silicon/robot/ai_shell/Initialize() mmi = new /obj/item/mmi/inert/ai_remote(src) post_mmi_setup() return ..() +/mob/living/silicon/robot/flying/ai_shell/Initialize() + mmi = new /obj/item/mmi/inert/ai_remote(src) + post_mmi_setup() + return ..() + // Call after inserting or instantiating an MMI. /mob/living/silicon/robot/proc/post_mmi_setup() if(istype(mmi, /obj/item/mmi/inert/ai_remote)) @@ -128,8 +133,12 @@ GLOBAL_LIST_EMPTY(available_ai_shells) icon = 'icons/mob/screen1.dmi' icon_state = "x3" delete_me = TRUE + var/shell_type = /mob/living/silicon/robot/ai_shell /obj/effect/landmark/free_ai_shell/Initialize() if(config.allow_ai_shells && config.give_free_ai_shell) - new /mob/living/silicon/robot/ai_shell(get_turf(src)) + new shell_type(get_turf(src)) return ..() + +/obj/effect/landmark/free_ai_shell/flying + shell_type = /mob/living/silicon/robot/flying/ai_shell diff --git a/code/modules/mob/living/silicon/robot/subtypes/flying.dm b/code/modules/mob/living/silicon/robot/subtypes/flying.dm index cfcd3ea266..35342d4802 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/flying.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/flying.dm @@ -1,7 +1,6 @@ /mob/living/silicon/robot/flying desc = "A utility robot with an anti-gravity hover unit and a lightweight frame." icon = 'icons/mob/robots/robots_flying.dmi' - icon_state = "drone-standard" module_category = ROBOT_MODULE_TYPE_FLYING dismantle_type = /obj/item/robot_parts/frame/flyer power_efficiency = 0.75 @@ -12,6 +11,12 @@ mob_swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL mob_push_flags = MONKEY|SLIME|SIMPLE_ANIMAL +/mob/living/silicon/robot/flying/update_floating() + if(hovering) + make_floating(TRUE) + return + ..() + /mob/living/silicon/robot/flying/initialize_components() components["actuator"] = new/datum/robot_component/actuator(src) components["radio"] = new/datum/robot_component/radio(src) @@ -29,16 +34,18 @@ start_hovering() /mob/living/silicon/robot/flying/proc/start_hovering() - hovering = TRUE - pass_flags |= PASSTABLE - default_pixel_y = 0 - make_floating(10) + if(!hovering) + hovering = TRUE + pass_flags |= PASSTABLE + default_pixel_y = 0 + update_floating() /mob/living/silicon/robot/flying/proc/stop_hovering() - hovering = FALSE - pass_flags &= ~PASSTABLE - default_pixel_y = -8 - stop_floating() + if(hovering) + hovering = FALSE + pass_flags &= ~PASSTABLE + default_pixel_y = -8 + update_floating() /mob/living/silicon/robot/flying/death() . = ..() diff --git a/icons/mob/robots/robots_flying.dmi b/icons/mob/robots/robots_flying.dmi index 9e59bb8bf2..472fd220fb 100644 Binary files a/icons/mob/robots/robots_flying.dmi and b/icons/mob/robots/robots_flying.dmi differ diff --git a/maps/cynosure/cynosure-3.dmm b/maps/cynosure/cynosure-3.dmm index 3500357a56..a5b9cff7cb 100644 --- a/maps/cynosure/cynosure-3.dmm +++ b/maps/cynosure/cynosure-3.dmm @@ -14284,7 +14284,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 1 }, -/obj/effect/landmark/free_ai_shell, +/obj/effect/landmark/free_ai_shell/flying, /turf/simulated/floor/tiled/techfloor, /area/surface/station/ai) "iUT" = (