diff --git a/code/__DEFINES/~skyrat_defines/robot_defines.dm b/code/__DEFINES/~skyrat_defines/robot_defines.dm index 62c77596d37..bbd1b156c45 100644 --- a/code/__DEFINES/~skyrat_defines/robot_defines.dm +++ b/code/__DEFINES/~skyrat_defines/robot_defines.dm @@ -9,8 +9,6 @@ //Defines for model features, set in the model_features list of a robot model datum. Are they a dogborg? Is the model small? etc. /// Cyborgs with unique sprites for when they get totally broken down. #define R_TRAIT_UNIQUEWRECK "unique_wreck" -/// Or when tipped over. -#define R_TRAIT_UNIQUETIP "unique_tip" /// Represents wide/quadruped/dogborg type models. #define R_TRAIT_WIDE "wide_borg" /// Any model small enough to reject the shrinker upgrade. diff --git a/code/datums/components/tippable.dm b/code/datums/components/tippable.dm index cda77f5365c..04190787290 100644 --- a/code/datums/components/tippable.dm +++ b/code/datums/components/tippable.dm @@ -16,9 +16,18 @@ var/datum/callback/post_tipped_callback /// Callback to additional behavior after being untipped. var/datum/callback/post_untipped_callback + /// Callback to any extra roleplay behaviour + var/datum/callback/roleplay_callback ///The timer given until they untip themselves var/self_untip_timer + ///Should we accept roleplay? + var/roleplay_friendly + ///Have we roleplayed? + var/roleplayed = FALSE + ///List of emotes that will half their untip time + var/list/roleplay_emotes + /datum/component/tippable/Initialize( tip_time = 3 SECONDS, untip_time = 1 SECONDS, @@ -26,6 +35,9 @@ datum/callback/pre_tipped_callback, datum/callback/post_tipped_callback, datum/callback/post_untipped_callback, + roleplay_friendly = FALSE, + roleplay_emotes, + datum/callback/roleplay_callback, ) if(!isliving(parent)) @@ -37,9 +49,15 @@ src.pre_tipped_callback = pre_tipped_callback src.post_tipped_callback = post_tipped_callback src.post_untipped_callback = post_untipped_callback + src.roleplay_friendly = roleplay_friendly + src.roleplay_emotes = roleplay_emotes + src.roleplay_callback = roleplay_callback /datum/component/tippable/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_SECONDARY, .proc/interact_with_tippable) + if (roleplay_friendly) + RegisterSignal(parent, COMSIG_MOB_EMOTE, .proc/accept_roleplay) + /datum/component/tippable/UnregisterFromParent() UnregisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_SECONDARY) @@ -51,6 +69,8 @@ QDEL_NULL(post_tipped_callback) if(post_untipped_callback) QDEL_NULL(post_untipped_callback) + if(roleplay_callback) + QDEL_NULL(roleplay_callback) return ..() /* @@ -212,3 +232,18 @@ else tipped_mob.transform = turn(tipped_mob.transform, -180) REMOVE_TRAIT(tipped_mob, TRAIT_IMMOBILIZED, TIPPED_OVER) + +/datum/component/tippable/proc/accept_roleplay(mob/living/user, datum/emote/emote) + SIGNAL_HANDLER + + if (!is_tipped) + return + if (roleplayed) + return + if (!is_type_in_list(emote, roleplay_emotes)) + return + var/time_left = timeleft(self_untip_timer) + deltimer(self_untip_timer) + self_untip_timer = addtimer(CALLBACK(src, .proc/right_self, user), time_left * 0.75, TIMER_UNIQUE | TIMER_STOPPABLE) + roleplayed = TRUE + roleplay_callback?.Invoke(user) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b2df20eec1e..f57bb0199e8 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -9,7 +9,10 @@ untip_time = 2 SECONDS, \ self_right_time = 60 SECONDS, \ post_tipped_callback = CALLBACK(src, .proc/after_tip_over), \ - post_untipped_callback = CALLBACK(src, .proc/after_righted)) + post_untipped_callback = CALLBACK(src, .proc/after_righted), \ + roleplay_friendly = TRUE, \ + roleplay_emotes = list(/datum/emote/living/human/buzz, /datum/emote/living/human/buzz2, /datum/emote/living/human/beep, /datum/emote/living/human/beep2), \ + roleplay_callback = CALLBACK(src, .proc/untip_roleplay)) // SKYRAT EDIT CHANGE wires = new /datum/wires/robot(src) AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) @@ -1040,3 +1043,6 @@ var/datum/job/cyborg/cyborg_job_ref = SSjob.GetJobType(/datum/job/cyborg) .[cyborg_job_ref.title] = minutes + +/mob/living/silicon/robot/proc/untip_roleplay() + to_chat(src, span_notice("Your frustration has empowered you! You can now right yourself faster!")) diff --git a/modular_skyrat/master_files/code/modules/mob/living/sillicon/robot.dm b/modular_skyrat/master_files/code/modules/mob/living/sillicon/robot.dm new file mode 100644 index 00000000000..3fed99b28ec --- /dev/null +++ b/modular_skyrat/master_files/code/modules/mob/living/sillicon/robot.dm @@ -0,0 +1,29 @@ +// Alternative tipped procs +/mob/living/silicon/robot/after_tip_over(mob/user) + . = ..() + var/list/listofroombas = list("zoomba_engi", "zoomba_med", "zoomba_green", "zoomba_miner", "zoomba_jani", "zoomba_sec") + if(model.cyborg_base_icon in listofroombas) + roomba_after_tip_over() + +/mob/living/silicon/robot/after_righted(mob/user) + . = ..() + if(!user) //Did we self-right? + var/list/listofroombas = list("zoomba_engi", "zoomba_med", "zoomba_green", "zoomba_miner", "zoomba_jani", "zoomba_sec") + if(model.cyborg_base_icon in listofroombas) + roomba_after_righted() + + LAZYNULL(vis_contents) + +// Zoomba skinline +/mob/living/silicon/robot/proc/roomba_after_tip_over() + var/atom/movable/overlay = new /atom/movable + overlay.name = "[src]'s arm." + overlay.icon = 'modular_skyrat/modules/altborgs/icons/robot_effect.dmi' + overlay.layer = ABOVE_MOB_LAYER + + flick("zoomba_flip", overlay) //Start from the start + vis_contents += overlay + +/mob/living/silicon/robot/proc/roomba_after_righted() + SpinAnimation(3, 1) + playsound(get_turf(src), 'sound/vehicles/skateboard_ollie.ogg', 50, TRUE) //Roomba does a sick ollie diff --git a/modular_skyrat/modules/altborgs/code/robot_tipping.dm b/modular_skyrat/modules/altborgs/code/robot_tipping.dm deleted file mode 100644 index 1b9b8b10079..00000000000 --- a/modular_skyrat/modules/altborgs/code/robot_tipping.dm +++ /dev/null @@ -1,75 +0,0 @@ -// Modular solution for alternative skins and tipping -/mob/living/silicon/robot/Initialize(mapload) - . = ..() - AddComponent(/datum/component/tippable/skyrat, \ - tip_time = 3 SECONDS, \ - untip_time = 2 SECONDS, \ - self_right_time = 60 SECONDS, \ - post_tipped_callback = CALLBACK(src, .proc/after_tip_over), \ - post_untipped_callback = CALLBACK(src, .proc/after_righted)) - -/datum/component/tippable/skyrat/Initialize( - tip_time = 3 SECONDS, - untip_time = 1 SECONDS, - self_right_time = 60 SECONDS, - datum/callback/pre_tipped_callback, - datum/callback/post_tipped_callback, - datum/callback/post_untipped_callback, -) - qdel(GetComponent(/datum/component/tippable)) - . = ..() - -/datum/component/tippable/skyrat/set_tipped_status(mob/living/tipped_mob, new_status = FALSE) - var/mob/living/silicon/robot/robot = tipped_mob - - is_tipped = new_status - - if(is_tipped) - ADD_TRAIT(tipped_mob, TRAIT_IMMOBILIZED, TIPPED_OVER) - if(R_TRAIT_UNIQUETIP in robot.model.model_features) - robot.icon_state = "[robot.model.cyborg_base_icon]-tipped" - robot.cut_overlays() //Cut eye-lights - return - - tipped_mob.transform = turn(tipped_mob.transform, 180) - - else - REMOVE_TRAIT(tipped_mob, TRAIT_IMMOBILIZED, TIPPED_OVER) - if(R_TRAIT_UNIQUETIP in robot.model.model_features) - robot.icon_state = "[robot.model.cyborg_base_icon]" - robot.regenerate_icons() //Return eye-lights - return - - tipped_mob.transform = turn(tipped_mob.transform, -180) - -//// -// Alternative tipped procs -/mob/living/silicon/robot/after_tip_over(mob/user) - . = ..() - var/list/listofroombas = list("zoomba_engi", "zoomba_med", "zoomba_green", "zoomba_miner", "zoomba_jani", "zoomba_sec") - if(model.cyborg_base_icon in listofroombas) - roomba_after_tip_over() - -/mob/living/silicon/robot/after_righted(mob/user) - . = ..() - if(!user) //Did we self-right? - var/list/listofroombas = list("zoomba_engi", "zoomba_med", "zoomba_green", "zoomba_miner", "zoomba_jani", "zoomba_sec") - if(model.cyborg_base_icon in listofroombas) - roomba_after_righted() - - LAZYNULL(vis_contents) - - -// Zoomba skinline -/mob/living/silicon/robot/proc/roomba_after_tip_over() - var/atom/movable/overlay = new /atom/movable - overlay.name = "[src]'s arm." - overlay.icon = 'modular_skyrat/modules/altborgs/icons/robot_effect.dmi' - overlay.layer = ABOVE_MOB_LAYER - - flick("zoomba_flip", overlay) //Start from the start - vis_contents += overlay - -/mob/living/silicon/robot/proc/roomba_after_righted() - SpinAnimation(3, 1) - playsound(get_turf(src), 'sound/vehicles/skateboard_ollie.ogg', 50, TRUE) //Roomba does a sick ollie diff --git a/tgstation.dme b/tgstation.dme index 47043cfb384..6d8bd68aa2c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4328,6 +4328,7 @@ #include "modular_skyrat\master_files\code\modules\mob\living\carbon\human.dm" #include "modular_skyrat\master_files\code\modules\mob\living\carbon\human_helpers.dm" #include "modular_skyrat\master_files\code\modules\mob\living\human\species.dm" +#include "modular_skyrat\master_files\code\modules\mob\living\sillicon\robot.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\simple_animal.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\friendly\bananaspider.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\friendly\bumbles.dm" @@ -4448,7 +4449,6 @@ #include "modular_skyrat\modules\altborgs\code\robot_defines.dm" #include "modular_skyrat\modules\altborgs\code\robot_items.dm" #include "modular_skyrat\modules\altborgs\code\robot_model.dm" -#include "modular_skyrat\modules\altborgs\code\robot_tipping.dm" #include "modular_skyrat\modules\altborgs\code\robot_upgrade.dm" #include "modular_skyrat\modules\altborgs\code\update_icons.dm" #include "modular_skyrat\modules\alternative_job_titles\code\alt_job_titles.dm"