diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index fcc46d5c0bb..bc184ba4080 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -228,7 +228,7 @@ if(!R.robot_modules_background) return - var/display_rows = CEILING(length(R.module.get_inactive_modules()) / 8, 1) + var/display_rows = max(CEILING(length(R.module.get_inactive_modules()) / 8, 1),1) R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" screenmob.client.screen += R.robot_modules_background diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 6a64033bd0e..86b35fad6d8 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -372,7 +372,7 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list for(var/datum/mind/M in owners) if(!considered_alive(M, enforce_human = FALSE) || !SSshuttle.emergency.shuttle_areas[get_area(M.current)]) return FALSE - return SSshuttle.emergency.is_hijacked(filter_by_human = FALSE) + return SSshuttle.emergency.is_hijacked(filter_by_human = FALSE, solo_hijack = TRUE) /datum/objective/block name = "no organics on shuttle" diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 30bfa5582f2..78fe4e8035d 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -212,6 +212,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 playsound(user, 'sound/items/screwdriver2.ogg', 50, TRUE) /obj/item/claymore/highlander/robot //BLOODTHIRSTY BORGS NOW COME IN PLAID + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "claymore_cyborg" var/mob/living/silicon/robot/robot /obj/item/claymore/highlander/robot/Initialize() diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index 5f83b3245ff..4d82a5f3d91 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -87,6 +87,10 @@ /datum/antagonist/highlander/robot name="highlander" +/datum/antagonist/highlander/robot/greet() + to_chat(owner, "Your integrated claymore cries out for blood. Claim the lives of others, and your own will be restored!\n\ + Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.") + /datum/antagonist/highlander/robot/give_equipment() var/mob/living/silicon/robot/robotlander = owner.current if(!istype(robotlander)) @@ -97,6 +101,4 @@ robotlander.laws.set_zeroth_law("THERE CAN BE ONLY ONE") robotlander.laws.show_laws(robotlander) robotlander.module.transform_to(/obj/item/robot_module/syndicate/kiltborg) - robotlander.place_on_head(new /obj/item/clothing/head/beret/highlander(robotlander)) - ADD_TRAIT(robotlander.hat, TRAIT_NODROP, HIGHLANDER) sword = locate(/obj/item/claymore/highlander/robot) in robotlander.module.basic_modules diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index d2fa26831b4..3740192c9ff 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -51,6 +51,10 @@ * * module_num - the slot number being equipped to. */ /mob/living/silicon/robot/proc/equip_module_to_slot(obj/item/item_module, module_num) + var/storage_was_closed = FALSE //Just to be consistant and all + if(!shown_robot_modules) //Tools may be invisible if the collection is hidden + hud_used.toggle_show_robot_modules() + storage_was_closed = TRUE switch(module_num) if(1) item_module.screen_loc = inv1.screen_loc @@ -72,6 +76,9 @@ update_sight() observer_screen_update(item_module, TRUE) + + if(storage_was_closed) + hud_used.toggle_show_robot_modules() return TRUE /** diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 377f1186a05..856637c0cf8 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -663,10 +663,17 @@ qdel(robot.radio) robot.radio = new /obj/item/radio/borg/syndicate(robot) robot.scrambledcodes = TRUE - robot.maxHealth = 50 //DIE IN THREE HITS, LIKE REAL SCOT + robot.maxHealth = 50 //DIE IN THREE HITS, LIKE A REAL SCOT robot.break_cyborg_slot(3) //YOU ONLY HAVE TWO ITEMS ANYWAY + var/obj/item/pinpointer/nuke/diskyfinder = locate(/obj/item/pinpointer/nuke) in basic_modules + diskyfinder.attack_self(robot) + +/obj/item/robot_module/syndicate/kiltborg/do_transform_delay() //AUTO-EQUIPPING THESE TOOLS ANY EARLIER CAUSES RUNTIMES OH YEAH + . = ..() robot.equip_module_to_slot(locate(/obj/item/claymore/highlander/robot) in basic_modules, 1) robot.equip_module_to_slot(locate(/obj/item/pinpointer/nuke) in basic_modules, 2) + robot.place_on_head(new /obj/item/clothing/head/beret/highlander(robot)) //THE ONLY PART MORE IMPORTANT THAN THE SWORD IS THE HAT + ADD_TRAIT(robot.hat, TRAIT_NODROP, HIGHLANDER) /datum/robot_energy_storage var/name = "Generic energy storage" diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 3f90b93dff9..ab3a17eeb68 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -260,9 +260,19 @@ SSshuttle.emergencyLastCallLoc = null priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlerecalled.ogg', "Priority") -/obj/docking_port/mobile/emergency/proc/is_hijacked(filter_by_human = TRUE) +/** + * Proc that handles checking if the emergency shuttle was successfully hijacked + * + * Checks for all mobs on the shuttle, checks their status, and checks if they're + * borgs or simple animals. Depending on the args, certain mobs may be ignored, + * and the presence of other antags may or may not invalidate a hijack. + * Args: + * filter_by_human, default TRUE, tells the proc that only humans should block a hijack. Borgs and animals are ignored and will not block if this is TRUE. + * solo_hijack, default FALSE, tells the proc to fail with multiple hijackers, such as for Highlander mode. + */ +/obj/docking_port/mobile/emergency/proc/is_hijacked(filter_by_human = TRUE, solo_hijack = FALSE) var/has_people = FALSE - var/hijacker_present = FALSE + var/hijacker_count = 0 for(var/mob/living/player in GLOB.player_list) if(player.mind) if(player.stat != DEAD) @@ -282,7 +292,7 @@ var/prevent = FALSE for(var/datum/antagonist/A in player.mind.antag_datums) if(A.can_hijack == HIJACK_HIJACKER) - hijacker_present = TRUE + hijacker_count += 1 prevent = FALSE break //If we have both prevent and hijacker antags assume we want to hijack. else if(A.can_hijack == HIJACK_PREVENT) @@ -290,8 +300,8 @@ if(prevent) return FALSE - - return has_people && hijacker_present + //has people AND either there's only one hijacker or there's any but solo_hijack is disabled + return has_people && ((hijacker_count == 1) || (hijacker_count && !solo_hijack)) /obj/docking_port/mobile/emergency/proc/ShuttleDBStuff() set waitfor = FALSE diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi index b0e8a7b3b25..01ea5d822fe 100644 Binary files a/icons/mob/screen_cyborg.dmi and b/icons/mob/screen_cyborg.dmi differ diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi index a4bd75f7e51..7669c190c14 100644 Binary files a/icons/obj/items_cyborg.dmi and b/icons/obj/items_cyborg.dmi differ